Geant4 Cross Reference |
1 // 2 // ******************************************************************** 3 // * License and Disclaimer * 4 // * * 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. * 10 // * * 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitation of liability. * 17 // * * 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************************************** 25 // 26 // 27 /// \file Par02FastSimModelTracker.cc 28 /// \brief Implementation of the Par02FastSimModelTracker class 29 30 #include "Par02FastSimModelTracker.hh" 31 32 #include "Par02EventInformation.hh" 33 #include "Par02Output.hh" 34 #include "Par02PrimaryParticleInformation.hh" 35 #include "Par02Smearer.hh" 36 37 #include "G4AnalysisManager.hh" 38 #include "G4Electron.hh" 39 #include "G4Event.hh" 40 #include "G4FieldTrack.hh" 41 #include "G4FieldTrackUpdator.hh" 42 #include "G4Gamma.hh" 43 #include "G4PathFinder.hh" 44 #include "G4Positron.hh" 45 #include "G4RunManager.hh" 46 #include "G4SystemOfUnits.hh" 47 #include "G4Track.hh" 48 #include "Randomize.hh" 49 50 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 51 52 Par02FastSimModelTracker::Par02FastSimModelTracker( 53 G4String aModelName, G4Region* aEnvelope, Par02DetectorParametrisation::Parametrisation aType) 54 : G4VFastSimulationModel(aModelName, aEnvelope), 55 fCalculateParametrisation(), 56 fParametrisation(aType) 57 {} 58 59 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 60 61 Par02FastSimModelTracker::Par02FastSimModelTracker(G4String aModelName, G4Region* aEnvelope) 62 : G4VFastSimulationModel(aModelName, aEnvelope), 63 fCalculateParametrisation(), 64 fParametrisation(Par02DetectorParametrisation::eCMS) 65 {} 66 67 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 68 69 Par02FastSimModelTracker::Par02FastSimModelTracker(G4String aModelName) 70 : G4VFastSimulationModel(aModelName), 71 fCalculateParametrisation(), 72 fParametrisation(Par02DetectorParametrisation::eCMS) 73 {} 74 75 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 76 77 Par02FastSimModelTracker::~Par02FastSimModelTracker() = default; 78 79 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 80 81 G4bool Par02FastSimModelTracker::IsApplicable(const G4ParticleDefinition& aParticleType) 82 { 83 return aParticleType.GetPDGCharge() != 0; // Applicable for all charged particles 84 } 85 86 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 87 88 G4bool Par02FastSimModelTracker::ModelTrigger(const G4FastTrack& /*aFastTrack*/) 89 { 90 return true; // No kinematical restrictions to apply the parametrisation 91 } 92 93 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 94 95 void Par02FastSimModelTracker::DoIt(const G4FastTrack& aFastTrack, G4FastStep& aFastStep) 96 { 97 G4cout << " ________Tracker model triggered _________" << G4endl; 98 99 // Calculate the final position (at the outer boundary of the tracking detector) 100 // of the particle with the momentum at the entrance of the tracking detector. 101 102 G4Track track = *aFastTrack.GetPrimaryTrack(); 103 G4FieldTrack aFieldTrack('0'); 104 G4FieldTrackUpdator::Update(&aFieldTrack, &track); 105 106 G4double retSafety = -1.0; 107 ELimited retStepLimited; 108 G4FieldTrack endTrack('a'); 109 G4double currentMinimumStep = 10.0 * m; // Temporary: change that to sth connected 110 // to particle momentum. 111 G4PathFinder* fPathFinder = G4PathFinder::GetInstance(); 112 /*G4double lengthAlongCurve = */ 113 fPathFinder->ComputeStep(aFieldTrack, currentMinimumStep, 0, 114 aFastTrack.GetPrimaryTrack()->GetCurrentStepNumber(), retSafety, 115 retStepLimited, endTrack, aFastTrack.GetPrimaryTrack()->GetVolume()); 116 117 // Place the particle at the tracking detector exit 118 // (at the place it would reach without the change of its momentum). 119 aFastStep.ProposePrimaryTrackFinalPosition(endTrack.GetPosition()); 120 121 // Consider only primary tracks (do nothing else for secondary charged particles) 122 G4ThreeVector Porg = aFastTrack.GetPrimaryTrack()->GetMomentum(); 123 if (!aFastTrack.GetPrimaryTrack()->GetParentID()) { 124 auto info = (Par02EventInformation*)G4EventManager::GetEventManager()->GetUserInformation(); 125 if (info->GetDoSmearing()) { 126 // Smearing according to the tracking detector resolution 127 G4double res = fCalculateParametrisation->GetResolution( 128 Par02DetectorParametrisation::eTRACKER, fParametrisation, Porg.mag()); 129 G4double eff = fCalculateParametrisation->GetEfficiency( 130 Par02DetectorParametrisation::eTRACKER, fParametrisation, Porg.mag()); 131 G4ThreeVector Psm; 132 Psm = Par02Smearer::Instance()->SmearMomentum(aFastTrack.GetPrimaryTrack(), res); 133 Par02Output::Instance()->FillHistogram(0, ((Psm.mag() / MeV) / (Porg.mag() / MeV))); 134 // Setting the values of Psm, res and eff 135 ((Par02PrimaryParticleInformation*)(const_cast<G4PrimaryParticle*>( 136 aFastTrack.GetPrimaryTrack() 137 ->GetDynamicParticle() 138 ->GetPrimaryParticle()) 139 ->GetUserInformation())) 140 ->SetTrackerMomentum(Psm); 141 ((Par02PrimaryParticleInformation*)(const_cast<G4PrimaryParticle*>( 142 aFastTrack.GetPrimaryTrack() 143 ->GetDynamicParticle() 144 ->GetPrimaryParticle()) 145 ->GetUserInformation())) 146 ->SetTrackerResolution(res); 147 ((Par02PrimaryParticleInformation*)(const_cast<G4PrimaryParticle*>( 148 aFastTrack.GetPrimaryTrack() 149 ->GetDynamicParticle() 150 ->GetPrimaryParticle()) 151 ->GetUserInformation())) 152 ->SetTrackerEfficiency(eff); 153 } 154 else { 155 // No smearing: simply setting the value of Porg 156 ((Par02PrimaryParticleInformation*)(const_cast<G4PrimaryParticle*>( 157 aFastTrack.GetPrimaryTrack() 158 ->GetDynamicParticle() 159 ->GetPrimaryParticle()) 160 ->GetUserInformation())) 161 ->SetTrackerMomentum(Porg); 162 } 163 } 164 } 165 166 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 167