CMS 3D CMS Logo

HGCGeometryValidation.cc
Go to the documentation of this file.
1 #include <memory>
2 #include <iostream>
3 
9 
12 
26 
33 
35 
36 #include "CLHEP/Geometry/Point3D.h"
37 #include "CLHEP/Geometry/Vector3D.h"
38 #include "CLHEP/Units/GlobalSystemOfUnits.h"
39 #include "CLHEP/Units/GlobalPhysicalConstants.h"
40 
42 
43 public:
44 
45  explicit HGCGeometryValidation( const edm::ParameterSet& );
47  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
48 
49 protected:
50  void dqmBeginRun(edm::Run const&, edm::EventSetup const&) override;
51  void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override;
52  void analyze(const edm::Event&, const edm::EventSetup&) override;
53 
54 private:
56  std::vector<std::string> geometrySource_;
57 
58  //HGCal geometry scheme
59  std::vector<const HGCalDDDConstants*> hgcGeometry_;
61 
62  //histogram related stuff
73 
78 };
79 
81 
82  g4Token_ = consumes<PHGCalValidInfo>(cfg.getParameter<edm::InputTag>("g4Source"));
83  geometrySource_ = cfg.getUntrackedParameter< std::vector<std::string> >("geometrySource");
84 }
85 
87 
89  //The following says we do not know what parameters are allowed so do no validation
90  // Please change this to state exactly what you do use, even if it is no parameters
92  desc.setUnknown();
93  descriptions.addDefault(desc);
94 }
95 
97  const edm::EventSetup& iSetup) {
98 
99  //initiating hgcnumbering
100  for (size_t i=0; i<geometrySource_.size(); i++) {
101  if (geometrySource_[i].find("Hcal") != std::string::npos) {
103  iSetup.get<HcalSimNumberingRecord>().get(pHRNDC);
104  if (pHRNDC.isValid()) {
105  hcons_ = &(*pHRNDC);
106  hgcGeometry_.push_back(0);
107  } else {
108  edm::LogWarning("HGCalValid") << "Cannot initiate HGCalGeometry for "
109  << geometrySource_[i] << std::endl;
110  }
111  } else {
113  iSetup.get<IdealGeometryRecord>().get(geometrySource_[i],hgcGeom);
114  if (hgcGeom.isValid()) {
115  hgcGeometry_.push_back(hgcGeom.product());
116  } else {
117  edm::LogWarning("HGCalValid") << "Cannot initiate HGCalGeometry for "
118  << geometrySource_[i] << std::endl;
119  }
120  }
121  }
122 }
123 
124 
126  edm::Run const&,
127  edm::EventSetup const&) {
128 
129  iB.setCurrentFolder("HGCalSimHitsV/Geometry");
130 
131  //initiating histograms
132  heeTotEdepStep = iB.book1D("heeTotEdepStep","",100,0,100);
133  hefTotEdepStep = iB.book1D("hefTotEdepStep","",100,0,100);
134  hebTotEdepStep = iB.book1D("hebTotEdepStep","",100,0,100);
135 
136  hebLayerVsEnStep = iB.book2D("hebLayerVsEnStep","",25,0,25,100,0,0.01);
137  hefLayerVsEnStep = iB.book2D("hefLayerVsEnStep","",36,0,36,100,0,0.01);
138  heeLayerVsEnStep = iB.book2D("heeLayerVsEnStep","",84,0,84,100,0,0.01);
139 
140  heeXG4VsId = iB.book2D("heeXG4VsId","",600,-300,300,600,-300,300);
141  heeYG4VsId = iB.book2D("heeYG4VsId","",600,-300,300,600,-300,300);
142  heeZG4VsId = iB.book2D("heeZG4VsId","",3000,320,350,3000,320,350);
143 
144  hefXG4VsId = iB.book2D("hefXG4VsId","",600,-300,300,600,-300,300);
145  hefYG4VsId = iB.book2D("hefYG4VsId","",600,-300,300,600,-300,300);
146  hefZG4VsId = iB.book2D("hefZG4VsId","",6000,350,410,6000,350,410);
147 
148  hebXG4VsId = iB.book2D("hebXG4VsId","",600,-300,300,600,-300,300);
149  hebYG4VsId = iB.book2D("hebYG4VsId","",600,-300,300,600,-300,300);
150  hebZG4VsId = iB.book2D("hebZG4VsId","",220,400,620,220,400,620);
151 
152  heedzVsZ = iB.book2D("heedzVsZ","",600,320,350,100,-1,1);
153  heedyVsY = iB.book2D("heedyVsY","",400,-200,200,100,-1,1);
154  heedxVsX = iB.book2D("heedxVsX","",400,-200,200,100,-1,1);
155 
156  hefdzVsZ = iB.book2D("hefdzVsZ","",1200,350,410,100,-1,1);
157  hefdyVsY = iB.book2D("hefdyVsY","",400,-200,200,100,-1,1);
158  hefdxVsX = iB.book2D("hefdxVsX","",400,-200,200,100,-1,1);
159 
160  hebdzVsZ = iB.book2D("hebdzVsZ","",220,400,620,100,-5,5);
161  hebdyVsY = iB.book2D("hebdyVsY","",400,-200,200,100,-5,5);
162  hebdxVsX = iB.book2D("hebdxVsX","",400,-200,200,100,-5,5);
163 
164  heedzVsLayer = iB.book2D("heedzVsLayer","",100,0,100,100,-1,1);
165  hefdzVsLayer = iB.book2D("hefdzVsLayer","",40,0,40,100,-1,1);
166  hebdzVsLayer = iB.book2D("hebdzVsLayer","",50,0,25,100,-5,5);
167 
168  heedyVsLayer = iB.book2D("heedyVsLayer","",100,0,100,100,-1,1);
169  hefdyVsLayer = iB.book2D("hefdyVsLayer","",40,0,40,100,-1,1);
170  hebdyVsLayer = iB.book2D("hebdyVsLayer","",50,0,25,100,-5,5);
171 
172  heedxVsLayer = iB.book2D("heedxVsLayer","",100,0,100,100,-1,1);
173  hefdxVsLayer = iB.book2D("hefdxVsLayer","",40,0,40,500,-1,1);
174  hebdxVsLayer = iB.book2D("hebdxVsLayer","",50,0,25,500,-5,5.0);
175 
176  heedX = iB.book1D("heedX","",100,-1,1);
177  heedY = iB.book1D("heedY","",100,-1,1);
178  heedZ = iB.book1D("heedZ","",100,-1,1);
179 
180  hefdX = iB.book1D("hefdX","",100,-1,1);
181  hefdY = iB.book1D("hefdY","",100,-1,1);
182  hefdZ = iB.book1D("hefdZ","",100,-1,1);
183 
184  hebdX = iB.book1D("hebdX","",100,-1,1);
185  hebdY = iB.book1D("hebdY","",100,-1,1);
186  hebdZ = iB.book1D("hebdZ","",100,-1,1);
187 }
188 
190  const edm::EventSetup &iSetup) {
191 
192  //Accessing G4 information
194  iEvent.getByToken(g4Token_,infoLayer);
195 
196  if (infoLayer.isValid()) {
197  //step vertex information
198  std::vector<float> hitVtxX = infoLayer->hitvtxX();
199  std::vector<float> hitVtxY = infoLayer->hitvtxY();
200  std::vector<float> hitVtxZ = infoLayer->hitvtxZ();
201  std::vector<unsigned int> hitDet = infoLayer->hitDets();
202  std::vector<unsigned int> hitIdx = infoLayer->hitIndex();
203 
204  //energy information
205  std::vector<float> edepLayerEE = infoLayer->eehgcEdep();
206  std::vector<float> edepLayerHE = infoLayer->hefhgcEdep();
207  std::vector<float> edepLayerHB = infoLayer->hebhgcEdep();
208 
209  unsigned int i;
210  for(i=0; i<edepLayerEE.size(); i++) {
211  heeLayerVsEnStep->Fill(i,edepLayerEE.at(i));
212  }
213 
214  for(i=0; i<edepLayerHE.size(); i++) {
215  hefLayerVsEnStep->Fill(i,edepLayerHE.at(i));
216  }
217 
218  for(i=0; i<edepLayerHB.size(); i++) {
219  hebLayerVsEnStep->Fill(i,edepLayerHB.at(i));
220  }
221 
222  //fill total energy deposited
223  heeTotEdepStep->Fill((double)infoLayer->eeTotEdep());
224  hefTotEdepStep->Fill((double)infoLayer->hefTotEdep());
225  hebTotEdepStep->Fill((double)infoLayer->hebTotEdep());
226 
227  //loop over all hits
228  for(unsigned int i=0; i<hitVtxX.size(); i++) {
229 
230  if (hitDet.at(i) == (unsigned int)(DetId::Forward)) {
231  int subdet, zside, layer, wafer, celltype, cell;
232  HGCalTestNumbering::unpackHexagonIndex(hitIdx.at(i), subdet, zside, layer, wafer, celltype, cell);
233 
234  std::pair<float, float> xy;
235  std::pair<int,float> layerIdx;
236  double zp, xx, yx;
237 
238  if (subdet==(int)(HGCEE)) {
239  xy = hgcGeometry_[0]->locateCell(cell,layer,wafer,false); //mm
240  zp = hgcGeometry_[0]->waferZ(layer,false); //cm
241  if (zside < 0) zp = -zp;
242  xx = (zp<0) ? -xy.first/10 : xy.first/10; //mm
243  yx = xy.second/10; //mm
244  hitVtxX.at(i) = hitVtxX.at(i)/10;
245  hitVtxY.at(i) = hitVtxY.at(i)/10;
246  hitVtxZ.at(i) = hitVtxZ.at(i)/10;
247 
248  heedzVsZ->Fill(zp, (hitVtxZ.at(i)-zp));
249  heedyVsY->Fill(yx, (hitVtxY.at(i)-yx));
250  heedxVsX->Fill(xx, (hitVtxX.at(i)-xx));
251 
252  heeXG4VsId->Fill(hitVtxX.at(i),xx);
253  heeYG4VsId->Fill(hitVtxY.at(i),yx);
254  heeZG4VsId->Fill(hitVtxZ.at(i),zp);
255 
256  heedzVsLayer->Fill(layer,(hitVtxZ.at(i)-zp));
257  heedyVsLayer->Fill(layer,(hitVtxY.at(i)-yx));
258  heedxVsLayer->Fill(layer,(hitVtxX.at(i)-xx));
259 
260  heedX->Fill((hitVtxX.at(i)-xx));
261  heedZ->Fill((hitVtxZ.at(i)-zp));
262  heedY->Fill((hitVtxY.at(i)-yx));
263 
264  } else if (subdet==(int)(HGCHEF)) {
265 
266  xy = hgcGeometry_[1]->locateCell(cell,layer,wafer,false); //mm
267  zp = hgcGeometry_[1]->waferZ(layer,false); //cm
268  if (zside < 0) zp = -zp;
269  xx = (zp<0) ? -xy.first/10 : xy.first/10; //mm
270  yx = xy.second/10; //mm
271  hitVtxX.at(i) = hitVtxX.at(i)/10;
272  hitVtxY.at(i) = hitVtxY.at(i)/10;
273  hitVtxZ.at(i) = hitVtxZ.at(i)/10;
274 
275  hefdzVsZ->Fill(zp, (hitVtxZ.at(i)-zp));
276  hefdyVsY->Fill(yx, (hitVtxY.at(i)-yx));
277  hefdxVsX->Fill(xx, (hitVtxX.at(i)-xx));
278 
279  hefXG4VsId->Fill(hitVtxX.at(i),xx);
280  hefYG4VsId->Fill(hitVtxY.at(i),yx);
281  hefZG4VsId->Fill(hitVtxZ.at(i),zp);
282 
283  hefdzVsLayer->Fill(layer,(hitVtxZ.at(i)-zp));
284  hefdyVsLayer->Fill(layer,(hitVtxY.at(i)-yx));
285  hefdxVsLayer->Fill(layer,(hitVtxX.at(i)-xx));
286 
287  hefdX->Fill((hitVtxX.at(i)-xx));
288  hefdZ->Fill((hitVtxZ.at(i)-zp));
289  hefdY->Fill((hitVtxY.at(i)-yx));
290 
291  }
292 
293  } else if (hitDet.at(i) == (unsigned int)(DetId::Hcal)) {
294 
295  int subdet, zside, depth, eta, phi, lay;
296  HcalTestNumbering::unpackHcalIndex(hitIdx.at(i), subdet, zside, depth, eta, phi, lay);
297  HcalCellType::HcalCell cell = hcons_->cell(subdet, zside, lay, eta, phi);
298 
299  double zp = cell.rz/10; //mm --> cm
300  if (zside == 0) zp = -zp;
301  double rho = zp*tan(2.0*atan(exp(-cell.eta)));
302  double xp = rho * cos(cell.phi); //cm
303  double yp = rho * sin(cell.phi); //cm
304 
305  hitVtxX.at(i) = hitVtxX.at(i)/10;
306  hitVtxY.at(i) = hitVtxY.at(i)/10;
307  hitVtxZ.at(i) = hitVtxZ.at(i)/10;
308 
309  hebdzVsZ->Fill(zp, (hitVtxZ.at(i)-zp));
310  hebdyVsY->Fill(yp, (hitVtxY.at(i)-yp));
311  hebdxVsX->Fill(xp, (hitVtxX.at(i)-xp));
312 
313  hebXG4VsId->Fill(hitVtxX.at(i),xp);
314  hebYG4VsId->Fill(hitVtxY.at(i),yp);
315  hebZG4VsId->Fill(hitVtxZ.at(i),zp);
316 
317  hebdzVsLayer->Fill(lay,(hitVtxZ.at(i)-zp));
318  hebdyVsLayer->Fill(lay,(hitVtxY.at(i)-yp));
319  hebdxVsLayer->Fill(lay,(hitVtxX.at(i)-xp));
320 
321  hebdX->Fill((hitVtxX.at(i)-xp));
322  hebdZ->Fill((hitVtxZ.at(i)-zp));
323  hebdY->Fill((hitVtxY.at(i)-yp));
324  }
325 
326  }//end G4 hits
327 
328  } else {
329  edm::LogWarning("HGCalValid") << "No PHGCalInfo " << std::endl;
330  }
331 
332 }
333 
334 //define this as a plug-in
336 
337 
338 
339 
340 
341 
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
edm::EDGetTokenT< PHGCalValidInfo > g4Token_
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:457
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:20
float eeTotEdep() const
std::vector< const HGCalDDDConstants * > hgcGeometry_
void Fill(long long x)
std::vector< float > hitvtxZ() const
int iEvent
Definition: GenABIO.cc:230
float hefTotEdep() const
void addDefault(ParameterSetDescription const &psetDescription)
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
void dqmBeginRun(edm::Run const &, edm::EventSetup const &) override
MonitorElement * hefTotEdepStep
std::vector< float > eehgcEdep() const
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
MonitorElement * hefLayerVsEnStep
MonitorElement * book1D(Args &&...args)
Definition: DQMStore.h:115
MonitorElement * heeLayerVsEnStep
Tan< T >::type tan(const T &t)
Definition: Tan.h:22
static void unpackHcalIndex(const uint32_t &idx, int &det, int &z, int &depth, int &eta, int &phi, int &lay)
bool isValid() const
Definition: HandleBase.h:74
void analyze(const edm::Event &, const edm::EventSetup &) override
std::vector< float > hitvtxX() const
MonitorElement * hebTotEdepStep
std::vector< float > hitvtxY() const
void setCurrentFolder(const std::string &fullpath)
Definition: DQMStore.cc:277
MonitorElement * book2D(Args &&...args)
Definition: DQMStore.h:133
const T & get() const
Definition: EventSetup.h:56
std::vector< float > hebhgcEdep() const
MonitorElement * hebLayerVsEnStep
const HcalDDDSimConstants * hcons_
float hebTotEdep() const
HcalCellType::HcalCell cell(const int det, const int zside, const int depth, const int etaR, const int iphi) const
HGCGeometryValidation(const edm::ParameterSet &)
std::vector< unsigned int > hitIndex() const
std::vector< std::string > geometrySource_
bool isValid() const
Definition: ESHandle.h:47
MonitorElement * heeTotEdepStep
T const * product() const
Definition: ESHandle.h:86
std::vector< unsigned int > hitDets() const
std::vector< float > hefhgcEdep() const
static void unpackHexagonIndex(const uint32_t &idx, int &subdet, int &z, int &lay, int &wafer, int &celltyp, int &cell)
Definition: Run.h:42