CMS 3D CMS Logo

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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 
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() << ") R = " << r << " Z = " << z
109  << " 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  edm::LogVerbatim("HGCSim") << "Depths: " << touch->GetHistoryDepth() << " name " << touch->GetVolume(0)->GetName()
174  << ":" << touch->GetReplicaNumber(0) << " " << touch->GetVolume(1)->GetName() << ":"
175  << touch->GetReplicaNumber(1) << " " << touch->GetVolume(2)->GetName() << ":"
176  << touch->GetReplicaNumber(2) << " "
177  << " layer:module:cell " << layer << ":" << module << ":" << cell << " Material "
178  << mat->GetName() << ":" << aStep->GetPreStepPoint()->GetMaterial()->GetRadlen();
179 #endif
180  // The following statement should be examined later before elimination
181  // VI: this is likely a check if media is vacuum - not needed
182  if (aStep->GetPreStepPoint()->GetMaterial()->GetRadlen() > 100000.)
183  return 0;
184 
185  uint32_t id = setDetUnitId(subdet, layer, module, cell, iz, localpos);
186  if (rejectMB_ && id != 0) {
187  int det, z, lay, wafer, type, ic;
188  HGCalTestNumbering::unpackHexagonIndex(id, det, z, lay, wafer, type, ic);
189 #ifdef EDM_ML_DEBUG
190  edm::LogVerbatim("HGCSim") << "ID " << std::hex << id << std::dec << " Decode " << det << ":" << z << ":" << lay
191  << ":" << wafer << ":" << type << ":" << ic;
192 #endif
193  if (mouseBite_->exclude(hitPoint, z, wafer, 0))
194  id = 0;
195  }
196  return id;
197 }
198 
199 void HGCSD::update(const BeginOfJob* job) {
200  const edm::EventSetup* es = (*job)();
202  es->get<IdealGeometryRecord>().get(nameX_, hdc);
203  if (hdc.isValid()) {
204  const HGCalDDDConstants* hgcons = hdc.product();
205  geom_mode_ = hgcons->geomMode();
206  slopeMin_ = hgcons->minSlope();
207  levelT_ = hgcons->levelTop();
208  numberingScheme_.reset(new HGCNumberingScheme(*hgcons, nameX_));
209  if (rejectMB_)
210  mouseBite_.reset(new HGCMouseBite(*hgcons, angles_, mouseBiteCut_, waferRot_));
211  } else {
212  edm::LogError("HGCSim") << "HCalSD : Cannot find HGCalDDDConstants for " << nameX_;
213  throw cms::Exception("Unknown", "HGCSD") << "Cannot find HGCalDDDConstants for " << nameX_ << "\n";
214  }
215 #ifdef EDM_ML_DEBUG
216  edm::LogVerbatim("HGCSim") << "HGCSD::Initialized with mode " << geom_mode_ << " Slope cut " << slopeMin_
217  << " top Level " << levelT_;
218 #endif
219 }
220 
222 #ifdef plotDebug
224  if (tfile.isAvailable()) {
225  tree_ = tfile->make<TTree>("TreeHGCSD", "TreeHGCSD");
226  tree_->Branch("EventID", &t_EventID_);
227  tree_->Branch("Layer", &t_Layer_);
228  tree_->Branch("ParticleCode", &t_Parcode_);
229  tree_->Branch("dEStepOriginal", &t_dEStep1_);
230  tree_->Branch("dEStepWeighted", &t_dEStep2_);
231  tree_->Branch("TrackEnergy", &t_TrackE_);
232  tree_->Branch("ThetaAngle", &t_Angle_);
233  }
234 #endif
235 }
236 
237 void HGCSD::initEvent(const BeginOfEvent* g4Event) {
238  const G4Event* evt = (*g4Event)();
239  t_EventID_ = evt->GetEventID();
240 #ifdef plotDebug
241  t_Layer_.clear();
242  t_Parcode_.clear();
243  t_dEStep1_.clear();
244  t_dEStep2_.clear();
245  t_TrackE_.clear();
246  t_Angle_.clear();
247 #endif
248 }
249 
251 #ifdef plotDebug
252  if (tree_)
253  tree_->Fill();
254 #endif
255 }
256 
257 bool HGCSD::filterHit(CaloG4Hit* aHit, double time) {
258  return ((time <= tmaxHit) && (aHit->getEnergyDeposit() > eminHit_));
259 }
260 
261 uint32_t HGCSD::setDetUnitId(ForwardSubdetector& subdet, int layer, int module, int cell, int iz, G4ThreeVector& pos) {
262  uint32_t id = numberingScheme_ ? numberingScheme_->getUnitID(subdet, layer, module, cell, iz, pos) : 0;
263  return id;
264 }
std::vector< double > t_TrackE_
Definition: HGCSD.h:61
type
Definition: HCALResponse.h:21
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
double getEnergyDeposit(const G4Step *) override
Definition: HGCSD.cc:99
std::vector< double > t_dEStep1_
Definition: HGCSD.h:61
void setNumberCheckedHits(int val)
Definition: CaloSD.h:112
std::vector< double > t_dEStep2_
Definition: HGCSD.h:61
int levelT_
Definition: HGCSD.h:53
double mouseBiteCut_
Definition: HGCSD.h:55
Definition: CaloSD.h:38
std::vector< int > t_Layer_
Definition: HGCSD.h:60
std::string nameX_
Definition: HGCSD.h:46
#define nullptr
std::vector< double > angles_
Definition: HGCSD.h:56
T * make(const Args &...args) const
make new ROOT object
Definition: TFileService.h:64
bool storeAllG4Hits_
Definition: HGCSD.h:54
ForwardSubdetector
bool waferRot_
Definition: HGCSD.h:54
void setUseMap(bool val)
Definition: CaloSD.h:101
double eminHit
Definition: CaloSD.h:133
const double MeV
HGCalGeometryMode::GeometryMode geom_mode_
Definition: HGCSD.h:47
double slopeMin_
Definition: HGCSD.h:52
std::unique_ptr< HGCMouseBite > mouseBite_
Definition: HGCSD.h:49
void initRun() override
Definition: HGCSD.cc:221
bool isAvailable() const
Definition: Service.h:40
double minSlope() const
Tan< T >::type tan(const T &t)
Definition: Tan.h:22
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
HGCalGeometryMode::GeometryMode geomMode() const
std::vector< int > t_Parcode_
Definition: HGCSD.h:60
HGCSD(const std::string &, const edm::EventSetup &, const SensitiveDetectorCatalog &, edm::ParameterSet const &, const SimTrackManager *)
Definition: HGCSD.cc:34
std::unique_ptr< HGCNumberingScheme > numberingScheme_
Definition: HGCSD.h:48
void initEvent(const BeginOfEvent *) override
Definition: HGCSD.cc:237
double tmaxHit
Definition: CaloSD.h:133
double eminHit_
Definition: HGCSD.h:50
std::vector< double > t_Angle_
Definition: HGCSD.h:62
bool rejectMB_
Definition: HGCSD.h:54
TTree * tree_
Definition: HGCSD.h:58
HLT enums.
uint32_t setDetUnitId(const G4Step *step) override
Definition: HGCSD.cc:143
T get() const
Definition: EventSetup.h:73
void update(const BeginOfJob *) override
This routine will be called when the appropriate signal arrives.
Definition: HGCSD.cc:199
bool filterHit(CaloG4Hit *, double) override
Definition: HGCSD.cc:257
int levelTop(int ind=0) const
double getResponseWt(const G4Track *)
Definition: CaloSD.cc:620
ForwardSubdetector myFwdSubdet_
Definition: HGCSD.h:51
void endEvent() override
Definition: HGCSD.cc:250
Definition: vlib.h:198
static void unpackHexagonIndex(const uint32_t &idx, int &subdet, int &z, int &lay, int &wafer, int &celltyp, int &cell)
double getEnergyDeposit() const
Definition: CaloG4Hit.h:77
uint32_t t_EventID_
Definition: HGCSD.h:59
T angle(T x1, T y1, T z1, T x2, T y2, T z2)
Definition: angle.h:11