Belle II Software  release-08-01-10
SensitiveDetector.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 
9 #include <beast/he3tube/simulation/SensitiveDetector.h>
10 #include <beast/he3tube/dataobjects/He3tubeSimHit.h>
11 #include <beast/he3tube/dataobjects/HE3G4TrackInfo.h>
12 
13 #include <framework/datastore/StoreArray.h>
14 #include <framework/datastore/RelationArray.h>
15 
16 #include <G4Track.hh>
17 #include <G4Step.hh>
18 #include "G4VProcess.hh"
19 
20 
21 namespace Belle2 {
27  namespace he3tube {
28 
30  Simulation::SensitiveDetectorBase("He3tubeSensitiveDetector", Const::invalidDetector)
31  {
32  m_trackID = 0;
33  //Make sure all collections are registered
34  StoreArray<MCParticle> mcParticles;
36  StoreArray<HE3G4TrackInfo> HE3G4TrackInfos;
37  RelationArray relMCSimHit(mcParticles, simHits);
38 
39  //Register all collections we want to modify and require those we want to use
40  mcParticles.registerInDataStore();
41  simHits.registerInDataStore();
42  relMCSimHit.registerInDataStore();
43  HE3G4TrackInfos.registerInDataStore();
44  //Register the Relation so that the TrackIDs get replaced by the actual
45  //MCParticle indices after simulating the events. This is needed as
46  //secondary particles might not be stored so everything relating to those
47  //particles will be attributed to the last saved mother particle
48  registerMCParticleRelation(relMCSimHit);
49  }
50 
51  bool SensitiveDetector::step(G4Step* step, G4TouchableHistory*)
52  {
53  //Get Track information
54  const G4Track& track = *step->GetTrack();
55  const int trackID = track.GetTrackID();
56  const double depEnergy = step->GetTotalEnergyDeposit() * CLHEP::MeV;
57  const double nielEnergy = step->GetNonIonizingEnergyDeposit() * CLHEP::MeV;
58  const G4ThreeVector G4tkPos = step->GetTrack()->GetPosition();
59  float tkPos[3];
60  tkPos[0] = G4tkPos.x() * CLHEP::cm;
61  tkPos[1] = G4tkPos.y() * CLHEP::cm;
62  tkPos[2] = G4tkPos.z() * CLHEP::cm;
63  const G4ThreeVector G4tkMom = step->GetTrack()->GetMomentum();
64  float tkMom[3];
65  tkMom[0] = G4tkMom.x() * CLHEP::MeV;
66  tkMom[1] = G4tkMom.y() * CLHEP::MeV;
67  tkMom[2] = G4tkMom.z() * CLHEP::MeV;
68  const G4ThreeVector G4tkMomDir = step->GetTrack()->GetMomentumDirection();
69  float tkMomDir[3];
70  tkMomDir[0] = G4tkMomDir.x() * CLHEP::MeV;
71  tkMomDir[1] = G4tkMomDir.y() * CLHEP::MeV;
72  tkMomDir[2] = G4tkMomDir.z() * CLHEP::MeV;
73  const int tkPDG = step->GetTrack()->GetDefinition()->GetPDGEncoding();
74  const double tkKEnergy = step->GetTrack()->GetKineticEnergy();
75  const int detNb = step->GetTrack()->GetVolume()->GetCopyNo();
76  const double GlTime = step->GetPreStepPoint()->GetGlobalTime();
77  //Ignore everything below 1eV
78  //if (depEnergy < CLHEP::eV) return false;
79 
80  //Get the datastore arrays
81  StoreArray<MCParticle> mcParticles;
83  RelationArray relMCSimHit(mcParticles, simHits);
84 
85  //find out if the process that created the particle was a neutron process
86  bool neuProc = false;
87  G4String CPName;
88  if (step->GetTrack()->GetCreatorProcess() != 0) {
89  const G4VProcess* creator = step->GetTrack()->GetCreatorProcess();
90  CPName = creator->GetProcessName();
91  if (G4StrUtil::contains(CPName, "Neutron")) neuProc = true;
92  }
93 
94  //set TrackID
95  m_trackID = track.GetTrackID();
96  //Save Hit if track leaves volume or is killed
97  if (track.GetNextVolume() != track.GetVolume() || track.GetTrackStatus() >= fStopAndKill) {
98  auto& mcparticle = Simulation::TrackInfo::getInfo(track);
99  int PDG = mcparticle.getPDG();
100  float Mass = mcparticle.getMass();
101  float Energy = mcparticle.getEnergy();
102  float vtx[3];
103  vtx[0] = mcparticle.getProductionVertex().X();
104  vtx[1] = mcparticle.getProductionVertex().Y();
105  vtx[2] = mcparticle.getProductionVertex().Z();
106  float mom[3];
107  mom[0] = mcparticle.getMomentum().X();
108  mom[1] = mcparticle.getMomentum().Y();
109  mom[2] = mcparticle.getMomentum().Z();
110  saveG4TrackInfo(m_trackID, PDG, Mass, Energy, vtx, mom);
111  //Reset TrackID
112  m_trackID = 0;
113  }
114 
115  StoreArray<He3tubeSimHit> He3tubeHits;
116  He3tubeSimHit* hit = He3tubeHits.appendNew(
117  depEnergy,
118  nielEnergy,
119  tkPDG,
120  tkKEnergy,
121  detNb,
122  GlTime,
123  tkPos,
124  tkMom,
125  tkMomDir,
126  neuProc
127  );
128 
129  //Add Relation between SimHit and MCParticle with a weight of 1. Since
130  //the MCParticle index is not yet defined we use the trackID from Geant4
131  relMCSimHit.add(trackID, hit->getArrayIndex(), 1.0);
132 
133  return true;
134  }
135 
137  int trackID,
138  int PDG,
139  float Mass,
140  float Energy,
141  float vtx[3],
142  float mom[3]
143  )
144  {
145  //Get the datastore arrays
146  StoreArray<HE3G4TrackInfo> HE3G4TrackInfos;
147 
148  HE3G4TrackInfos.appendNew(HE3G4TrackInfo(trackID, PDG, Mass, Energy, vtx, mom));
149 
150  int simhitNumber = HE3G4TrackInfos.getEntries() - 1;
151 
152  return (simhitNumber);
153  }//saveG4TrackInfo
154 
155 
156 
157 
158  } //he3tube namespace
160 } //Belle2 namespace
This class provides a set of constants for the framework.
Definition: Const.h:34
Class HE3G4TrackInfo - Geant4 simulated hit for the Microtpc detector.
ClassHe3tubeSimHit - Geant4 simulated hit for the He3tube detector.
Definition: He3tubeSimHit.h:30
Low-level class to create/modify relations between StoreArrays.
Definition: RelationArray.h:62
void add(index_type from, index_type to, weight_type weight=1.0)
Add a new element to the relation.
static void registerMCParticleRelation(const std::string &name, RelationArray::EConsolidationAction ignoreAction=RelationArray::c_negativeWeight)
Register an relation involving MCParticles.
static Payload getInfo(Carrier &obj)
Static function to just return UserInformation attached to the obj of type Carrier.
Definition: UserInfo.h:100
bool registerInDataStore(DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut)
Register the object/array in the DataStore.
T * appendNew()
Construct a new T object at the end of the array.
Definition: StoreArray.h:246
int getEntries() const
Get the number of objects in the array.
Definition: StoreArray.h:216
int saveG4TrackInfo(int trackID, int PDG, float Mass, float Energy, float vtx[3], float mom[3])
Save saveG4TrackInfo into datastore.
bool step(G4Step *step, G4TouchableHistory *) override
Step processing method.
Abstract base class for different kinds of events.