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