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 /// \file electromagnetic/TestEm15/src/SteppingAction.cc 27 /// \brief Implementation of the SteppingActio 27 /// \brief Implementation of the SteppingAction class 28 // 28 // 29 // << 29 // $Id$ >> 30 // 30 //....oooOO0OOooo........oooOO0OOooo........oo 31 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 31 //....oooOO0OOooo........oooOO0OOooo........oo 32 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 32 33 33 #include "SteppingAction.hh" 34 #include "SteppingAction.hh" 34 << 35 #include "DetectorConstruction.hh" 35 #include "DetectorConstruction.hh" 36 #include "HistoManager.hh" << 36 #include "PrimaryGeneratorAction.hh" 37 #include "RunAction.hh" 37 #include "RunAction.hh" >> 38 #include "HistoManager.hh" 38 39 39 #include "G4ParticleTypes.hh" << 40 #include "G4RunManager.hh" 40 #include "G4RunManager.hh" 41 41 42 #include <G4RotationMatrix.hh> << 43 #include <G4ThreeVector.hh> << 44 << 45 //....oooOO0OOooo........oooOO0OOooo........oo 42 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 46 43 47 SteppingAction::SteppingAction(DetectorConstru << 44 SteppingAction::SteppingAction(DetectorConstruction* det, 48 : G4UserSteppingAction(), fDetector(det), fR << 45 PrimaryGeneratorAction* prim, RunAction* RuAct) 49 {} << 46 :fDetector(det), fPrimary(prim), fRunAction(RuAct) >> 47 { } 50 48 51 //....oooOO0OOooo........oooOO0OOooo........oo 49 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 52 50 53 SteppingAction::~SteppingAction() {} << 51 SteppingAction::~SteppingAction() >> 52 { } 54 53 55 //....oooOO0OOooo........oooOO0OOooo........oo 54 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 56 55 57 void SteppingAction::UserSteppingAction(const 56 void SteppingAction::UserSteppingAction(const G4Step* aStep) 58 { 57 { 59 G4StepPoint* prePoint = aStep->GetPreStepPoi 58 G4StepPoint* prePoint = aStep->GetPreStepPoint(); 60 << 59 61 // if World --> return 60 // if World --> return 62 if (prePoint->GetTouchableHandle()->GetVolum << 61 if(prePoint->GetTouchableHandle()->GetVolume()==fDetector->GetWorld()) return; 63 << 62 64 // here we enter in the absorber Box 63 // here we enter in the absorber Box 65 // tag the event to be killed anyway after t 64 // tag the event to be killed anyway after this step 66 // 65 // 67 G4RunManager::GetRunManager()->AbortEvent(); 66 G4RunManager::GetRunManager()->AbortEvent(); 68 << 67 69 // count processes and keep only Multiple Sc << 68 //count processes and keep only Multiple Scattering 70 // << 69 // 71 G4StepPoint* endPoint = aStep->GetPostStepPo 70 G4StepPoint* endPoint = aStep->GetPostStepPoint(); 72 G4String procName = endPoint->GetProcessDefi 71 G4String procName = endPoint->GetProcessDefinedStep()->GetProcessName(); 73 fRunAction->CountProcesses(procName); 72 fRunAction->CountProcesses(procName); 74 << 73 75 if (procName == "msc" || procName == "muMsc" << 74 if (procName != "msc" && procName != "muMsc" && procName != "stepMax") return; 76 // below, only multiple Scattering happens << 75 77 // << 76 //below, only multiple Scattering happens 78 G4ThreeVector position = endPoint->GetPosi << 77 // 79 G4ThreeVector direction = endPoint->GetMom << 78 G4ThreeVector position = endPoint->GetPosition(); 80 << 79 G4ThreeVector direction = endPoint->GetMomentumDirection(); 81 G4double truePathLength = aStep->GetStepLe << 80 82 G4double geomPathLength = position.x() + 0 << 81 G4double truePathLength = aStep->GetStepLength(); 83 G4double ratio = geomPathLength / truePath << 82 G4double geomPathLength = position.x() + 0.5*fDetector->GetBoxSize(); 84 fRunAction->SumPathLength(truePathLength, << 83 G4double ratio = geomPathLength/truePathLength; 85 G4AnalysisManager* analysisManager = G4Ana << 84 fRunAction->SumPathLength(truePathLength,geomPathLength); 86 analysisManager->FillH1(1, truePathLength) << 85 G4AnalysisManager* analysisManager = G4AnalysisManager::Instance(); 87 analysisManager->FillH1(2, geomPathLength) << 86 analysisManager->FillH1(1,truePathLength); 88 analysisManager->FillH1(3, ratio); << 87 analysisManager->FillH1(2,geomPathLength); 89 << 88 analysisManager->FillH1(3,ratio); 90 G4double yend = position.y(), zend = posit << 89 91 G4double lateralDisplacement = std::sqrt(y << 90 G4double yend = position.y(), zend = position.z(); 92 fRunAction->SumLateralDisplacement(lateral << 91 G4double lateralDisplacement = std::sqrt(yend*yend + zend*zend); 93 analysisManager->FillH1(4, lateralDisplace << 92 fRunAction->SumLateralDisplacement(lateralDisplacement); 94 << 93 analysisManager->FillH1(4,lateralDisplacement); 95 G4double psi = std::atan(lateralDisplaceme << 94 96 fRunAction->SumPsi(psi); << 95 G4double psi = std::atan(lateralDisplacement/geomPathLength); 97 analysisManager->FillH1(5, psi); << 96 fRunAction->SumPsi(psi); 98 << 97 analysisManager->FillH1(5,psi); 99 G4double xdir = direction.x(), ydir = dire << 98 100 G4double tetaPlane = std::atan2(ydir, xdir << 99 G4double xdir = direction.x(), ydir = direction.y(), zdir = direction.z(); 101 fRunAction->SumTetaPlane(tetaPlane); << 100 G4double tetaPlane = std::atan2(ydir, xdir); 102 analysisManager->FillH1(6, tetaPlane); << 101 fRunAction->SumTetaPlane(tetaPlane); 103 tetaPlane = std::atan2(zdir, xdir); << 102 analysisManager->FillH1(6,tetaPlane); 104 fRunAction->SumTetaPlane(tetaPlane); << 103 tetaPlane = std::atan2(zdir, xdir); 105 analysisManager->FillH1(6, tetaPlane); << 104 fRunAction->SumTetaPlane(tetaPlane); 106 << 105 analysisManager->FillH1(6,tetaPlane); 107 G4double phiPos = std::atan2(zend, yend); << 106 108 analysisManager->FillH1(7, phiPos); << 107 G4double phiPos = std::atan2(zend, yend); 109 G4double phiDir = std::atan2(zdir, ydir); << 108 analysisManager->FillH1(7,phiPos); 110 analysisManager->FillH1(8, phiDir); << 109 G4double phiDir = std::atan2(zdir, ydir); 111 << 110 analysisManager->FillH1(8,phiDir); 112 G4double phiCorrel = 0.; << 111 113 if (lateralDisplacement > 0.) phiCorrel = << 112 G4double phiCorrel = 0.; 114 fRunAction->SumPhiCorrel(phiCorrel); << 113 if (lateralDisplacement > 0.) 115 analysisManager->FillH1(9, phiCorrel); << 114 phiCorrel = (yend*ydir + zend*zdir)/lateralDisplacement; 116 } << 115 fRunAction->SumPhiCorrel(phiCorrel); 117 else if (procName == "conv" || procName == " << 116 analysisManager->FillH1(9,phiCorrel); 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 } 117 } 193 118 194 //....oooOO0OOooo........oooOO0OOooo........oo 119 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 120 >> 121 195 122