Belle II Software development
SensitiveDetector Class Reference

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

#include <SensitiveDetector.h>

Inheritance diagram for SensitiveDetector:
SensitiveDetectorBase

Public Member Functions

 SensitiveDetector ()
 Constructor.
 
 ~SensitiveDetector ()
 Destructor.
 

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 *step, 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 current_pdgID
 particle PDG id
 
int current_sensorID
 sensor ID
 
int current_trackID
 track ID
 
float current_trackVertex_x
 track production vertex x coordinates in G4 ref
 
float current_trackVertex_y
 track production vertex y coordinates in G4 ref
 
float current_trackVertex_z
 track production vertex z coordinates in G4 ref
 
float current_energyDep
 deposited energy in MeV
 
float current_nielDep
 non ionizing deposited energy
 
float current_posIN_x
 incoming track position x in G4 ref, in mm
 
float current_posIN_y
 incoming track position y in G4 ref, in mm
 
float current_posIN_z
 incoming track position z in G4 ref, in mm
 
float current_posIN_u
 incoming track position u in sensor ref, in mm
 
float current_posIN_v
 incoming track position v in sensor ref, in mm
 
float current_posIN_w
 incoming track position w in sensor ref, in mm
 
float current_posOUT_u
 outcoming track position u in sensor ref, in mm
 
float current_posOUT_v
 outcoming track position v in sensor ref, in mm
 
float current_posOUT_w
 outcoming track position w in sensor ref, in mm
 
float current_posOUT_x
 outcoming track position x in sensor ref, in mm
 
float current_posOUT_y
 outcoming track position y in sensor ref, in mm
 
float current_posOUT_z
 outcoming track position z in sensor ref, in mm
 
float current_momentum_x
 incoming track momentum, x coordinates in G4 ref, in GeV
 
float current_momentum_y
 incoming track momentum, y coordinates in G4 ref, in GeV
 
float current_momentum_z
 incoming track momentum, z coordinates in G4 ref, in GeV
 
float current_thetaAngle
 local (sensor ref) theta angle, out of sensor plane, in degree
 
float current_phiAngle
 local (sensor ref) phi angle, in sensor plane, in degree
 
float current_globalTime
 global time
 
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 PLUME detector.

Definition at line 22 of file SensitiveDetector.h.

Constructor & Destructor Documentation

◆ SensitiveDetector()

Constructor.

Definition at line 33 of file SensitiveDetector.cc.

33 :
34 Simulation::SensitiveDetectorBase("PlumeSensitiveDetector", Const::invalidDetector)
35 {
40 current_pdgID = 0;
42 current_posIN_u = 0.;
43 current_posIN_v = 0.;
44 current_posIN_w = 0.;
45 current_posIN_x = 0.;
46 current_posIN_y = 0.;
47 current_posIN_z = 0.;
58 current_nielDep = 0.;
59 current_thetaAngle = 0.; // local sensor frame
60 current_phiAngle = 0.; // local sensor frame
62
63 //Make sure all collections are registered
64 StoreArray<MCParticle> mcParticles;
65 StoreArray<PlumeSimHit> simHits;
66 StoreArray<PlumeHit> plumeHits;
67
68 RelationArray relMCSimHit(mcParticles, simHits);
69 RelationArray relMCplumeHit(mcParticles, plumeHits);
70
71 //Register all collections we want to modify and require those we want to use
72 mcParticles.registerInDataStore();
73 simHits.registerInDataStore();
74 plumeHits.registerInDataStore();
75 relMCSimHit.registerInDataStore();
76 relMCplumeHit.registerInDataStore();
77
78 //Register the Relation so that the TrackIDs get replaced by the actual
79 //MCParticle indices after simulating the events. This is needed as
80 //secondary particles might not be stored so everything relating to those
81 //particles will be attributed to the last saved mother particle
82 registerMCParticleRelation(relMCSimHit);
83 registerMCParticleRelation(relMCplumeHit);
84 }
static void registerMCParticleRelation(const std::string &name, RelationArray::EConsolidationAction ignoreAction=RelationArray::c_negativeWeight)
Register an relation involving MCParticles.
float current_trackVertex_z
track production vertex z coordinates in G4 ref
float current_posIN_v
incoming track position v in sensor ref, in mm
float current_posIN_u
incoming track position u in sensor ref, in mm
float current_momentum_z
incoming track momentum, z coordinates in G4 ref, in GeV
float current_posIN_y
incoming track position y in G4 ref, in mm
float current_momentum_y
incoming track momentum, y coordinates in G4 ref, in GeV
float current_posOUT_w
outcoming track position w in sensor ref, in mm
float current_energyDep
deposited energy in MeV
float current_trackVertex_x
track production vertex x coordinates in G4 ref
float current_posOUT_z
outcoming track position z in sensor ref, in mm
float current_posOUT_v
outcoming track position v in sensor ref, in mm
float current_posIN_z
incoming track position z in G4 ref, in mm
float current_thetaAngle
local (sensor ref) theta angle, out of sensor plane, in degree
float current_posOUT_u
outcoming track position u in sensor ref, in mm
float current_momentum_x
incoming track momentum, x coordinates in G4 ref, in GeV
float current_trackVertex_y
track production vertex y coordinates in G4 ref
float current_posOUT_y
outcoming track position y in sensor ref, in mm
float current_posIN_x
incoming track position x in G4 ref, in mm
float current_phiAngle
local (sensor ref) phi angle, in sensor plane, in degree
float current_nielDep
non ionizing deposited energy
float current_posIN_w
incoming track position w in sensor ref, in mm
float current_posOUT_x
outcoming track position x in sensor ref, in mm

