Belle II Software development
SensitiveDetector Class Reference

Sensitive Detector implementation of the CSI detector. More...

#include <SensitiveDetector.h>

Inheritance diagram for SensitiveDetector:
SensitiveDetectorBase

Public Member Functions

 SensitiveDetector ()
 Constructor.
 
 ~SensitiveDetector ()
 Destructor.
 
int saveSimHit (const G4int cellId, const G4int trackID, const G4int pid, const G4double tof, const G4double edep, G4ThreeVector mom, G4ThreeVector pos, G4ThreeVector PosCell, G4ThreeVector VecCell)
 Save ECLSimHits of the event into datastore.
 

Static Public Member Functions

static const std::map< std::string, RelationArray::EConsolidationAction > & getMCParticleRelations ()
 Return a list of all registered Relations with MCParticles.
 
static void setActive (bool activeStatus)
 Enable/Disable all Sensitive Detectors.
 
static void registerMCParticleRelation (const std::string &name, RelationArray::EConsolidationAction ignoreAction=RelationArray::c_negativeWeight)
 Register an relation involving MCParticles.
 
static void registerMCParticleRelation (const RelationArray &relation, RelationArray::EConsolidationAction ignoreAction=RelationArray::c_negativeWeight)
 Overload to make it easer to register MCParticle relations.
 

Protected Member Functions

bool step (G4Step *aStep, G4TouchableHistory *) override
 Step processing method.
 

Private Member Functions

virtual bool ProcessHits (G4Step *aStep, G4TouchableHistory *aROhist)
 Check if recording hits is enabled and if so call step() and set the correct MCParticle flag.
 

Private Attributes

int m_hitNum
 members of SensitiveDetector

 
int m_EvnetNumber
 The current number of created hits in an event.
 
int m_oldEvnetNumber
 The current number of created hits in an event.
 
int m_trackID
 The current number of created hits in an event.
 
G4ThreeVector m_startPos
 track id
 
G4ThreeVector m_endPos
 Position of prestep.
 
G4ThreeVector m_WightedPos
 Position of poststep.
 
G4ThreeVector m_momentum
 Wighted step Position.
 
double m_startTime
 momentum of track
 
double m_endTime
 global time
 
double m_WightedTime
 global time
 
double m_startEnergy
 global time
 
double m_energyDeposit
 particle energy at the entrance in volume
 
double m_trackLength
 energy deposited in volume
 
int CsiHitIndex [18][80]
 length of the track in the volume
 
int iECLCell
 Hit index of StoreArray.
 
int TimeIndex
 Hit Energy of StoreArray.
 
double local_pos
 Hit Time of StoreArray.
 
double T_ave
 position alongthe vector of crystal axis

 
int firstcall
 flight time to diode sensor

 
int m_phiID
 flag of first call

 
int m_thetaID
 The current phi ID in an event.
 
int m_cellID
 The current theta ID in an event.
 
Const::EDetector m_subdetector
 Subdetector the class belongs to.
 

Static Private Attributes

static std::map< std::string, RelationArray::EConsolidationActions_mcRelations
 Static set holding all relations which have to be updated at the end of the Event.
 
static bool s_active
 Static bool which indicates wether recording of hits is enabled.
 

Detailed Description

Sensitive Detector implementation of the CSI detector.

Definition at line 22 of file SensitiveDetector.h.

Constructor & Destructor Documentation

◆ SensitiveDetector()

Constructor.

Definition at line 29 of file SensitiveDetector.cc.

