Belle II Software  release-08-01-10
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/claw/simulation/SensitiveDetector.h>
10 #include <beast/claw/dataobjects/ClawSimHit.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 
19 namespace Belle2 {
25  namespace claw {
26 
28  Simulation::SensitiveDetectorBase("ClawSensitiveDetector", Const::invalidDetector)
29  {
30  m_hitNum = 0;
31  m_EvnetNumber = 0;
32  m_oldEvnetNumber = 0;
33  m_trackID = 0;
34  m_startTime = 0;
35  m_endTime = 0;
36  m_WightedTime = 0;
37  m_startEnergy = 0;
38  m_energyDeposit = 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;
51  StoreArray<ClawSimHit> simHits;
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;
91  m_energyDeposit = 0;
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  TVector3 position((m_startPos.getX() + m_endPos.getX()) / 2 / CLHEP::cm, (m_startPos.getY() + m_endPos.getY()) / 2 / CLHEP::cm,
111  (m_startPos.getZ() + m_endPos.getZ()) / 2 / CLHEP::cm);
112  m_WightedPos += position * (step->GetTotalEnergyDeposit());
113 
114  //Save Hit if track leaves volume or is killed
115  if (track.GetNextVolume() != track.GetVolume() || track.GetTrackStatus() >= fStopAndKill) {
116  int pdgCode = track.GetDefinition()->GetPDGEncoding();
117 
118  //const G4VPhysicalVolume& v = * track.GetVolume();
119  //G4ThreeVector posCell = v.GetTranslation();
120  // Get layer ID
121 
122  //if (v.GetName().find("Crystal") != std::string::npos) {
123  //CsiGeometryPar* eclp = CsiGeometryPar::Instance();
124  m_cellID = track.GetVolume()->GetCopyNo();
125 
126  double dTotalEnergy = 1 / m_energyDeposit; //avoid the error no match for 'operator/'
127  if (m_energyDeposit > 0.) {
129  m_energyDeposit, m_momentum, m_WightedPos * dTotalEnergy);
130  //}
131  }
132 
133  //Reset TrackID
134  m_trackID = 0;
135  }
136 
137  return true;
138  }
139 
141  const G4int cellId,
142  const G4int trackID,
143  const G4int pid,
144  const G4double tof,
145  const G4double edep,
146  G4ThreeVector mom,
147  TVector3 posAve)
148  {
149 
150  //Get the datastore arraus
151  StoreArray<MCParticle> mcParticles;
152  StoreArray<ClawSimHit> simHits;
153  RelationArray relMClawmHit(mcParticles, simHits);
154 
155  StoreArray<ClawSimHit> ClawHits;
156  RelationArray clawSimHitRel(mcParticles, ClawHits);
157  TVector3 momentum(mom.getX() / CLHEP::GeV, mom.getY() / CLHEP::GeV, mom.getZ() / CLHEP::GeV);
158  ClawHits.appendNew(cellId, trackID, pid, tof / CLHEP::ns, edep / CLHEP::GeV, momentum, posAve);
159  int simhitNumber = ClawHits.getEntries() - 1;
160  B2DEBUG(150, "HitNumber: " << simhitNumber);
161  clawSimHitRel.add(trackID, simhitNumber);
162  return (simhitNumber);
163  }//saveSimHit
164 
165 
166  } //claw namespace
168 } //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.
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 TimeIndex
Hit Energy of StoreArray.
int m_trackID
The current number of created hits in an event.
TVector3 m_WightedPos
Position of poststep.
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.
double m_startTime
momentum of track
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.
G4ThreeVector m_startPos
track id
G4ThreeVector m_endPos
Position of prestep.
bool step(G4Step *step, G4TouchableHistory *) override
Step processing method.
int saveSimHit(const G4int cellId, const G4int trackID, const G4int pid, const G4double tof, const G4double edep, G4ThreeVector mom, TVector3 WightedPos)
Save ClawSimHit into datastore.
Abstract base class for different kinds of events.