◆ ~SensitiveDetector()

Destructor.

Definition at line 86 of file SensitiveDetector.cc.

87 {
88
89 }

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 }

◆ 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 *  step,
G4TouchableHistory *   
)
overrideprotectedvirtual

Step processing method.

Parameters
stepthe 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 92 of file SensitiveDetector.cc.

93 {
94
95 //Get track information, and pre- and post-step
96 const G4Track& track = *step->GetTrack();
97 const G4StepPoint& preStepPoint = *step->GetPreStepPoint();
98 const G4StepPoint& postStepPoint = *step->GetPostStepPoint();
99
100
101 // If new track, store general information from this first step
102 if (current_trackID != track.GetTrackID()) { // if new track
103 current_trackID = track.GetTrackID();
104 current_trackVertex_x = track.GetVertexPosition().x();
105 current_trackVertex_y = track.GetVertexPosition().y();
106 current_trackVertex_z = track.GetVertexPosition().z();
107 current_pdgID = track.GetDefinition()->GetPDGEncoding();
108 current_sensorID = preStepPoint.GetTouchableHandle()->GetReplicaNumber(1);
109
110 // since this is first step in volume store track incidence and momentum and reset energy loss
111 G4ThreeVector preStepPointPosition = preStepPoint.GetPosition();
112 G4ThreeVector trackMomentum = track.GetMomentum();
114 current_nielDep = 0.;
115
116 current_posIN_x = preStepPointPosition.x();
117 current_posIN_y = preStepPointPosition.y();
118 current_posIN_z = preStepPointPosition.z();
119 current_momentum_x = trackMomentum.x();
120 current_momentum_y = trackMomentum.y();
121 current_momentum_z = trackMomentum.z();
122
123 // We want the track angles of incidence on the local volume and the local position
124 G4TouchableHandle theTouchable = preStepPoint.GetTouchableHandle();
125 G4ThreeVector worldDirection = preStepPoint.GetMomentumDirection();
126 G4ThreeVector localDirection = theTouchable->GetHistory()->GetTopTransform().TransformAxis(worldDirection);
127
128 if (localDirection.z() < 0.) {
129 current_thetaAngle = M_PI - acos(-1. * localDirection.z());
130 } else {
131 current_thetaAngle = acos(localDirection.z());
132 }
133
134
135 if (localDirection.x() < 0. && localDirection.y() > 0.) {
136 current_phiAngle = atan(-1. * localDirection.x() / localDirection.y());
137 } else if (localDirection.x() < 0. && localDirection.y() < 0.) {
138 current_phiAngle = M_PI - atan(localDirection.x() / localDirection.y());
139 } else if (localDirection.x() > 0. && localDirection.y() < 0.) {
140 current_phiAngle = M_PI + atan(-1. * localDirection.x() / localDirection.y());
141 } else if (localDirection.x() > 0. && localDirection.y() > 0.) {
142 current_phiAngle = 2. * M_PI - atan(localDirection.x() / localDirection.y());
143 } else if (localDirection.x() < 0. && localDirection.y() == 0.) {
144 current_phiAngle = M_PI / 2.;
145 } else if (localDirection.x() > 0. && localDirection.y() == 0.) {
146 current_phiAngle = 3.* M_PI / 2.;
147 } else if (localDirection.x() == 0. && localDirection.y() > 0.) {
148 current_phiAngle = 0.;
149 } else if (localDirection.x() == 0. && localDirection.y() < 0.) {
150 current_phiAngle = M_PI;
151 }
152
153 G4ThreeVector localINPosition = theTouchable->GetHistory()->GetTopTransform().TransformPoint(preStepPointPosition);
154 current_posIN_u = localINPosition.y();
155 current_posIN_v = - localINPosition.x();
156 current_posIN_w = localINPosition.z();
157
158 current_globalTime = step->GetPreStepPoint()->GetGlobalTime();
159
160 } // end if new track
161
162 // Update information at each step
163 current_energyDep += step->GetTotalEnergyDeposit();
164 current_nielDep += step->GetNonIonizingEnergyDeposit();
165
166 // If track leaves volume or is killed, store final step info and save simHit
167 if (track.GetNextVolume() != track.GetVolume() || track.GetTrackStatus() >= fStopAndKill) { // if last step
168
169 G4ThreeVector postStepPointPosition = postStepPoint.GetPosition();
170
171 current_posOUT_x = postStepPointPosition.x();
172 current_posOUT_y = postStepPointPosition.y();
173 current_posOUT_z = postStepPointPosition.z();
174 G4ThreeVector localOUTPosition = preStepPoint.GetTouchableHandle()->GetHistory()->GetTopTransform().TransformPoint(
175 postStepPointPosition);
176 current_posOUT_u = localOUTPosition.y();
177 current_posOUT_v = - localOUTPosition.x();
178 current_posOUT_w = localOUTPosition.z();
179
180 //Get the datastore arrays
181 StoreArray<MCParticle> mcParticles;
182 StoreArray<PlumeSimHit> simHits;
183
184 if (current_energyDep > CLHEP::eV) {
185
186 RelationArray relMCSimHit(mcParticles, simHits);
187 PlumeSimHit* hit = simHits.appendNew(
191 current_trackVertex_x / CLHEP::mm,
192 current_trackVertex_y / CLHEP::mm,
193 current_trackVertex_z / CLHEP::mm,
194 current_energyDep / CLHEP::MeV,
195 current_nielDep / CLHEP::MeV,
196 current_posIN_x / CLHEP::mm,
197 current_posIN_y / CLHEP::mm,
198 current_posIN_z / CLHEP::mm,
199 current_posIN_u / CLHEP::mm,
200 current_posIN_v / CLHEP::mm,
201 current_posIN_w / CLHEP::mm,
202 current_posOUT_u / CLHEP::mm,
203 current_posOUT_v / CLHEP::mm,
204 current_posOUT_w / CLHEP::mm,
205 current_momentum_x / CLHEP::GeV,
206 current_momentum_y / CLHEP::GeV,
207 current_momentum_z / CLHEP::GeV,
208 current_thetaAngle / CLHEP::degree,
209 current_phiAngle / CLHEP::degree,
210 current_globalTime / CLHEP::nanosecond
211 );
212
213 //Add Relation between SimHit and MCParticle with a weight of 1. Since
214 //the MCParticle index is not yet defined we use the trackID from Geant4
215 relMCSimHit.add(current_trackID, hit->getArrayIndex(), 1.0);
216 }
217
218 //Reset TrackID
219 current_trackID = 0;
220
221 } // end if last
222
223
224 //Ignore everything below 1eV
225 if (current_energyDep < CLHEP::eV) return false;
226
227
228 return true;
229 }
bool step(G4Step *step, G4TouchableHistory *) override
Step processing method.
double atan(double a)
atan for double
Definition: beamHelpers.h:34