29 :
30 Simulation::SensitiveDetectorBase("CsiSensitiveDetector", Const::invalidDetector)
31 {
32 m_hitNum = 0;
33 m_EvnetNumber = 0;
35 m_trackID = 0;
36 m_startTime = 0;
37 m_endTime = 0;
38 m_WightedTime = 0;
39 m_startEnergy = 0;
41 m_trackLength = 0;
42 iECLCell = 0;
43 TimeIndex = 0;
44 local_pos = 0;
45 T_ave = 0;
46 firstcall = 0;
47 m_phiID = 0;
48 m_thetaID = 0;
49 m_cellID = 0;
50
51
52 // CsiHitIndex: array of 18 (Nb. crystals) x 80 (max time index (tof [ns]/100))
53 for (int i = 0; i < 18; i++) {for (int j = 0; j < 80; j++) { CsiHitIndex[i][j] = 0;}}
54
55 //Make sure all collections are registered
56 StoreArray<MCParticle> mcParticles;
57 StoreArray<CsiSimHit> simHits;
58 StoreArray<CsiHit> csiHits;
59
60 RelationArray simHitRel(mcParticles, simHits);
61 RelationArray csiHitRel(mcParticles, csiHits);
62
63 //Register all collections we want to modify and require those we want to use
64 mcParticles.registerInDataStore();
65 simHits.registerInDataStore();
66 csiHits.registerInDataStore();
67 simHitRel.registerInDataStore();
68 csiHitRel.registerInDataStore();
69
70 //Register the Relation so that the TrackIDs get replaced by the actual
71 //MCParticle indices after simulating the events. This is needed as
72 //secondary particles might not be stored so everything relating to those
73 //particles will be attributed to the last saved mother particle
76 }
static void registerMCParticleRelation(const std::string &name, RelationArray::EConsolidationAction ignoreAction=RelationArray::c_negativeWeight)
Register an relation involving MCParticles.
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 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
Hit Time of StoreArray.
int m_cellID
The current theta ID in an event.
double m_startTime
momentum of track
int CsiHitIndex[18][80]
length of the track in the volume
int iECLCell
Hit index of StoreArray.
double m_trackLength
energy deposited in volume
int m_oldEvnetNumber
The current number of created hits in an event.
int m_phiID
flag of first call

◆ ~SensitiveDetector()

Destructor.

Definition at line 78 of file SensitiveDetector.cc.

79 {
80
81 }

Member Function Documentation

◆ getMCParticleRelations()

static const std::map< std::string, RelationArray::EConsolidationAction > & getMCParticleRelations ( )
inlinestaticinherited

Return a list of all registered Relations with MCParticles.

Definition at line 42 of file SensitiveDetectorBase.h.

42{ return s_mcRelations; }
static std::map< std::string, RelationArray::EConsolidationAction > s_mcRelations
Static set holding all relations which have to be updated at the end of the Event.

◆ ProcessHits()

bool ProcessHits ( G4Step *  aStep,
G4TouchableHistory *  aROhist 
)
inlineprivatevirtualinherited

Check if recording hits is enabled and if so call step() and set the correct MCParticle flag.

Called by Geant4 for each step inside the sensitive volumes attached

Definition at line 94 of file SensitiveDetectorBase.h.

95 {
96 if (!s_active) return false;
97 bool result = step(aStep, aROhist);
98 // Do not include hits from invalid detector (beast,teastbeam, etc.)
99 if (result && (m_subdetector != Const::invalidDetector)) TrackInfo::getInfo(*aStep->GetTrack()).addSeenInDetector(m_subdetector);
100 return result;
101 }
virtual bool step(G4Step *step, G4TouchableHistory *ROhist)=0
Process a Geant4 step in any of the sensitive volumes attached to this sensitive detector.
Const::EDetector m_subdetector
Subdetector the class belongs to.
static bool s_active
Static bool which indicates wether recording of hits is enabled.
static Payload getInfo(Carrier &obj)
Static function to just return UserInformation attached to the obj of type Carrier.
Definition: UserInfo.h:100

◆ registerMCParticleRelation() [1/2]

static void registerMCParticleRelation ( const RelationArray relation,
RelationArray::EConsolidationAction  ignoreAction = RelationArray::c_negativeWeight 
)
inlinestaticinherited

