Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 /// \file electromagnetic/TestEm15/src/Steppin << 26 // $Id: SteppingAction.cc,v 1.6 2007/03/15 15:52:39 maire Exp $ 27 /// \brief Implementation of the SteppingActio << 27 // GEANT4 tag $Name: geant4-08-03 $ 28 // << 28 // 29 // << 30 //....oooOO0OOooo........oooOO0OOooo........oo 29 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 31 //....oooOO0OOooo........oooOO0OOooo........oo 30 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 32 31 33 #include "SteppingAction.hh" 32 #include "SteppingAction.hh" 34 << 35 #include "DetectorConstruction.hh" 33 #include "DetectorConstruction.hh" 36 #include "HistoManager.hh" << 34 #include "PrimaryGeneratorAction.hh" 37 #include "RunAction.hh" 35 #include "RunAction.hh" >> 36 #include "HistoManager.hh" 38 37 39 #include "G4ParticleTypes.hh" << 40 #include "G4RunManager.hh" 38 #include "G4RunManager.hh" 41 39 42 #include <G4RotationMatrix.hh> << 43 #include <G4ThreeVector.hh> << 44 << 45 //....oooOO0OOooo........oooOO0OOooo........oo 40 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 46 41 47 SteppingAction::SteppingAction(DetectorConstru << 42 SteppingAction::SteppingAction(DetectorConstruction* det, 48 : G4UserSteppingAction(), fDetector(det), fR << 43 PrimaryGeneratorAction* prim, RunAction* RuAct, 49 {} << 44 HistoManager* Hist) >> 45 :detector(det), primary(prim), runAction(RuAct), histoManager(Hist) >> 46 { } 50 47 51 //....oooOO0OOooo........oooOO0OOooo........oo 48 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 52 49 53 SteppingAction::~SteppingAction() {} << 50 SteppingAction::~SteppingAction() >> 51 { } 54 52 55 //....oooOO0OOooo........oooOO0OOooo........oo 53 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 56 54 57 void SteppingAction::UserSteppingAction(const 55 void SteppingAction::UserSteppingAction(const G4Step* aStep) 58 { 56 { 59 G4StepPoint* prePoint = aStep->GetPreStepPoi 57 G4StepPoint* prePoint = aStep->GetPreStepPoint(); 60 << 58 61 // if World --> return 59 // if World --> return 62 if (prePoint->GetTouchableHandle()->GetVolum << 60 if (prePoint->GetTouchableHandle()->GetVolume()==detector->GetWorld()) return; 63 << 61 64 // here we enter in the absorber Box 62 // here we enter in the absorber Box 65 // tag the event to be killed anyway after t 63 // tag the event to be killed anyway after this step 66 // 64 // 67 G4RunManager::GetRunManager()->AbortEvent(); 65 G4RunManager::GetRunManager()->AbortEvent(); 68 << 66 69 // count processes and keep only Multiple Sc << 67 //count processes and keep only Multiple Scattering 70 // << 68 // 71 G4StepPoint* endPoint = aStep->GetPostStepPo 69 G4StepPoint* endPoint = aStep->GetPostStepPoint(); 72 G4String procName = endPoint->GetProcessDefi 70 G4String procName = endPoint->GetProcessDefinedStep()->GetProcessName(); 73 fRunAction->CountProcesses(procName); << 71 runAction->CountProcesses(procName); 74 << 72 75 if (procName == "msc" || procName == "muMsc" << 73 if (procName != "msc" && procName != "stepMax") return; 76 // below, only multiple Scattering happens << 74 77 // << 75 //below, only multiple Scattering happens 78 G4ThreeVector position = endPoint->GetPosi << 76 // 79 G4ThreeVector direction = endPoint->GetMom << 77 G4ThreeVector position = endPoint->GetPosition(); 80 << 78 G4ThreeVector direction = endPoint->GetMomentumDirection(); 81 G4double truePathLength = aStep->GetStepLe << 79 82 G4double geomPathLength = position.x() + 0 << 80 G4double truePathLength = aStep->GetStepLength(); 83 G4double ratio = geomPathLength / truePath << 81 G4double geomPathLength = position.x() + 0.5*detector->GetBoxSize(); 84 fRunAction->SumPathLength(truePathLength, << 82 G4double ratio = geomPathLength/truePathLength; 85 G4AnalysisManager* analysisManager = G4Ana << 83 runAction->SumPathLength(truePathLength,geomPathLength); 86 analysisManager->FillH1(1, truePathLength) << 84 histoManager->FillHisto(1,truePathLength); 87 analysisManager->FillH1(2, geomPathLength) << 85 histoManager->FillHisto(2,geomPathLength); 88 analysisManager->FillH1(3, ratio); << 86 histoManager->FillHisto(3,ratio); 89 << 87 90 G4double yend = position.y(), zend = posit << 88 G4double yend = position.y(), zend = position.z(); 91 G4double lateralDisplacement = std::sqrt(y << 89 G4double lateralDisplacement = std::sqrt(yend*yend + zend*zend); 92 fRunAction->SumLateralDisplacement(lateral << 90 runAction->SumLateralDisplacement(lateralDisplacement); 93 analysisManager->FillH1(4, lateralDisplace << 91 histoManager->FillHisto(4,lateralDisplacement); 94 << 92 95 G4double psi = std::atan(lateralDisplaceme << 93 G4double psi = std::atan(lateralDisplacement/geomPathLength); 96 fRunAction->SumPsi(psi); << 94 runAction->SumPsi(psi); 97 analysisManager->FillH1(5, psi); << 95 histoManager->FillHisto(5,psi); 98 << 96 99 G4double xdir = direction.x(), ydir = dire << 97 G4double xdir = direction.x(), ydir = direction.y(), zdir = direction.z(); 100 G4double tetaPlane = std::atan2(ydir, xdir << 98 G4double tetaPlane = std::atan2(ydir, xdir); 101 fRunAction->SumTetaPlane(tetaPlane); << 99 runAction->SumTetaPlane(tetaPlane); 102 analysisManager->FillH1(6, tetaPlane); << 100 histoManager->FillHisto(6,tetaPlane); 103 tetaPlane = std::atan2(zdir, xdir); << 101 tetaPlane = std::atan2(zdir, xdir); 104 fRunAction->SumTetaPlane(tetaPlane); << 102 runAction->SumTetaPlane(tetaPlane); 105 analysisManager->FillH1(6, tetaPlane); << 103 histoManager->FillHisto(6,tetaPlane); 106 << 104 107 G4double phiPos = std::atan2(zend, yend); << 105 G4double phiPos = std::atan2(zend, yend); 108 analysisManager->FillH1(7, phiPos); << 106 histoManager->FillHisto(7,phiPos); 109 G4double phiDir = std::atan2(zdir, ydir); << 107 G4double phiDir = std::atan2(zdir, ydir); 110 analysisManager->FillH1(8, phiDir); << 108 histoManager->FillHisto(8,phiDir); 111 << 109 112 G4double phiCorrel = 0.; << 110 G4double phiCorrel = 0.; 113 if (lateralDisplacement > 0.) phiCorrel = << 111 if (lateralDisplacement > 0.) 114 fRunAction->SumPhiCorrel(phiCorrel); << 112 phiCorrel = (yend*ydir + zend*zdir)/lateralDisplacement; 115 analysisManager->FillH1(9, phiCorrel); << 113 runAction->SumPhiCorrel(phiCorrel); 116 } << 114 histoManager->FillHisto(9,phiCorrel); 117 else if (procName == "conv" || procName == " << 118 // gamma conversion << 119 << 120 G4StepPoint* PrePoint = aStep->GetPreStepP << 121 G4double EGamma = PrePoint->GetTotalEnergy << 122 G4ThreeVector PGamma = PrePoint->GetMoment << 123 G4ThreeVector PolaGamma = PrePoint->GetPol << 124 << 125 G4double Eplus = -1; << 126 G4ThreeVector Pplus, Pminus, Precoil; << 127 << 128 const G4TrackVector* secondary = fpSteppin << 129 << 130 const size_t Nsecondaries = (*secondary).s << 131 << 132 // No conversion , E < threshold << 133 if (Nsecondaries == 0) return; << 134 << 135 for (size_t lp = 0; lp < std::min(Nseconda << 136 if (((*secondary)[lp]->GetDefinition() = << 137 || ((*secondary)[lp]->GetDefinition( << 138 { << 139 Pminus = (*secondary)[lp]->GetMomentum << 140 } << 141 if (((*secondary)[lp]->GetDefinition() = << 142 || ((*secondary)[lp]->GetDefinition( << 143 { << 144 Eplus = (*secondary)[lp]->GetTotalEner << 145 Pplus = (*secondary)[lp]->GetMomentum( << 146 } << 147 } << 148 << 149 if (Nsecondaries >= 3) { << 150 Precoil = (*secondary)[2]->GetMomentum() << 151 } << 152 << 153 G4AnalysisManager* analysisManager = G4Ana << 154 << 155 // Fill Histograms << 156 << 157 G4ThreeVector z = PGamma.unit(); // gamma << 158 G4ThreeVector x(1., 0., 0.); << 159 << 160 // pola perpendicular to direction << 161 << 162 if (PolaGamma.mag() != 0.0) { << 163 x = PolaGamma.unit(); << 164 } << 165 else { // Pola = 0 case << 166 x = z.orthogonal().unit(); << 167 } << 168 << 169 G4ThreeVector y = z; << 170 y = y.cross(x); << 171 << 172 G4RotationMatrix GtoW(x, y, z); // from << 173 G4RotationMatrix WtoG = inverseOf(GtoW); << 174 << 175 G4double angleE = Pplus.angle(Pminus) * EG << 176 analysisManager->FillH1(10, angleE); << 177 << 178 if (Nsecondaries >= 3) { << 179 // recoil returned << 180 analysisManager->FillH1(11, std::log10(P << 181 analysisManager->FillH1(12, Precoil.tran << 182 } << 183 G4double phiPlus = Pplus.transform(WtoG).p << 184 G4double phiMinus = Pminus.transform(WtoG) << 185 analysisManager->FillH1(13, phiPlus); << 186 analysisManager->FillH1(14, std::cos(phiPl << 187 analysisManager->FillH1(15, Eplus / EGamma << 188 << 189 G4double phiPola = PolaGamma.transform(Wto << 190 analysisManager->FillH1(16, phiPola); << 191 } << 192 } 115 } 193 116 194 //....oooOO0OOooo........oooOO0OOooo........oo 117 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 118 >> 119 195 120