Member Data Documentation

◆ current_energyDep

float current_energyDep
private

deposited energy in MeV

Definition at line 50 of file SensitiveDetector.h.

◆ current_globalTime

float current_globalTime
private

global time

Definition at line 88 of file SensitiveDetector.h.

◆ current_momentum_x

float current_momentum_x
private

incoming track momentum, x coordinates in G4 ref, in GeV

Definition at line 78 of file SensitiveDetector.h.

◆ current_momentum_y

float current_momentum_y
private

incoming track momentum, y coordinates in G4 ref, in GeV

Definition at line 80 of file SensitiveDetector.h.

◆ current_momentum_z

float current_momentum_z
private

incoming track momentum, z coordinates in G4 ref, in GeV

Definition at line 82 of file SensitiveDetector.h.

◆ current_nielDep

float current_nielDep
private

non ionizing deposited energy

Definition at line 52 of file SensitiveDetector.h.

◆ current_pdgID

int current_pdgID
private

particle PDG id

Definition at line 38 of file SensitiveDetector.h.

◆ current_phiAngle

float current_phiAngle
private

local (sensor ref) phi angle, in sensor plane, in degree

Definition at line 86 of file SensitiveDetector.h.

◆ current_posIN_u

float current_posIN_u
private

incoming track position u in sensor ref, in mm

