CMS 3D CMS Logo

hcalCalib.cc
Go to the documentation of this file.
1 #define hcalCalib_cxx
2 
3 // TSelector-based code for getting the HCAL resp. correction
4 // from physics events. Works for DiJet and IsoTrack calibration.
5 //
6 // Anton Anastassov (Northwestern)
7 // Email: aa@fnal.gov
8 //
9 //
10 
14 
15 #include <TH2.h>
16 #include <TStyle.h>
17 #include "TFile.h"
18 
19 #include <iostream>
20 #include <fstream>
21 
22 #include <sstream>
23 #include <string>
24 
25 #include <map>
26 #include <numeric>
27 #include <algorithm>
28 #include <set>
29 
31 
32 #include "TMatrixF.h"
33 #include "TMatrixD.h"
34 #include "TDecompSVD.h"
35 #include "TDecompQRH.h"
36 
39 
40 UInt_t nEvents;
41 
42 TFile* histoFile;
43 
44 // sanity check histograms
45 TH1F* h1_trkP;
46 TH1F* h1_allTrkP;
47 
49 
50 TH1F* h1_rawSumE;
51 TH1F* h1_rawResp;
52 TH1F* h1_corResp;
58 
61 
62 // histograms based on iEta, iPhi of refPosition forthe cluster (at the moment: hottest tower)
63 // expect range |iEta|<=24 (to do: add flexibility for arbitrary range)
64 TH1F* h1_corRespIEta[48];
65 
66 void hcalCalib::Begin(TTree* /*tree*/) {
67  TString option = GetOption();
68 
69  nEvents = 0;
70 
72  edm::LogError("HcalCalib") << "\nERROR: Failed to read the phi symmetry corrections.\n"
73  << "Check if the filename is correct. If the corrections are not needed, set the "
74  "corresponding flag to \"false\"\n"
75  << "\nThe program will be terminated\n";
76 
77  exit(1);
78  }
79 
80  // cellEnergies.reserve(1000000);
81  // cellIds.reserve(1000000);
82  // targetEnergies.reserve(1000000);
83 
84  histoFile = new TFile(HISTO_FILENAME.Data(), "RECREATE");
85 
86  h1_trkP = new TH1F("h1_trkP", "Track momenta; p_{trk} (GeV); Number of tracks", 100, 0, 200);
87  h1_allTrkP = new TH1F("h1_allTrkP", "Track momenta - all tracks; p_{trk} (GeV); Number of tracks", 100, 0, 200);
88 
89  h1_selTrkP_iEta10 = new TH1F(
90  "h1_selTrkP_iEta10", "Track momenta - tracks with |iEta|<10; p_{trk} (GeV); Number of tracks", 100, 0, 200);
91 
92  if (CALIB_TYPE == "ISO_TRACK")
93  h1_rawSumE = new TH1F("h1_rawSumE", "Cluster Energy; E_{cl} (GeV); Number of tracks", 100, 0, 200);
94  else
95  h1_rawSumE = new TH1F("h1_rawSumE", "Cluster Energy; E_{cl} (GeV); Number of tracks", 1000, 0, 2000);
96 
97  h1_rawResp = new TH1F("h1_rawResp", "Uncorrected response: |iEta|<24; E_{had}/p; Number of tracks", 300, 0, 3);
98  h1_corResp = new TH1F("h1_corResp", "Corrected response: |iEta|<24; E_{had}/p; Number of tracks", 300, 0, 3);
99 
101  new TH1F("h1_rawRespBarrel", "Uncorrected response: |iEta|<15; E_{had}/p; Number of tracks", 300, 0, 3);
103  new TH1F("h1_corRespBarrel", "Corrected response: |iEta|<15; E_{had}/p; Number of tracks", 300, 0, 3);
104 
106  new TH1F("h1_rawRespEndcap", "Uncorrected response: 17<|iEta|<24; E_{had}/p; Number of tracks", 300, 0, 3);
108  new TH1F("h1_corRespEndcap", "Corrected response: 17<|iEta|<24; E_{had}/p; Number of tracks", 300, 0, 3);
109 
110  h1_numEventsTwrIEta = new TH1F("h1_numEventsTwrIEta", "h1_numEventsTwrIEta", 80, -40, 40);
111 
112  h2_dHitRefBarrel = new TH2F("h2_dHitRefBarrel",
113  "{#Delta}i{#phi} vs {#Delta}i{#eta} of hit and most energetic "
114  "tower(|i{#eta}|<16);{#Delta}i{#eta}; {#Delta}i{#phi}",
115  10,
116  -5,
117  5,
118  10,
119  -5,
120  5);
121  h2_dHitRefEndcap = new TH2F("h2_dHitRefEndcap",
122  "{#Delta}i{#phi} vs {#Delta}i{#eta} of hit and most energetic tower (16<|i{#eta}|<25) "
123  ";{#Delta}i{#eta}; {#Delta}i{#phi}",
124  10,
125  -5,
126  5,
127  10,
128  -5,
129  5);
130 
131  TString histoName = "isoTrack_";
132 
133  for (Int_t i = 0; i < 48; ++i) {
134  Long_t iEta;
135  if (i < 24)
136  iEta = i - 24;
137  else
138  iEta = i - 23;
139  TString hn = histoName + iEta;
140  h1_corRespIEta[i] = new TH1F(hn, hn, 300, 0, 3.0);
141  }
142 
143 } // end of Begin()
144 
145 //void hcalCalib::SlaveBegin(TTree * /*tree*/) {
146 // TString option = GetOption();
147 //}
148 
149 Bool_t hcalCalib::Process(Long64_t entry) {
150  // fChain->GetTree()->GetEntry(entry);
151  GetEntry(entry);
152 
153  std::set<UInt_t> uniqueIds; // for testing: check if there are duplicate cells (AA)
154 
155  Bool_t acceptEvent = kTRUE;
156 
157  ++nEvents;
158 
159  if (!(nEvents % 100000))
160  edm::LogVerbatim("HcalCalib") << "event: " << nEvents;
161 
162  h1_allTrkP->Fill(targetE);
163 
164  if (targetE < MIN_TARGET_E || targetE > MAX_TARGET_E)
165  return kFALSE;
166  ;
167 
168  // make local copy as the cells may be modified due to phi/depth sum, phi corrections etc
169  std::vector<TCell> selectCells;
170 
171  if (cells->GetSize() == 0)
172  return kFALSE;
173 
174  if (CALIB_TYPE == "DI_JET" && probeJetEmFrac > 0.999)
175  return kTRUE;
176 
177  for (Int_t i = 0; i < cells->GetSize(); ++i) {
178  TCell* thisCell = (TCell*)cells->At(i);
179 
180  if (HcalDetId(thisCell->id()).subdet() == HcalOuter)
181  continue; // reject HO, make a switch!
182 
183  if (HcalDetId(thisCell->id()).subdet() != HcalBarrel && HcalDetId(thisCell->id()).subdet() != HcalEndcap &&
184  HcalDetId(thisCell->id()).subdet() != HcalForward) {
185  edm::LogWarning("HcalCalib") << "Unknown or wrong hcal subdetector: " << HcalDetId(thisCell->id()).subdet();
186  }
187 
188  // Apply phi symmetry corrections if the flag is set
190  thisCell->SetE(phiSymCor[thisCell->id()] * thisCell->e());
191 
192  if (thisCell->e() > MIN_CELL_E)
193  selectCells.push_back(*thisCell);
194  }
195 
196  if (selectCells.empty()) {
197  edm::LogWarning("HcalCalib") << "NO CELLS ABOVE THRESHOLD FOUND FOR TARGET!!!";
198  }
199 
200  if (SUM_DEPTHS)
201  sumDepths(selectCells);
202  else if (SUM_SMALL_DEPTHS)
203  sumSmallDepths(selectCells); // depth 1,2 in twrs 15,16
204 
205  // most energetic tower (IsoTracks) or centroid of probe jet (DiJets)
206  std::pair<Int_t, UInt_t> refPos;
207 
208  Int_t dEtaHitRef = 999;
209  Int_t dPhiHitRef = 999;
210 
211  if (CALIB_TYPE == "ISO_TRACK") {
212  Int_t iEtaMaxE; // filled by reference in getIEtaIPhiForHighestE
213  UInt_t iPhiMaxE; //
214 
215  getIEtaIPhiForHighestE(selectCells, iEtaMaxE, iPhiMaxE);
216 
217  dEtaHitRef = iEtaMaxE - iEtaHit;
218  dPhiHitRef = iPhiMaxE - iPhiHit;
219 
220  if (dPhiHitRef < -36)
221  dPhiHitRef += 72;
222  if (dPhiHitRef > 36)
223  dPhiHitRef -= 72;
224 
225  if (iEtaHit * iEtaMaxE < 0) {
226  if (dEtaHitRef < 0)
227  dEtaHitRef += 1;
228  if (dEtaHitRef > 0)
229  dEtaHitRef -= 1;
230  }
231 
232  if (abs(iEtaHit) < 16)
233  h2_dHitRefBarrel->Fill(dEtaHitRef, dPhiHitRef);
234  if (abs(iEtaHit) > 16 && abs(iEtaHit) < 25)
235  h2_dHitRefEndcap->Fill(dEtaHitRef, dPhiHitRef);
236 
237  // --------------------------------------------------
238  // Choice of cluster definition
239  //
240  // fixed size NxN clusters as specified in to config file
241  if (!USE_CONE_CLUSTERING) {
242  if (abs(iEtaMaxE) < 16 && HB_CLUSTER_SIZE == 3)
243  filterCells3x3(selectCells, iEtaMaxE, iPhiMaxE);
244  if (abs(iEtaMaxE) > 15 && HE_CLUSTER_SIZE == 3)
245  filterCells3x3(selectCells, iEtaMaxE, iPhiMaxE);
246 
247  if (abs(iEtaMaxE) < 16 && HB_CLUSTER_SIZE == 5)
248  filterCells5x5(selectCells, iEtaMaxE, iPhiMaxE);
249  if (abs(iEtaMaxE) > 15 && HE_CLUSTER_SIZE == 5)
250  filterCells5x5(selectCells, iEtaMaxE, iPhiMaxE);
251  } else {
252  // calculate distance at hcal surface
253  const GlobalPoint hitPositionHcal(xTrkHcal, yTrkHcal, zTrkHcal);
254  filterCellsInCone(selectCells, hitPositionHcal, MAX_CONE_DIST, theCaloGeometry);
255  }
256 
257  refPos.first = iEtaMaxE;
258  refPos.second = iPhiMaxE;
259 
260  } else if (CALIB_TYPE == "DI_JET") { // Apply selection cuts on DiJet events here
261 
263  acceptEvent = kFALSE;
264 
265  Float_t jetsDPhi = probeJetP4->DeltaPhi(*tagJetP4);
266  if (fabs(jetsDPhi * 180.0 / M_PI) < MIN_DPHI_DIJETS)
267  acceptEvent = kFALSE;
268 
270  acceptEvent = kFALSE;
271  if (fabs(probeJetP4->Eta()) < MIN_PROBEJET_ABSETA)
272  acceptEvent = kFALSE;
273  if (fabs(tagJetP4->Eta()) > MAX_TAGJET_ABSETA)
274  acceptEvent = kFALSE;
275  if (fabs(tagJetP4->Et()) < MIN_TAGJET_ET)
276  acceptEvent = kFALSE;
277 
278  if (acceptEvent) {
279  Int_t iEtaMaxE; // filled by reference in getIEtaIPhiForHighestE
280  UInt_t iPhiMaxE; //
281 
282  getIEtaIPhiForHighestE(selectCells, iEtaMaxE, iPhiMaxE);
283 
284  // The ref position for the jet is not used in the minimization at this time.
285  // It will be needed if we attempt to do matrix inversion: then the question is
286  // which value is better suited: the centroid of the jet or the hottest tower...
287 
288  // refPos.first = iEtaHit;
289  // refPos.second = iPhiHit;
290 
291  refPos.first = iEtaMaxE;
292  refPos.second = iPhiMaxE;
293 
294  if (abs(iEtaMaxE) > 40)
295  acceptEvent = kFALSE; // for testing : set as parameter (AA)
296  }
297  }
298 
299  if (COMBINE_PHI)
300  combinePhi(selectCells);
301 
302  // fill the containers for the minimization prcedures
303  std::vector<Float_t> energies;
304  std::vector<UInt_t> ids;
305 
306  for (std::vector<TCell>::iterator i_it = selectCells.begin(); i_it != selectCells.end(); ++i_it) {
307  // for testing : fill only unique id's
308 
309  if (uniqueIds.insert(i_it->id()).second) {
310  energies.push_back(i_it->e());
311  ids.push_back(i_it->id());
312  }
313  }
314 
315  if (CALIB_TYPE == "ISO_TRACK") {
316  if (accumulate(energies.begin(), energies.end(), 0.0) / targetE < MIN_EOVERP)
317  acceptEvent = kFALSE;
318  if (accumulate(energies.begin(), energies.end(), 0.0) / targetE > MAX_EOVERP)
319  acceptEvent = kFALSE;
320 
321  if (emEnergy > MAX_TRK_EME)
322  acceptEvent = kFALSE;
323 
324  if (abs(dEtaHitRef) > 1 || abs(dPhiHitRef) > 1)
325  acceptEvent = kFALSE;
326 
327  // Have to check if for |iEta|>20 (and neighboring region) the dPhiHitRef
328  // should be relaxed to 2. The neighboring towers have dPhi=2...
329  }
330 
331  h1_rawSumE->Fill(accumulate(energies.begin(), energies.end(), 0.0));
332 
333  // here we fill the information for the minimization procedure
334  if (acceptEvent) {
335  cellEnergies.push_back(energies);
336  cellIds.push_back(ids);
337  targetEnergies.push_back(targetE);
338  refIEtaIPhi.push_back(refPos);
339 
340  if (abs(refPos.first) <= 10)
341  h1_selTrkP_iEta10->Fill(targetE);
342  }
343 
344  // Clean up
345  energies.clear();
346  ids.clear();
347  selectCells.clear();
348 
349  return kTRUE;
350 }
351 
352 //void hcalCalib::SlaveTerminate() {}
353 
355  edm::LogVerbatim("HcalCalib") << "\n\nFinished reading the events.\n"
356  << "Number of input objects: " << cellIds.size()
357  << "\nPerforming minimization: depending on selected method can take some time...\n\n";
358 
359  for (std::vector<std::pair<Int_t, UInt_t> >::iterator it_rp = refIEtaIPhi.begin(); it_rp != refIEtaIPhi.end();
360  ++it_rp) {
361  Float_t weight = (abs(it_rp->first) < 21) ? 1.0 / 72.0 : 1.0 / 36.0;
362  h1_numEventsTwrIEta->Fill(it_rp->first, weight);
363  }
364 
365  if (CALIB_METHOD == "MATRIX_INV_OF_ETA_AVE") {
367  } else if (CALIB_METHOD == "L3" || CALIB_METHOD == "L3_AND_MTRX_INV") {
368  int eventWeight = 2; // 2 is the default (try at some point 0,1,2,3)
369  MinL3AlgoUniv<UInt_t>* thisL3Algo = new MinL3AlgoUniv<UInt_t>(eventWeight);
370  int numIterations = 10; // default 10
371 
372  solution = thisL3Algo->iterate(cellEnergies, cellIds, targetEnergies, numIterations);
373 
374  // in order to handle the case where sumDepths="false", but the flag to sum depths 1,2 in HB towers 15, 16
375  // is set (sumSmallDepths) we create entries in "solution" to create equal correction here
376  // for each encountered coef in depth one.
377 
378  if (!SUM_DEPTHS && SUM_SMALL_DEPTHS) {
379  std::vector<UInt_t> idForSummedCells;
380 
381  for (std::map<UInt_t, Float_t>::iterator m_it = solution.begin(); m_it != solution.end(); ++m_it) {
382  if (HcalDetId(m_it->first).ietaAbs() != 15 && HcalDetId(m_it->first).ietaAbs() != 16)
383  continue;
384  if (HcalDetId(m_it->first).subdet() != HcalBarrel)
385  continue;
386  if (HcalDetId(m_it->first).depth() == 1)
387  idForSummedCells.push_back(HcalDetId(m_it->first));
388  }
389 
390  for (std::vector<UInt_t>::iterator v_it = idForSummedCells.begin(); v_it != idForSummedCells.end(); ++v_it) {
391  UInt_t addCoefId = HcalDetId(HcalBarrel, HcalDetId(*v_it).ieta(), HcalDetId(*v_it).iphi(), 2);
392  solution[addCoefId] = solution[*v_it];
393  }
394 
395  } // end of special treatment for "sumSmallDepths" mode
396 
397  if (CALIB_METHOD == "L3_AND_MTRX_INV") {
399 
400  // loop over the solution from L3 and multiply by the additional factor from
401  // the matrix inversion. Set coef outside of the valid calibration region =1.
402  for (std::map<UInt_t, Float_t>::iterator it_s = solution.begin(); it_s != solution.end(); ++it_s) {
403  Int_t iEtaSol = HcalDetId(it_s->first).ieta();
404  if (abs(iEtaSol) < CALIB_ABS_IETA_MIN || abs(iEtaSol) > CALIB_ABS_IETA_MAX)
405  it_s->second = 1.0;
406  else
407  it_s->second *= iEtaCoefMap[iEtaSol];
408  }
409 
410  } // if CALIB_METHOD=="L3_AND_MTRX_INV"
411 
412  } // end of L3 or L3 + mtrx inversion minimization
413 
414  // done getting the constants -> write the formatted file
415  makeTextFile();
416 
417  // fill some histograms
418  Float_t rawResp = 0;
419  Float_t corResp = 0;
420  Int_t maxIEta = 0;
421  Int_t minIEta = 999;
422 
423  for (unsigned int i = 0; i < cellEnergies.size(); ++i) {
424  Int_t iEta;
425  for (unsigned int j = 0; j < (cellEnergies[i]).size(); ++j) {
426  iEta = HcalDetId(cellIds[i][j]).ieta();
427  rawResp += (cellEnergies[i])[j];
428 
429  if (CALIB_METHOD == "L3_AND_MTRX_INV") {
430  corResp += (solution[cellIds[i][j]] * cellEnergies[i][j]);
431  } else if (CALIB_METHOD == "L3") {
432  corResp += (solution[cellIds[i][j]] * (cellEnergies[i][j]));
433  } else if (CALIB_METHOD == "MATRIX_INV_OF_ETA_AVE") {
434  corResp += (iEtaCoefMap[iEta] * cellEnergies[i][j]);
435  }
436 
437  if (maxIEta < abs(iEta))
438  maxIEta = abs(iEta);
439  if (minIEta > abs(iEta))
440  minIEta = abs(iEta);
441  }
442 
443  rawResp /= targetEnergies[i];
444  corResp /= targetEnergies[i];
445 
446  // fill histograms based on iEta on ref point of the cluster (for now: hottest tower)
447  // expect range |iEta|<=24 (to do: add flexibility for arbitrary range)
448 
449  if (CALIB_TYPE == "ISO_TRACK") {
450  Int_t ind = refIEtaIPhi[i].first;
451  (ind < 0) ? (ind += 24) : (ind += 23);
452  if (ind >= 0 && ind < 48) {
453  h1_corRespIEta[ind]->Fill(corResp);
454  }
455 
456  // fill histograms for cases where all towers are in the barrel or endcap
457  if (maxIEta < 25) {
458  h1_rawResp->Fill(rawResp);
459  h1_corResp->Fill(corResp);
460  }
461  if (maxIEta < 15) {
462  h1_rawRespBarrel->Fill(rawResp);
463  h1_corRespBarrel->Fill(corResp);
464  } else if (maxIEta < 25 && minIEta > 16) {
465  h1_rawRespEndcap->Fill(rawResp);
466  h1_corRespEndcap->Fill(corResp);
467  }
468  } // histograms for isotrack calibration
469 
470  else {
471  // put jet plots here
472  }
473 
474  rawResp = 0;
475  corResp = 0;
476  maxIEta = 0;
477  minIEta = 999;
478  }
479 
480  // save the histograms
481  h1_trkP->Write();
482  h1_allTrkP->Write();
483 
484  h1_selTrkP_iEta10->Write();
485 
486  h1_rawSumE->Write();
487  h1_rawResp->Write();
488  h1_corResp->Write();
489  h1_rawRespBarrel->Write();
490  h1_corRespBarrel->Write();
491  h1_rawRespEndcap->Write();
492  h1_corRespEndcap->Write();
493  h1_numEventsTwrIEta->Write();
494  h2_dHitRefBarrel->Write();
495  h2_dHitRefEndcap->Write();
496  for (Int_t i = 0; i < 48; ++i) {
497  h1_corRespIEta[i]->Write();
498  }
499 
500  histoFile->Write();
501  histoFile->Close();
502 
503  edm::LogVerbatim("HcalCalib") << "\n Finished calibration.\n ";
504 
505 } // end of Terminate()
506 
507 //**************************************************************************************************************
508 
510  // these maps are keyed by iEta
511  std::map<Int_t, Float_t> aveTargetE;
512  std::map<Int_t, Int_t> nEntries; // count hits
513 
514  // iEtaRef iEtaCell, energy
515  std::map<Int_t, std::map<Int_t, Float_t> > aveHitE; // add energies in the loop, normalize after that
516 
517  for (unsigned int i = 0; i < cellEnergies.size(); ++i) {
518  Int_t iEtaRef = refIEtaIPhi[i].first;
519  aveTargetE[iEtaRef] += targetEnergies[i];
520  nEntries[iEtaRef]++;
521 
522  // for hybrid method: matrix inv of averages preceeded by L3
523  if (CALIB_METHOD == "L3_AND_MTRX_INV") {
524  for (unsigned int j = 0; j < (cellEnergies[i]).size(); ++j) {
525  aveHitE[iEtaRef][HcalDetId(cellIds[i][j]).ieta()] += (solution[cellIds[i][j]] * cellEnergies[i][j]);
526  }
527  } else if (CALIB_METHOD == "MATRIX_INV_OF_ETA_AVE") {
528  for (unsigned int j = 0; j < (cellEnergies[i]).size(); ++j) {
529  aveHitE[iEtaRef][HcalDetId(cellIds[i][j]).ieta()] += cellEnergies[i][j];
530  }
531  }
532 
533  } // end of loop of entries
534 
535  // scale by number of entries to get the averages
536  Float_t norm = 1.0;
537  for (std::map<Int_t, Float_t>::iterator m_it = aveTargetE.begin(); m_it != aveTargetE.end(); ++m_it) {
538  Int_t iEta = m_it->first;
539  norm = (nEntries[iEta] > 0) ? 1.0 / (nEntries[iEta]) : 1.0;
540  aveTargetE[iEta] *= norm;
541 
542  std::map<Int_t, Float_t>::iterator n_it = (aveHitE[iEta]).begin();
543 
544  Float_t sumRawE = 0;
545  for (; n_it != (aveHitE[iEta]).end(); ++n_it) {
546  (n_it->second) *= norm;
547  sumRawE += (n_it->second);
548  }
549 
550  } // end of scaling by number of entries
551 
552  Int_t ONE_SIDE_IETA_RANGE = CALIB_ABS_IETA_MAX - CALIB_ABS_IETA_MIN + 1;
553 
554  // conversion from iEta to index for the linear system
555  // contains elements only in the valid range for *matrix inversion*
556  std::vector<Int_t> iEtaList;
557 
558  for (Int_t i = -CALIB_ABS_IETA_MAX; i <= CALIB_ABS_IETA_MAX; ++i) {
559  if (abs(i) < CALIB_ABS_IETA_MIN)
560  continue;
561  iEtaList.push_back(i);
562  }
563 
564  TMatrixD A(2 * ONE_SIDE_IETA_RANGE, 2 * ONE_SIDE_IETA_RANGE);
565  TMatrixD b(2 * ONE_SIDE_IETA_RANGE, 1);
566  TMatrixD x(2 * ONE_SIDE_IETA_RANGE, 1);
567 
568  for (Int_t i = 0; i < 2 * ONE_SIDE_IETA_RANGE; ++i) {
569  for (Int_t j = 0; j < 2 * ONE_SIDE_IETA_RANGE; ++j) {
570  A(i, j) = 0.0;
571  }
572  }
573 
574  for (UInt_t i = 0; i < iEtaList.size(); ++i) {
575  b(i, 0) = aveTargetE[iEtaList[i]];
576 
577  std::map<Int_t, Float_t>::iterator n_it = aveHitE[iEtaList[i]].begin();
578  for (; n_it != aveHitE[iEtaList[i]].end(); ++n_it) {
579  if (fabs(n_it->first) > CALIB_ABS_IETA_MAX || fabs(n_it->first) < CALIB_ABS_IETA_MIN)
580  continue;
581  Int_t j = Int_t(find(iEtaList.begin(), iEtaList.end(), n_it->first) - iEtaList.begin());
582  A(i, j) = n_it->second;
583  }
584  }
585 
586  TMatrixD coef = b;
587  TDecompQRH qrh(A);
588  Bool_t hasSolution = qrh.MultiSolve(coef);
589 
590  if (hasSolution && (CALIB_METHOD == "L3_AND_MTRX_INV" || CALIB_METHOD == "MATRIX_INV_OF_ETA_AVE")) {
591  for (UInt_t i = 0; i < iEtaList.size(); ++i) {
592  iEtaCoefMap[iEtaList[i]] = coef(i, 0);
593  }
594  }
595 }
596 
598  std::ifstream phiSymFile(PHI_SYM_COR_FILENAME.Data());
599 
600  if (!phiSymFile) {
601  edm::LogWarning("HcalCalib") << "\nERROR: Can not find file with phi symmetry constants \""
602  << PHI_SYM_COR_FILENAME.Data() << "\"";
603  return kFALSE;
604  }
605 
606  // assumes the format used in CSA08, first line is a comment
607 
608  Int_t iEta;
609  UInt_t iPhi;
610  UInt_t depth;
611  TString sdName;
612  UInt_t detId;
613 
614  Float_t value;
616 
618 
619  while (getline(phiSymFile, line)) {
620  if (line.empty() || line[0] == '#')
621  continue;
622 
623  std::istringstream linestream(line);
624  linestream >> iEta >> iPhi >> depth >> sdName >> value >> std::hex >> detId;
625 
626  if (sdName == "HB")
627  sd = HcalBarrel;
628  else if (sdName == "HE")
629  sd = HcalEndcap;
630  else if (sdName == "HO")
631  sd = HcalOuter;
632  else if (sdName == "HF")
633  sd = HcalForward;
634  else {
635  edm::LogWarning("HcalCalib") << "\nInvalid detector name in phi symmetry constants file: " << sdName.Data()
636  << "\nCheck file and rerun!\n";
637  return kFALSE;
638  }
639 
640  // check if the data is consistent
641 
642  if (HcalDetId(sd, iEta, iPhi, depth) != HcalDetId(detId)) {
643  edm::LogWarning("HcalCalib")
644  << "\nInconsistent info in phi symmetry file: subdet, iEta, iPhi, depth do not match rawId!\n";
645  return kFALSE;
646  }
647  HcalDetId hId(detId);
648  if (!topo_->valid(hId)) {
649  edm::LogWarning("HcalCalib") << "\nInvalid DetId from: iEta=" << iEta << " iPhi=" << iPhi << " depth=" << depth
650  << " subdet=" << sdName.Data() << " detId=" << detId << "\n";
651  return kFALSE;
652  }
653 
654  phiSymCor[HcalDetId(sd, iEta, iPhi, depth)] = value;
655  }
656 
657  return kTRUE;
658 }
659 
661  //{ HcalEmpty=0, HcalBarrel=1, HcalEndcap=2, HcalOuter=3, HcalForward=4, HcalTriggerTower=5, HcalOther=7 };
662 
663  TString sdName[8] = {"EMPTY", "HB", "HE", "HO", "HF", "TRITWR", "UNDEF", "OTHER"};
664 
665  FILE* constFile = fopen(OUTPUT_COR_COEF_FILENAME.Data(), "w+");
666 
667  // header of the constants file
668  fprintf(constFile, "%1s%16s%16s%16s%16s%9s%11s\n", "#", "eta", "phi", "depth", "det", "value", "DetId");
669 
670  // Order loops to produce sequence of constants as for phi symmetry
671 
672  for (Int_t sd = 1; sd <= 4; sd++) {
673  for (Int_t e = 1; e <= 50; e++) {
674  Int_t eta;
675 
676  for (Int_t side = 0; side < 2; side++) {
677  eta = (side == 0) ? -e : e; //ta *= (-1);
678 
679  for (Int_t phi = 1; phi <= 72; phi++) {
680  for (Int_t d = 1; d < 5; d++) {
682  continue;
684  Float_t corrFactor = 1.0;
685 
687  // if (abs(eta)>=CALIB_ABS_IETA_MIN && abs(eta)<=22 && HcalSubdetector(sd)!=HcalOuter) {
688 
689  // need some care when depths were summed for iEta=16 =>
690  // the coeficients are saved in depth 1 of HB: affects
691  Int_t subdetInd = sd;
692 
693  if (abs(eta) == 16 && HcalSubdetector(sd) == HcalEndcap && SUM_DEPTHS) {
694  subdetInd = 1;
695  }
696 
697  if (CALIB_METHOD == "L3" || CALIB_METHOD == "L3_AND_MTRX_INV") {
698  if (SUM_DEPTHS && COMBINE_PHI)
699  corrFactor = solution[HcalDetId(HcalSubdetector(subdetInd), eta, 1, 1)];
700  else if (SUM_DEPTHS)
701  corrFactor = solution[HcalDetId(HcalSubdetector(subdetInd), eta, phi, 1)];
702  else if (COMBINE_PHI)
703  corrFactor = solution[HcalDetId(HcalSubdetector(sd), eta, 1, d)];
704  else
705  corrFactor = solution[HcalDetId(HcalSubdetector(sd), eta, phi, d)];
706 
707  // Remark: a new case was added (sumSmallDepths) where the first two depths in towers 15,16
708  // are summed and stored in depth 1.
709  // For now we create the correction coef for depth 2 (set equal to depth 1)
710  // after the call to the L3 minimizer so that this case is also handled without modifying the
711  // logic above. Probably it is better to move it here?
712 
713  } // L3
714 
715  else if (CALIB_METHOD == "MATRIX_INV_OF_ETA_AVE") {
716  corrFactor = iEtaCoefMap[eta];
717  }
718 
719  else if (CALIB_METHOD == "ISO_TRK_PHI_SYM") {
720  corrFactor = solution[HcalDetId(HcalSubdetector(sd), eta, phi, d)];
721  }
722 
723  } // if within the calibration range
724 
725  fprintf(constFile, "%17i%16i%16i%16s%9.5f%11X\n", eta, phi, d, sdName[sd].Data(), corrFactor, id.rawId());
726  }
727  }
728  }
729  }
730  }
731 
732  return;
733 }
filterCells3x3
void filterCells3x3(std::vector< TCell > &selectCells, Int_t iEta, UInt_t iPhi)
Definition: hcalCalibUtils.cc:172
hcalCalib::emEnergy
Float_t emEnergy
Definition: hcalCalib.h:47
mps_fire.i
i
Definition: mps_fire.py:428
h2_dHitRefBarrel
TH2F * h2_dHitRefBarrel
Definition: hcalCalib.cc:59
hcalCalib::Terminate
void Terminate() override
Definition: hcalCalib.cc:354
hcalCalib::APPLY_PHI_SYM_COR_FLAG
Bool_t APPLY_PHI_SYM_COR_FLAG
Definition: hcalCalib.h:141
MessageLogger.h
h1_rawSumE
TH1F * h1_rawSumE
Definition: hcalCalib.cc:50
hcalCalib::makeTextFile
void makeTextFile()
Definition: hcalCalib.cc:660
TCell::e
Float_t e()
Definition: TCell.h:31
hcalCalib::tagJetP4
TLorentzVector * tagJetP4
Definition: hcalCalib.h:58
hcalCalib::Process
Bool_t Process(Long64_t entry) override
Definition: hcalCalib.cc:149
hcalCalib::ReadPhiSymCor
Bool_t ReadPhiSymCor()
Definition: hcalCalib.cc:597
hcalCalib::zTrkHcal
Float_t zTrkHcal
Definition: hcalCalib.h:53
HcalDetId::iphi
constexpr int iphi() const
get the cell iphi
Definition: HcalDetId.h:157
hcalCalib::topo_
const HcalTopology * topo_
Definition: hcalCalib.h:147
hcalCalib::refIEtaIPhi
std::vector< std::pair< Int_t, UInt_t > > refIEtaIPhi
Definition: hcalCalib.h:194
hcalCalib::MAX_TAGJET_ABSETA
Float_t MAX_TAGJET_ABSETA
Definition: hcalCalib.h:132
hcalCalib::MAX_PROBEJET_EMFRAC
Float_t MAX_PROBEJET_EMFRAC
Definition: hcalCalib.h:130
hcalCalib::MIN_CELL_E
Float_t MIN_CELL_E
Definition: hcalCalib.h:109
mps_splice.entry
entry
Definition: mps_splice.py:68
hcalCalib::probeJetP4
TLorentzVector * probeJetP4
Definition: hcalCalib.h:59
hcalCalib::MIN_PROBEJET_ABSETA
Float_t MIN_PROBEJET_ABSETA
Definition: hcalCalib.h:135
combinePhi
void combinePhi(std::vector< TCell > &selectCells)
Definition: hcalCalibUtils.cc:89
histoFile
TFile * histoFile
Definition: hcalCalib.cc:42
MinL3AlgoUniv::iterate
IDmap iterate(const std::vector< std::vector< float > > &eventMatrix, const std::vector< std::vector< IDdet > > &idMatrix, const std::vector< float > &energyVector, const int &nIter, const bool &normalizeFlag=false)
Definition: MinL3AlgoUniv.h:76
h1_corRespIEta
TH1F * h1_corRespIEta[48]
Definition: hcalCalib.cc:64
hcalCalib::yTrkHcal
Float_t yTrkHcal
Definition: hcalCalib.h:52
edm::second
U second(std::pair< T, U > const &p)
Definition: ParameterSet.cc:222
filterCellsInCone
void filterCellsInCone(std::vector< TCell > &selectCells, const GlobalPoint hitPositionHcal, Float_t maxConeDist, const CaloGeometry *theCaloGeometry)
Definition: hcalCalibUtils.cc:325
h1_rawRespBarrel
TH1F * h1_rawRespBarrel
Definition: hcalCalib.cc:53
HcalDetId::depth
constexpr int depth() const
get the tower depth
Definition: HcalDetId.h:164
DDAxes::x
hcalCalib.h
h1_allTrkP
TH1F * h1_allTrkP
Definition: hcalCalib.cc:46
HcalBarrel
Definition: HcalAssistant.h:33
hcalCalib::cellEnergies
std::vector< std::vector< Float_t > > cellEnergies
Definition: hcalCalib.h:192
spr::find
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
hcalCalib::Begin
void Begin(TTree *tree) override
Definition: hcalCalib.cc:66
fileinputsource_cfi.option
option
Definition: fileinputsource_cfi.py:94
edm::LogWarning
Log< level::Warning, false > LogWarning
Definition: MessageLogger.h:122
h2_dHitRefEndcap
TH2F * h2_dHitRefEndcap
Definition: hcalCalib.cc:60
TCell::id
UInt_t id()
Definition: TCell.h:32
hcalCalib::etVetoJet
Float_t etVetoJet
Definition: hcalCalib.h:49
sumDepths
void sumDepths(std::vector< TCell > &selectCells)
Definition: hcalCalibUtils.cc:15
hcalCalib::iPhiHit
UInt_t iPhiHit
Definition: hcalCalib.h:45
hcalCalib::cells
TClonesArray * cells
Definition: hcalCalib.h:46
h1_rawResp
TH1F * h1_rawResp
Definition: hcalCalib.cc:51
filterCells5x5
void filterCells5x5(std::vector< TCell > &selectCells, Int_t iEta, UInt_t iPhi)
Definition: hcalCalibUtils.cc:236
h1_numEventsTwrIEta
TH1F * h1_numEventsTwrIEta
Definition: hcalCalib.cc:57
PVValHelper::eta
Definition: PVValidationHelpers.h:70
hcalCalib::MAX_TARGET_E
Float_t MAX_TARGET_E
Definition: hcalCalib.h:107
hcalCalib::GetCoefFromMtrxInvOfAve
void GetCoefFromMtrxInvOfAve()
Definition: hcalCalib.cc:509
mps_fire.end
end
Definition: mps_fire.py:242
TCell::SetE
void SetE(Float_t e)
Definition: TCell.h:34
h1_trkP
TH1F * h1_trkP
Definition: hcalCalib.cc:45
h1_corResp
TH1F * h1_corResp
Definition: hcalCalib.cc:52
HcalOuter
Definition: HcalAssistant.h:35
getIEtaIPhiForHighestE
void getIEtaIPhiForHighestE(std::vector< TCell > &selectCells, Int_t &iEta, UInt_t &iPhi)
Definition: hcalCalibUtils.cc:143
Point3DBase< float, GlobalTag >
hcalCalib::CALIB_TYPE
TString CALIB_TYPE
Definition: hcalCalib.h:137
b
double b
Definition: hdecay.h:118
LEDCalibrationChannels.depth
depth
Definition: LEDCalibrationChannels.py:65
hcalCalib::iEtaCoefMap
std::map< Int_t, Float_t > iEtaCoefMap
Definition: hcalCalib.h:201
hcalCalib::phiSymCor
std::map< UInt_t, Float_t > phiSymCor
Definition: hcalCalib.h:197
hcalCalib::COMBINE_PHI
Bool_t COMBINE_PHI
Definition: hcalCalib.h:119
hcalCalib::MAX_ET_THIRD_JET
Float_t MAX_ET_THIRD_JET
Definition: hcalCalib.h:114
HcalDetId::ieta
constexpr int ieta() const
get the cell ieta
Definition: HcalDetId.h:155
hcalCalib::CALIB_METHOD
TString CALIB_METHOD
Definition: hcalCalib.h:138
h1_selTrkP_iEta10
TH1F * h1_selTrkP_iEta10
Definition: hcalCalib.cc:48
hcalCalib::PHI_SYM_COR_FILENAME
TString PHI_SYM_COR_FILENAME
Definition: hcalCalib.h:140
hcalCalib::targetE
Float_t targetE
Definition: hcalCalib.h:48
hcalCalib::SUM_DEPTHS
Bool_t SUM_DEPTHS
Definition: hcalCalib.h:117
MinL3AlgoUniv.h
HcalDetId.h
hcalCalib::MIN_DPHI_DIJETS
Float_t MIN_DPHI_DIJETS
Definition: hcalCalib.h:115
A
HcalDetId::subdet
constexpr HcalSubdetector subdet() const
get the subdetector
Definition: HcalDetId.h:138
hcalCalib::CALIB_ABS_IETA_MAX
Int_t CALIB_ABS_IETA_MAX
Definition: hcalCalib.h:127
HcalDetId
Definition: HcalDetId.h:12
value
Definition: value.py:1
M_PI
#define M_PI
Definition: BXVectorInputProducer.cc:49
trackerHitRTTI::vector
Definition: trackerHitRTTI.h:21
hcalCalib::probeJetEmFrac
Float_t probeJetEmFrac
Definition: hcalCalib.h:62
hcalCalib::CALIB_ABS_IETA_MIN
Int_t CALIB_ABS_IETA_MIN
Definition: hcalCalib.h:128
edm::LogError
Log< level::Error, false > LogError
Definition: MessageLogger.h:123
AlCaHLTBitMon_QueryRunRegistry.string
string string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
hcalCalib::SUM_SMALL_DEPTHS
Bool_t SUM_SMALL_DEPTHS
Definition: hcalCalib.h:118
HcalSubdetector
HcalSubdetector
Definition: HcalAssistant.h:31
hcalCalib::HE_CLUSTER_SIZE
Int_t HE_CLUSTER_SIZE
Definition: hcalCalib.h:122
hcalCalib::MAX_TRK_EME
Float_t MAX_TRK_EME
Definition: hcalCalib.h:112
HcalForward
Definition: HcalAssistant.h:36
HcalTopology::valid
bool valid(const DetId &id) const override
Definition: HcalTopology.cc:225
hcalCalib::GetEntry
Int_t GetEntry(Long64_t entry, Int_t getall=0) override
Definition: hcalCalib.h:95
DDAxes::phi
MaterialEffects_cfi.A
A
Definition: MaterialEffects_cfi.py:11
TCell
Definition: TCell.h:15
hcalCalib::theCaloGeometry
const CaloGeometry * theCaloGeometry
Definition: hcalCalib.h:146
hcalCalib::USE_CONE_CLUSTERING
Bool_t USE_CONE_CLUSTERING
Definition: hcalCalib.h:124
HcalEndcap
Definition: HcalAssistant.h:34
DetId.h
edm::LogVerbatim
Log< level::Info, true > LogVerbatim
Definition: MessageLogger.h:128
triggerObjects_cff.id
id
Definition: triggerObjects_cff.py:29
relativeConstraints.value
value
Definition: relativeConstraints.py:53
hcalCalib::MAX_CONE_DIST
Float_t MAX_CONE_DIST
Definition: hcalCalib.h:125
hcalCalib::solution
std::map< UInt_t, Float_t > solution
Definition: hcalCalib.h:199
hcalCalibUtils.h
HltBtagPostValidation_cff.histoName
histoName
Definition: HltBtagPostValidation_cff.py:17
hcalCalib::MIN_EOVERP
Float_t MIN_EOVERP
Definition: hcalCalib.h:110
h1_rawRespEndcap
TH1F * h1_rawRespEndcap
Definition: hcalCalib.cc:55
sd
double sd
Definition: CascadeWrapper.h:113
h1_corRespBarrel
TH1F * h1_corRespBarrel
Definition: hcalCalib.cc:54
L1TowerCalibrationProducer_cfi.iEta
iEta
Definition: L1TowerCalibrationProducer_cfi.py:60
ztail.d
d
Definition: ztail.py:151
funct::abs
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
hcalCalib::xTrkHcal
Float_t xTrkHcal
Definition: hcalCalib.h:51
h1_corRespEndcap
TH1F * h1_corRespEndcap
Definition: hcalCalib.cc:56
beamvalidation.exit
def exit(msg="")
Definition: beamvalidation.py:52
HcalDetId::ietaAbs
constexpr int ietaAbs() const
get the absolute value of the cell ieta
Definition: HcalDetId.h:148
hcalCalib::iEtaHit
Int_t iEtaHit
Definition: hcalCalib.h:44
hcalCalib::targetEnergies
std::vector< Float_t > targetEnergies
Definition: hcalCalib.h:195
dqmiolumiharvest.j
j
Definition: dqmiolumiharvest.py:66
nEvents
UInt_t nEvents
Definition: hcalCalib.cc:40
mps_splice.line
line
Definition: mps_splice.py:76
hcalCalib::HB_CLUSTER_SIZE
Int_t HB_CLUSTER_SIZE
Definition: hcalCalib.h:121
MinL3AlgoUniv
Definition: MinL3AlgoUniv.h:20
hcalCalib::MAX_EOVERP
Float_t MAX_EOVERP
Definition: hcalCalib.h:111
hcalCalib::MIN_TAGJET_ET
Float_t MIN_TAGJET_ET
Definition: hcalCalib.h:133
sumSmallDepths
void sumSmallDepths(std::vector< TCell > &selectCells)
Definition: hcalCalibUtils.cc:267
weight
Definition: weight.py:1
hcalCalib::cellIds
std::vector< std::vector< UInt_t > > cellIds
Definition: hcalCalib.h:193
hcalCalib::HISTO_FILENAME
TString HISTO_FILENAME
Definition: hcalCalib.h:144
hcalCalib::OUTPUT_COR_COEF_FILENAME
TString OUTPUT_COR_COEF_FILENAME
Definition: hcalCalib.h:143
findQualityFiles.size
size
Write out results.
Definition: findQualityFiles.py:443
MillePedeFileConverter_cfg.e
e
Definition: MillePedeFileConverter_cfg.py:37