Belle II Software development
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/qcsmonitor/simulation/SensitiveDetector.h>
10#include <beast/qcsmonitor/dataobjects/QcsmonitorSimHit.h>
11
12#include <framework/datastore/StoreArray.h>
13#include <framework/datastore/RelationArray.h>
14
15#include <G4Track.hh>
16#include <G4Step.hh>
17#include <G4Version.hh>
18
19namespace Belle2 {
25 namespace qcsmonitor {
26
28 Simulation::SensitiveDetectorBase("QcsmonitorSensitiveDetector", Const::invalidDetector)
29 {
30 m_hitNum = 0;
31 m_EvnetNumber = 0;
33 m_trackID = 0;
34 m_startTime = 0;
35 m_endTime = 0;
36 m_WightedTime = 0;
37 m_startEnergy = 0;
39 m_trackLength = 0;
40 iECLCell = 0;
41 TimeIndex = 0;
42 local_pos = 0;
43 T_ave = 0;
44 firstcall = 0;
45 m_phiID = 0;
46 m_thetaID = 0;
47 m_cellID = 0;
48
49 //Make sure all collections are registered
50 StoreArray<MCParticle> mcParticles;
52 RelationArray relMCSimHit(mcParticles, simHits);
53
54 //Register all collections we want to modify and require those we want to use
55 mcParticles.registerInDataStore();
56 simHits.registerInDataStore();
57 relMCSimHit.registerInDataStore();
58
59 //Register the Relation so that the TrackIDs get replaced by the actual
60 //MCParticle indices after simulating the events. This is needed as
61 //secondary particles might not be stored so everything relating to those
62 //particles will be attributed to the last saved mother particle
63 registerMCParticleRelation(relMCSimHit);
64#if G4VERSION_NUMBER < 1010
65 saturationEngine = new G4EmSaturation();
66#else
67 saturationEngine = new G4EmSaturation(1); // verbose level
68#endif
69
70 }
71
73 {
74
75 }
76
77 bool SensitiveDetector::step(G4Step* step, G4TouchableHistory*)
78 {
79 const G4StepPoint& preStep = *step->GetPreStepPoint();
80 const G4StepPoint& postStep = *step->GetPostStepPoint();
81
82 G4Track& track = *step->GetTrack();
83 if (m_trackID != track.GetTrackID()) {
84 //TrackID changed, store track informations
85 m_trackID = track.GetTrackID();
86 //Get momentum
87 m_momentum = preStep.GetMomentum() ;
88 //Get energy
89 m_startEnergy = preStep.GetKineticEnergy() ;
90 //Reset energy deposit;
92 //Reset Wighted Time;
93 m_WightedTime = 0;
94 //Reset m_WightedPos;
95 m_WightedPos.SetXYZ(0, 0, 0);
96
97 }
98 //Update energy deposit
99 const double depEnergy = step->GetTotalEnergyDeposit() ;
100 m_energyDeposit += saturationEngine->VisibleEnergyDeposition(track.GetDefinition(), track.GetMaterialCutsCouple(),
101 step->GetStepLength(), depEnergy, 0.);
102 //step->GetTotalEnergyDeposit() ;
103
104 m_startTime = preStep.GetGlobalTime();
105 m_endTime = postStep.GetGlobalTime();
106 m_WightedTime += (m_startTime + m_endTime) / 2 * (step->GetTotalEnergyDeposit());
107
108 m_startPos = preStep.GetPosition();
109 m_endPos = postStep.GetPosition();
110 ROOT::Math::XYZVector position((m_startPos.getX() + m_endPos.getX()) / 2 / CLHEP::cm,
111 (m_startPos.getY() + m_endPos.getY()) / 2 / CLHEP::cm,
112 (m_startPos.getZ() + m_endPos.getZ()) / 2 / CLHEP::cm);
113 m_WightedPos += position * (step->GetTotalEnergyDeposit());
114
115 //Save Hit if track leaves volume or is killed
116 if (track.GetNextVolume() != track.GetVolume() || track.GetTrackStatus() >= fStopAndKill) {
117 int pdgCode = track.GetDefinition()->GetPDGEncoding();
118
119 //const G4VPhysicalVolume& v = * track.GetVolume();
120 //G4ThreeVector posCell = v.GetTranslation();
121 // Get layer ID
122
123 //if (v.GetName().find("Crystal") != std::string::npos) {
124 //CsiGeometryPar* eclp = CsiGeometryPar::Instance();
125 m_cellID = track.GetVolume()->GetCopyNo();
126
127 double dTotalEnergy = 1 / m_energyDeposit; //avoid the error no match for 'operator/'
128 if (m_energyDeposit > 0.) {
130 m_energyDeposit, m_momentum, m_WightedPos * dTotalEnergy);
131 //}
132 }
133
134 //Reset TrackID
135 m_trackID = 0;
136 }
137
138 return true;
139 }
140
142 const G4int cellId,
143 const G4int trackID,
144 const G4int pid,
145 const G4double tof,
146 const G4double edep,
147 G4ThreeVector mom,
148 ROOT::Math::XYZVector posAve)
149 {
150
151 //Get the datastore arraus
152 StoreArray<MCParticle> mcParticles;
154 RelationArray relMQcsmonitormHit(mcParticles, simHits);
155
156 StoreArray<QcsmonitorSimHit> QcsmonitorHits;
157 RelationArray qcsmonitorSimHitRel(mcParticles, QcsmonitorHits);
158 ROOT::Math::XYZVector momentum(mom.getX() / CLHEP::GeV, mom.getY() / CLHEP::GeV, mom.getZ() / CLHEP::GeV);
159 QcsmonitorHits.appendNew(cellId, trackID, pid, tof / CLHEP::ns, edep / CLHEP::GeV, momentum, posAve);
160 int simhitNumber = QcsmonitorHits.getEntries() - 1;
161 B2DEBUG(150, "HitNumber: " << simhitNumber);
162 qcsmonitorSimHitRel.add(trackID, simhitNumber);
163 return (simhitNumber);
164 }//saveSimHit
165
166
167 } //qcsmonitor namespace
169} //Belle2 namespace
This class provides a set of constants for the framework.
Definition: Const.h:34
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.
bool registerInDataStore(DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut)
Register the object/array in the DataStore.
Accessor to arrays stored in the data store.
Definition: StoreArray.h:113
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 m_thetaID
The current phi ID in an event.
double m_energyDeposit
particle energy at the entrance in volume
int m_EvnetNumber
The current number of created hits in an event.
int saveSimHit(const G4int cellId, const G4int trackID, const G4int pid, const G4double tof, const G4double edep, G4ThreeVector mom, ROOT::Math::XYZVector WightedPos)
Save QcsmonitorSimHit into datastore.
int TimeIndex
Hit Energy of StoreArray.
int m_trackID
The current number of created hits in an event.
int m_hitNum
members of SensitiveDetector
int firstcall
flight time to diode sensor
double T_ave
position alongthe vector of crystal axis
double local_pos
vector of crystal axis
G4ThreeVector m_momentum
Wighted step Position.
int m_cellID
The current theta ID in an event.
G4EmSaturation * saturationEngine
The current cellID in an event.
int iECLCell
length of the track in the volume
double m_trackLength
energy deposited in volume
int m_oldEvnetNumber
The current number of created hits in an event.
ROOT::Math::XYZVector m_WightedPos
Position of poststep.
G4ThreeVector m_endPos
Position of prestep.
bool step(G4Step *step, G4TouchableHistory *) override
Step processing method.
Abstract base class for different kinds of events.