Definition at line 60 of file SensitiveDetector.h.

◆ current_posIN_v

float current_posIN_v
private

incoming track position v in sensor ref, in mm

Definition at line 62 of file SensitiveDetector.h.

◆ current_posIN_w

float current_posIN_w
private

incoming track position w in sensor ref, in mm

Definition at line 64 of file SensitiveDetector.h.

◆ current_posIN_x

float current_posIN_x
private

incoming track position x in G4 ref, in mm

Definition at line 54 of file SensitiveDetector.h.

◆ current_posIN_y

float current_posIN_y
private

incoming track position y in G4 ref, in mm

Definition at line 56 of file SensitiveDetector.h.

◆ current_posIN_z

float current_posIN_z
private

incoming track position z in G4 ref, in mm

Definition at line 58 of file SensitiveDetector.h.

◆ current_posOUT_u

float current_posOUT_u
private

outcoming track position u in sensor ref, in mm

Definition at line 66 of file SensitiveDetector.h.

◆ current_posOUT_v

float current_posOUT_v
private

outcoming track position v in sensor ref, in mm

Definition at line 68 of file SensitiveDetector.h.

◆ current_posOUT_w

float current_posOUT_w
private

outcoming track position w in sensor ref, in mm

Definition at line 70 of file SensitiveDetector.h.

◆ current_posOUT_x

float current_posOUT_x
private

outcoming track position x in sensor ref, in mm

Definition at line 72 of file SensitiveDetector.h.

◆ current_posOUT_y

float current_posOUT_y
private

outcoming track position y in sensor ref, in mm

Definition at line 74 of file SensitiveDetector.h.

◆ current_posOUT_z

float current_posOUT_z
private

outcoming track position z in sensor ref, in mm

Definition at line 76 of file SensitiveDetector.h.

◆ current_sensorID

int current_sensorID
private

sensor ID

Definition at line 40 of file SensitiveDetector.h.

◆ current_thetaAngle

float current_thetaAngle
private

local (sensor ref) theta angle, out of sensor plane, in degree

Definition at line 84 of file SensitiveDetector.h.

◆ current_trackID

int current_trackID
private

track ID

Definition at line 42 of file SensitiveDetector.h.

◆ current_trackVertex_x

float current_trackVertex_x
private

track production vertex x coordinates in G4 ref

Definition at line 44 of file SensitiveDetector.h.

◆ current_trackVertex_y

float current_trackVertex_y
private

track production vertex y coordinates in G4 ref

Definition at line 46 of file SensitiveDetector.h.

◆ current_trackVertex_z

float current_trackVertex_z
private

track production vertex z coordinates in G4 ref

Definition at line 48 of file SensitiveDetector.h.

◆ m_subdetector

Const::EDetector m_subdetector
privateinherited

Subdetector the class belongs to.

Definition at line 91 of file SensitiveDetectorBase.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.


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