CMS 3D CMS Logo

HGCSD.cc
Go to the documentation of this file.
1 // File: HGCSD.cc
3 // Description: Sensitive Detector class for Combined Forward Calorimeter
5 
7 
19 #include "G4LogicalVolumeStore.hh"
20 #include "G4LogicalVolume.hh"
21 #include "G4Step.hh"
22 #include "G4Track.hh"
23 #include "G4ParticleTable.hh"
24 #include "G4VProcess.hh"
25 #include "G4Trap.hh"
26 
27 #include <iostream>
28 #include <fstream>
29 #include <iomanip>
30 
31 //#define EDM_ML_DEBUG
32 //#define plotDebug
33 
35  const edm::EventSetup& es,
36  const SensitiveDetectorCatalog& clg,
37  edm::ParameterSet const& p,
38  const SimTrackManager* manager)
39  : CaloSD(name,
40  es,
41  clg,
42  p,
43  manager,
44  (float)(p.getParameter<edm::ParameterSet>("HGCSD").getParameter<double>("TimeSliceUnit")),
45  p.getParameter<edm::ParameterSet>("HGCSD").getParameter<bool>("IgnoreTrackID")),
46  slopeMin_(0),
47  levelT_(99),
48  tree_(nullptr) {
49  numberingScheme_.reset(nullptr);
50  mouseBite_.reset(nullptr);
51 
52  edm::ParameterSet m_HGC = p.getParameter<edm::ParameterSet>("HGCSD");
53  eminHit_ = m_HGC.getParameter<double>("EminHit") * CLHEP::MeV;
54  storeAllG4Hits_ = m_HGC.getParameter<bool>("StoreAllG4Hits");
55  rejectMB_ = m_HGC.getParameter<bool>("RejectMouseBite");
56  waferRot_ = m_HGC.getParameter<bool>("RotatedWafer");
57  angles_ = m_HGC.getUntrackedParameter<std::vector<double>>("WaferAngles");
58  double waferSize = m_HGC.getUntrackedParameter<double>("WaferSize") * CLHEP::mm;
59  double mouseBite = m_HGC.getUntrackedParameter<double>("MouseBite") * CLHEP::mm;
60  mouseBiteCut_ = waferSize * tan(30.0 * CLHEP::deg) - mouseBite;
61 
62  if (storeAllG4Hits_) {
63  setUseMap(false);
65  }
66  //this is defined in the hgcsens.xml
67  G4String myName = name;
69  nameX_ = "HGCal";
70  if (myName.find("HitsEE") != std::string::npos) {
72  nameX_ = "HGCalEESensitive";
73  } else if (myName.find("HitsHEfront") != std::string::npos) {
75  nameX_ = "HGCalHESiliconSensitive";
76  } else if (myName.find("HitsHEback") != std::string::npos) {
78  nameX_ = "HGCalHEScintillatorSensitive";
79  }
80 
81 #ifdef EDM_ML_DEBUG
82  edm::LogVerbatim("HGCSim") << "**************************************************"
83  << "\n"
84  << "* *"
85  << "\n"
86  << "* Constructing a HGCSD with name " << name << "\n"
87  << "* *"
88  << "\n"
89  << "**************************************************";
90 #endif
91  edm::LogVerbatim("HGCSim") << "HGCSD:: Threshold for storing hits: " << eminHit << " for " << nameX_ << " subdet "
92  << myFwdSubdet_;
93  edm::LogVerbatim("HGCSim") << "Flag for storing individual Geant4 Hits " << storeAllG4Hits_;
94  edm::LogVerbatim("HGCSim") << "Reject MosueBite Flag: " << rejectMB_ << " Size of wafer " << waferSize
95  << " Mouse Bite " << mouseBite << ":" << mouseBiteCut_ << " along " << angles_.size()
96  << " axes";
97 }
98 
99 double HGCSD::getEnergyDeposit(const G4Step* aStep) {
100  double r = aStep->GetPreStepPoint()->GetPosition().perp();
101  double z = std::abs(aStep->GetPreStepPoint()->GetPosition().z());
102 
103 #ifdef EDM_ML_DEBUG
104  G4int parCode = aStep->GetTrack()->GetDefinition()->GetPDGEncoding();
105  G4LogicalVolume* lv = aStep->GetPreStepPoint()->GetPhysicalVolume()->GetLogicalVolume();
106  edm::LogVerbatim("HGCSim") << "HGCSD: Hit from standard path from " << lv->GetName() << " for Track "
107  << aStep->GetTrack()->GetTrackID() << " ("
108  << aStep->GetTrack()->GetDefinition()->GetParticleName() << ":" << parCode << ") R = " << r
109  << " Z = " << z << " slope = " << r / z << ":" << slopeMin_;
110 #endif
111 
112  // Apply fiductial volume
113  if (r < z * slopeMin_) {
114  return 0.0;
115  }
116 
117  double wt1 = getResponseWt(aStep->GetTrack());
118  double wt2 = aStep->GetTrack()->GetWeight();
119  double destep = wt1 * aStep->GetTotalEnergyDeposit();
120  if (wt2 > 0)
121  destep *= wt2;
122 
123 #ifdef plotDebug
124  const G4VTouchable* touch = aStep->GetPreStepPoint()->GetTouchable();
125  G4double tmptrackE = aStep->GetTrack()->GetKineticEnergy();
126  G4int parCode = aStep->GetTrack()->GetDefinition()->GetPDGEncoding();
127  G4double angle = (aStep->GetTrack()->GetMomentumDirection().theta()) / CLHEP::deg;
128  G4int layer = ((touch->GetHistoryDepth() == levelT_) ? touch->GetReplicaNumber(0) : touch->GetReplicaNumber(2));
129  G4int ilayer = (layer - 1) / 3;
130  if (aStep->GetTotalEnergyDeposit() > 0) {
131  t_Layer_.emplace_back(ilayer);
132  t_Parcode_.emplace_back(parCode);
133  t_dEStep1_.emplace_back(aStep->GetTotalEnergyDeposit());
134  t_dEStep2_.emplace_back(destep);
135  t_TrackE_.emplace_back(tmptrackE);
136  t_Angle_.emplace_back(angle);
137  }
138 #endif
139 
140  return destep;
141 }
142 
143 uint32_t HGCSD::setDetUnitId(const G4Step* aStep) {
144  const G4StepPoint* preStepPoint = aStep->GetPreStepPoint();
145  const G4VTouchable* touch = preStepPoint->GetTouchable();
146 
147  //determine the exact position in global coordinates in the mass geometry
148  G4ThreeVector hitPoint = preStepPoint->GetPosition();
149  float globalZ = touch->GetTranslation(0).z();
150  int iz(globalZ > 0 ? 1 : -1);
151 
152  //convert to local coordinates (=local to the current volume):
153  G4ThreeVector localpos = touch->GetHistory()->GetTopTransform().TransformPoint(hitPoint);
154 
155  //get the det unit id with
157 
158  int layer, module, cell;
159  if (touch->GetHistoryDepth() == levelT_) {
160  layer = touch->GetReplicaNumber(0);
161  module = -1;
162  cell = -1;
163 #ifdef EDM_ML_DEBUG
164  edm::LogVerbatim("HGCSim") << "Depths: " << touch->GetHistoryDepth() << " name " << touch->GetVolume(0)->GetName()
165  << " layer:module:cell " << layer << ":" << module << ":" << cell;
166 #endif
167  } else {
168  layer = touch->GetReplicaNumber(2);
169  module = touch->GetReplicaNumber(1);
170  cell = touch->GetReplicaNumber(0);
171  }
172 #ifdef EDM_ML_DEBUG
173  const G4Material* mat = aStep->GetPreStepPoint()->GetMaterial();
174  edm::LogVerbatim("HGCSim") << "Depths: " << touch->GetHistoryDepth() << " name " << touch->GetVolume(0)->GetName()
175  << ":" << touch->GetReplicaNumber(0) << " " << touch->GetVolume(1)->GetName() << ":"
176  << touch->GetReplicaNumber(1) << " " << touch->GetVolume(2)->GetName() << ":"
177  << touch->GetReplicaNumber(2) << " layer:module:cell " << layer << ":" << module << ":"
178  << cell << " Material " << mat->GetName() << ":" << mat->GetRadlen();
179 //for (int k = 0; k< touch->GetHistoryDepth(); ++k)
180 // edm::LogVerbatim("HGCSim") << "Level [" << k << "] " << touch->GetVolume(k)->GetName() << ":" << touch->GetReplicaNumber(k);
181 #endif
182  // The following statement should be examined later before elimination
183  // VI: this is likely a check if media is vacuum - not needed
184  if (aStep->GetPreStepPoint()->GetMaterial()->GetRadlen() > 100000.)
185  return 0;
186 
187  uint32_t id = setDetUnitId(subdet, layer, module, cell, iz, localpos);
188  if (rejectMB_ && id != 0) {
189  int det, z, lay, wafer, type, ic;
190  HGCalTestNumbering::unpackHexagonIndex(id, det, z, lay, wafer, type, ic);
191 #ifdef EDM_ML_DEBUG
192  edm::LogVerbatim("HGCSim") << "ID " << std::hex << id << std::dec << " Decode " << det << ":" << z << ":" << lay
193  << ":" << wafer << ":" << type << ":" << ic;
194 #endif
195  if (mouseBite_->exclude(hitPoint, z, wafer, 0))
196  id = 0;
197  }
198  return id;
199 }
200 
201 void HGCSD::update(const BeginOfJob* job) {
202  const edm::EventSetup* es = (*job)();
204  es->get<IdealGeometryRecord>().get(nameX_, hdc);
205  if (hdc.isValid()) {
206  const HGCalDDDConstants* hgcons = hdc.product();
207  geom_mode_ = hgcons->geomMode();
208  slopeMin_ = hgcons->minSlope();
209  levelT_ = hgcons->levelTop();
210  numberingScheme_.reset(new HGCNumberingScheme(*hgcons, nameX_));
211  if (rejectMB_)
212  mouseBite_.reset(new HGCMouseBite(*hgcons, angles_, mouseBiteCut_, waferRot_));
213  } else {
214  edm::LogError("HGCSim") << "HCalSD : Cannot find HGCalDDDConstants for " << nameX_;
215  throw cms::Exception("Unknown", "HGCSD") << "Cannot find HGCalDDDConstants for " << nameX_ << "\n";
216  }
217 #ifdef EDM_ML_DEBUG
218  edm::LogVerbatim("HGCSim") << "HGCSD::Initialized with mode " << geom_mode_ << " Slope cut " << slopeMin_
219  << " top Level " << levelT_;
220 #endif
221 }
222 
224 #ifdef plotDebug
226  if (tfile.isAvailable()) {
227  tree_ = tfile->make<TTree>("TreeHGCSD", "TreeHGCSD");
228  tree_->Branch("EventID", &t_EventID_);
229  tree_->Branch("Layer", &t_Layer_);
230  tree_->Branch("ParticleCode", &t_Parcode_);
231  tree_->Branch("dEStepOriginal", &t_dEStep1_);
232  tree_->Branch("dEStepWeighted", &t_dEStep2_);
233  tree_->Branch("TrackEnergy", &t_TrackE_);
234  tree_->Branch("ThetaAngle", &t_Angle_);
235  }
236 #endif
237 }
238 
239 void HGCSD::initEvent(const BeginOfEvent* g4Event) {
240  const G4Event* evt = (*g4Event)();
241  t_EventID_ = evt->GetEventID();
242 #ifdef plotDebug
243  t_Layer_.clear();
244  t_Parcode_.clear();
245  t_dEStep1_.clear();
246  t_dEStep2_.clear();
247  t_TrackE_.clear();
248  t_Angle_.clear();
249 #endif
250 }
251 
253 #ifdef plotDebug
254  if (tree_)
255  tree_->Fill();
256 #endif
257 }
258 
259 bool HGCSD::filterHit(CaloG4Hit* aHit, double time) {
260  return ((time <= tmaxHit) && (aHit->getEnergyDeposit() > eminHit_));
261 }
262 
263 uint32_t HGCSD::setDetUnitId(ForwardSubdetector& subdet, int layer, int module, int cell, int iz, G4ThreeVector& pos) {
264  uint32_t id = numberingScheme_ ? numberingScheme_->getUnitID(subdet, layer, module, cell, iz, pos) : 0;
265  return id;
266 }
HGCSD::t_dEStep2_
std::vector< double > t_dEStep2_
Definition: HGCSD.h:61
HGCSD::levelT_
int levelT_
Definition: HGCSD.h:53
SimTrackManager
Definition: SimTrackManager.h:35
electrons_cff.bool
bool
Definition: electrons_cff.py:372
CaloSD::tmaxHit
double tmaxHit
Definition: CaloSD.h:133
HGCSD::mouseBiteCut_
double mouseBiteCut_
Definition: HGCSD.h:55
dqmMemoryStats.float
float
Definition: dqmMemoryStats.py:127
ForwardEmpty
Definition: ForwardSubdetector.h:5
ESHandle.h
HGCSD::nameX_
std::string nameX_
Definition: HGCSD.h:46
ForwardSubdetector
ForwardSubdetector
Definition: ForwardSubdetector.h:4
HGCalDDDConstants::geomMode
HGCalGeometryMode::GeometryMode geomMode() const
Definition: HGCalDDDConstants.h:52
edm
HLT enums.
Definition: AlignableModifier.h:19
HGCalGeometryMode.h
AlCaHLTBitMon_ParallelJobs.p
p
Definition: AlCaHLTBitMon_ParallelJobs.py:153
HGCSD::waferRot_
bool waferRot_
Definition: HGCSD.h:54
pos
Definition: PixelAliasList.h:18
HGCalTestNumbering::unpackHexagonIndex
static void unpackHexagonIndex(const uint32_t &idx, int &subdet, int &z, int &lay, int &wafer, int &celltyp, int &cell)
Definition: HGCalTestNumbering.cc:47
HGCSD::angles_
std::vector< double > angles_
Definition: HGCSD.h:56
MeV
const double MeV
edm::ParameterSet::getUntrackedParameter
T getUntrackedParameter(std::string const &, T const &) const
HGCSD::storeAllG4Hits_
bool storeAllG4Hits_
Definition: HGCSD.h:54
HGCSD::slopeMin_
double slopeMin_
Definition: HGCSD.h:52
HGCalDDDConstants
Definition: HGCalDDDConstants.h:25
FastMath.h
CaloSD::getResponseWt
double getResponseWt(const G4Track *)
Definition: CaloSD.cc:627
HGCSD::initRun
void initRun() override
Definition: HGCSD.cc:223
edm::EventSetup::get
T get() const
Definition: EventSetup.h:73
Service.h
HGCSD::HGCSD
HGCSD(const std::string &, const edm::EventSetup &, const SensitiveDetectorCatalog &, edm::ParameterSet const &, const SimTrackManager *)
Definition: HGCSD.cc:34
tfile
Definition: tfile.py:1
CaloG4Hit::getEnergyDeposit
double getEnergyDeposit() const
Definition: CaloG4Hit.h:77
DDAxes::z
edm::ESHandle
Definition: DTSurvey.h:22
SensitiveDetectorCatalog
Definition: SensitiveDetectorCatalog.h:10
HGCMouseBite
Definition: HGCMouseBite.h:9
BeginOfJob
Definition: BeginOfJob.h:8
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
HGCSD::t_Parcode_
std::vector< int > t_Parcode_
Definition: HGCSD.h:60
HGCEE
Definition: ForwardSubdetector.h:8
TFileService.h
CaloSD::eminHit
double eminHit
Definition: CaloSD.h:133
HGCSD::geom_mode_
HGCalGeometryMode::GeometryMode geom_mode_
Definition: HGCSD.h:47
edm::ParameterSet
Definition: ParameterSet.h:36
edm::LogError
Definition: MessageLogger.h:183
ParameterSet
Definition: Functions.h:16
HGCSD::mouseBite_
std::unique_ptr< HGCMouseBite > mouseBite_
Definition: HGCSD.h:49
funct::tan
Tan< T >::type tan(const T &t)
Definition: Tan.h:22
edm::Service< TFileService >
HGCSD::numberingScheme_
std::unique_ptr< HGCNumberingScheme > numberingScheme_
Definition: HGCSD.h:48
edm::LogVerbatim
Definition: MessageLogger.h:297
CaloSD::setNumberCheckedHits
void setNumberCheckedHits(int val)
Definition: CaloSD.h:112
BeginOfEvent
Definition: BeginOfEvent.h:6
HGCSD::setDetUnitId
uint32_t setDetUnitId(const G4Step *step) override
Definition: HGCSD.cc:143
IdealGeometryRecord.h
edm::EventSetup
Definition: EventSetup.h:57
TrackInformation.h
CaloG4Hit
Definition: CaloG4Hit.h:32
HGCSD::update
void update(const BeginOfJob *) override
This routine will be called when the appropriate signal arrives.
Definition: HGCSD.cc:201
module
Definition: vlib.h:198
get
#define get
HGCSD::eminHit_
double eminHit_
Definition: HGCSD.h:50
HGCNumberingScheme
Definition: HGCNumberingScheme.h:13
alignCSCRings.r
r
Definition: alignCSCRings.py:93
compare.tfile
tfile
Definition: compare.py:325
HGCSD::rejectMB_
bool rejectMB_
Definition: HGCSD.h:54
edm::ParameterSet::getParameter
T getParameter(std::string const &) const
HGCalDDDConstants::minSlope
double minSlope() const
Definition: HGCalDDDConstants.h:95
HGCSD::initEvent
void initEvent(const BeginOfEvent *) override
Definition: HGCSD.cc:239
type
type
Definition: HCALResponse.h:21
HGCSD::endEvent
void endEvent() override
Definition: HGCSD.cc:252
triggerObjects_cff.id
id
Definition: triggerObjects_cff.py:31
Exception
Definition: hltDiff.cc:246
HGCSD::t_Angle_
std::vector< double > t_Angle_
Definition: HGCSD.h:62
angle
T angle(T x1, T y1, T z1, T x2, T y2, T z2)
Definition: angle.h:11
Skims_PA_cff.name
name
Definition: Skims_PA_cff.py:17
EventSetup.h
HGCSD::tree_
TTree * tree_
Definition: HGCSD.h:58
Exception.h
HGCSD::t_TrackE_
std::vector< double > t_TrackE_
Definition: HGCSD.h:61
HGCalDDDConstants::levelTop
int levelTop(int ind=0) const
Definition: HGCalDDDConstants.h:85
HGCSD::myFwdSubdet_
ForwardSubdetector myFwdSubdet_
Definition: HGCSD.h:51
HGCSD.h
HGCHEF
Definition: ForwardSubdetector.h:9
CaloSD::setUseMap
void setUseMap(bool val)
Definition: CaloSD.h:101
funct::abs
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
HGCalDDDConstants.h
HGCSD::t_dEStep1_
std::vector< double > t_dEStep1_
Definition: HGCSD.h:61
HGCSD::getEnergyDeposit
double getEnergyDeposit(const G4Step *) override
Definition: HGCSD.cc:99
ntuplemaker.time
time
Definition: ntuplemaker.py:310
HGCSD::filterHit
bool filterHit(CaloG4Hit *, double) override
Definition: HGCSD.cc:259
HGCSD::t_EventID_
uint32_t t_EventID_
Definition: HGCSD.h:59
TauDecayModes.dec
dec
Definition: TauDecayModes.py:143
IdealGeometryRecord
Definition: IdealGeometryRecord.h:27
CaloSD
Definition: CaloSD.h:38
HGCSD::t_Layer_
std::vector< int > t_Layer_
Definition: HGCSD.h:60
HGCHEB
Definition: ForwardSubdetector.h:10
HGCalTestNumbering.h