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 #include "G4FastSimHitMaker.hh" 27 #include "G4FastSimHitMaker.hh" 28 28 >> 29 #include "G4TransportationManager.hh" >> 30 #include "G4VSensitiveDetector.hh" >> 31 #include "G4TouchableHandle.hh" 29 #include "G4Step.hh" 32 #include "G4Step.hh" 30 #include "G4StepPoint.hh" 33 #include "G4StepPoint.hh" 31 #include "G4TouchableHandle.hh" << 34 32 #include "G4TransportationManager.hh" << 33 #include "G4VFastSimSensitiveDetector.hh" 35 #include "G4VFastSimSensitiveDetector.hh" 34 #include "G4VSensitiveDetector.hh" << 35 36 36 G4FastSimHitMaker::G4FastSimHitMaker() 37 G4FastSimHitMaker::G4FastSimHitMaker() 37 { 38 { 38 fTouchableHandle = new G4TouchableHistory(); 39 fTouchableHandle = new G4TouchableHistory(); 39 fpNavigator = new G4Navigator(); << 40 fpNavigator = new G4Navigator(); 40 fNaviSetup = false; << 41 fNaviSetup = false; 41 fWorldWithSdName = ""; 42 fWorldWithSdName = ""; 42 fpSpotS = new G4Step(); 43 fpSpotS = new G4Step(); 43 fpSpotP = new G4StepPoint(); 44 fpSpotP = new G4StepPoint(); 44 // N.B. Pre and Post step points are common. 45 // N.B. Pre and Post step points are common. 45 fpSpotS->SetPreStepPoint(fpSpotP); 46 fpSpotS->SetPreStepPoint(fpSpotP); 46 fpSpotS->SetPostStepPoint(fpSpotP); 47 fpSpotS->SetPostStepPoint(fpSpotP); 47 } 48 } 48 49 49 //....oooOO0OOooo........oooOO0OOooo........oo 50 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 50 51 51 G4FastSimHitMaker::~G4FastSimHitMaker() << 52 G4FastSimHitMaker::~G4FastSimHitMaker() 52 { 53 { 53 delete fpNavigator; << 54 delete fpNavigator; 54 delete fpSpotP; 55 delete fpSpotP; 55 fpSpotS->ResetPreStepPoint(); 56 fpSpotS->ResetPreStepPoint(); 56 fpSpotS->ResetPostStepPoint(); 57 fpSpotS->ResetPostStepPoint(); 57 delete fpSpotS; 58 delete fpSpotS; 58 } 59 } 59 60 60 //....oooOO0OOooo........oooOO0OOooo........oo 61 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 61 62 62 void G4FastSimHitMaker::make(const G4FastHit& 63 void G4FastSimHitMaker::make(const G4FastHit& aHit, const G4FastTrack& aTrack) 63 { 64 { 64 // do not make empty deposit 65 // do not make empty deposit 65 if (aHit.GetEnergy() <= 0) return; << 66 if(aHit.GetEnergy() <= 0) >> 67 return; 66 // Locate the spot 68 // Locate the spot 67 if (!fNaviSetup) { << 69 if(!fNaviSetup) >> 70 { 68 // Choose the world volume that contains t 71 // Choose the world volume that contains the sensitive detector based on its 69 // name (empty name for mass geometry) 72 // name (empty name for mass geometry) 70 G4VPhysicalVolume* worldWithSD = nullptr; 73 G4VPhysicalVolume* worldWithSD = nullptr; 71 if (fWorldWithSdName.empty()) { << 74 if(fWorldWithSdName.empty()) >> 75 { 72 worldWithSD = G4TransportationManager::G 76 worldWithSD = G4TransportationManager::GetTransportationManager() 73 ->GetNavigatorForTrackin 77 ->GetNavigatorForTracking() 74 ->GetWorldVolume(); 78 ->GetWorldVolume(); 75 } 79 } 76 else { << 80 else >> 81 { 77 worldWithSD = 82 worldWithSD = 78 G4TransportationManager::GetTransporta << 83 G4TransportationManager::GetTransportationManager()->GetParallelWorld( >> 84 fWorldWithSdName); 79 } 85 } 80 fpNavigator->SetWorldVolume(worldWithSD); 86 fpNavigator->SetWorldVolume(worldWithSD); 81 // use track global position 87 // use track global position 82 fpNavigator->LocateGlobalPointAndUpdateTou << 88 fpNavigator->LocateGlobalPointAndUpdateTouchable( 83 << 89 aTrack.GetPrimaryTrack()->GetPosition(), fTouchableHandle(), false); 84 fNaviSetup = true; 90 fNaviSetup = true; 85 } 91 } 86 else { << 92 else >> 93 { 87 // for further deposits use hit (local) po 94 // for further deposits use hit (local) position and local->global 88 // transformation 95 // transformation 89 fpNavigator->LocateGlobalPointAndUpdateTou 96 fpNavigator->LocateGlobalPointAndUpdateTouchable( 90 aTrack.GetInverseAffineTransformation()- << 97 aTrack.GetInverseAffineTransformation()->TransformPoint( >> 98 aHit.GetPosition()), 91 fTouchableHandle()); 99 fTouchableHandle()); 92 } 100 } 93 G4VPhysicalVolume* currentVolume = fTouchabl 101 G4VPhysicalVolume* currentVolume = fTouchableHandle()->GetVolume(); 94 102 95 if (currentVolume != nullptr) { << 103 if(currentVolume != 0) >> 104 { 96 G4VSensitiveDetector* sensitive = currentV 105 G4VSensitiveDetector* sensitive = currentVolume->GetLogicalVolume()->GetSensitiveDetector(); 97 auto fastSimSensitive = dynamic_cast<G4VFa << 106 G4VFastSimSensitiveDetector* fastSimSensitive = 98 if (fastSimSensitive != nullptr) { << 107 dynamic_cast<G4VFastSimSensitiveDetector*>(sensitive); >> 108 if(fastSimSensitive) >> 109 { 99 fastSimSensitive->Hit(&aHit, &aTrack, &f 110 fastSimSensitive->Hit(&aHit, &aTrack, &fTouchableHandle); 100 } 111 } 101 else if ((sensitive != nullptr) << 112 else if(sensitive && 102 && (currentVolume->GetLogicalVolu << 113 currentVolume->GetLogicalVolume()->GetFastSimulationManager()) 103 { 114 { 104 fpSpotS->SetTotalEnergyDeposit(aHit.GetE 115 fpSpotS->SetTotalEnergyDeposit(aHit.GetEnergy()); 105 fpSpotS->SetTrack(const_cast<G4Track*>(a 116 fpSpotS->SetTrack(const_cast<G4Track*>(aTrack.GetPrimaryTrack())); 106 fpSpotP->SetWeight(aTrack.GetPrimaryTrac 117 fpSpotP->SetWeight(aTrack.GetPrimaryTrack()->GetWeight()); 107 fpSpotP->SetPosition(aHit.GetPosition()) 118 fpSpotP->SetPosition(aHit.GetPosition()); 108 fpSpotP->SetGlobalTime(aTrack.GetPrimary 119 fpSpotP->SetGlobalTime(aTrack.GetPrimaryTrack()->GetGlobalTime()); 109 fpSpotP->SetLocalTime(aTrack.GetPrimaryT 120 fpSpotP->SetLocalTime(aTrack.GetPrimaryTrack()->GetLocalTime()); 110 fpSpotP->SetProperTime(aTrack.GetPrimary 121 fpSpotP->SetProperTime(aTrack.GetPrimaryTrack()->GetProperTime()); 111 fpSpotP->SetTouchableHandle(fTouchableHa 122 fpSpotP->SetTouchableHandle(fTouchableHandle); 112 fpSpotP->SetProcessDefinedStep(fpProcess 123 fpSpotP->SetProcessDefinedStep(fpProcess); 113 fpSpotP->SetStepStatus(fUserDefinedLimit 124 fpSpotP->SetStepStatus(fUserDefinedLimit); 114 sensitive->Hit(fpSpotS); 125 sensitive->Hit(fpSpotS); 115 } 126 } 116 } 127 } 117 } 128 } 118 129