CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
ElectronCalibration.cc
Go to the documentation of this file.
1 
3 
20 #include "TFile.h"
21 #include "TH1.h"
22 #include "TH2.h"
23 #include "TF1.h"
24 #include "TRandom.h"
25 
26 #include <iostream>
27 #include <string>
28 #include <stdexcept>
29 #include <vector>
30 
33 
35 {
36 
37  rootfile_ = iConfig.getParameter<std::string>("rootfile");
38  recHitLabel_ = iConfig.getParameter< edm::InputTag > ("ebRecHitsLabel");
39  electronLabel_ = iConfig.getParameter< edm::InputTag > ("electronLabel");
40  trackLabel_ = iConfig.getParameter< edm::InputTag > ("trackLabel");
41  calibAlgo_ = iConfig.getParameter<std::string>("CALIBRATION_ALGO");
42  std::cout << " The used Algorithm is " << calibAlgo_ << std::endl;
43  keventweight_ = iConfig.getParameter<int>("keventweight");
44  ClusterSize_ = iConfig.getParameter<int>("Clustersize");
45  ElePt_ = iConfig.getParameter<double>("ElePt");
46  maxeta_ = iConfig.getParameter<int>("maxeta");
47  mineta_ = iConfig.getParameter<int>("mineta");
48  maxphi_ = iConfig.getParameter<int>("maxphi");
49  minphi_ = iConfig.getParameter<int>("minphi");
50  cut1_ = iConfig.getParameter<double>("cut1");
51  cut2_ = iConfig.getParameter<double>("cut2");
52  cut3_ = iConfig.getParameter<double>("cut3");
53  elecclass_ = iConfig.getParameter<int>("elecclass");
54  std::cout << " The electronclass is " << elecclass_ <<std::endl;
55  numevent_ = iConfig.getParameter<int>("numevent");
56  miscalibfile_ = iConfig.getParameter<std::string>("miscalibfile");
57 
58  cutEPCalo1_ = iConfig.getParameter<double>("cutEPCaloMin");
59  cutEPCalo2_ = iConfig.getParameter<double>("cutEPCaloMax");
60  cutEPin1_ = iConfig.getParameter<double>("cutEPinMin");
61  cutEPin2_ = iConfig.getParameter<double>("cutEPinMax");
62  cutCalo1_ = iConfig.getParameter<double>("cutCaloMin");
63  cutCalo2_ = iConfig.getParameter<double>("cutCaloMax");
64 
65  cutESeed_ = iConfig.getParameter<double>("cutESeed");
66 }
67 
68 
70 {
71 
72 
73 }
74 
75 //========================================================================
77  //========================================================================
78  f = new TFile(rootfile_.c_str(),"RECREATE");
79 
80  // Book histograms
81  e9 = new TH1F("e9","E9 energy", 300, 0., 150.);
82  e25 = new TH1F("e25","E25 energy", 300, 0., 150.);
83  scE = new TH1F("scE","SC energy", 300, 0., 150.);
84  trP = new TH1F("trP","Trk momentum", 300, 0., 150.);
85  EoP = new TH1F("EoP","EoP", 600, 0., 3.);
86  EoP_all = new TH1F("EoP_all","EoP_all",600, 0., 3.);
87 
88  if (elecclass_ ==0 || elecclass_ == -1) {
89  calibs = new TH1F("calib","Calibration constants", 4000, 0.5, 2.);
90  }else{
91  calibs = new TH1F("calib","Calibration constants", 800, 0.5, 2.);
92  }
93 
94  e25OverScE = new TH1F("e25OverscE","E25 / SC energy", 400, 0., 2.);
95  E25oP = new TH1F("E25oP","E25 / P", 1200, 0., 1.5);
96 
97  Map = new TH2F("Map","Nb Events in Crystal",85,1, 85,70 ,5, 75);
98  e9Overe25 = new TH1F("e9Overe25","E9 / E25", 400, 0., 2.);
99  Map3Dcalib = new TH2F("3Dcalib", "3Dcalib",85 ,1 ,85,70, 5, 75 );
100 
101  MapCor1 = new TH2F ("MapCor1", "Correlation E25/Pcalo versus E25/Pin",100 ,0. ,5. ,100,0.,5. );
102  MapCor2 = new TH2F ("MapCor2", "Correlation E25/Pcalo versus E/P",100 ,0. ,5. ,100,0.,5. );
103  MapCor3 = new TH2F ("MapCor3", "Correlation E25/Pcalo versus Pout/Pin",100 ,0. ,5. ,100,0.,5. );
104  MapCor4 = new TH2F ("MapCor4", "Correlation E25/Pcalo versus E25/highestP",100 ,0. ,5. ,100,0.,5. );
105  MapCor5 = new TH2F ("MapCor5", "Correlation E25/Pcalo versus Pcalo/Pout",100 ,0. ,5. ,100,0.,5. );
106  MapCor6 = new TH2F ("MapCor6", "Correlation Pout/Pin versus E25/Pin",100 ,0. ,5. ,100,0.,5. );
107  MapCor7 = new TH2F ("MapCor7", "Correlation Pout/Pin versus Pcalo/Pout",100 ,0. ,5. ,100,0.,5. );
108  MapCor8 = new TH2F ("MapCor8", "Correlation E25/Pin versus Pcalo/Pout",100 ,0. ,5. ,100,0.,5. );
109  MapCor9 = new TH2F ("MapCor9", "Correlation E25/Pcalo versus Eseed/Pout",100 ,0. ,5. ,100,0.,5. );
110  MapCor10 = new TH2F ("MapCor10", "Correlation Eseed/Pout versus Pout/Pin",100 ,0. ,5. ,100,0.,5. );
111  MapCor11 = new TH2F ("MapCor11", "Correlation Eseed/Pout versus E25/Pin",100 ,0. ,5. ,100,0.,5. );
112  MapCorCalib = new TH2F ("MapCorCalib", "Correlation Miscalibration versus Calibration constants", 100, 0.5,1.5, 100, 0.5, 1.5);
113 
114  PinMinPout = new TH1F("PinMinPout","(Pin - Pout)/Pin",600,-2.0,2.0);
115 
116  if(elecclass_ == 0 || elecclass_ == -1) {
117  calibinter = new TH1F("calibinter", "internal calibration constants", 2000 , 0.5,2.);
118  PinOverPout= new TH1F("PinOverPout", "pinOverpout", 600,0., 3.);
119  eSeedOverPout= new TH1F("eSeedOverPout", "eSeedOverpout ", 600, 0., 3.);
120  MisCalibs = new TH1F("MisCalibs","Miscalibration constants",4000,0.5,2.);
121  RatioCalibs = new TH1F("RatioCalibs","Ratio in Calibration Constants", 4000, 0.5, 2.0);
122  DiffCalibs = new TH1F("DiffCalibs", "Difference in Calibration constants", 4000, -1.0,1.0);
123  }else {
124  calibinter = new TH1F("calibinter", "internal calibration constants",400 , 0.5,2.);
125  PinOverPout= new TH1F("PinOverPout", "pinOverpout", 600,0., 3.);
126  eSeedOverPout= new TH1F("eSeedOverPout", "eSeedOverpout ", 600, 0., 3.);
127  MisCalibs = new TH1F("MisCalibs","Miscalibration constants",800,0.5,2.);
128  RatioCalibs = new TH1F("RatioCalibs","Ratio in Calibration Constants", 800, 0.5, 2.0);
129  DiffCalibs = new TH1F("DiffCalibs", "Difference in Calibration constants", 800, -1.0,1.0);
130  }
131  Error1 = new TH1F ("Error1","DeltaP/Pin",800 ,-1.0,1.0 );
132  Error2 = new TH1F ("Error2","DeltaP/Pout",800 ,-1.0,1.0 );
133  Error3 = new TH1F ("Error3","DeltaP/Pcalo",800 ,-1.0,1.0 );
134  eSeedOverPout2= new TH1F("eSeedOverPout2", "eSeedOverpout (No Supercluster)", 600, 0., 4.);
135  hadOverEm= new TH1F("hadOverEm", "Had/EM distribution", 600, -2., 2.);
136 
137  // Book histograms
138  Map3DcalibNoCuts = new TH2F("3DcalibNoCuts", "3Dcalib (Before Cuts)",85 ,1 ,85,70, 5, 75 );
139  e9NoCuts = new TH1F("e9NoCuts","E9 energy (Before Cuts)",300, 0., 150.);
140  e25NoCuts = new TH1F("e25NoCuts","E25 energy (Before Cuts)", 300, 0., 150.);
141  scENoCuts = new TH1F("scENoCuts","SC energy (Before Cuts)", 300, 0., 150.);
142  trPNoCuts = new TH1F("trPNoCuts","Trk momentum (Before Cuts)", 300, 0., 150.);
143  EoPNoCuts = new TH1F("EoPNoCuts","EoP (Before Cuts)", 600, 0., 3.);
144  if (elecclass_ ==0 || elecclass_ == -1){
145  calibsNoCuts = new TH1F("calibNoCuts","Calibration constants (Before Cuts)", 4000, 0., 2.);
146  }else{
147  calibsNoCuts = new TH1F("calibNoCuts","Calibration constants (Before Cuts)", 800, 0., 2.);
148  }
149  e25OverScENoCuts = new TH1F("e25OverscENoCuts","E25 / SC energy (Before Cuts)", 400, 0., 2.);
150  E25oPNoCuts = new TH1F("E25oPNoCuts","E25 / P (Before Cuts)", 1200, 0., 1.5);
151  MapNoCuts = new TH2F("MapNoCuts","Nb Events in Crystal (Before Cuts)",85,1, 85,70 ,5, 75);
152  e9Overe25NoCuts = new TH1F("e9Overe25NoCuts","E9 / E25 (Before Cuts)", 400, 0., 2.);
153  PinOverPoutNoCuts = new TH1F("PinOverPoutNoCuts", "pinOverpout (Before Cuts)", 600,0., 3.);
154  eSeedOverPoutNoCuts = new TH1F(" eSeedOverPoutNoCuts", "eSeedOverpout (Before Cuts) ", 600, 0., 4.);
155  PinMinPoutNoCuts = new TH1F("PinMinPoutNoCuts","(Pin - Pout)/Pin (Before Cuts)",600,-2.0,2.0);
156 
157  RatioCalibsNoCuts = new TH1F("RatioCalibsNoCuts","Ratio in Calibration Constants (Before Cuts)", 4000, 0.5, 2.0);
158  DiffCalibsNoCuts = new TH1F("DiffCalibsNoCuts", "Difference in Calibration constants (Before Cuts)", 4000, -1.0,1.0);
159  calibinterNoCuts = new TH1F("calibinterNoCuts", "internal calibration constants", 2000 , 0.5,2.);
160 
161  MapCor1NoCuts = new TH2F ("MapCor1NoCuts", "Correlation E25/PatCalo versus E25/Pin (Before Cuts)",100 ,0. ,5. ,100,0.,5. );
162  MapCor2NoCuts = new TH2F ("MapCor2NoCuts", "Correlation E25/PatCalo versus E/P (Before Cuts)",100 ,0. ,5. ,100,0.,5. );
163  MapCor3NoCuts = new TH2F ("MapCor3NoCuts", "Correlation E25/PatCalo versus Pout/Pin (Before Cuts)",100 ,0. ,5. ,100,0.,5. );
164  MapCor4NoCuts = new TH2F ("MapCor4NoCuts", "Correlation E25/PatCalo versus E25/highestP (Before Cuts)",100 ,0. ,5. ,100,0.,5. );
165  MapCor5NoCuts = new TH2F ("MapCor5NoCuts", "Correlation E25/Pcalo versus Pcalo/Pout (Before Cuts)",100 ,0. ,5. ,100,0.,5. );
166  MapCor6NoCuts = new TH2F ("MapCor6NoCuts", "Correlation Pout/Pin versus E25/Pin (Before Cuts)",100 ,0. ,5. ,100,0.,5. );
167  MapCor7NoCuts = new TH2F ("MapCor7NoCuts", "Correlation Pout/Pin versus Pcalo/Pout (Before Cuts)",100 ,0. ,5. ,100,0.,5. );
168  MapCor8NoCuts = new TH2F ("MapCor8NoCuts", "Correlation E25/Pin versus Pcalo/Pout (Before Cuts)",100 ,0. ,5. ,100,0.,5. );
169  MapCor9NoCuts = new TH2F ("MapCor9NoCuts", "Correlation E25/Pcalo versus Eseed/Pout (Before Cuts)",100 ,0. ,5. ,100,0.,5. );
170  MapCor10NoCuts = new TH2F ("MapCor10NoCuts", "Correlation Eseed/Pout versus Pout/Pin (Before Cuts)",100 ,0. ,5. ,100,0.,5. );
171  MapCor11NoCuts = new TH2F ("MapCor11NoCuts", "Correlation Eseed/Pout versus E25/Pin (Before Cuts)",100 ,0. ,5. ,100,0.,5. );
172  MapCorCalibNoCuts = new TH2F ("MapCorCalibNoCuts", "Correlation Miscalibration versus Calibration constants (Before Cuts)", 100, 0., 3., 100, 0., 3.);
173 
174  Error1NoCuts = new TH1F ("Eror1NoCuts","DeltaP/Pin (Before Cuts)",800 ,-1.0,1.0 );
175  Error2NoCuts = new TH1F ("Error2NoCuts","DeltaP/Pout (Before Cuts)",800 ,-1.0,1.0 );
176  Error3NoCuts = new TH1F ("Error3NoCuts","DeltaP/Pcalo (Before Cuts)",800 ,-1.0, 1.0);
177  eSeedOverPout2NoCuts= new TH1F("eSeedOverPout2NoCuts", "eSeedOverpout (No Supercluster, Before Cuts)", 600, 0., 4.);
178  hadOverEmNoCuts= new TH1F("hadOverEmNoCuts", "Had/EM distribution (Before Cuts)", 600, -2., 2.);
179 
180  //Book histograms after ESeed cut
181  MapCor1ESeed = new TH2F ("MapCor1ESeed", "Correlation E25/Pcalo versus E25/Pin (after Eseed/Pout cut)",100 ,0. ,5. ,100,0.,5. );
182  MapCor2ESeed = new TH2F ("MapCor2ESeed", "Correlation E25/Pcalo versus E/P (after Eseed/Pout cut)",100 ,0. ,5. ,100,0.,5. );
183  MapCor3ESeed = new TH2F ("MapCor3ESeed", "Correlation E25/Pcalo versus Pout/Pin (after Eseed/Pout cut)",100 ,0. ,5. ,100,0.,5. );
184  MapCor4ESeed = new TH2F ("MapCor4ESeed", "Correlation E25/Pcalo versus E25/highestP (after Eseed/Pout cut)",100 ,0. ,5. ,100,0.,5. );
185  MapCor5ESeed = new TH2F ("MapCor5ESeed", "Correlation E25/Pcalo versus Pcalo/Pout (after Eseed/Pout cut)",100 ,0. ,5. ,100,0.,5. );
186  MapCor6ESeed = new TH2F ("MapCor6ESeed", "Correlation Pout/Pin versus E25/Pin (after Eseed/Pout cut)",100 ,0. ,5. ,100,0.,5. );
187  MapCor7ESeed = new TH2F ("MapCor7ESeed", "Correlation Pout/Pin versus Pcalo/Pout (after Eseed/Pout cut)",100 ,0. ,5. ,100,0.,5. );
188  MapCor8ESeed = new TH2F ("MapCor8ESeed", "Correlation E25/Pin versus Pcalo/Pout (after Eseed/Pout cut)",100 ,0. ,5. ,100,0.,5. );
189  MapCor9ESeed = new TH2F ("MapCor9ESeed", "Correlation E25/Pcalo versus Eseed/Pout (after Eseed/Pout cut)",100 ,0. ,5. ,100,0.,5. );
190  MapCor10ESeed = new TH2F ("MapCor10ESeed", "Correlation Eseed/Pout versus Pout/Pin (after Eseed/Pout cut)",100 ,0. ,5. ,100,0.,5. );
191  MapCor11ESeed = new TH2F ("MapCor11ESeed", "Correlation Eseed/Pout versus E25/Pin (after Eseed/Pout cut)",100 ,0. ,5. ,100,0.,5. );
192 
193  eSeedOverPout2ESeed= new TH1F("eSeedOverPout2ESeed", "eSeedOverpout (No Supercluster, after Eseed/Pout cut)", 600, 0., 4.);
194 
195  hadOverEmESeed= new TH1F("hadOverEmESeed", "Had/EM distribution (after Eseed/Pout cut)", 600, -2., 2.);
196 
197  //Book histograms without any cut
198  GeneralMap = new TH2F("GeneralMap","Map without any cuts",85,1,85,70,5,75);
199 
201  etaMin = mineta_;
202  etaMax = maxeta_;
203  phiMin = minphi_;
204  phiMax = maxphi_;
205  if(calibAlgo_=="L3") {
207  }else{
208  if(calibAlgo_=="HH" || calibAlgo_=="HHReg"){
210  }else{
211  std::cout<<" Name of Algorithm is not recognize "<<calibAlgo_<<" Should be either L3, HH or HHReg. Abort! "<<std::endl;
212  }
213  }
214  read_events=0;
215 
216  // get Region to be calibrated
218 
219  oldCalibs.resize(ReducedMap.size(),0.);
220 
221  // table is set to zero
222  for (int phi=0; phi<360; phi++){for (int eta=0; eta<171; eta++){eventcrystal[eta][phi]=0;}}
223 
224 
225  std::cout<<" Begin JOB "<<std::endl;
226 }
227 
228 
229 //========================================================================
230 
231 void
233 //========================================================================
234 
235 int nIterations =10;
236 if(calibAlgo_=="L3"){
238  }else{
239  if(calibAlgo_=="HH"){
241  }else{
243  }else{
244  std::cout<<" Calibration not run due to problem in Algo Choice..."<<std::endl;return;
245  }
246  }
247  }
248  for (int ii=0;ii<(int)solution.size();ii++)
249  {
250  std::cout << "solution[" << ii << "] = " << solution[ii] << std::endl;
251  calibs->Fill(solution[ii]);
252  }
253 
254  newCalibs.resize(ReducedMap.size(),0.);
255 
256  calibXMLwriter write_calibrations;
257 
258  FILE* MisCalib;
259  MisCalib = fopen(miscalibfile_.c_str(),"r");
260  int fileStatus=1;
261  int eta=-1;
262  int phi=-1;
263  float coeff=-1;
264 
265  std::map<EBDetId,float> OldCoeff;
266 
267  while(fileStatus != EOF) {
268  fileStatus = fscanf(MisCalib,"%d %d %f\n", &eta,&phi,&coeff);
269  if(eta!=-1&&phi!=-1&& coeff!=-1){
270  // std::cout<<" We have read correctly the coefficient " << coeff << " corresponding to eta "<<eta<<" and phi "<<phi<<std::endl;
271  OldCoeff.insert(std::make_pair(EBDetId(eta,phi,EBDetId::ETAPHIMODE),coeff ));
272  }
273  }
274 
275  fclose(MisCalib);
276 
277  int icry=0;
278  CalibrationCluster::CalibMap::iterator itmap;
279  for (itmap=ReducedMap.begin(); itmap != ReducedMap.end();itmap++){
280 
281  newCalibs[icry] = solution[icry];
282 
283  write_calibrations.writeLine(itmap->first,newCalibs[icry]);
284  float Compare =1.;
285  std::map<EBDetId,float>::iterator iter = OldCoeff.find(itmap->first);
286  if( iter != OldCoeff.end() )Compare = iter->second;
287 
288  if((itmap->first).ieta()>mineta_ && (itmap->first).ieta()<maxeta_ && (itmap->first).iphi()>minphi_ && (itmap->first).iphi()<maxphi_){
289  Map3Dcalib->Fill((itmap->first).ieta(),(itmap->first).iphi(),newCalibs[icry]*Compare ) ;
290  MisCalibs->Fill(Compare);
291 
292 }
293  if((itmap->first).ieta()< mineta_+2){icry++; continue;}
294  if((itmap->first).ieta()> maxeta_-2){icry++; continue;}
295  if((itmap->first).iphi()< minphi_+2){icry++; continue;}
296  if((itmap->first).iphi()> maxphi_-2){icry++; continue;}
297 
298  calibinter->Fill(newCalibs[icry]);
299  DiffCalibs->Fill(newCalibs[icry]-1./Compare);
300  RatioCalibs->Fill(newCalibs[icry]*Compare);
301  MapCorCalib->Fill(1./Compare, newCalibs[icry]);
302  icry++;
303  }
304 
305  if(calibAlgo_=="L3"){
307  }else{
308  if(calibAlgo_=="HH"){
310  }else{
311  if(calibAlgo_=="HHReg"){
313  }else{
314  std::cout<<" Calibration not run due to problem in AlgoChoice..."<<std::endl;return;
315  }
316  }
317  }
318  for (int ii=0;ii<(int)solutionNoCuts.size();ii++){
319  calibsNoCuts->Fill(solutionNoCuts[ii]);
320  }
321  int icryp=0;
322  CalibrationCluster::CalibMap::iterator itmapp;
323  for (itmapp=ReducedMap.begin(); itmapp != ReducedMap.end();itmapp++){
324 
325  newCalibs[icryp] = solutionNoCuts[icryp];
326  float Compare2 =1.;
327  std::map<EBDetId,float>::iterator iter2 = OldCoeff.find(itmapp->first);
328  if( iter2 != OldCoeff.end() )Compare2 = iter2->second;
329 
330  if((itmapp->first).ieta()>mineta_ && (itmapp->first).ieta()<maxeta_ && (itmapp->first).iphi()>minphi_ && (itmapp->first).iphi()<maxphi_)Map3DcalibNoCuts->Fill((itmapp->first).ieta(),(itmapp->first).iphi(),newCalibs[icryp]*Compare2) ;
331  if ((itmapp->first).ieta()< mineta_+2){icryp++; continue;}
332  if ((itmapp->first).ieta()> maxeta_-2){icryp++; continue;}
333  if ((itmapp->first).iphi()< minphi_+2){icryp++; continue;}
334  if ((itmapp->first).iphi()> maxphi_-2){icryp++; continue;}
335  calibinterNoCuts->Fill(newCalibs[icryp]);
336  DiffCalibsNoCuts->Fill(newCalibs[icryp]-1./(Compare2));
337  RatioCalibsNoCuts->Fill(newCalibs[icryp]*Compare2);
338  MapCorCalibNoCuts->Fill(1./Compare2 ,newCalibs[icryp]);
339  icryp++;
340  }
341 
342 
343 
345 
346  std::cout << " " << std::endl;
347  std::cout << "************* STATISTICS **************" << std::endl;
348  std::cout << " Events Studied "<<read_events<< std::endl;
349 
351 
352  f->Write();
353 
354  f->Close();
355 }
356 
357 
358 //=================================================================================
360 //=================================================================================
361 
362  EcalRecHitCollection ecrh = *phits;
364  int count=0;
365  EBDetId save;
366  float en_save=0;
367  for (it = ecrh.begin(); it != ecrh.end(); it++)
368  {
369  EBDetId p = EBDetId(it->id().rawId());
370  if(it->energy()> en_save){
371  en_save=it->energy();
372  save=p;
373  }
374  count++;
375  }
376  return save;
377 
378 }
379 
380 //=================================================================================
381 EBDetId ElectronCalibration::findMaxHit2(const std::vector<DetId> & v1,const EBRecHitCollection* hits) {
382 //=================================================================================
383 
384  double currEnergy = 0.;
385  EBDetId maxHit;
386 
387  for( std::vector<DetId>::const_iterator idsIt = v1.begin(); idsIt != v1.end(); ++idsIt) {
388  if(idsIt->subdetId()!=1) continue;
390  itrechit = hits->find(*idsIt);
391 
392  if(itrechit == hits->end()){
393  std::cout << "ElectronCalibration::findMaxHit2: rechit not found! " << std::endl;
394  continue;
395  }
396  if(itrechit->energy() > currEnergy) {
397  currEnergy=itrechit->energy();
398  maxHit= *idsIt;
399  }
400  }
401 
402  return maxHit;
403 }
404 
405 
406 //=================================================================================
408 //=================================================================================
409  using namespace edm;
410 
411  // Get EBRecHits
413  iEvent.getByLabel( recHitLabel_, phits);
414  if (!phits.isValid()) {
415  std::cerr << "Error! can't get the product EBRecHitCollection: " << std::endl;
416  }
417 
418  const EBRecHitCollection* hits = phits.product(); // get a ptr to the product
419 
420  // Get pixelElectrons
422 
423  iEvent.getByLabel(electronLabel_, pElectrons);
424  if (!pElectrons.isValid()) {
425  std::cerr << "Error! can't get the product ElectronCollection: " << std::endl;
426  }
427 
428  const reco::GsfElectronCollection* electronCollection = pElectrons.product();
429  read_events++;
430  if(read_events%1000 ==0)std::cout << "read_events = " << read_events << std::endl;
431 
432  if(!hits)return;
433  if(hits->size() == 0)return;
434  if(!electronCollection)return;
435  if(electronCollection->size() == 0)return;
436 
437 
439  // START HERE....
441  reco::GsfElectronCollection::const_iterator eleIt = electronCollection->begin();
442 
443  reco::GsfElectron highPtElectron;
444 
445  float highestElePt=0.;
446  bool found=false;
447  for (eleIt=electronCollection->begin(); eleIt!=electronCollection->end(); eleIt++) {
448  //Comments
449  if(fabs(eleIt->eta())>(maxeta_+3) * 0.0175) continue;
450  if(eleIt->eta()<(mineta_-3) * 0.0175) continue;
451 
452  if(eleIt->pt()>highestElePt) {
453  highestElePt=eleIt->pt();
454  highPtElectron = *eleIt;
455  found =true;
456  }
457 
458  }
459  if(highestElePt<ElePt_)return;
460  if(!found) return;
461  const reco::SuperCluster & sc = *(highPtElectron.superCluster()) ;
462  if(fabs(sc.eta())>(maxeta_+3) * 0.0175){
463  std::cout<<"++++ Problem with electron, electron eta is "<< highPtElectron.eta()<<" while SC is "<<sc.eta()<<std::endl;return;
464  }
465 // std::cout << "track eta = " << highPtElectron.eta() << std::endl;
466 // std::cout << "track phi = " << highPtElectron.phi() << std::endl;
467 
468  std::vector<DetId> v1;
469  //Loop to fill the vector of DetIds
470 for (std::vector<std::pair<DetId,float> >::const_iterator idsIt = sc.hitsAndFractions().begin();
471  idsIt != sc.hitsAndFractions().end ();++idsIt)
472  {v1.push_back(idsIt->first);
473  }
474 
475  //getHitsByDetId(); //Change function name
476  EBDetId maxHitId;
477 
478  maxHitId = findMaxHit2(v1,hits);
479 
480  if(maxHitId.null()){std::cout<<" Null "<<std::endl; return;}
481 
482  int maxCC_Eta = maxHitId.ieta();
483  int maxCC_Phi = maxHitId.iphi();
484 
485  if(maxCC_Eta>maxeta_ )return;
486  if(maxCC_Eta<mineta_ )return;
487  if(maxCC_Phi>maxphi_ ) return;
488  if(maxCC_Phi<minphi_ ) return;
489 
490  // number of events per crystal is set
491  if(numevent_>0){
492  eventcrystal[maxCC_Eta+85][maxCC_Phi-1]+=1;
493  if (eventcrystal[maxCC_Eta+85][maxCC_Phi-1] > numevent_) return;
494  }
495 
496  std::vector<EBDetId> Xtals5x5 = calibCluster.get5x5Id(maxHitId);
497 
498  if((int)Xtals5x5.size()!=ClusterSize_*ClusterSize_)return;
499 
500  // fill cluster energy
501  std::vector<float> energy;
502  float energy3x3=0.;
503  float energy5x5=0.;
504 
505  for (int icry=0;icry<ClusterSize_*ClusterSize_;icry++){
506 
508  if(Xtals5x5[icry].subdetId()!=1) continue;
509  itrechit = hits->find(Xtals5x5[icry]);
510  if(itrechit==hits->end())
511  { std::cout << "DetId not is e25" << std::endl;
512  continue;
513  }
514 
515  if (std::isnan(itrechit->energy())) return;
516  energy.push_back(itrechit->energy());
517  energy5x5 += energy[icry];
518 
519  if ( icry == 6 || icry == 7 || icry == 8 ||
520  icry == 11 || icry == 12 || icry ==13 ||
521  icry == 16 || icry == 17 || icry ==18 )
522  {
523  energy3x3+=energy[icry];
524  }
525 
526  }
527  if((int)energy.size()!=ClusterSize_*ClusterSize_) return;
528  //Once we have the matrix 5x5, we have to correct for gaps/cracks/umbrella and maincontainement
529 
530  GeneralMap->Fill(maxCC_Eta,maxCC_Phi);
531 
532  EoP_all->Fill(highPtElectron.eSuperClusterOverP());
533 
534  if(highPtElectron.classification()==elecclass_ || elecclass_== -1 ){
535 
536  float Ptrack_in=sqrt( pow(highPtElectron.trackMomentumAtVtx().X(),2) +pow(highPtElectron.trackMomentumAtVtx().Y(),2) + pow(highPtElectron.trackMomentumAtVtx().Z(),2) );
537 
538  float UncorrectedPatCalo = sqrt(pow(highPtElectron.trackMomentumAtCalo().X(),2)+pow(highPtElectron.trackMomentumAtCalo().Y(),2)+pow(highPtElectron.trackMomentumAtCalo().Z(),2));
539 
540  float Ptrack_out = sqrt( pow(highPtElectron.trackMomentumOut().X(),2)+ pow(highPtElectron.trackMomentumOut().Y(),2)+ pow(highPtElectron.trackMomentumOut().Z(),2) );
541 
542 
543  EventMatrixNoCuts.push_back(energy);
544  EnergyVectorNoCuts.push_back(UncorrectedPatCalo);
545 
546  MaxCCetaNoCuts.push_back(maxCC_Eta);
547  MaxCCphiNoCuts.push_back(maxCC_Phi);
548 
549  WeightVectorNoCuts.push_back(energy5x5/UncorrectedPatCalo);
550 
551  //---------------------------------------------------No Cuts-------------------------------------------------------
552  e9NoCuts->Fill(energy3x3);
553  e25NoCuts->Fill(energy5x5);
554  e9Overe25NoCuts->Fill(energy3x3/energy5x5);
555  scENoCuts->Fill(sc.energy());
556 
557  trPNoCuts->Fill(UncorrectedPatCalo);
558 
559  EoPNoCuts->Fill(highPtElectron.eSuperClusterOverP());
560  e25OverScENoCuts->Fill(energy5x5/sc.energy());
561 
562  E25oPNoCuts->Fill(energy5x5/UncorrectedPatCalo);
563 
564  MapNoCuts->Fill(maxCC_Eta,maxCC_Phi);
565  PinOverPoutNoCuts->Fill( sqrt( pow(highPtElectron.trackMomentumAtVtx().X(),2) +pow(highPtElectron.trackMomentumAtVtx().Y(),2) + pow(highPtElectron.trackMomentumAtVtx().Z(),2) )/sqrt( pow(highPtElectron.trackMomentumOut().X(),2)+ pow(highPtElectron.trackMomentumOut().Y(),2)+ pow(highPtElectron.trackMomentumOut().Z(),2) ) );
566  eSeedOverPoutNoCuts->Fill(highPtElectron.eSuperClusterOverP());
567 
568  MapCor1NoCuts->Fill(energy5x5/UncorrectedPatCalo,energy5x5/Ptrack_in);
569  MapCor2NoCuts->Fill(energy5x5/UncorrectedPatCalo,highPtElectron.eSuperClusterOverP());
570  MapCor3NoCuts->Fill(energy5x5/UncorrectedPatCalo,Ptrack_out/Ptrack_in);
571  MapCor4NoCuts->Fill(energy5x5/UncorrectedPatCalo,energy5x5/highPtElectron.p());
572  MapCor5NoCuts->Fill(energy5x5/UncorrectedPatCalo,UncorrectedPatCalo/Ptrack_out);
573  MapCor6NoCuts->Fill(Ptrack_out/Ptrack_in,energy5x5/Ptrack_in);
574  MapCor7NoCuts->Fill(Ptrack_out/Ptrack_in,UncorrectedPatCalo/Ptrack_out);
575  MapCor8NoCuts->Fill(energy5x5/Ptrack_in,UncorrectedPatCalo/Ptrack_out);
576  MapCor9NoCuts->Fill(energy5x5/UncorrectedPatCalo,highPtElectron.eSeedClusterOverPout());
577  MapCor10NoCuts->Fill(highPtElectron.eSeedClusterOverPout(),Ptrack_out/Ptrack_in);
578  MapCor11NoCuts->Fill(highPtElectron.eSeedClusterOverPout(),energy5x5/Ptrack_in);
579 
580  PinMinPoutNoCuts->Fill((Ptrack_in-Ptrack_out)/Ptrack_in);
581 
582  Error1NoCuts-> Fill(highPtElectron.trackMomentumError()/Ptrack_in);
583  Error2NoCuts->Fill(highPtElectron.trackMomentumError()/Ptrack_out);
584  Error3NoCuts->Fill(highPtElectron.trackMomentumError()/UncorrectedPatCalo);
585  eSeedOverPout2NoCuts->Fill(highPtElectron.eSeedClusterOverPout());
586 
587  hadOverEmNoCuts->Fill(highPtElectron.hadronicOverEm());
588 
589  //------------------------------------------------Cuts-----------------------------------------------------
590  //Cuts!
591  if((energy3x3/energy5x5)<cut1_)return;
592 
593  if((Ptrack_out/Ptrack_in)< cut2_ || (Ptrack_out/Ptrack_in)> cut3_ )return;
594  if((energy5x5/Ptrack_in)< cutEPin1_ || (energy5x5/Ptrack_in)> cutEPin2_ )return;
595 
596  e9->Fill(energy3x3);
597  e25->Fill(energy5x5);
598  e9Overe25->Fill(energy3x3/energy5x5);
599  scE->Fill(sc.energy());
600  trP->Fill(UncorrectedPatCalo);
601 
602  EoP->Fill(highPtElectron.eSuperClusterOverP());
603  e25OverScE->Fill(energy5x5/sc.energy());
604 
605  E25oP->Fill(energy5x5/UncorrectedPatCalo);
606 
607  Map->Fill(maxCC_Eta,maxCC_Phi);
608  PinOverPout->Fill( sqrt( pow(highPtElectron.trackMomentumAtVtx().X(),2) +pow(highPtElectron.trackMomentumAtVtx().Y(),2) + pow(highPtElectron.trackMomentumAtVtx().Z(),2) )/sqrt( pow(highPtElectron.trackMomentumOut().X(),2)+ pow(highPtElectron.trackMomentumOut().Y(),2)+ pow(highPtElectron.trackMomentumOut().Z(),2) ) );
609  eSeedOverPout->Fill(highPtElectron.eSuperClusterOverP());
610 
611  MapCor1->Fill(energy5x5/UncorrectedPatCalo,energy5x5/Ptrack_in);
612  MapCor2->Fill(energy5x5/UncorrectedPatCalo,highPtElectron.eSuperClusterOverP());
613  MapCor3->Fill(energy5x5/UncorrectedPatCalo,Ptrack_out/Ptrack_in);
614  MapCor4->Fill(energy5x5/UncorrectedPatCalo,energy5x5/highPtElectron.p());
615  MapCor5->Fill(energy5x5/UncorrectedPatCalo,UncorrectedPatCalo/Ptrack_out);
616  MapCor6->Fill(Ptrack_out/Ptrack_in,energy5x5/Ptrack_in);
617  MapCor7->Fill(Ptrack_out/Ptrack_in,UncorrectedPatCalo/Ptrack_out);
618  MapCor8->Fill(energy5x5/Ptrack_in,UncorrectedPatCalo/Ptrack_out);
619  MapCor9->Fill(energy5x5/UncorrectedPatCalo,highPtElectron.eSeedClusterOverPout());
620  MapCor10->Fill(highPtElectron.eSeedClusterOverPout(),Ptrack_out/Ptrack_in);
621  MapCor11->Fill(highPtElectron.eSeedClusterOverPout(),energy5x5/Ptrack_in);
622 
623  PinMinPout->Fill((Ptrack_in-Ptrack_out)/Ptrack_in);
624 
625  Error1-> Fill(highPtElectron.trackMomentumError()/Ptrack_in);
626  Error2->Fill(highPtElectron.trackMomentumError()/Ptrack_out);
627  Error3->Fill(highPtElectron.trackMomentumError()/UncorrectedPatCalo);
628 
629  eSeedOverPout2->Fill(highPtElectron.eSeedClusterOverPout());
630  hadOverEm->Fill(highPtElectron.hadronicOverEm());
631 
632  EventMatrix.push_back(energy);
633  EnergyVector.push_back(UncorrectedPatCalo);
634  MaxCCeta.push_back(maxCC_Eta);
635  MaxCCphi.push_back(maxCC_Phi);
636 
637  WeightVector.push_back(energy5x5/UncorrectedPatCalo);
638 
639  //-------------------------------------------------------Extra Cut-----------------------------------------------------
640  if(highPtElectron.eSeedClusterOverPout()< cutESeed_ ) return;
641 
642  MapCor1ESeed->Fill(energy5x5/UncorrectedPatCalo,energy5x5/Ptrack_in);
643  MapCor2ESeed->Fill(energy5x5/UncorrectedPatCalo,highPtElectron.eSuperClusterOverP());
644  MapCor3ESeed->Fill(energy5x5/UncorrectedPatCalo,Ptrack_out/Ptrack_in);
645  MapCor4ESeed->Fill(energy5x5/UncorrectedPatCalo,energy5x5/highPtElectron.p());
646  MapCor5ESeed->Fill(energy5x5/UncorrectedPatCalo,UncorrectedPatCalo/Ptrack_out);
647  MapCor6ESeed->Fill(Ptrack_out/Ptrack_in,energy5x5/Ptrack_in);
648  MapCor7ESeed->Fill(Ptrack_out/Ptrack_in,UncorrectedPatCalo/Ptrack_out);
649  MapCor8ESeed->Fill(energy5x5/Ptrack_in,UncorrectedPatCalo/Ptrack_out);
650  MapCor9ESeed->Fill(energy5x5/UncorrectedPatCalo,highPtElectron.eSeedClusterOverPout());
651  MapCor10ESeed->Fill(highPtElectron.eSeedClusterOverPout(),Ptrack_out/Ptrack_in);
652  MapCor11ESeed->Fill(highPtElectron.eSeedClusterOverPout(),energy5x5/Ptrack_in);
653 
654  eSeedOverPout2ESeed->Fill(highPtElectron.eSeedClusterOverPout());
655 
656  hadOverEmESeed->Fill(highPtElectron.hadronicOverEm());
657 
658  }else{return;}
659 }
660 
T getParameter(std::string const &) const
CalibrationCluster::CalibMap ReducedMap
std::vector< float > WeightVector
edm::InputTag recHitLabel_
virtual void analyze(const edm::Event &, const edm::EventSetup &)
HouseholderDecomposition * MyHH
std::vector< EcalRecHit >::const_iterator const_iterator
CalibMap getMap(int, int, int, int)
std::vector< float > solutionNoCuts
MinL3Algorithm * MyL3Algo1
std::vector< int > MaxCCphiNoCuts
std::vector< int > MaxCCetaNoCuts
T eta() const
std::vector< GsfElectron > GsfElectronCollection
collection of GsfElectron objects
std::vector< float > solution
edm::InputTag electronLabel_
std::vector< float > newCalibs
std::vector< float > EnergyVector
int iEvent
Definition: GenABIO.cc:243
ElectronCalibration(const edm::ParameterSet &)
bool isnan(float x)
Definition: math.h:13
void Fill(HcalDetId &id, double val, std::vector< TH2F > &depth)
EBDetId findMaxHit(edm::Handle< EBRecHitCollection > &)
std::vector< float > iterate(const std::vector< std::vector< float > > &eventMatrix, const std::vector< int > &VmaxCeta, const std::vector< int > &VmaxCphi, const std::vector< float > &energyVector, const int &nIter, const bool &normalizeFlag=false)
std::vector< int > MaxCCphi
T sqrt(T t)
Definition: SSEVec.h:46
std::vector< float > WeightVectorNoCuts
std::vector< std::vector< float > > EventMatrixNoCuts
CalibrationCluster calibCluster
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:356
static const int ETAPHIMODE
Definition: EBDetId.h:145
std::vector< EcalRecHit >::iterator iterator
const_iterator end() const
std::vector< std::vector< float > > EventMatrix
std::vector< float > runRegional(const std::vector< std::vector< float > > &eventMatrix, const std::vector< int > &VmaxCeta, const std::vector< int > &VmaxCphi, const std::vector< float > &energyVector, const int &nIter, const int &regLength=5)
EBDetId findMaxHit2(const std::vector< DetId > &, const EBRecHitCollection *)
void writeLine(EBDetId const &, float)
iterator find(key_type k)
std::vector< float > EnergyVectorNoCuts
tuple cout
Definition: gather_cfg.py:121
std::vector< EBDetId > get5x5Id(EBDetId const &)
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40
std::vector< float > oldCalibs
std::vector< float > iterate(const std::vector< std::vector< float > > &eventMatrix, const std::vector< int > &VmaxCeta, const std::vector< int > &VmaxCphi, const std::vector< float > &energyVector, const int &nIter, const bool &normalizeFlag=false)
const_iterator begin() const
Definition: DDAxes.h:10
std::vector< int > MaxCCeta