Belle II Software  release-08-01-10
SensitiveDetector Class Reference

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

#include <SensitiveDetector.h>

Inheritance diagram for SensitiveDetector:
Collaboration diagram for SensitiveDetector:

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. More...
 
static void registerMCParticleRelation (const std::string &name, RelationArray::EConsolidationAction ignoreAction=RelationArray::c_negativeWeight)
 Register an relation involving MCParticles. More...
 
static void registerMCParticleRelation (const RelationArray &relation, RelationArray::EConsolidationAction ignoreAction=RelationArray::c_negativeWeight)
 Overload to make it easer to register MCParticle relations. More...
 

Protected Member Functions

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

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. More...
 

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.

Member Function Documentation

◆ 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.

◆ 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.

◆ 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.

◆ 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.

◆ 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();
113  current_energyDep = 0.;
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  }
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
bool step(G4Step *step, G4TouchableHistory *) override
Step processing method.
float current_posOUT_x
outcoming track position x in sensor ref, in mm
double atan(double a)
atan for double
Definition: beamHelpers.h:34

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