Overload to make it easer to register MCParticle relations.

Parameters
relationRelationArray to register
ignoreAction

Definition at line 66 of file SensitiveDetectorBase.h.

67 { registerMCParticleRelation(relation.getName(), ignoreAction); }

◆ registerMCParticleRelation() [2/2]

void registerMCParticleRelation ( const std::string &  name,
RelationArray::EConsolidationAction  ignoreAction = RelationArray::c_negativeWeight 
)
staticinherited

Register an relation involving MCParticles.

All Relations which point from an MCParticle to something have to be registered with addMCParticleRelation() because the index of the MCParticles might change at the end of the event. During simulation, the TrackID should be used as index of the MCParticle

Parameters
nameName of the relation to register
ignoreAction

Definition at line 22 of file SensitiveDetectorBase.cc.

23 {
24 std::pair<std::map<std::string, RelationArray::EConsolidationAction>::iterator, bool> insert = s_mcRelations.insert(std::make_pair(
25 name, ignoreAction));
26 //If the relation already exists and the ignoreAction is different we do have a problem
27 if (!insert.second && insert.first->second != ignoreAction) {
28 B2FATAL("MCParticle Relation " << name << " already registered with different ignore action.");
29 }
30 }

◆ saveSimHit()

int saveSimHit ( const G4int  cellId,
const G4int  trackID,
const G4int  pid,
const G4double  tof,
const G4double  edep,
G4ThreeVector  mom,
G4ThreeVector  pos,
G4ThreeVector  PosCell,
G4ThreeVector  VecCell 
)

Save ECLSimHits of the event into datastore.

Parameters
cellIdthe channel identifier
trackIDthe track identifier
pidthe pdg code of the particle
tofthe time of flight of the particle
edepthe energy deposited in the crystal by the particle
momthe momentum of the particle
posTO BE COMPLETED
PosCellTO BE COMPLETED
VecCellTO BE COMPLETED
Returns
int the number of hits saved in this event

Definition at line 153 of file SensitiveDetector.cc.

