Belle II Software  release-05-02-19
SensitiveBar Class Reference

Class providing information on MCParticles hitting the bars. More...

#include <SensitiveBar.h>

Inheritance diagram for SensitiveBar:
Collaboration diagram for SensitiveBar:

Public Member Functions

 SensitiveBar ()
 Constructor.
 
bool step (G4Step *aStep, G4TouchableHistory *) override
 Process each step and fill TOPBarHits. More...
 
void setReplicaDepth (int depth)
 Sets replica depth of module volume. More...
 

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

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 m_replicaDepth = 2
 replica depth of module volume
 
TOPGeometryParm_topgp = TOPGeometryPar::Instance()
 geometry parameters
 
std::vector< int > m_trackIDs
 track ID's
 
StoreArray< MCParticlem_mcParticles
 collection of MC particles
 
StoreArray< TOPBarHitm_barHits
 collection of entrance-to-bar hits
 
RelationArray m_relParticleHit {m_mcParticles, m_barHits}
 relations
 
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

Class providing information on MCParticles hitting the bars.

Applies also quantum efficiency to reduce the number of propagating photons.

Definition at line 41 of file SensitiveBar.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 98 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 70 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 24 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 54 of file SensitiveDetectorBase.h.

◆ setReplicaDepth()

void setReplicaDepth ( int  depth)
inline

Sets replica depth of module volume.

Parameters
depthreplica depth

Definition at line 61 of file SensitiveBar.h.

◆ step()

bool step ( G4Step *  aStep,
G4TouchableHistory *   
)
overridevirtual

Process each step and fill TOPBarHits.

Parameters
aStepCurrent Geant4 step in the sensitive medium.
Returns
true when particle that is not an optical photon enters the bar

Implements SensitiveDetectorBase.

Definition at line 55 of file SensitiveBar.cc.

56  {
57 
58  // get track and particle definition
59 
60  G4Track* aTrack = aStep->GetTrack();
61  G4ParticleDefinition* particle = aTrack->GetDefinition();
62 
63  // if optical photon, apply QE and return false
64 
65  if (particle == G4OpticalPhoton::OpticalPhotonDefinition()) {
66  auto* info = dynamic_cast<Simulation::TrackInfo*>(aTrack->GetUserInformation());
67  if (!info) return false;
68  if (info->getStatus() < 2) {
69  double energy = aTrack->GetKineticEnergy() * Unit::MeV / Unit::eV;
70  double qeffi = m_topgp->getPMTEfficiencyEnvelope(energy);
71  double fraction = info->getFraction();
72  if (qeffi == 0 or gRandom->Uniform() * fraction > qeffi) {
73  aTrack->SetTrackStatus(fStopAndKill);
74  return false;
75  }
76  info->setStatus(2);
77  info->setFraction(qeffi);
78  }
79  return false;
80  }
81 
82  // continue for other particles, if they enter the volume for the first time
83 
84  G4StepPoint* PrePosition = aStep->GetPreStepPoint();
85  if (PrePosition->GetStepStatus() != fGeomBoundary) return false; // not on boundary
86 
87  if (m_barHits.getEntries() == 0) {
88  for (auto& trackID : m_trackIDs) trackID = -1; // reset on new event
89  }
90 
91  int moduleID = PrePosition->GetTouchableHandle()->GetReplicaNumber(m_replicaDepth);
92  const auto* geo = m_topgp->getGeometry();
93  if (!geo->isModuleIDValid(moduleID)) {
94  B2ERROR("TOP::SensitiveBar: undefined module ID."
95  << LogVar("moduleID", moduleID));
96  return false;
97  }
98 
99  int trackID = aTrack->GetTrackID();
100  if (trackID == m_trackIDs[moduleID - 1]) return false; // not first time on boundary
101  m_trackIDs[moduleID - 1] = trackID;
102 
103  // particle other than optical photon entered the volume for the first time
104  // convert to basf2 units and write-out the hit
105 
106  G4ThreeVector worldPosition = PrePosition->GetPosition();
107  double tracklength = aTrack->GetTrackLength() - aStep->GetStepLength();
108  double globalTime = PrePosition->GetGlobalTime();
109  G4ThreeVector momentum = PrePosition->GetMomentum();
110 
111  TVector3 TPosition(worldPosition.x(), worldPosition.y(), worldPosition.z());
112  TVector3 TMomentum(momentum.x(), momentum.y(), momentum.z());
113  TVector3 TOrigin(aTrack->GetVertexPosition().x(),
114  aTrack->GetVertexPosition().y(),
115  aTrack->GetVertexPosition().z());
116 
117  // convert to Basf2 units
118  TPosition = TPosition * Unit::mm;
119  TMomentum = TMomentum * Unit::MeV;
120  TOrigin = TOrigin * Unit::mm;
121  tracklength = tracklength * Unit::mm;
122 
123  const auto& module = geo->getModule(moduleID);
124  TVector3 locPosition = module.pointToLocal(TPosition);
125  TVector3 locMomentum = module.momentumToLocal(TMomentum);
126  double theta = locMomentum.Theta();
127  double phi = locMomentum.Phi();
128 
129  int PDG = (int)(particle->GetPDGEncoding());
130 
131  // write hit to datastore
132  auto* hit = m_barHits.appendNew(moduleID, PDG, TOrigin, TPosition, TMomentum,
133  globalTime, tracklength, locPosition,
134  theta, phi);
135 
136  // set the relation
137  m_relParticleHit.add(trackID, hit->getArrayIndex());
138 
139  return true;
140  }

The documentation for this class was generated from the following files:
Belle2::TOP::SensitiveBar::m_barHits
StoreArray< TOPBarHit > m_barHits
collection of entrance-to-bar hits
Definition: SensitiveBar.h:70
Belle2::TOP::SensitiveBar::m_replicaDepth
int m_replicaDepth
replica depth of module volume
Definition: SensitiveBar.h:65
Belle2::TOP::SensitiveBar::m_mcParticles
StoreArray< MCParticle > m_mcParticles
collection of MC particles
Definition: SensitiveBar.h:69
Belle2::TOP::SensitiveBar::m_trackIDs
std::vector< int > m_trackIDs
track ID's
Definition: SensitiveBar.h:67
Belle2::TOP::TOPGeometryPar::getPMTEfficiencyEnvelope
double getPMTEfficiencyEnvelope(double energy) const
Returns PMT efficiency envelope, e.g.
Definition: TOPGeometryPar.cc:179
Belle2::TOP::SensitiveBar::m_relParticleHit
RelationArray m_relParticleHit
relations
Definition: SensitiveBar.h:71
Belle2::Unit::MeV
static const double MeV
[megaelectronvolt]
Definition: Unit.h:124
Belle2::Unit::eV
static const double eV
[electronvolt]
Definition: Unit.h:122
LogVar
Class to store variables with their name which were sent to the logging service.
Definition: LogVariableStream.h:24
Belle2::RelationArray::add
void add(index_type from, index_type to, weight_type weight=1.0)
Add a new element to the relation.
Definition: RelationArray.h:291
Belle2::Unit::mm
static const double mm
[millimeters]
Definition: Unit.h:80
Belle2::TOP::SensitiveBar::m_topgp
TOPGeometryPar * m_topgp
geometry parameters
Definition: SensitiveBar.h:66
Belle2::TOP::TOPGeometryPar::getGeometry
const TOPGeometry * getGeometry() const
Returns pointer to geometry object using Basf2 units.
Definition: TOPGeometryPar.cc:167