forked from cms-sw/cmssw
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMtdSD.cc
More file actions
156 lines (138 loc) · 5.46 KB
/
Copy pathMtdSD.cc
File metadata and controls
156 lines (138 loc) · 5.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
//#define EDM_ML_DEBUG
#include "SimG4CMS/Forward/interface/MtdSD.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include "Geometry/MTDCommonData/interface/BTLNumberingScheme.h"
#include "Geometry/MTDCommonData/interface/ETLNumberingScheme.h"
#include "DataFormats/ForwardDetId/interface/MTDDetId.h"
#include "SimDataFormats/TrackingHit/interface/PSimHit.h"
#include "G4Track.hh"
#include "G4Step.hh"
#include "G4StepPoint.hh"
#include <iostream>
//-------------------------------------------------------------------
MtdSD::MtdSD(const std::string& name,
const SensitiveDetectorCatalog& clg,
edm::ParameterSet const& p,
const SimTrackManager* manager)
: TimingSD(name, clg, manager), numberingScheme(nullptr) {
//Parameters
edm::ParameterSet m_p = p.getParameter<edm::ParameterSet>("MtdSD");
int verbn = m_p.getUntrackedParameter<int>("Verbosity");
SetVerboseLevel(verbn);
MTDNumberingScheme* scheme = nullptr;
if (name == "FastTimerHitsBarrel") {
scheme = dynamic_cast<MTDNumberingScheme*>(new BTLNumberingScheme());
isBTL = true;
} else if (name == "FastTimerHitsEndcap") {
scheme = dynamic_cast<MTDNumberingScheme*>(new ETLNumberingScheme());
isETL = true;
} else {
scheme = nullptr;
edm::LogWarning("MtdSim") << "MtdSD: ReadoutName not supported";
}
if (scheme)
setNumberingScheme(scheme);
energyCut = m_p.getParameter<double>("EnergyThresholdForPersistencyInGeV") * CLHEP::GeV; //default must be 0.5
energyHistoryCut = m_p.getParameter<double>("EnergyThresholdForHistoryInGeV") * CLHEP::GeV; //default must be 0.05
setCuts(energyCut, energyHistoryCut);
double newTimeFactor = 1. / m_p.getParameter<double>("TimeSliceUnit");
edm::LogVerbatim("MtdSim") << "New time factor = " << newTimeFactor;
setTimeFactor(newTimeFactor);
edm::LogVerbatim("MtdSim") << "MtdSD: Instantiation completed for " << name;
}
MtdSD::~MtdSD() {}
uint32_t MtdSD::setDetUnitId(const G4Step* aStep) {
if (numberingScheme == nullptr) {
return MTDDetId();
} else {
getBaseNumber(aStep);
#ifdef EDM_ML_DEBUG
edm::LogVerbatim("MtdSim") << "DetId = " << numberingScheme->getUnitID(theBaseNumber);
#endif
return numberingScheme->getUnitID(theBaseNumber);
}
}
void MtdSD::setNumberingScheme(MTDNumberingScheme* scheme) {
if (scheme != nullptr) {
edm::LogVerbatim("MtdSim") << "MtdSD: updates numbering scheme for " << GetName();
if (numberingScheme)
delete numberingScheme;
numberingScheme = scheme;
}
}
void MtdSD::getBaseNumber(const G4Step* aStep) {
theBaseNumber.reset();
const G4VTouchable* touch = aStep->GetPreStepPoint()->GetTouchable();
int theSize = touch->GetHistoryDepth() + 1;
if (theBaseNumber.getCapacity() < theSize)
theBaseNumber.setSize(theSize);
//Get name and copy numbers
if (theSize > 1) {
#ifdef EDM_ML_DEBUG
edm::LogVerbatim("MtdSim") << "Building MTD basenumber:";
#endif
for (int ii = 0; ii < theSize; ii++) {
theBaseNumber.addLevel(touch->GetVolume(ii)->GetName(), touch->GetReplicaNumber(ii));
#ifdef EDM_ML_DEBUG
edm::LogVerbatim("MtdSim") << "MtdSD::getBaseNumber(): Adding level " << ii << ": "
<< touch->GetVolume(ii)->GetName() << "[" << touch->GetReplicaNumber(ii) << "]";
#endif
}
}
}
int MtdSD::getTrackID(const G4Track* aTrack) {
int theID = aTrack->GetTrackID();
TrackInformation* trkInfo = cmsTrackInformation(aTrack);
const G4String& rname = aTrack->GetVolume()->GetLogicalVolume()->GetRegion()->GetName();
if (trkInfo != nullptr) {
#ifdef EDM_ML_DEBUG
trkInfo->Print();
#endif
if (!trkInfo->storeTrack()) {
theID = trkInfo->idLastStoredAncestor();
}
#ifdef EDM_ML_DEBUG
edm::LogVerbatim("MtdSim") << "MtdSD: current Track ID: " << aTrack->GetTrackID()
<< " stored Track ID: " << trkInfo->mcTruthID() << ":" << theID;
#endif
// In the case of ECAL GFlash fast spot may be inside MTD and should be ignored
if (rname != "FastTimerRegionSensBTL" && rname != "FastTimerRegionSensETL") {
throw cms::Exception("MtdSDError") << "MtdSD called in incorrect region " << rname;
}
} else {
#ifdef EDM_ML_DEBUG
edm::LogWarning("MtdSim") << "MtdSD: Problem with primaryID **** set by force to TkID **** " << theID;
#endif
}
return theID;
}
void MtdSD::setHitClassID(const G4Step* aStep) {
hitClassID = 0;
TrackInformation* trkInfo = cmsTrackInformation(aStep->GetTrack());
if (nullptr == trkInfo) {
return;
}
const G4String& rname = aStep->GetTrack()->GetVolume()->GetLogicalVolume()->GetRegion()->GetName();
if (rname == "FastTimerRegionSensBTL") {
if (trkInfo->isInTrkFromBackscattering()) {
hitClassID = SimHitCategory::prodTypeMTD[3];
} else if (trkInfo->isExtSecondary() && !trkInfo->isInTrkFromBackscattering() && !trkInfo->storeTrack()) {
hitClassID = SimHitCategory::prodTypeMTD[1];
} else if (trkInfo->isBTLlooper()) {
hitClassID = SimHitCategory::prodTypeMTD[2];
}
} else if (rname == "FastTimerRegionSensETL") {
double zin = std::abs(aStep->GetPreStepPoint()->GetPosition().z());
double zout = std::abs(aStep->GetPostStepPoint()->GetPosition().z());
if (zout - zin < 0.) {
hitClassID = SimHitCategory::prodTypeMTD[4];
trkInfo->setETLfromBack();
} else {
trkInfo->setETLfromFront();
}
}
#ifdef EDM_ML_DEBUG
edm::LogVerbatim("MtdSim") << "MtdSD: process type = " << hitClassID;
#endif
}