163 {
164
165 //Get the datastore arrays
166 StoreArray<MCParticle> mcParticles;
167 StoreArray<CsiSimHit> simHits;
168
169 RelationArray simHitRel(mcParticles, simHits);
170
171 // convert Hep3Vectors to ROOT::Math::XYZVector
172 ROOT::Math::XYZVector momentum(mom.getX(), mom.getY(), mom.getZ());
173 ROOT::Math::XYZVector position(pos.getX(), pos.getY(), pos.getZ());
174
175 //Append
176 simHits.appendNew(cellId, trackID, pid, tof / CLHEP::ns, edep / CLHEP::GeV,
177 momentum * (1.0 / CLHEP::GeV), position * (1.0 / CLHEP::cm));
178
179 int simhitNumber = simHits.getEntries() - 1;
180 simHitRel.add(trackID, simhitNumber);
181 B2DEBUG(150, "Saving CsiSimHit Number: " << simhitNumber);
182
183 // Store CsiHit: total energy deposited per hit, with average time.
184
185 // Old names:
186 /*
187 StoreArray<CsiHit> eclHitArray;
188 RelationArray eclHitRel(mcParticles, eclHitArray);
189 */
190
191 // New names:
192
193 StoreArray<CsiHit> csiHits;
194
195 RelationArray csiHitRel(mcParticles, csiHits);
196
197
198 StoreObjPtr<EventMetaData> eventMetaDataPtr;
199 int m_currentEvnetNumber = eventMetaDataPtr->getEvent();
200
201
202 if (firstcall == 0 || m_currentEvnetNumber != m_oldEvnetNumber) {
203 m_oldEvnetNumber = m_currentEvnetNumber;
204 for (int iCSICell = 0; iCSICell < 18; iCSICell++) {
205 for (int TimeInd = 0; TimeInd < 80; TimeInd++) {
206 CsiHitIndex[iCSICell][TimeInd] = -1;
207 }
208 }
209 firstcall++;
210 }
211
212
213 if (m_currentEvnetNumber == m_oldEvnetNumber) {
214 if ((tof / CLHEP::ns) < 8000) {
215 TimeIndex = (int)((tof / CLHEP::ns) / 100);
216
217 // local_pos is the distance between the hit and the PIN-diode end of the crystal.
218 local_pos = (15. - (pos - PosCell) * VecCell);
219
220 // From the ECL package T_ave = 6.05 + 0.0749 * local_pos - 0.00112 * local_pos * local_pos + (tof / CLHEP::ns) ;
221
222 //For CsI: we remove the offset (I hypothetize it if from photo-sensor delay)
223 // we remove the acceleration of the light
224 // we correct the velocity term using n_CsI=1.80
225 T_ave = 0.0600 * local_pos + (tof / CLHEP::ns) ;
226
227
228 double E_cell = (edep / CLHEP::GeV);
229 if (CsiHitIndex[cellId][TimeIndex] == -1) {
230 //m_hitNum = csiHits->GetLast() + 1;
231 //new(csiHits->AddrAt(m_hitNum)) CSIHit();
232 csiHits.appendNew();
233 m_hitNum = csiHits.getEntries() - 1;
234 CsiHitIndex[cellId][TimeIndex] = m_hitNum;
235 csiHits[m_hitNum]->setCellId(cellId);
236 csiHits[m_hitNum]->setEnergyDep(E_cell);
237 csiHits[m_hitNum]->setTimeAve(T_ave);
238 csiHits[m_hitNum]->setTimeVar(0);
239 csiHitRel.add(trackID, m_hitNum);
240
241 } else {
242 m_hitNum = CsiHitIndex[cellId][TimeIndex];
243 double old_edep = csiHits[m_hitNum]->getEnergyDep();
244 double old_TimeAve = csiHits[m_hitNum]->getTimeAve();
245 double old_TimeVar = csiHits[m_hitNum]->getTimeVar();
246
247 //double new_edep = E_cell + old_edep;
248 //double new_TimeAve = (old_edep * old_TimeAve + E_cell * T_ave) / new_edep;
249
250 double temp = E_cell + old_edep;
251 double delta = T_ave - old_TimeAve;
252 double R = delta * E_cell / temp;
253 double new_TimeAve = old_TimeAve + R;
254 double new_TimeVar = old_TimeVar + old_edep * delta * R;
255 double new_edep = temp;
256
257 //Algo from Wiki:
258 /*
259 for x, weight in dataWeightPairs: # Alternatively "for x, weight in zip(data, weights):"
260 temp = weight + sumweight
261 delta = x - mean
262 R = delta * weight / temp
263 mean = mean + R
264 M2 = M2 + sumweight * delta * R # Alternatively, "M2 = M2 + weight * delta * (x−mean)"
265 sumweight = temp
266
267 variance_n = M2/sumweight
268 */
269
270 csiHits[m_hitNum]->setEnergyDep(new_edep);
271 csiHits[m_hitNum]->setTimeAve(new_TimeAve);
272 csiHits[m_hitNum]->setTimeVar(new_TimeVar);
273 csiHitRel.add(trackID, m_hitNum);
274
275 }
276 }
277 } else { B2ERROR("m_currentEvnetNumber ERROR: m_oldEvnetNumber==m_oldEvnetNumber"); }
278
279 return (simhitNumber);
280 }//saveSimHit
double R
typedef autogenerated by FFTW

◆ setActive()

static void setActive ( bool  activeStatus)
inlinestaticinherited

Enable/Disable all Sensitive Detectors.

By default, all sensitive detectors won't create hits to make it possible to use the Geant4 Navigator for non-simulation purposes. Only during simulation the sensitive detectors will be enabled to record hits

Parameters
activeStatusbool to indicate wether hits should be recorded

