Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 /// \file electromagnetic/TestEm15/src/Steppin 27 /// \brief Implementation of the SteppingActio 28 // 29 // 30 //....oooOO0OOooo........oooOO0OOooo........oo 31 //....oooOO0OOooo........oooOO0OOooo........oo 32 33 #include "SteppingAction.hh" 34 35 #include "DetectorConstruction.hh" 36 #include "HistoManager.hh" 37 #include "RunAction.hh" 38 39 #include "G4ParticleTypes.hh" 40 #include "G4RunManager.hh" 41 42 #include <G4RotationMatrix.hh> 43 #include <G4ThreeVector.hh> 44 45 //....oooOO0OOooo........oooOO0OOooo........oo 46 47 SteppingAction::SteppingAction(DetectorConstru 48 : G4UserSteppingAction(), fDetector(det), fR 49 {} 50 51 //....oooOO0OOooo........oooOO0OOooo........oo 52 53 SteppingAction::~SteppingAction() {} 54 55 //....oooOO0OOooo........oooOO0OOooo........oo 56 57 void SteppingAction::UserSteppingAction(const 58 { 59 G4StepPoint* prePoint = aStep->GetPreStepPoi 60 61 // if World --> return 62 if (prePoint->GetTouchableHandle()->GetVolum 63 64 // here we enter in the absorber Box 65 // tag the event to be killed anyway after t 66 // 67 G4RunManager::GetRunManager()->AbortEvent(); 68 69 // count processes and keep only Multiple Sc 70 // 71 G4StepPoint* endPoint = aStep->GetPostStepPo 72 G4String procName = endPoint->GetProcessDefi 73 fRunAction->CountProcesses(procName); 74 75 if (procName == "msc" || procName == "muMsc" 76 // below, only multiple Scattering happens 77 // 78 G4ThreeVector position = endPoint->GetPosi 79 G4ThreeVector direction = endPoint->GetMom 80 81 G4double truePathLength = aStep->GetStepLe 82 G4double geomPathLength = position.x() + 0 83 G4double ratio = geomPathLength / truePath 84 fRunAction->SumPathLength(truePathLength, 85 G4AnalysisManager* analysisManager = G4Ana 86 analysisManager->FillH1(1, truePathLength) 87 analysisManager->FillH1(2, geomPathLength) 88 analysisManager->FillH1(3, ratio); 89 90 G4double yend = position.y(), zend = posit 91 G4double lateralDisplacement = std::sqrt(y 92 fRunAction->SumLateralDisplacement(lateral 93 analysisManager->FillH1(4, lateralDisplace 94 95 G4double psi = std::atan(lateralDisplaceme 96 fRunAction->SumPsi(psi); 97 analysisManager->FillH1(5, psi); 98 99 G4double xdir = direction.x(), ydir = dire 100 G4double tetaPlane = std::atan2(ydir, xdir 101 fRunAction->SumTetaPlane(tetaPlane); 102 analysisManager->FillH1(6, tetaPlane); 103 tetaPlane = std::atan2(zdir, xdir); 104 fRunAction->SumTetaPlane(tetaPlane); 105 analysisManager->FillH1(6, tetaPlane); 106 107 G4double phiPos = std::atan2(zend, yend); 108 analysisManager->FillH1(7, phiPos); 109 G4double phiDir = std::atan2(zdir, ydir); 110 analysisManager->FillH1(8, phiDir); 111 112 G4double phiCorrel = 0.; 113 if (lateralDisplacement > 0.) phiCorrel = 114 fRunAction->SumPhiCorrel(phiCorrel); 115 analysisManager->FillH1(9, phiCorrel); 116 } 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 } 193 194 //....oooOO0OOooo........oooOO0OOooo........oo 195