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 // Hadrontherapy advanced example for Geant4 << 26 // $Id: HadrontherapyProtonSteppingAction.cc; May 2005 27 // See more at: https://twiki.cern.ch/twiki/bi << 27 // ---------------------------------------------------------------------------- >> 28 // GEANT 4 - Hadrontherapy example >> 29 // ---------------------------------------------------------------------------- >> 30 // Code developed by: >> 31 // >> 32 // G.A.P. Cirrone(a)*, F. Di Rosa(a), S. Guatelli(b), G. Russo(a) >> 33 // >> 34 // (a) Laboratori Nazionali del Sud >> 35 // of the INFN, Catania, Italy >> 36 // (b) INFN Section of Genova, Genova, Italy >> 37 // >> 38 // * cirrone@lns.infn.it >> 39 // ---------------------------------------------------------------------------- 28 40 29 #include "G4SteppingManager.hh" 41 #include "G4SteppingManager.hh" 30 #include "G4TrackVector.hh" 42 #include "G4TrackVector.hh" 31 #include "HadrontherapySteppingAction.hh" 43 #include "HadrontherapySteppingAction.hh" 32 #include "G4ios.hh" 44 #include "G4ios.hh" 33 #include "G4SteppingManager.hh" 45 #include "G4SteppingManager.hh" 34 #include "G4Track.hh" 46 #include "G4Track.hh" 35 #include "G4Step.hh" 47 #include "G4Step.hh" 36 #include "G4StepPoint.hh" 48 #include "G4StepPoint.hh" 37 #include "G4TrackStatus.hh" 49 #include "G4TrackStatus.hh" 38 #include "G4TrackVector.hh" 50 #include "G4TrackVector.hh" 39 #include "G4ParticleDefinition.hh" 51 #include "G4ParticleDefinition.hh" 40 #include "G4ParticleTypes.hh" 52 #include "G4ParticleTypes.hh" 41 #include "G4UserEventAction.hh" << 53 42 #include "G4TransportationManager.hh" << 54 #ifdef G4ANALYSIS_USE 43 #include "G4VSensitiveDetector.hh" << 55 #include "HadrontherapyAnalysisManager.hh" >> 56 #endif >> 57 44 #include "HadrontherapyRunAction.hh" 58 #include "HadrontherapyRunAction.hh" 45 #include "HadrontherapyMatrix.hh" << 46 #include "G4SystemOfUnits.hh" << 47 59 48 ////////////////////////////////////////////// << 60 HadrontherapySteppingAction::HadrontherapySteppingAction( HadrontherapyRunAction* run) 49 HadrontherapySteppingAction::HadrontherapyStep << 50 { 61 { 51 runAction = run; << 62 runAction = run; 52 } 63 } 53 64 54 ////////////////////////////////////////////// << 55 HadrontherapySteppingAction::~HadrontherapySte 65 HadrontherapySteppingAction::~HadrontherapySteppingAction() 56 { 66 { 57 } 67 } 58 68 59 ////////////////////////////////////////////// << 60 void HadrontherapySteppingAction::UserStepping 69 void HadrontherapySteppingAction::UserSteppingAction(const G4Step* aStep) 61 { << 70 { 62 << 71 // Electromagnetic and hadronic processes of primary particles in the phantom 63 // The followings are calls to usefuls inf << 72 64 // Please, comment out them if want to use << 73 if ((aStep -> GetTrack() -> GetTrackID() == 1) && 65 << 74 (aStep -> GetTrack() -> GetVolume() -> GetName() == "PhantomPhys") && 66 // G4Track* theTrack = aStep->GetTrack(); << 75 (aStep -> GetPostStepPoint() -> GetProcessDefinedStep() != NULL)) 67 << 76 { 68 G4StepPoint* PreStep = aStep->GetPreStepPo << 77 G4String process = aStep -> GetPostStepPoint() -> 69 G4StepPoint* PostStep = aStep->GetPostStep << 78 GetProcessDefinedStep() -> GetProcessName(); 70 << 79 71 G4TouchableHandle touchPreStep = PreStep-> << 80 if ((process == "Transportation") || (process == "StepLimiter")) {;} 72 G4TouchableHandle touchPostStep = PostStep << 81 else { 73 << 82 if ((process == "msc") || (process == "hLowEIoni") || (process == "hIoni")) 74 //G4double PreStepX =PreStep->GetPosition( << 83 { 75 //G4double PreStepY =PreStep->GetPosition( << 84 runAction -> AddEMProcess(); 76 //G4double PreStepZ =PreStep->GetPosition( << 85 } 77 << 86 else 78 //G4double PostStepX =PostStep->GetPositio << 87 { 79 //G4double PostStepY =PostStep->GetPositio << 88 runAction -> AddHadronicProcess(); 80 //G4double PostStepZ =PostStep->GetPositi << 89 81 << 90 if ( (process != "LElastic") && (process != "ProtonInelastic") && (process != "hElastic") ) 82 //To get the current volume: << 91 G4cout << "Warning! Unknown proton process: "<< process << G4endl; 83 G4VPhysicalVolume* volumePre = touchPreSte << 92 } 84 //G4VPhysicalVolume* volumePost =touchPost << 93 } 85 << 94 } 86 //To get its name: << 95 87 G4String namePre = volumePre->GetName(); << 96 // Retrieve information about the secondaries originated in the phantom 88 << 97 89 << 98 #ifdef G4ANALYSIS_USE 90 // positions in the global coordinate syst << 99 G4SteppingManager* steppingManager = fpSteppingManager; 91 //G4ThreeVector posPreStep = PreStep->Get << 100 G4Track* theTrack = aStep -> GetTrack(); 92 //G4ThreeVector posPostStep = PostStep->Ge << 101 93 << 102 // check if it is alive 94 //G4int eventNum = G4RunManager::GetRunMan << 103 if(theTrack-> GetTrackStatus() == fAlive) { return; } 95 << 104 96 //G4double parentID =aStep->GetTrack()->Ge << 105 // Retrieve the secondary particles 97 //G4double trackID =aStep->GetTrack()->Get << 106 G4TrackVector* fSecondary = steppingManager -> GetfSecondary(); 98 << 107 99 G4double eKin = aStep -> GetPreStepPoint() << 108 for(size_t lp1=0;lp1<(*fSecondary).size(); lp1++) 100 << 109 { 101 G4double PosX = aStep->GetTrack()->GetPosi << 110 G4String volumeName = (*fSecondary)[lp1] -> GetVolume() -> GetName(); 102 G4double PosY = aStep->GetTrack()->GetPosi << 111 103 G4double PosZ = aStep->GetTrack()->GetPosi << 112 if (volumeName == "PhantomPhys") 104 << 113 { 105 G4String volume= aStep->GetTrack()->GetVo << 114 G4String secondaryParticleName = (*fSecondary)[lp1]->GetDefinition() -> GetParticleName(); 106 G4Track* theTrack = aStep->GetTrack(); << 115 G4double secondaryParticleKineticEnergy = (*fSecondary)[lp1] -> GetKineticEnergy(); 107 << 116 108 //G4String material= aStep -> GetTrack() - << 117 HadrontherapyAnalysisManager* analysis = HadrontherapyAnalysisManager::getInstance(); 109 //G4cout << "material " << material << G << 110 //G4String volume= aStep->GetTrack()->Get << 111 //G4String pvname= pv-> GetName(); << 112 << 113 G4String particleName = aStep->GetTrack()- << 114 << 115 G4double momentumX = aStep->GetTrack()->G << 116 G4double momentumY = aStep->GetTrack()->G << 117 G4double momentumZ = aStep->GetTrack()->G << 118 << 119 << 120 G4ParticleDefinition *particleDef = theTra << 121 G4int pdg = particleDef ->GetPDGEncoding() << 122 << 123 if(namePre == "VirtualLayer") << 124 { << 125 std::ofstream WriteDataIn("Virtual_Lay << 126 WriteDataIn << 127 << 128 << eKin <<" " // 1 << 129 << PosX <<" " // 2 << 130 << PosY <<" " // 3 << 131 << PosZ <<" " // 4 << 132 << momentumX <<" " // 5 << 133 << momentumY <<" " // 6 << 134 << momentumZ <<" " // 7 << 135 << pdg << 136 //<< theTrack << '\t' << " << 137 << 138 << G4endl; << 139 << 140 theTrack -> SetTrackStatus(fKillTrackA << 141 << 142 118 >> 119 if (secondaryParticleName == "e-") >> 120 analysis -> electronEnergyDistribution(secondaryParticleKineticEnergy/MeV); >> 121 >> 122 if (secondaryParticleName == "gamma") >> 123 analysis -> gammaEnergyDistribution(secondaryParticleKineticEnergy/MeV); >> 124 >> 125 if (secondaryParticleName == "deuteron") >> 126 analysis -> deuteronEnergyDistribution(secondaryParticleKineticEnergy/MeV); >> 127 >> 128 if (secondaryParticleName == "triton") >> 129 analysis -> tritonEnergyDistribution(secondaryParticleKineticEnergy/MeV); >> 130 >> 131 if (secondaryParticleName == "alpha") >> 132 analysis -> alphaEnergyDistribution(secondaryParticleKineticEnergy/MeV); >> 133 >> 134 G4double z = (*fSecondary)[lp1]-> GetDynamicParticle() -> GetDefinition() -> GetPDGCharge(); >> 135 if (z > 0.) >> 136 { >> 137 G4int a = (*fSecondary)[lp1]-> GetDynamicParticle() -> GetDefinition() -> GetBaryonNumber(); >> 138 G4int electronOccupancy = (*fSecondary)[lp1] -> GetDynamicParticle() -> GetTotalOccupancy(); >> 139 // If a generic ion is originated in the phantom, its baryonic number, PDG charge, >> 140 // total number of electrons in the orbitals are stored in a ntuple >> 141 analysis -> genericIonInformation(a, z, electronOccupancy, secondaryParticleKineticEnergy/MeV); >> 142 } >> 143 } 143 } 144 } 144 << 145 #endif 145 << 146 << 147 << 148 } 146 } >> 147 >> 148 149 149 150 150 151 151 152 152