00001 #ifndef DQM_HCALMONITORTASKS_HCALETAPHIHISTS_H
00002 #define DQM_HCALMONITORTASKS_HCALETAPHIHISTS_H
00003
00004 #include "TH1F.h"
00005 #include "TH2F.h"
00006
00007 #include "DQMServices/Core/interface/DQMStore.h"
00008 #include "DQMServices/Core/interface/MonitorElement.h"
00009 #include "DataFormats/DetId/interface/DetId.h"
00010 #include "DataFormats/HcalDetId/interface/HcalDetId.h"
00011 #include "DQMServices/Core/interface/DQMStore.h"
00012
00013 #include <iostream>
00014
00015
00016
00017
00018 class EtaPhiHists{
00019
00020 public:
00021 EtaPhiHists(){};
00022 ~EtaPhiHists(){};
00023
00024 void setup(DQMStore* &m_dbe,std::string Name, std::string Units="")
00025 {
00026 std::stringstream name;
00027 name<<Name;
00028
00029 std::stringstream unitname;
00030 std::stringstream unittitle;
00031 std::string s(Units);
00032 if (s.empty())
00033 {
00034 unitname<<Units;
00035 unittitle<<"No Units";
00036 }
00037 else
00038 {
00039 unitname<<" "<<Units;
00040 unittitle<<Units;
00041 }
00042
00043
00044 depth.push_back(m_dbe->book2D(("HB HE HF Depth 1 "+name.str()+unitname.str()).c_str(),
00045 (name.str()+" Depth 1 -- HB HE HF ("+unittitle.str().c_str()+")"),
00046 85,-42.5,42.5,
00047 72,0.5,72.5));
00048 float ybins[73];
00049 for (int i=0;i<=72;i++) ybins[i]=(float)(i+0.5);
00050 float xbinsd2[]={-42.5,-41.5,-40.5,-39.5,-38.5,-37.5,-36.5,-35.5,-34.5,-33.5,-32.5,-31.5,-30.5,-29.5,
00051 -28.5,-27.5,-26.5,-25.5,-24.5,-23.5,-22.5,-21.5,-20.5,-19.5,-18.5,-17.5,-16.5,
00052 -15.5,-14.5,
00053 14.5, 15.5,
00054 16.5,17.5,18.5,19.5,20.5,21.5,22.5,23.5,24.5,25.5,26.5,27.5,28.5,29.5,30.5,
00055 31.5,32.5,33.5,34.5,35.5,36.5,37.5,38.5,39.5,40.5,41.5,42.5};
00056 depth.push_back(m_dbe->book2D(("HB HE HF Depth 2 "+name.str()+unitname.str()).c_str(),
00057 (name.str()+" Depth 2 -- HB HE HF ("+unittitle.str().c_str()+")"),
00058 57, xbinsd2, 72, ybins));
00059
00060
00061 float xbins[]={-28.5,-27.5,-26.5,-16.5,-15.5,
00062 15.5,16.5,26.5,27.5,28.5};
00063
00064 depth.push_back(m_dbe->book2D(("HE Depth 3 "+name.str()+unitname.str()).c_str(),
00065 (name.str()+" Depth 3 -- HE ("+unittitle.str().c_str()+")"),
00066
00067 9, xbins, 72, ybins));
00068
00069 depth.push_back(m_dbe->book2D(("HO Depth 4 "+name.str()+unitname.str()).c_str(),
00070 (name.str()+" Depth 4 -- HO ("+unittitle.str().c_str()+")"),
00071 31,-15.5,15.5,
00072 72,0.5,72.5));
00073 for (unsigned int i=0;i<depth.size();++i)
00074 (depth[i]->getTH2F())->SetOption("colz");
00075 setBinLabels();
00076
00077 }
00078
00079 int getEtaBins(int depth)
00080 {
00081 if (depth==1) return 85;
00082 if (depth==2) return 57;
00083 if (depth==3) return 9;
00084 if (depth==4) return 31;
00085 return 0;
00086 }
00087
00088 int getPhiBins(int depth)
00089 {
00090 if (depth>0 && depth<5)
00091 return 72;
00092 return 0;
00093 }
00094
00095 void setBinLabels()
00096 {
00097
00098 for (unsigned int i=0;i<depth.size();++i)
00099 {
00100 depth[i]->setAxisTitle("i#eta",1);
00101 depth[i]->setAxisTitle("i#phi",2);
00102 }
00103
00104 std::stringstream label;
00105
00106 for (int i=-41;i<=-29;i=i+2)
00107 {
00108 label<<i;
00109 depth[0]->setBinLabel(i+42,label.str().c_str());
00110 depth[1]->setBinLabel(i+42,label.str().c_str());
00111 label.str("");
00112 }
00113 depth[0]->setBinLabel(14,"-29HE");
00114 depth[1]->setBinLabel(14,"-29HE");
00115
00116
00117 for (int i=-27;i<=27;i=i+2)
00118 {
00119 label<<i;
00120 depth[0]->setBinLabel(i+43,label.str().c_str());
00121 label.str("");
00122 }
00123 depth[0]->setBinLabel(72,"29HE");
00124 for (int i=29;i<=41;i=i+2)
00125 {
00126 label<<i;
00127 depth[0]->setBinLabel(i+44,label.str().c_str());
00128 label.str("");
00129 }
00130 for (int i=16;i<=28;i=i+2)
00131 {
00132 label<<i-43;
00133 depth[1]->setBinLabel(i,label.str().c_str());
00134 label.str("");
00135 }
00136 depth[1]->setBinLabel(29,"NULL");
00137 for (int i=15;i<=27;i=i+2)
00138 {
00139 label<<i;
00140 depth[1]->setBinLabel(i+15,label.str().c_str());
00141 label.str("");
00142 }
00143
00144 depth[1]->setBinLabel(44,"29HE");
00145 for (int i=29;i<=41;i=i+2)
00146 {
00147 label<<i;
00148 depth[1]->setBinLabel(i+16,label.str().c_str());
00149 label.str("");
00150 }
00151
00152
00153 depth[2]->setBinLabel(1,"-28");
00154 depth[2]->setBinLabel(2,"-27");
00155 depth[2]->setBinLabel(3,"Null");
00156 depth[2]->setBinLabel(4,"-16");
00157 depth[2]->setBinLabel(5,"Null");
00158 depth[2]->setBinLabel(6,"16");
00159 depth[2]->setBinLabel(7,"Null");
00160 depth[2]->setBinLabel(8,"27");
00161 depth[2]->setBinLabel(9,"28");
00162
00163 for (int d=0;d<4;++d)
00164 {
00165 depth[d]->setAxisTitle("i#eta",1);
00166 depth[d]->setAxisTitle("i#phi",2);
00167 }
00168 };
00169
00170 void Fill(HcalDetId& id, double val=1)
00171 {
00172
00173 if (id.subdet()==HcalForward)
00174 depth[id.depth()-1]->Fill(id.ieta()<0 ? id.ieta()-1 : id.ieta()+1, id.iphi(), val);
00175 else
00176 depth[id.depth()-1]->Fill(id.ieta(),id.iphi(),val);
00177 };
00178
00179 void Reset(void)
00180 {
00181 for (unsigned int d=0;d<depth.size();d++)
00182 if(depth[d]) depth[d]->Reset();
00183 };
00184
00185
00186 std::vector<MonitorElement*> depth;
00187
00188 };
00189
00190
00191
00192
00193 const int binmapd2[]={-42,-41,-40,-39,-38,-37,-36,-35,-34,-33,-32,-31,-30,
00194 -29,-28,-27,-26,-25,-24,-23,-22,-21,-20,-19,-18,-17,
00195 -16,-15,-9999, 15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,
00196 30,31,32,33,34,35,36,37,38,39,40,41,42};
00197
00198
00199
00200 const int binmapd3[]={-28,-27,-9999,-16,-9999,16,-9999,27,28};
00201
00202 inline int CalcEtaBin(int subdet, int ieta, int depth)
00203 {
00204
00205
00206
00207
00208
00209
00210
00211
00212 int etabin=-9999;
00213
00214 if (depth==1)
00215 {
00216
00217 etabin=ieta+42;
00218 if (subdet==HcalForward)
00219 {
00220 ieta < 0 ? etabin-- : etabin++;
00221 }
00222 }
00223
00224 else if (depth==2)
00225 {
00226
00227 if (ieta<-14)
00228 {
00229 etabin=ieta+42;
00230 if (subdet==HcalForward) etabin--;
00231 }
00232 else if (ieta>14)
00233 {
00234 etabin=ieta+14;
00235 if (subdet==HcalForward) etabin++;
00236 }
00237
00238 }
00239
00240 else if (subdet==HcalOuter && abs(ieta)<16)
00241 etabin=ieta+15;
00242 else if (subdet==HcalEndcap)
00243 {
00244
00245 if (depth==3)
00246 {
00247 if (ieta==-28) etabin=0;
00248 else if (ieta==-27) etabin=1;
00249 else if (ieta==-16) etabin=3;
00250 else if (ieta==16) etabin=5;
00251 else if (ieta==27) etabin=7;
00252 else if (ieta==28) etabin=8;
00253 }
00254 }
00255 return etabin;
00256 }
00257
00258 inline int CalcIeta(int subdet, int eta, int depth)
00259 {
00260
00261
00262
00263
00264
00265
00266 int ieta=-9999;
00267 if (subdet==HcalBarrel)
00268 {
00269 if (depth==1)
00270 {
00271 ieta=eta-42;
00272 if (ieta==0) return -9999;
00273 return ieta;
00274 }
00275 else if (depth==2)
00276 {
00277 ieta=binmapd2[eta];
00278 if (ieta==0) return -9999;
00279 if (ieta==17 || ieta == -17)
00280 return -9999;
00281 return ieta;
00282 }
00283 else
00284 return -9999;
00285 }
00286 else if (subdet==HcalForward)
00287 {
00288 if (depth==1)
00289 {
00290 ieta=eta-42;
00291 if (eta<13) ieta++;
00292 else if (eta>71) ieta--;
00293 else return -9999;
00294 return ieta;
00295 }
00296 else if (depth==2)
00297 {
00298 ieta=binmapd2[eta];
00299 if (ieta<=-30) ieta++;
00300 else if (ieta>=30) ieta--;
00301 else return -9999;
00302 return ieta;
00303 }
00304 else return -9999;
00305 }
00306
00307 else if (subdet==HcalEndcap)
00308 {
00309 if (depth==1)
00310 ieta=eta-42;
00311 else if (depth==2)
00312 {
00313 ieta=binmapd2[eta];
00314 if (abs(ieta)>29 || abs(ieta)<18) return -9999;
00315 if (ieta==0) return -9999;
00316 return ieta;
00317 }
00318 else if (depth==3)
00319 {
00320 if (eta<0 || eta>8) return -9999;
00321 else
00322 ieta=binmapd3[eta];
00323 if (ieta==0) return -9999;
00324 return ieta;
00325 }
00326 else return -9999;
00327 }
00328 else if ( subdet==HcalOuter)
00329 {
00330 if (depth!=4)
00331 return -9999;
00332 else
00333 {
00334 ieta= eta-15;
00335 if (abs(ieta)>15) return -9999;
00336 if (ieta==0) return -9999;
00337 return ieta;
00338 }
00339 }
00340 if (ieta==0) return -9999;
00341 return ieta;
00342 }
00343
00344 inline int CalcIeta(int eta, int depth)
00345 {
00346
00347
00348
00349
00350
00351 int ieta=-9999;
00352 if (eta<0) return ieta;
00353 if (depth==1)
00354 {
00355 ieta=eta-42;
00356 if (eta<13) ieta++;
00357 else if (eta>71) ieta--;
00358 if (ieta==0) ieta=-9999;
00359 return ieta;
00360 }
00361 else if (depth==2)
00362 {
00363 if (eta>56) return -9999;
00364 else
00365 {
00366 ieta=binmapd2[eta];
00367 if (ieta==-9999) return ieta;
00368 if (ieta==0) return -9999;
00369 if (ieta==17 || ieta == -17) return -9999;
00370 else if (ieta<=-30) ieta++;
00371 else if (ieta>=30) ieta--;
00372 return ieta;
00373 }
00374 }
00375 else if (depth==3)
00376 {
00377 if (eta>8) return -9999;
00378 else
00379 ieta=binmapd3[eta];
00380 if (ieta==0) return -9999;
00381 return ieta;
00382 }
00383 else if (depth==4)
00384 {
00385 ieta= eta-15;
00386 if (abs(ieta)>15) return -9999;
00387 if (ieta==0) return -9999;
00388 return ieta;
00389 }
00390 return ieta;
00391 }
00392
00393
00394
00395
00396 inline std::vector<std::string> HcalEtaPhiHistNames()
00397 {
00398 std::vector<std::string> name;
00399 name.push_back("HB HE HF Depth 1 ");
00400 name.push_back("HB HE HF Depth 2 ");
00401 name.push_back("HE Depth 3 ");
00402 name.push_back("HO Depth 4 ");
00403 return name;
00404 }
00405
00406
00407 inline bool isHB(int etabin, int depth)
00408 {
00409 if (depth>2) return false;
00410 else if (depth<1) return false;
00411 else
00412 {
00413 int ieta=CalcIeta(etabin,depth);
00414 if (ieta==-9999) return false;
00415 if (depth==1)
00416 {
00417 if (abs(ieta)<=16 ) return true;
00418 else return false;
00419 }
00420 else if (depth==2)
00421 {
00422 if (abs(ieta)==15 || abs(ieta)==16) return true;
00423 else return false;
00424 }
00425 }
00426 return false;
00427 }
00428
00429 inline bool isHE(int etabin, int depth)
00430 {
00431 if (depth>3) return false;
00432 else if (depth<1) return false;
00433 else
00434 {
00435 int ieta=CalcIeta(etabin,depth);
00436 if (ieta==-9999) return false;
00437 if (depth==1)
00438 {
00439 if (abs(ieta)>=17 && abs(ieta)<=28 ) return true;
00440 if (ieta==-29 && etabin==13) return true;
00441 if (ieta==29 && etabin == 71) return true;
00442 }
00443 else if (depth==2)
00444 {
00445 if (abs(ieta)>=17 && abs(ieta)<=28 ) return true;
00446 if (ieta==-29 && etabin==13) return true;
00447 if (ieta==29 && etabin == 43) return true;
00448 }
00449 else if (depth==3)
00450 return true;
00451 }
00452 return false;
00453 }
00454
00455 inline bool isHF(int etabin, int depth)
00456 {
00457 if (depth>2) return false;
00458 else if (depth<1) return false;
00459 else
00460 {
00461 int ieta=CalcIeta(etabin,depth);
00462 if (ieta==-9999) return false;
00463 if (depth==1)
00464 {
00465 if (ieta==-29 && etabin==13) return false;
00466 else if (ieta==29 && etabin == 71) return false;
00467 else if (abs(ieta)>=29 ) return true;
00468 }
00469 else if (depth==2)
00470 {
00471 if (ieta==-29 && etabin==13) return false;
00472 else if (ieta==29 && etabin==43) return false;
00473 else if (abs(ieta)>=29 ) return true;
00474 }
00475 }
00476 return false;
00477 }
00478
00479 inline bool isHO(int etabin, int depth)
00480 {
00481 if (depth!=4) return false;
00482 int ieta=CalcIeta(etabin,depth);
00483 if (ieta!=-9999) return true;
00484 return false;
00485 }
00486
00487
00488
00489 inline bool isSiPM(int ieta, int iphi, int depth)
00490 {
00491 if (depth!=4) return false;
00492
00493 if (ieta>=5 && ieta <=10 && iphi>=47 && iphi<=58) return true;
00494
00495 if (ieta>=11 && ieta<=15 && iphi>=59 && iphi<=70) return true;
00496 return false;
00497 }
00498
00499
00500
00501
00502 inline bool validDetId(HcalSubdetector sd, int ies, int ip, int dp)
00503 {
00504
00505
00506
00507 const int ie ( abs( ies ) ) ;
00508
00509 return ( ( ip >= 1 ) &&
00510 ( ip <= 72 ) &&
00511 ( dp >= 1 ) &&
00512 ( ie >= 1 ) &&
00513 ( ( ( sd == HcalBarrel ) &&
00514 ( ( ( ie <= 14 ) &&
00515 ( dp == 1 ) ) ||
00516 ( ( ( ie == 15 ) || ( ie == 16 ) ) &&
00517 ( dp <= 2 ) ) ) ) ||
00518 ( ( sd == HcalEndcap ) &&
00519 ( ( ( ie == 16 ) &&
00520 ( dp == 3 ) ) ||
00521 ( ( ie == 17 ) &&
00522 ( dp == 1 ) ) ||
00523 ( ( ie >= 18 ) &&
00524 ( ie <= 20 ) &&
00525 ( dp <= 2 ) ) ||
00526 ( ( ie >= 21 ) &&
00527 ( ie <= 26 ) &&
00528 ( dp <= 2 ) &&
00529 ( ip%2 == 1 ) ) ||
00530 ( ( ie >= 27 ) &&
00531 ( ie <= 28 ) &&
00532 ( dp <= 3 ) &&
00533 ( ip%2 == 1 ) ) ||
00534 ( ( ie == 29 ) &&
00535 ( dp <= 2 ) &&
00536 ( ip%2 == 1 ) ) ) ) ||
00537 ( ( sd == HcalOuter ) &&
00538 ( ie <= 15 ) &&
00539 ( dp == 4 ) ) ||
00540 ( ( sd == HcalForward ) &&
00541 ( dp <= 2 ) &&
00542 ( ( ( ie >= 29 ) &&
00543 ( ie <= 39 ) &&
00544 ( ip%2 == 1 ) ) ||
00545 ( ( ie >= 40 ) &&
00546 ( ie <= 41 ) &&
00547 ( ip%4 == 3 ) ) ) ) ) ) ;
00548
00549
00550
00551 }
00552
00553
00554
00555
00556 inline void SetEtaPhiLabels(MonitorElement* h)
00557 {
00558 std::stringstream label;
00559 for (int i=-41;i<=-29;i=i+2)
00560 {
00561 label<<i;
00562 h->setBinLabel(i+42,label.str().c_str());
00563 label.str("");
00564 }
00565 h->setBinLabel(14,"-29HE");
00566
00567
00568 for (int i=-27;i<=27;i=i+2)
00569 {
00570 label<<i;
00571 h->setBinLabel(i+43,label.str().c_str());
00572 label.str("");
00573 }
00574 h->setBinLabel(72,"29HE");
00575 for (int i=29;i<=41;i=i+2)
00576 {
00577 label<<i;
00578 h->setBinLabel(i+44,label.str().c_str());
00579 label.str("");
00580 }
00581 return;
00582 }
00583
00584
00585
00586
00587 inline void FillUnphysicalHEHFBins(EtaPhiHists &hh)
00588 {
00589 int ieta=0;
00590 int iphi=0;
00591
00592 for (unsigned int d=0;d<3;++d)
00593 {
00594 if (!hh.depth[d]) continue;
00595 for (int eta=0;eta<hh.depth[d]->getNbinsX();++eta)
00596 {
00597 ieta=CalcIeta(eta,d+1);
00598 if (ieta==-9999 || abs(ieta)<21) continue;
00599 for (int phi=0;phi<hh.depth[d]->getNbinsY();++phi)
00600 {
00601 iphi=phi+1;
00602 if (iphi%2==1 && abs(ieta)<40 && iphi<73)
00603 {
00604 hh.depth[d]->setBinContent(eta+1,iphi+1,hh.depth[d]->getBinContent(eta+1,iphi));
00605 }
00606
00607
00608 else if (abs(ieta)>39 && iphi%4==3 && iphi<73)
00609 {
00610
00611 hh.depth[d]->setBinContent(eta+1,(iphi)%72+1, hh.depth[d]->getBinContent(eta+1,iphi));
00612 hh.depth[d]->setBinContent(eta+1,(iphi+1)%72+1, hh.depth[d]->getBinContent(eta+1,iphi));
00613 hh.depth[d]->setBinContent(eta+1,(iphi+2)%72+1, hh.depth[d]->getBinContent(eta+1,iphi));
00614 }
00615 }
00616 }
00617 }
00618
00619 return;
00620 }
00621
00622
00623
00624 inline void FillUnphysicalHEHFBins(MonitorElement* hh)
00625 {
00626
00627
00628 if (hh==0) return;
00629 int ieta=0;
00630 int iphi=0;
00631 int etabins = hh->getNbinsX();
00632 int phibins = hh->getNbinsY();
00633 float binval=0;
00634 for (int eta=0;eta<etabins;++eta)
00635 {
00636 ieta=CalcIeta(eta,1);
00637 if (ieta==-9999 || abs(ieta)<21) continue;
00638
00639 for (int phi=0;phi<phibins;++phi)
00640 {
00641 iphi=phi+1;
00642 if (iphi%2==1 && abs(ieta)<40 && iphi<73)
00643 {
00644 binval=hh->getBinContent(eta+1,iphi);
00645 hh->setBinContent(eta+1,iphi+1,binval);
00646 }
00647 else if (abs(ieta)>39 && iphi%4==3 && iphi<73)
00648 {
00649
00650
00651 hh->setBinContent(eta+1, (iphi)%72+1, hh->getBinContent(eta+1,iphi));
00652 hh->setBinContent(eta+1, (iphi+1)%72+1, hh->getBinContent(eta+1,iphi));
00653 hh->setBinContent(eta+1, (iphi+2)%72+1, hh->getBinContent(eta+1,iphi));
00654 }
00655 }
00656
00657 }
00658
00659 return;
00660 }
00661
00662
00663
00664
00665 #endif