Definition at line 50 of file SensitiveDetectorBase.h.

50{ s_active = activeStatus; }

◆ step()

bool step ( G4Step *  aStep,
G4TouchableHistory *   
)
overrideprotectedvirtual

Step processing method.

Parameters
aStepthe G4Step with the current step information
Returns
true if a Hit has been created, false if the hit was ignored

Implements SensitiveDetectorBase.

Definition at line 85 of file SensitiveDetector.cc.

86 {
87
88 const G4StepPoint& preStep = *aStep->GetPreStepPoint();
89 const G4StepPoint& postStep = * aStep->GetPostStepPoint();
90
91 G4Track& track = * aStep->GetTrack();
92 if (m_trackID != track.GetTrackID()) {
93 //TrackID changed, store track informations
94 m_trackID = track.GetTrackID();
95 //Get momentum
96 m_momentum = preStep.GetMomentum() ;
97 //Get energy
98 m_startEnergy = preStep.GetKineticEnergy() ;
99 //Reset energy deposit;
100 m_energyDeposit = 0;
101 //Reset Wighted Time;
102 m_WightedTime = 0;
103 //Reset m_WightedPos;
104 m_WightedPos.set(0, 0, 0);
105
106 }
107 //Update energy deposit
108 m_energyDeposit += aStep->GetTotalEnergyDeposit() ;
109
110 m_startTime = preStep.GetGlobalTime();
111 m_endTime = postStep.GetGlobalTime();
112 m_WightedTime += (m_startTime + m_endTime) / 2 * (aStep->GetTotalEnergyDeposit());
113
114 m_startPos = preStep.GetPosition();
115 m_endPos = postStep.GetPosition();
116
117 G4ThreeVector position(0.5 * (m_startPos + m_endPos));
118 m_WightedPos += position * (aStep->GetTotalEnergyDeposit());
119
120 //Save Hit if track leaves volume or is killed
121 if (track.GetNextVolume() != track.GetVolume() || track.GetTrackStatus() >= fStopAndKill) {
122 int pdgCode = track.GetDefinition()->GetPDGEncoding();
123
124 const G4VPhysicalVolume& v = * track.GetVolume();
125
126 //Column z of the rotation matrix R is the result of R * zhat.
127 // This is what we want since G4Trap are created aligned along z
128 G4RotationMatrix rotCell = * v.GetObjectRotation();
129 // G4RotationMatrix rotCell = * v.GetRotation();
130 G4ThreeVector vecCell = rotCell.colZ();
131 G4ThreeVector posCell = v.GetTranslation();
132
133 // Get layer ID
134 if (v.GetName().find("Crystal") != std::string::npos) {
135 CsiGeometryPar* csip = CsiGeometryPar::Instance();
136 m_cellID = csip->CsiVolNameToCellID(v.GetName());
137
138 double dTotalEnergy = 1.0 / m_energyDeposit; //avoid the error no match for 'operator/'
139 if (m_energyDeposit > 0.) {
140 saveSimHit(m_cellID, m_trackID, pdgCode, m_WightedTime * dTotalEnergy,
141 m_energyDeposit, m_momentum, m_WightedPos * dTotalEnergy,
142 posCell, vecCell);
143 }
144 }
145
146 //Reset TrackID
147 m_trackID = 0;
148 }
149
150 return true;
151 }
static CsiGeometryPar * Instance()
Static method to get a reference to the CsiGeometryPar instance.
G4ThreeVector m_momentum
Wighted step Position.
G4ThreeVector m_WightedPos
Position of poststep.
G4ThreeVector m_startPos
track id
int saveSimHit(const G4int cellId, const G4int trackID, const G4int pid, const G4double tof, const G4double edep, G4ThreeVector mom, G4ThreeVector pos, G4ThreeVector PosCell, G4ThreeVector VecCell)
Save ECLSimHits of the event into datastore.
G4ThreeVector m_endPos
Position of prestep.

