Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer << 3 // * DISCLAIMER * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th << 5 // * The following disclaimer summarizes all the specific disclaimers * 6 // * the Geant4 Collaboration. It is provided << 6 // * of contributors to this software. The specific disclaimers,which * 7 // * conditions of the Geant4 Software License << 7 // * govern, are listed with their locations in: * 8 // * LICENSE and available at http://cern.ch/ << 8 // * http://cern.ch/geant4/license * 9 // * include a list of copyright holders. << 10 // * 9 // * * 11 // * Neither the authors of this software syst 10 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 11 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 12 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 13 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file << 14 // * use. * 16 // * for the full disclaimer and the limitatio << 17 // * 15 // * * 18 // * This code implementation is the result << 16 // * This code implementation is the intellectual property of the * 19 // * technical work of the GEANT4 collaboratio << 17 // * GEANT4 collaboration. * 20 // * By using, copying, modifying or distri << 18 // * By copying, distributing or modifying the Program (or any work * 21 // * any work based on the software) you ag << 19 // * based on the Program) you indicate your acceptance of this * 22 // * use in resulting scientific publicati << 20 // * statement, and all its terms. * 23 // * acceptance of all terms of the Geant4 Sof << 24 // ******************************************* 21 // ******************************************************************** 25 // 22 // 26 /// \file electromagnetic/TestEm3/src/Stepping << 23 // $Id: SteppingAction.cc,v 1.19 2005/02/02 16:42:45 maire Exp $ 27 /// \brief Implementation of the SteppingActio << 24 // GEANT4 tag $Name: geant4-07-00-patch-01 $ 28 // << 29 // 25 // 30 //....oooOO0OOooo........oooOO0OOooo........oo 26 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 31 //....oooOO0OOooo........oooOO0OOooo........oo 27 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 32 28 33 #include "SteppingAction.hh" 29 #include "SteppingAction.hh" 34 30 35 #include "DetectorConstruction.hh" 31 #include "DetectorConstruction.hh" 36 #include "EventAction.hh" 32 #include "EventAction.hh" 37 #include "HistoManager.hh" 33 #include "HistoManager.hh" 38 #include "Run.hh" << 39 34 40 #include "G4PhysicalConstants.hh" << 35 #include "G4Track.hh" 41 #include "G4Positron.hh" 36 #include "G4Positron.hh" 42 #include "G4RunManager.hh" 37 #include "G4RunManager.hh" 43 38 44 //....oooOO0OOooo........oooOO0OOooo........oo 39 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 45 40 46 SteppingAction::SteppingAction(DetectorConstru << 41 SteppingAction::SteppingAction(DetectorConstruction* det, EventAction* evt, 47 : fDetector(det), fEventAct(evt) << 42 HistoManager* hist) >> 43 :G4UserSteppingAction(),detector(det),eventAct(evt),histoManager(hist) >> 44 {} >> 45 >> 46 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 47 >> 48 SteppingAction::~SteppingAction() 48 {} 49 {} 49 50 50 //....oooOO0OOooo........oooOO0OOooo........oo 51 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 51 52 52 void SteppingAction::UserSteppingAction(const 53 void SteppingAction::UserSteppingAction(const G4Step* aStep) 53 { 54 { 54 // track informations << 55 const G4StepPoint* prePoint = aStep->GetPreS 55 const G4StepPoint* prePoint = aStep->GetPreStepPoint(); 56 << 56 57 // if World, return << 57 //if World, returns 58 // 58 // 59 G4VPhysicalVolume* volume = prePoint->GetTou << 59 G4VPhysicalVolume* volume = prePoint->GetPhysicalVolume(); 60 // if sum of absorbers do not fill exactly a << 60 //if sum of absorbers do not fill exactly a layer: check material, not volume. 61 const G4Material* mat = volume->GetLogicalVo << 61 G4Material* mat = volume->GetLogicalVolume()->GetMaterial(); 62 if (mat == fDetector->GetWorldMaterial()) re << 62 if (mat == detector->GetWorldMaterial()) return; 63 << 63 64 const G4StepPoint* endPoint = aStep->GetPost 64 const G4StepPoint* endPoint = aStep->GetPostStepPoint(); 65 const G4ParticleDefinition* particle = aStep << 65 const G4Track* track = aStep->GetTrack(); 66 << 66 const G4ParticleDefinition* particle = track->GetDefinition(); 67 // here we are in an absorber. Locate it << 67 68 // << 68 //locate the absorber 69 G4int absorNum = prePoint->GetTouchableHandl << 69 // 70 G4int layerNum = prePoint->GetTouchableHandl << 70 G4int absorNum = volume->GetCopyNo(); 71 << 71 G4int layerNum = prePoint->GetTouchable()->GetReplicaNumber(1); 72 // get Run << 72 73 Run* run = static_cast<Run*>(G4RunManager::G << 73 // collect energy deposit 74 << 74 G4double edep = aStep->GetTotalEnergyDeposit(); 75 // collect energy deposit taking into accoun << 75 76 G4double edep = aStep->GetTotalEnergyDeposit << 77 << 78 // collect step length of charged particles 76 // collect step length of charged particles 79 G4double stepl = 0.; 77 G4double stepl = 0.; 80 if (particle->GetPDGCharge() != 0.) { << 78 if (particle->GetPDGCharge() != 0.) stepl = aStep->GetStepLength(); 81 stepl = aStep->GetStepLength(); << 79 82 run->AddChargedStep(); << 83 } << 84 else { << 85 run->AddNeutralStep(); << 86 } << 87 << 88 // G4cout << "Nabs= " << absorNum << " ed << 89 << 90 // sum up per event 80 // sum up per event 91 fEventAct->SumEnergy(absorNum, edep, stepl); << 81 eventAct->SumEnergy(absorNum,edep,stepl); 92 << 82 93 // longitudinal profile of edep per absorber << 83 //longitudinal profile of edep per absorber 94 if (edep > 0.) { << 84 if (edep>0.) histoManager->FillHisto(MaxAbsor+absorNum, layerNum+1., edep); 95 G4AnalysisManager::Instance()->FillH1(kMax << 85 96 } << 86 //energy flow 97 // energy flow << 87 // 98 // << 88 //leaving an absorber ? in forward direction ? 99 // unique identificator of layer+absorber << 89 if ((endPoint->GetPhysicalVolume() != volume) 100 G4int Idnow = (fDetector->GetNbOfAbsor()) * << 90 && (track->GetMomentumDirection().x() > 0.)) { 101 G4int plane; << 91 G4int planNum = 1 + (detector->GetNbOfAbsor())*layerNum + absorNum; 102 // << 92 G4double EnLeaving = track->GetKineticEnergy(); 103 // leaving the absorber ? << 93 if (particle == G4Positron::Positron()) EnLeaving += 2*electron_mass_c2; 104 if (endPoint->GetStepStatus() == fGeomBounda << 94 G4int ih = 2*MaxAbsor + 1; 105 G4ThreeVector position = endPoint->GetPosi << 95 if (track->GetTrackID() != 1) ih += 1; 106 G4ThreeVector direction = endPoint->GetMom << 96 histoManager->FillHisto(ih, (G4double)planNum, EnLeaving); 107 G4double sizeYZ = 0.5 * fDetector->GetCalo << 108 G4double Eflow = endPoint->GetKineticEnerg << 109 if (particle == G4Positron::Positron()) Ef << 110 if ((std::abs(position.y()) >= sizeYZ) || << 111 run->SumLateralEleak(Idnow, Eflow); << 112 else if (direction.x() >= 0.) << 113 run->SumEnergyFlow(plane = Idnow + 1, Ef << 114 else << 115 run->SumEnergyFlow(plane = Idnow, -Eflow << 116 } 97 } 117 98 118 //// example of Birk attenuation << 99 //// example of Birk attenuation 119 /// G4double destep = aStep->GetTotalEnerg << 100 //// G4double destep = aStep->GetTotalEnergyDeposit(); 120 /// G4double response = BirksAttenuation(aSt << 101 //// G4double response = BirkAttenuation(aStep); 121 /// G4cout << " Destep: " << destep/keV << " << 102 //// G4cout << " Destep: " << destep/keV << " keV" 122 /// << " response after Birks: " << re << 103 //// << " response after Birk: " << response/keV << " keV" << G4endl; 123 } 104 } 124 105 125 //....oooOO0OOooo........oooOO0OOooo........oo 106 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 126 107 127 G4double SteppingAction::BirksAttenuation(cons << 108 G4double SteppingAction::BirkAttenuation(const G4Step* aStep) 128 { 109 { 129 // Example of Birk attenuation law in organi << 110 //Example of Birk attenuation law in organic scintillators. 130 // adapted from Geant3 PHYS337. See MIN 80 ( << 111 //adapted from Geant3 PHYS337. See MIN 80 (1970) 239-244 131 // << 112 // 132 const G4Material* material = aStep->GetTrack << 113 const G4String myMaterial = "Scintillator"; 133 G4double birk1 = material->GetIonisation()-> << 114 const G4double birk1 = 0.013*g/(MeV*cm2); 134 G4double destep = aStep->GetTotalEnergyDepos << 115 // 135 G4double stepl = aStep->GetStepLength(); << 116 G4double destep = aStep->GetTotalEnergyDeposit(); 136 G4double charge = aStep->GetTrack()->GetDefi << 117 G4Material* material = aStep->GetTrack()->GetMaterial(); 137 // << 118 G4double charge = aStep->GetTrack()->GetDefinition()->GetPDGCharge(); 138 G4double response = destep; << 119 // 139 if (birk1 * destep * stepl * charge != 0.) { << 120 G4double response = destep; 140 response = destep / (1. + birk1 * destep / << 121 if ((material->GetName()==myMaterial)&&(charge!=0.)) 141 } << 122 { 142 return response; << 123 G4double correction = >> 124 birk1*destep/((material->GetDensity())*(aStep->GetStepLength())); >> 125 response = destep/(1. + correction); >> 126 } >> 127 return response; 143 } 128 } 144 129 145 //....oooOO0OOooo........oooOO0OOooo........oo 130 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 131 146 132