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.20 2005/05/18 15:28:37 maire Exp $ 27 /// \brief Implementation of the SteppingActio << 24 // GEANT4 tag $Name: geant4-07-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" >> 32 #include "RunAction.hh" 36 #include "EventAction.hh" 33 #include "EventAction.hh" 37 #include "HistoManager.hh" 34 #include "HistoManager.hh" 38 #include "Run.hh" << 39 35 40 #include "G4PhysicalConstants.hh" << 36 #include "G4Track.hh" 41 #include "G4Positron.hh" 37 #include "G4Positron.hh" 42 #include "G4RunManager.hh" 38 #include "G4RunManager.hh" 43 39 44 //....oooOO0OOooo........oooOO0OOooo........oo 40 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 45 41 46 SteppingAction::SteppingAction(DetectorConstru << 42 SteppingAction::SteppingAction(DetectorConstruction* det, RunAction* run, 47 : fDetector(det), fEventAct(evt) << 43 EventAction* evt, HistoManager* hist) >> 44 :G4UserSteppingAction(),detector(det),runAct(run),eventAct(evt), >> 45 histoManager(hist) >> 46 {} >> 47 >> 48 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 49 >> 50 SteppingAction::~SteppingAction() 48 {} 51 {} 49 52 50 //....oooOO0OOooo........oooOO0OOooo........oo 53 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 51 54 52 void SteppingAction::UserSteppingAction(const 55 void SteppingAction::UserSteppingAction(const G4Step* aStep) 53 { 56 { 54 // track informations << 57 //initialize Energy flow 55 const G4StepPoint* prePoint = aStep->GetPreS << 58 if (aStep->GetTrack()->GetCurrentStepNumber() == 1) Idold = 0; 56 << 59 57 // if World, return << 60 //if World, return 58 // 61 // 59 G4VPhysicalVolume* volume = prePoint->GetTou << 62 const G4StepPoint* prePoint = aStep->GetPreStepPoint(); 60 // if sum of absorbers do not fill exactly a << 63 G4VPhysicalVolume* volume = prePoint->GetPhysicalVolume(); 61 const G4Material* mat = volume->GetLogicalVo << 64 //if sum of absorbers do not fill exactly a layer: check material, not volume. 62 if (mat == fDetector->GetWorldMaterial()) re << 65 G4Material* mat = volume->GetLogicalVolume()->GetMaterial(); 63 << 66 if (mat == detector->GetWorldMaterial()) return; >> 67 >> 68 //here we are in an absorber. Locate it >> 69 // >> 70 G4int absorNum = volume->GetCopyNo(); >> 71 G4int layerNum = prePoint->GetTouchable()->GetReplicaNumber(1); >> 72 >> 73 //track informations 64 const G4StepPoint* endPoint = aStep->GetPost 74 const G4StepPoint* endPoint = aStep->GetPostStepPoint(); 65 const G4ParticleDefinition* particle = aStep << 75 const G4Track* track = aStep->GetTrack(); 66 << 76 const G4ParticleDefinition* particle = track->GetDefinition(); 67 // here we are in an absorber. Locate it << 77 68 // << 78 // collect energy deposit 69 G4int absorNum = prePoint->GetTouchableHandl << 79 G4double edep = aStep->GetTotalEnergyDeposit(); 70 G4int layerNum = prePoint->GetTouchableHandl << 80 71 << 72 // get Run << 73 Run* run = static_cast<Run*>(G4RunManager::G << 74 << 75 // collect energy deposit taking into accoun << 76 G4double edep = aStep->GetTotalEnergyDeposit << 77 << 78 // collect step length of charged particles 81 // collect step length of charged particles 79 G4double stepl = 0.; 82 G4double stepl = 0.; 80 if (particle->GetPDGCharge() != 0.) { << 83 if (particle->GetPDGCharge() != 0.) stepl = aStep->GetStepLength(); 81 stepl = aStep->GetStepLength(); << 84 82 run->AddChargedStep(); << 83 } << 84 else { << 85 run->AddNeutralStep(); << 86 } << 87 << 88 // G4cout << "Nabs= " << absorNum << " ed << 89 << 90 // sum up per event 85 // sum up per event 91 fEventAct->SumEnergy(absorNum, edep, stepl); << 86 eventAct->SumEnergy(absorNum,edep,stepl); 92 << 87 93 // longitudinal profile of edep per absorber << 88 //longitudinal profile of edep per absorber 94 if (edep > 0.) { << 89 if (edep>0.) histoManager->FillHisto(MaxAbsor+absorNum, layerNum+1., edep); 95 G4AnalysisManager::Instance()->FillH1(kMax << 90 96 } << 91 //energy flow 97 // energy flow << 92 // 98 // << 93 // unique identificator of layer+absorber 99 // unique identificator of layer+absorber << 94 G4int Idnow = (detector->GetNbOfAbsor())*layerNum + absorNum; 100 G4int Idnow = (fDetector->GetNbOfAbsor()) * << 95 if (track->GetCurrentStepNumber() == 1) Idold = Idnow; // track begins 101 G4int plane; << 96 // 102 // << 97 //first step in the absorber ? 103 // leaving the absorber ? << 98 G4int plane=0; 104 if (endPoint->GetStepStatus() == fGeomBounda << 99 if (prePoint->GetStepStatus() == fGeomBoundary) { 105 G4ThreeVector position = endPoint->GetPosi << 100 G4double Eflow = prePoint->GetKineticEnergy(); 106 G4ThreeVector direction = endPoint->GetMom << 101 if (particle == G4Positron::Positron()) Eflow += 2*electron_mass_c2; 107 G4double sizeYZ = 0.5 * fDetector->GetCalo << 102 if (Idnow > Idold) runAct->sumForwEflow(plane=Idnow, Eflow); >> 103 else if (Idnow < Idold) runAct->sumBackEflow(plane=Idnow+1, Eflow); >> 104 Idold = Idnow; >> 105 } >> 106 >> 107 //last plane : forward leakage >> 108 G4int Idlast = (detector->GetNbOfAbsor())*(detector->GetNbOfLayers()); >> 109 if ((Idnow == Idlast) && (endPoint->GetStepStatus() == fGeomBoundary)) { 108 G4double Eflow = endPoint->GetKineticEnerg 110 G4double Eflow = endPoint->GetKineticEnergy(); 109 if (particle == G4Positron::Positron()) Ef << 111 if (particle == G4Positron::Positron()) Eflow += 2*electron_mass_c2; 110 if ((std::abs(position.y()) >= sizeYZ) || << 112 runAct->sumForwEflow(plane=Idlast+1, Eflow); 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 } 113 } 117 114 118 //// example of Birk attenuation << 115 //// example of Birk attenuation 119 /// G4double destep = aStep->GetTotalEnerg << 116 //// G4double destep = aStep->GetTotalEnergyDeposit(); 120 /// G4double response = BirksAttenuation(aSt << 117 //// G4double response = BirkAttenuation(aStep); 121 /// G4cout << " Destep: " << destep/keV << " << 118 //// G4cout << " Destep: " << destep/keV << " keV" 122 /// << " response after Birks: " << re << 119 //// << " response after Birk: " << response/keV << " keV" << G4endl; 123 } 120 } 124 121 125 //....oooOO0OOooo........oooOO0OOooo........oo 122 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 126 123 127 G4double SteppingAction::BirksAttenuation(cons << 124 G4double SteppingAction::BirkAttenuation(const G4Step* aStep) 128 { 125 { 129 // Example of Birk attenuation law in organi << 126 //Example of Birk attenuation law in organic scintillators. 130 // adapted from Geant3 PHYS337. See MIN 80 ( << 127 //adapted from Geant3 PHYS337. See MIN 80 (1970) 239-244 131 // << 128 // 132 const G4Material* material = aStep->GetTrack << 129 const G4String myMaterial = "Scintillator"; 133 G4double birk1 = material->GetIonisation()-> << 130 const G4double birk1 = 0.013*g/(MeV*cm2); 134 G4double destep = aStep->GetTotalEnergyDepos << 131 // 135 G4double stepl = aStep->GetStepLength(); << 132 G4double destep = aStep->GetTotalEnergyDeposit(); 136 G4double charge = aStep->GetTrack()->GetDefi << 133 G4Material* material = aStep->GetTrack()->GetMaterial(); 137 // << 134 G4double charge = aStep->GetTrack()->GetDefinition()->GetPDGCharge(); 138 G4double response = destep; << 135 // 139 if (birk1 * destep * stepl * charge != 0.) { << 136 G4double response = destep; 140 response = destep / (1. + birk1 * destep / << 137 if ((material->GetName()==myMaterial)&&(charge!=0.)) 141 } << 138 { 142 return response; << 139 G4double correction = >> 140 birk1*destep/((material->GetDensity())*(aStep->GetStepLength())); >> 141 response = destep/(1. + correction); >> 142 } >> 143 return response; 143 } 144 } 144 145 145 //....oooOO0OOooo........oooOO0OOooo........oo 146 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 147 146 148