Member Data Documentation

◆ CsiHitIndex

int CsiHitIndex[18][80]
private

length of the track in the volume

Definition at line 83 of file SensitiveDetector.h.

◆ firstcall

int firstcall
private

flight time to diode sensor

Definition at line 90 of file SensitiveDetector.h.

◆ iECLCell

int iECLCell
private

Hit index of StoreArray.

Definition at line 84 of file SensitiveDetector.h.

◆ local_pos

double local_pos
private

Hit Time of StoreArray.

Definition at line 88 of file SensitiveDetector.h.

◆ m_cellID

int m_cellID
private

The current theta ID in an event.

Used to fill the DataStore ECL array

Definition at line 93 of file SensitiveDetector.h.

◆ m_endPos

G4ThreeVector m_endPos
private

Position of prestep.

Definition at line 73 of file SensitiveDetector.h.

◆ m_endTime

double m_endTime
private

global time

Definition at line 77 of file SensitiveDetector.h.

◆ m_energyDeposit

double m_energyDeposit
private

particle energy at the entrance in volume

Definition at line 80 of file SensitiveDetector.h.

◆ m_EvnetNumber

int m_EvnetNumber
private

The current number of created hits in an event.

Used to fill the DataStore ECLHit.

Definition at line 69 of file SensitiveDetector.h.

◆ m_hitNum

int m_hitNum
private

members of SensitiveDetector

Definition at line 68 of file SensitiveDetector.h.

◆ m_momentum

G4ThreeVector m_momentum
private

Wighted step Position.

Definition at line 75 of file SensitiveDetector.h.

◆ m_oldEvnetNumber

int m_oldEvnetNumber
private

The current number of created hits in an event.

Used to fill the DataStore ECL EB array.

Definition at line 70 of file SensitiveDetector.h.

◆ m_phiID

int m_phiID
private

flag of first call

Definition at line 91 of file SensitiveDetector.h.

◆ m_startEnergy

double m_startEnergy
private

global time

Definition at line 79 of file SensitiveDetector.h.

◆ m_startPos

G4ThreeVector m_startPos
private

track id

Definition at line 72 of file SensitiveDetector.h.

◆ m_startTime

double m_startTime
private

momentum of track

Definition at line 76 of file SensitiveDetector.h.

◆ m_subdetector

Const::EDetector m_subdetector
privateinherited

Subdetector the class belongs to.

Definition at line 91 of file SensitiveDetectorBase.h.

◆ m_thetaID

int m_thetaID
private

The current phi ID in an event.

Used to fill the DataStore ECL array

Definition at line 92 of file SensitiveDetector.h.

◆ m_trackID

int m_trackID
private

The current number of created hits in an event.

Used to fill the DataStore

Definition at line 71 of file SensitiveDetector.h.

◆ m_trackLength

double m_trackLength
private

energy deposited in volume

Definition at line 81 of file SensitiveDetector.h.

◆ m_WightedPos

G4ThreeVector m_WightedPos
private

Position of poststep.

Definition at line 74 of file SensitiveDetector.h.

◆ m_WightedTime

double m_WightedTime
private

global time

Definition at line 78 of file SensitiveDetector.h.

◆ s_active

bool s_active
staticprivateinherited

Static bool which indicates wether recording of hits is enabled.

Definition at line 89 of file SensitiveDetectorBase.h.

◆ s_mcRelations

map< string, RelationArray::EConsolidationAction > s_mcRelations
staticprivateinherited

Static set holding all relations which have to be updated at the end of the Event.

Definition at line 87 of file SensitiveDetectorBase.h.

◆ T_ave

double T_ave
private

position alongthe vector of crystal axis

Definition at line 89 of file SensitiveDetector.h.

◆ TimeIndex

int TimeIndex
private

Hit Energy of StoreArray.

Definition at line 85 of file SensitiveDetector.h.


The documentation for this class was generated from the following files: