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