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 // 26 // 27 /// \file Par02FastSimModelTracker.cc 27 /// \file Par02FastSimModelTracker.cc 28 /// \brief Implementation of the Par02FastSimM 28 /// \brief Implementation of the Par02FastSimModelTracker class 29 29 30 #include "Par02FastSimModelTracker.hh" 30 #include "Par02FastSimModelTracker.hh" 31 << 32 #include "Par02EventInformation.hh" 31 #include "Par02EventInformation.hh" 33 #include "Par02Output.hh" << 34 #include "Par02PrimaryParticleInformation.hh" 32 #include "Par02PrimaryParticleInformation.hh" 35 #include "Par02Smearer.hh" 33 #include "Par02Smearer.hh" >> 34 #include "Par02Output.hh" 36 35 >> 36 #include "G4Track.hh" >> 37 #include "G4Event.hh" >> 38 #include "G4RunManager.hh" 37 #include "G4AnalysisManager.hh" 39 #include "G4AnalysisManager.hh" >> 40 >> 41 #include "Randomize.hh" >> 42 38 #include "G4Electron.hh" 43 #include "G4Electron.hh" 39 #include "G4Event.hh" << 44 #include "G4Positron.hh" 40 #include "G4FieldTrack.hh" << 41 #include "G4FieldTrackUpdator.hh" << 42 #include "G4Gamma.hh" 45 #include "G4Gamma.hh" >> 46 43 #include "G4PathFinder.hh" 47 #include "G4PathFinder.hh" 44 #include "G4Positron.hh" << 48 #include "G4FieldTrack.hh" 45 #include "G4RunManager.hh" << 49 #include "G4FieldTrackUpdator.hh" 46 #include "G4SystemOfUnits.hh" 50 #include "G4SystemOfUnits.hh" 47 #include "G4Track.hh" << 48 #include "Randomize.hh" << 49 51 50 //....oooOO0OOooo........oooOO0OOooo........oo 52 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 51 53 52 Par02FastSimModelTracker::Par02FastSimModelTra << 54 Par02FastSimModelTracker::Par02FastSimModelTracker( G4String aModelName, 53 G4String aModelName, G4Region* aEnvelope, Pa << 55 G4Region* aEnvelope, Par02DetectorParametrisation::Parametrisation aType ) : 54 : G4VFastSimulationModel(aModelName, aEnvelo << 56 G4VFastSimulationModel( aModelName, aEnvelope ), fCalculateParametrisation(), 55 fCalculateParametrisation(), << 57 fParametrisation( aType ) {} 56 fParametrisation(aType) << 57 {} << 58 58 59 //....oooOO0OOooo........oooOO0OOooo........oo 59 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 60 60 61 Par02FastSimModelTracker::Par02FastSimModelTra << 61 Par02FastSimModelTracker::Par02FastSimModelTracker( G4String aModelName, 62 : G4VFastSimulationModel(aModelName, aEnvelo << 62 G4Region* aEnvelope ) : 63 fCalculateParametrisation(), << 63 G4VFastSimulationModel( aModelName, aEnvelope ), fCalculateParametrisation(), 64 fParametrisation(Par02DetectorParametrisat << 64 fParametrisation( Par02DetectorParametrisation::eCMS ) {} 65 {} << 66 65 67 //....oooOO0OOooo........oooOO0OOooo........oo 66 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 68 67 69 Par02FastSimModelTracker::Par02FastSimModelTra << 68 Par02FastSimModelTracker::Par02FastSimModelTracker( G4String aModelName ) : 70 : G4VFastSimulationModel(aModelName), << 69 G4VFastSimulationModel( aModelName ), fCalculateParametrisation(), 71 fCalculateParametrisation(), << 70 fParametrisation( Par02DetectorParametrisation::eCMS ) {} 72 fParametrisation(Par02DetectorParametrisat << 73 {} << 74 71 75 //....oooOO0OOooo........oooOO0OOooo........oo 72 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 76 73 77 Par02FastSimModelTracker::~Par02FastSimModelTr 74 Par02FastSimModelTracker::~Par02FastSimModelTracker() = default; 78 75 79 //....oooOO0OOooo........oooOO0OOooo........oo 76 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 80 77 81 G4bool Par02FastSimModelTracker::IsApplicable( << 78 G4bool Par02FastSimModelTracker::IsApplicable( const G4ParticleDefinition& 82 { << 79 aParticleType ) { 83 return aParticleType.GetPDGCharge() != 0; / 80 return aParticleType.GetPDGCharge() != 0; // Applicable for all charged particles 84 } 81 } 85 82 86 //....oooOO0OOooo........oooOO0OOooo........oo 83 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 87 84 88 G4bool Par02FastSimModelTracker::ModelTrigger( << 85 G4bool Par02FastSimModelTracker::ModelTrigger( const G4FastTrack& /*aFastTrack*/ ) { 89 { << 90 return true; // No kinematical restrictions 86 return true; // No kinematical restrictions to apply the parametrisation 91 } 87 } 92 88 93 //....oooOO0OOooo........oooOO0OOooo........oo 89 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 94 90 95 void Par02FastSimModelTracker::DoIt(const G4Fa << 91 void Par02FastSimModelTracker::DoIt( const G4FastTrack& aFastTrack, 96 { << 92 G4FastStep& aFastStep ) { >> 93 97 G4cout << " ________Tracker model triggered 94 G4cout << " ________Tracker model triggered _________" << G4endl; 98 95 99 // Calculate the final position (at the oute 96 // Calculate the final position (at the outer boundary of the tracking detector) 100 // of the particle with the momentum at the 97 // of the particle with the momentum at the entrance of the tracking detector. 101 98 102 G4Track track = *aFastTrack.GetPrimaryTrack( << 99 G4Track track = * aFastTrack.GetPrimaryTrack(); 103 G4FieldTrack aFieldTrack('0'); << 100 G4FieldTrack aFieldTrack( '0' ); 104 G4FieldTrackUpdator::Update(&aFieldTrack, &t << 101 G4FieldTrackUpdator::Update( &aFieldTrack, &track ); 105 102 106 G4double retSafety = -1.0; 103 G4double retSafety = -1.0; 107 ELimited retStepLimited; 104 ELimited retStepLimited; 108 G4FieldTrack endTrack('a'); << 105 G4FieldTrack endTrack( 'a' ); 109 G4double currentMinimumStep = 10.0 * m; // << 106 G4double currentMinimumStep = 10.0*m; // Temporary: change that to sth connected 110 // << 107 // to particle momentum. 111 G4PathFinder* fPathFinder = G4PathFinder::Ge 108 G4PathFinder* fPathFinder = G4PathFinder::GetInstance(); 112 /*G4double lengthAlongCurve = */ << 109 /*G4double lengthAlongCurve = */ 113 fPathFinder->ComputeStep(aFieldTrack, curren << 110 fPathFinder->ComputeStep( aFieldTrack, 114 aFastTrack.GetPrima << 111 currentMinimumStep, 115 retStepLimited, end << 112 0, >> 113 aFastTrack.GetPrimaryTrack()->GetCurrentStepNumber(), >> 114 retSafety, >> 115 retStepLimited, >> 116 endTrack, >> 117 aFastTrack.GetPrimaryTrack()->GetVolume() ); 116 118 117 // Place the particle at the tracking detect << 119 // Place the particle at the tracking detector exit 118 // (at the place it would reach without the 120 // (at the place it would reach without the change of its momentum). 119 aFastStep.ProposePrimaryTrackFinalPosition(e << 121 aFastStep.ProposePrimaryTrackFinalPosition( endTrack.GetPosition() ); 120 122 121 // Consider only primary tracks (do nothing 123 // Consider only primary tracks (do nothing else for secondary charged particles) 122 G4ThreeVector Porg = aFastTrack.GetPrimaryTr 124 G4ThreeVector Porg = aFastTrack.GetPrimaryTrack()->GetMomentum(); 123 if (!aFastTrack.GetPrimaryTrack()->GetParent << 125 if ( ! aFastTrack.GetPrimaryTrack()->GetParentID() ) { 124 auto info = (Par02EventInformation*)G4Even << 126 auto info = (Par02EventInformation*) 125 if (info->GetDoSmearing()) { << 127 G4EventManager::GetEventManager()->GetUserInformation(); >> 128 if ( info->GetDoSmearing() ) { 126 // Smearing according to the tracking de 129 // Smearing according to the tracking detector resolution 127 G4double res = fCalculateParametrisation << 130 G4double res = fCalculateParametrisation-> 128 Par02DetectorParametrisation::eTRACKER << 131 GetResolution( Par02DetectorParametrisation::eTRACKER, 129 G4double eff = fCalculateParametrisation << 132 fParametrisation, Porg.mag() ); 130 Par02DetectorParametrisation::eTRACKER << 133 G4double eff = fCalculateParametrisation-> >> 134 GetEfficiency( Par02DetectorParametrisation::eTRACKER, >> 135 fParametrisation, Porg.mag() ); 131 G4ThreeVector Psm; 136 G4ThreeVector Psm; 132 Psm = Par02Smearer::Instance()->SmearMom << 137 Psm = Par02Smearer::Instance()-> 133 Par02Output::Instance()->FillHistogram(0 << 138 SmearMomentum( aFastTrack.GetPrimaryTrack(), res ); >> 139 Par02Output::Instance()->FillHistogram( 0, ((Psm.mag()/MeV) / (Porg.mag()/MeV)) ); 134 // Setting the values of Psm, res and ef 140 // Setting the values of Psm, res and eff 135 ((Par02PrimaryParticleInformation*)(cons << 141 ( (Par02PrimaryParticleInformation*) ( const_cast< G4PrimaryParticle* > 136 aF << 142 ( aFastTrack.GetPrimaryTrack()->GetDynamicParticle()->GetPrimaryParticle() )-> 137 << 143 GetUserInformation() ) )->SetTrackerMomentum( Psm ); 138 << 144 ( (Par02PrimaryParticleInformation*) ( const_cast< G4PrimaryParticle* > 139 -> << 145 ( aFastTrack.GetPrimaryTrack()->GetDynamicParticle()->GetPrimaryParticle() )-> 140 ->SetTrackerMomentum(Psm); << 146 GetUserInformation() ) )->SetTrackerResolution( res ); 141 ((Par02PrimaryParticleInformation*)(cons << 147 ( (Par02PrimaryParticleInformation*) ( const_cast< G4PrimaryParticle* > 142 aF << 148 ( aFastTrack.GetPrimaryTrack()->GetDynamicParticle()->GetPrimaryParticle() )-> 143 << 149 GetUserInformation() ) )->SetTrackerEfficiency( eff ); 144 << 150 } else { 145 -> << 146 ->SetTrackerResolution(res); << 147 ((Par02PrimaryParticleInformation*)(cons << 148 aF << 149 << 150 << 151 -> << 152 ->SetTrackerEfficiency(eff); << 153 } << 154 else { << 155 // No smearing: simply setting the value 151 // No smearing: simply setting the value of Porg 156 ((Par02PrimaryParticleInformation*)(cons << 152 ( (Par02PrimaryParticleInformation*) ( const_cast< G4PrimaryParticle* > 157 aF << 153 ( aFastTrack.GetPrimaryTrack()->GetDynamicParticle()->GetPrimaryParticle() )-> 158 << 154 GetUserInformation() ) )->SetTrackerMomentum( Porg ); 159 << 160 -> << 161 ->SetTrackerMomentum(Porg); << 162 } 155 } 163 } 156 } 164 } 157 } 165 158 166 //....oooOO0OOooo........oooOO0OOooo........oo 159 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 160 167 161