CMS 3D CMS Logo

EcalMatacqAnalyzer.cc
Go to the documentation of this file.
1 /*
2  * \class EcalMatacqAnalyzer
3  *
4  * primary author: Gautier Hamel De Monchenault - CEA/Saclay
5  * author: Julie Malcles - CEA/Saclay
6  */
7 
8 #include <TFile.h>
9 #include <TTree.h>
10 #include <TProfile.h>
11 #include <TChain.h>
12 #include <vector>
13 
15 
16 #include <sstream>
17 #include <iostream>
18 #include <iomanip>
19 
22 
24 
28 
32 
33 //========================================================================
35  //========================================================================
36  :
37 
38  iEvent(0),
39 
40  // framework parameters with default values
41 
42  _presample(iConfig.getUntrackedParameter<double>("nPresamples", 6.7)),
43  _nsamplesaftmax(iConfig.getUntrackedParameter<unsigned int>("nSamplesAftMax", 80)),
44  _noiseCut(iConfig.getUntrackedParameter<unsigned int>("noiseCut", 7)),
45  _parabnbefmax(iConfig.getUntrackedParameter<unsigned int>("paraBeforeMax", 8)),
46  _parabnaftmax(iConfig.getUntrackedParameter<unsigned int>("paraAfterMax", 7)),
47  _thres(iConfig.getUntrackedParameter<unsigned int>("threshold", 10)),
48  _lowlev(iConfig.getUntrackedParameter<unsigned int>("lowLevel", 20)),
49  _highlev(iConfig.getUntrackedParameter<unsigned int>("highLevel", 80)),
50  _nevlasers(iConfig.getUntrackedParameter<unsigned int>("nEventLaser", 600)),
51  _timebefmax(iConfig.getUntrackedParameter<unsigned int>("timeBefMax", 100)),
52  _timeaftmax(iConfig.getUntrackedParameter<unsigned int>("timeAftMax", 250)),
53  _cutwindow(iConfig.getUntrackedParameter<double>("cutWindow", 0.1)),
54  _nsamplesshape(iConfig.getUntrackedParameter<unsigned int>("nSamplesShape", 250)),
55  _presampleshape(iConfig.getUntrackedParameter<unsigned int>("nPresamplesShape", 50)),
56  _slide(iConfig.getUntrackedParameter<unsigned int>("nSlide", 100)),
57  _fedid(iConfig.getUntrackedParameter<int>("fedID", -999)),
58  _debug(iConfig.getUntrackedParameter<int>("debug", 0)),
59  resdir_(iConfig.getUntrackedParameter<std::string>("resDir")),
60  digiCollection_(iConfig.getParameter<std::string>("digiCollection")),
61  digiProducer_(iConfig.getParameter<std::string>("digiProducer")),
62  eventHeaderCollection_(iConfig.getParameter<std::string>("eventHeaderCollection")),
63  eventHeaderProducer_(iConfig.getParameter<std::string>("eventHeaderProducer")),
64  pmatToken_(consumes<EcalMatacqDigiCollection>(edm::InputTag(digiProducer_, digiCollection_))),
65  dccToken_(consumes<EcalRawDataCollection>(edm::InputTag(eventHeaderProducer_, eventHeaderCollection_))),
66  nSides(NSIDES),
67  lightside(0),
68  runType(-1),
69  runNum(0),
70  event(0),
71  color(-1),
72  maxsamp(0),
73  nsamples(0),
74  tt(0)
75 
76 //========================================================================
77 {
78  //now do what ever initialization is needed
79 }
80 
81 //========================================================================
83  //========================================================================
84 
85  // Define temporary file name
86 
87  sampfile = resdir_;
88  sampfile += "/TmpTreeMatacqAnalyzer.root";
89 
90  sampFile = new TFile(sampfile.c_str(), "RECREATE");
91 
92  // declaration of the tree to fill
93 
94  tree = new TTree("MatacqTree", "MatacqTree");
95 
96  //List of branches
97 
98  tree->Branch("event", &event, "event/I");
99  tree->Branch("color", &color, "color/I");
100  tree->Branch("matacq", &matacq, "matacq[2560]/D");
101  tree->Branch("nsamples", &nsamples, "nsamples/I");
102  tree->Branch("maxsamp", &maxsamp, "maxsamp/I");
103  tree->Branch("tt", &tt, "tt/D");
104  tree->Branch("lightside", &lightside, "lightside/I");
105 
106  tree->SetBranchAddress("event", &event);
107  tree->SetBranchAddress("color", &color);
108  tree->SetBranchAddress("matacq", matacq);
109  tree->SetBranchAddress("nsamples", &nsamples);
110  tree->SetBranchAddress("maxsamp", &maxsamp);
111  tree->SetBranchAddress("tt", &tt);
112  tree->SetBranchAddress("lightside", &lightside);
113 
114  // Define output results files' names
115 
116  std::stringstream namefile;
117  namefile << resdir_ << "/MATACQ.root";
118  outfile = namefile.str();
119 
120  // Laser events counter
121  laserEvents = 0;
122  isThereMatacq = false;
123 }
124 
125 //========================================================================
127  //========================================================================
128 
129  ++iEvent;
130 
131  if (_debug == 1)
132  edm::LogVerbatim("EcalMatacqAnalyzzer") << "-- debug test -- Entering Analyze -- event= " << iEvent;
133 
134  // retrieving MATACQ :
135  const edm::Handle<EcalMatacqDigiCollection>& pmatacqDigi = e.getHandle(pmatToken_);
136  const EcalMatacqDigiCollection* matacqDigi = (pmatacqDigi.isValid()) ? pmatacqDigi.product() : nullptr;
137  if (pmatacqDigi.isValid()) {
138  if (_debug == 1)
139  edm::LogVerbatim("EcalMatacqAnalyzzer") << "-- debug test -- Matacq Digis Found -- ";
140  } else {
141  edm::LogError("EcalMatacqAnalyzzer") << "Error! can't get the product EcalMatacqDigi producer:"
142  << digiProducer_.c_str() << " collection:" << digiCollection_.c_str();
143  return;
144  }
145 
146  // retrieving DCC header
147 
148  const edm::Handle<EcalRawDataCollection>& pDCCHeader = e.getHandle(dccToken_);
149  const EcalRawDataCollection* DCCHeader = (pDCCHeader.isValid()) ? pDCCHeader.product() : nullptr;
150  if (!pDCCHeader.isValid()) {
151  edm::LogError("EcalMatacqAnalyzzer") << "Error! can't get the product EcalRawData producer:"
152  << eventHeaderProducer_.c_str()
153  << " collection:" << eventHeaderCollection_.c_str();
154  return;
155  }
156 
157  // ====================================
158  // Decode Basic DCCHeader Information
159  // ====================================
160 
161  if (_debug == 1)
162  edm::LogVerbatim("EcalMatacqAnalyzzer") << "-- debug test -- Before header -- ";
163 
164  for (EcalRawDataCollection::const_iterator headerItr = DCCHeader->begin(); headerItr != DCCHeader->end();
165  ++headerItr) {
166  EcalDCCHeaderBlock::EcalDCCEventSettings settings = headerItr->getEventSettings();
167  color = (int)settings.wavelength;
168  if (color < 0)
169  return;
170 
171  // Get run type and run number
172 
173  int fed = headerItr->fedId();
174 
175  if (fed != _fedid && _fedid != -999)
176  continue;
177 
178  runType = headerItr->getRunType();
179  runNum = headerItr->getRunNumber();
180  event = headerItr->getLV1();
181 
182  if (_debug == 1)
183  edm::LogVerbatim("EcalMatacqAnalyzzer")
184  << "-- debug test -- runtype:" << runType << " event:" << event << " runNum:" << runNum;
185 
186  dccID = headerItr->getDccInTCCCommand();
187  fedID = headerItr->fedId();
188  lightside = headerItr->getRtHalf();
189 
190  //assert (lightside<2 && lightside>=0);
191 
192  if (lightside != 1 && lightside != 0) {
193  edm::LogVerbatim("EcalMatacqAnalyzzer") << "Unexpected lightside: " << lightside << " for event " << iEvent;
194  return;
195  }
196  if (_debug == 1) {
197  edm::LogVerbatim("EcalMatacqAnalyzzer")
198  << "-- debug test -- Inside header before fed cut -- color=" << color << ", dcc=" << dccID
199  << ", fed=" << fedID << ", lightside=" << lightside << ", runType=" << runType;
200  }
201 
202  // take event only if the fed corresponds to the DCC in TCC
203  if (600 + dccID != fedID)
204  continue;
205 
206  if (_debug == 1) {
207  edm::LogVerbatim("EcalMatacqAnalyzzer")
208  << "-- debug test -- Inside header after fed cut -- color=" << color << ", dcc=" << dccID << ", fed=" << fedID
209  << ", lightside=" << lightside << ", runType=" << runType;
210  }
211 
212  // Cut on runType
213 
216  return;
217 
218  std::vector<int>::iterator iter = find(colors.begin(), colors.end(), color);
219  if (iter == colors.end()) {
220  colors.push_back(color);
221  edm::LogVerbatim("EcalMatacqAnalyzzer") << " new color found " << color << " " << colors.size();
222  }
223  }
224 
225  if (_debug == 1)
226  edm::LogVerbatim("EcalMatacqAnalyzzer") << "-- debug test -- Before digis -- Event:" << iEvent;
227 
228  // Count laser events
229  laserEvents++;
230 
231  // ===========================
232  // Decode Matacq Information
233  // ===========================
234 
235  double max = 0;
236 
237  for (EcalMatacqDigiCollection::const_iterator it = matacqDigi->begin(); it != matacqDigi->end();
238  ++it) { // Loop on matacq channel
239 
240  //
241  const EcalMatacqDigi& digis = *it;
242 
243  if (_debug == 1) {
244  edm::LogVerbatim("EcalMatacqAnalyzzer") << "-- debug test -- Inside digis -- digi size=" << digis.size();
245  }
246 
247  if (digis.size() == 0)
248  continue;
249  else
250  isThereMatacq = true;
251 
252  max = 0;
253  maxsamp = 0;
254  nsamples = digis.size();
255  tt = digis.tTrig();
256 
257  for (int i = 0; i < digis.size(); ++i) { // Loop on matacq samples
258  matacq[i] = -digis.adcCount(i);
259  if (matacq[i] > max) {
260  max = matacq[i];
261  maxsamp = i;
262  }
263  }
264  if (_debug == 1) {
265  edm::LogVerbatim("EcalMatacqAnalyzzer")
266  << "-- debug test -- Inside digis -- nsamples=" << nsamples << ", max=" << max;
267  }
268  }
269 
270  if (_debug == 1)
271  edm::LogVerbatim("EcalMatacqAnalyzzer") << "-- debug test -- After digis -- Event: " << iEvent;
272  tree->Fill();
273 
274 } // analyze
275 
276 //========================================================================
278  // Don't do anything if there is no events
279  if (!isThereMatacq) {
280  edm::LogVerbatim("EcalMatacqAnalyzzer") << "\n\t+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+";
281  edm::LogVerbatim("EcalMatacqAnalyzzer") << "\t+=+ WARNING! NO MATACQ +=+";
282  edm::LogVerbatim("EcalMatacqAnalyzzer") << "\t+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+";
283 
284  // Remove temporary file
285  FILE* test;
286  test = fopen(sampfile.c_str(), "r");
287  if (test) {
288  std::stringstream del2;
289  del2 << "rm " << sampfile;
290  system(del2.str().c_str());
291  }
292  return;
293  }
294 
295  assert(colors.size() <= nColor);
296  unsigned int nCol = colors.size();
297 
298  for (unsigned int iCol = 0; iCol < nCol; iCol++) {
299  for (unsigned int iSide = 0; iSide < nSide; iSide++) {
300  MTQ[iCol][iSide] = new TMTQ();
301  }
302  }
303 
304  outFile = new TFile(outfile.c_str(), "RECREATE");
305 
306  TProfile* shapeMat = new TProfile("shapeLaser", "shapeLaser", _nsamplesshape, -0.5, double(_nsamplesshape) - 0.5);
307  TProfile* shapeMatTmp = new TProfile(
308  "shapeLaserTmp", "shapeLaserTmp", _timeaftmax + _timebefmax, -0.5, double(_timeaftmax + _timebefmax) - 0.5);
309 
310  edm::LogVerbatim("EcalMatacqAnalyzzer") << "\n\t+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+";
311  edm::LogVerbatim("EcalMatacqAnalyzzer") << "\t+=+ Analyzing MATACQ data +=+";
312 
313  //
314  // create output ntuple
315  //
316 
317  mtqShape = new TTree("MatacqShape", "MatacqShape");
318 
319  // list of branches
320  // keep Patrice's notations
321 
322  mtqShape->Branch("event", &event, "event/I");
323  mtqShape->Branch("color", &color, "color/I");
324  mtqShape->Branch("status", &status, "status/I");
325  mtqShape->Branch("peak", &peak, "peak/D");
326  mtqShape->Branch("sigma", &sigma, "sigma/D");
327  mtqShape->Branch("fit", &fit, "fit/D");
328  mtqShape->Branch("ampl", &ampl, "ampl/D");
329  mtqShape->Branch("trise", &trise, "trise/D");
330  mtqShape->Branch("fwhm", &fwhm, "fwhm/D");
331  mtqShape->Branch("fw20", &fw20, "fw20/D");
332  mtqShape->Branch("fw80", &fw80, "fw80/D");
333  mtqShape->Branch("ped", &ped, "ped/D");
334  mtqShape->Branch("pedsig", &pedsig, "pedsig/D");
335  mtqShape->Branch("ttrig", &ttrig, "ttrig/D");
336  mtqShape->Branch("sliding", &sliding, "sliding/D");
337 
338  mtqShape->SetBranchAddress("event", &event);
339  mtqShape->SetBranchAddress("color", &color);
340  mtqShape->SetBranchAddress("status", &status);
341  mtqShape->SetBranchAddress("peak", &peak);
342  mtqShape->SetBranchAddress("sigma", &sigma);
343  mtqShape->SetBranchAddress("fit", &fit);
344  mtqShape->SetBranchAddress("ampl", &ampl);
345  mtqShape->SetBranchAddress("fwhm", &fwhm);
346  mtqShape->SetBranchAddress("fw20", &fw20);
347  mtqShape->SetBranchAddress("fw80", &fw80);
348  mtqShape->SetBranchAddress("trise", &trise);
349  mtqShape->SetBranchAddress("ped", &ped);
350  mtqShape->SetBranchAddress("pedsig", &pedsig);
351  mtqShape->SetBranchAddress("ttrig", &ttrig);
352  mtqShape->SetBranchAddress("sliding", &sliding);
353 
354  unsigned int endsample;
355  unsigned int presample;
356 
357  // loop over the entries of the tree
358  TChain* fChain = (TChain*)tree;
359  Long64_t nentries = fChain->GetEntriesFast();
360 
361  for (Long64_t jentry = 0; jentry < nentries; jentry++) {
362  // load the event
363  Long64_t ientry = fChain->LoadTree(jentry);
364  if (ientry < 0)
365  break;
366  fChain->GetEntry(jentry);
367 
368  status = 0;
369  peak = -1;
370  sigma = 0;
371  fit = -1;
372  ampl = -1;
373  trise = -1;
374  ttrig = tt;
375  fwhm = 0;
376  fw20 = 0;
377  fw80 = 0;
378  ped = 0;
379  pedsig = 0;
380  sliding = 0;
381 
382  if (_debug == 1)
383  edm::LogVerbatim("EcalMatacqAnalyzzer")
384  << "-- debug test -- inside loop 1 -- jentry:" << jentry << " over nentries=" << nentries;
385 
386  // create the object for Matacq data analysis
387 
388  endsample = maxsamp + _nsamplesaftmax;
389  presample = int(_presample * nsamples / 100.);
390  TMatacq* mtq = new TMatacq(nsamples,
391  presample,
392  endsample,
393  _noiseCut,
396  _thres,
397  _lowlev,
398  _highlev,
399  _nevlasers,
400  _slide);
401 
402  if (_debug == 1)
403  edm::LogVerbatim("EcalMatacqAnalyzzer") << "-- debug test -- inside loop 2 -- ";
404 
405  // analyse the Matacq data
406  if (mtq->rawPulseAnalysis(nsamples, &matacq[0]) == 0) {
407  status = 1;
408  ped = mtq->getBaseLine();
409  pedsig = mtq->getsigBaseLine();
410 
411  if (_debug == 1)
412  edm::LogVerbatim("EcalMatacqAnalyzzer") << "-- debug test -- inside loop 3 -- ped:" << ped;
413  if (mtq->findPeak() == 0) {
414  peak = mtq->getTimpeak();
415  sigma = mtq->getsigTimpeak();
416  }
417  if (_debug == 1)
418  edm::LogVerbatim("EcalMatacqAnalyzzer") << "-- debug test -- inside loop 4 -- peak:" << peak;
419  if (mtq->doFit() == 0) {
420  fit = mtq->getTimax();
421  ampl = mtq->getAmpl();
422  fwhm = mtq->getFwhm();
423  fw20 = mtq->getWidth20();
424  fw80 = mtq->getWidth80();
425  sliding = mtq->getSlide();
426  }
427  if (_debug == 1)
428  edm::LogVerbatim("EcalMatacqAnalyzzer") << "-- debug test -- inside loop 4 -- ampl:" << ampl;
429  if (mtq->compute_trise() == 0) {
430  trise = mtq->getTrise();
431  }
432  if (_debug == 1)
433  edm::LogVerbatim("EcalMatacqAnalyzzer") << "-- debug test -- inside loop 5 -- trise:" << trise;
434  }
435 
436  if (_debug == 1)
437  edm::LogVerbatim("EcalMatacqAnalyzzer") << "-- debug test -- inside loop 6 -- status:" << status;
438 
439  if (status == 1 && mtq->findPeak() == 0) {
440  int firstS = int(peak - double(_timebefmax));
441  int lastS = int(peak + double(_timeaftmax));
442 
443  // Fill histo if there are enough samples
444  if (_debug == 1)
445  edm::LogVerbatim("EcalMatacqAnalyzzer")
446  << "-- debug test -- inside loop 7 -- firstS:" << firstS << ", nsamples:" << nsamples;
447 
448  if (firstS >= 0 && lastS <= nsamples) {
449  for (int i = firstS; i < lastS; i++) {
450  shapeMatTmp->Fill(double(i) - firstS, matacq[i]);
451  }
452 
453  } else { // else extrapolate
454 
455  int firstSBis;
456 
457  if (firstS < 0) { // fill first bins with 0
458 
459  double thisped;
460  thisped = (matacq[0] + matacq[1] + matacq[2] + matacq[4] + matacq[5]) / 5.0;
461 
462  for (int i = firstS; i < 0; i++) {
463  shapeMatTmp->Fill(double(i) - firstS, thisped);
464  }
465  firstSBis = 0;
466 
467  } else {
468  firstSBis = firstS;
469  }
470 
471  if (lastS > nsamples) {
472  for (int i = firstSBis; i < int(nsamples); i++) {
473  shapeMatTmp->Fill(double(i) - firstS, matacq[i]);
474  }
475 
476  //extrapolate with expo tail
477 
478  double expb = 0.998;
479  double matacqval = expb * matacq[nsamples - 1];
480 
481  for (int i = nsamples; i < lastS; i++) {
482  shapeMatTmp->Fill(double(i) - firstS, matacqval);
483  matacqval *= expb;
484  }
485 
486  } else {
487  for (int i = firstSBis; i < lastS; i++) {
488  shapeMatTmp->Fill(double(i) - firstS, matacq[i]);
489  }
490  }
491  }
492  }
493  if (_debug == 1)
494  edm::LogVerbatim("EcalMatacqAnalyzzer") << "-- debug test -- inside loop 8";
495 
496  // get back color
497 
498  int iCol = nCol;
499  for (unsigned int i = 0; i < nCol; i++) {
500  if (color == colors[i]) {
501  iCol = i;
502  i = nCol;
503  }
504  }
505  if (_debug == 1)
506  edm::LogVerbatim("EcalMatacqAnalyzzer")
507  << "-- debug test -- inside loop 8bis color:" << color << " iCol:" << iCol << " nCol:" << nCol;
508 
509  // fill TMTQ
510 
511  if (status == 1 && mtq->findPeak() == 0 && mtq->doFit() == 0 && mtq->compute_trise() == 0)
512  MTQ[iCol][lightside]->addEntry(peak, sigma, fit, ampl, trise, fwhm, fw20, fw80, ped, pedsig, sliding);
513 
514  // fill the output tree
515 
516  if (_debug == 1)
517  edm::LogVerbatim("EcalMatacqAnalyzzer") << "-- debug test -- inside loop 9";
518  mtqShape->Fill();
519 
520  // clean up
521  delete mtq;
522  }
523 
524  if (_debug == 1)
525  edm::LogVerbatim("EcalMatacqAnalyzzer") << "-- debug test -- after loop ";
526  sampFile->Close();
527 
528  double Peak[6], Sigma[6], Fit[6], Ampl[6], Trise[6], Fwhm[6], Fw20[6], Fw80[6], Ped[6], Pedsig[6], Sliding[6];
529  int Side;
530 
531  for (unsigned int iColor = 0; iColor < nCol; iColor++) {
532  std::stringstream nametree;
533  nametree << "MatacqCol" << colors[iColor];
534  meanTree[iColor] = new TTree(nametree.str().c_str(), nametree.str().c_str());
535  meanTree[iColor]->Branch("side", &Side, "Side/I");
536  meanTree[iColor]->Branch("peak", &Peak, "Peak[6]/D");
537  meanTree[iColor]->Branch("sigma", &Sigma, "Sigma[6]/D");
538  meanTree[iColor]->Branch("fit", &Fit, "Fit[6]/D");
539  meanTree[iColor]->Branch("ampl", &Ampl, "Ampl[6]/D");
540  meanTree[iColor]->Branch("trise", &Trise, "Trise[6]/D");
541  meanTree[iColor]->Branch("fwhm", &Fwhm, "Fwhm[6]/D");
542  meanTree[iColor]->Branch("fw20", &Fw20, "Fw20[6]/D");
543  meanTree[iColor]->Branch("fw80", &Fw80, "Fw80[6]/D");
544  meanTree[iColor]->Branch("ped", &Ped, "Ped[6]/D");
545  meanTree[iColor]->Branch("pedsig", &Pedsig, "Pedsig[6]/D");
546  meanTree[iColor]->Branch("sliding", &Sliding, "Sliding[6]/D");
547 
548  meanTree[iColor]->SetBranchAddress("side", &Side);
549  meanTree[iColor]->SetBranchAddress("peak", Peak);
550  meanTree[iColor]->SetBranchAddress("sigma", Sigma);
551  meanTree[iColor]->SetBranchAddress("fit", Fit);
552  meanTree[iColor]->SetBranchAddress("ampl", Ampl);
553  meanTree[iColor]->SetBranchAddress("fwhm", Fwhm);
554  meanTree[iColor]->SetBranchAddress("fw20", Fw20);
555  meanTree[iColor]->SetBranchAddress("fw80", Fw80);
556  meanTree[iColor]->SetBranchAddress("trise", Trise);
557  meanTree[iColor]->SetBranchAddress("ped", Ped);
558  meanTree[iColor]->SetBranchAddress("pedsig", Pedsig);
559  meanTree[iColor]->SetBranchAddress("sliding", Sliding);
560  }
561 
562  for (unsigned int iCol = 0; iCol < nCol; iCol++) {
563  for (unsigned int iSide = 0; iSide < nSides; iSide++) {
564  Side = iSide;
565  std::vector<double> val[TMTQ::nOutVar];
566 
567  for (int iVar = 0; iVar < TMTQ::nOutVar; iVar++) {
568  val[iVar] = MTQ[iCol][iSide]->get(iVar);
569 
570  for (unsigned int i = 0; i < val[iVar].size(); i++) {
571  switch (iVar) {
572  case TMTQ::iPeak:
573  Peak[i] = val[iVar].at(i);
574  break;
575  case TMTQ::iSigma:
576  Sigma[i] = val[iVar].at(i);
577  break;
578  case TMTQ::iFit:
579  Fit[i] = val[iVar].at(i);
580  break;
581  case TMTQ::iAmpl:
582  Ampl[i] = val[iVar].at(i);
583  break;
584  case TMTQ::iFwhm:
585  Fwhm[i] = val[iVar].at(i);
586  break;
587  case TMTQ::iFw20:
588  Fw20[i] = val[iVar].at(i);
589  break;
590  case TMTQ::iFw80:
591  Fw80[i] = val[iVar].at(i);
592  break;
593  case TMTQ::iTrise:
594  Trise[i] = val[iVar].at(i);
595  break;
596  case TMTQ::iPed:
597  Ped[i] = val[iVar].at(i);
598  break;
599  case TMTQ::iPedsig:
600  Pedsig[i] = val[iVar].at(i);
601  break;
602  case TMTQ::iSlide:
603  Sliding[i] = val[iVar].at(i);
604  break;
605  }
606  }
607  }
608  meanTree[iCol]->Fill();
609  if (_debug == 1)
610  edm::LogVerbatim("EcalMatacqAnalyzzer") << "-- debug test -- inside final loop ";
611  }
612  }
613 
614  // Calculate maximum with pol 2
615 
616  int im = shapeMatTmp->GetMaximumBin();
617  double q1 = shapeMatTmp->GetBinContent(im - 1);
618  double q2 = shapeMatTmp->GetBinContent(im);
619  double q3 = shapeMatTmp->GetBinContent(im + 1);
620 
621  double a2 = (q3 + q1) / 2.0 - q2;
622  double a1 = q2 - q1 + a2 * (1 - 2 * im);
623  double a0 = q2 - a1 * im - a2 * im * im;
624 
625  double am = a0 - a1 * a1 / (4 * a2);
626 
627  // Compute pedestal
628 
629  double bl = 0;
630  for (unsigned int i = 1; i < _presampleshape + 1; i++) {
631  bl += shapeMatTmp->GetBinContent(i);
632  }
633  bl /= _presampleshape;
634 
635  // Compute and save laser shape
636 
637  if (_debug == 1)
638  edm::LogVerbatim("EcalMatacqAnalyzzer") << "-- debug test -- computing shape ";
639 
640  int firstBin = 0;
641  double height = 0.0;
642 
643  for (unsigned int i = _timebefmax; i > _presampleshape; i--) {
644  height = shapeMatTmp->GetBinContent(i) - bl;
645 
646  if (height < (am - bl) * _cutwindow) {
647  firstBin = i;
648  i = _presampleshape;
649  }
650  }
651 
652  unsigned int lastBin = firstBin + _nsamplesshape;
653 
654  for (unsigned int i = firstBin; i < lastBin; i++) {
655  shapeMat->Fill(i - firstBin, shapeMatTmp->GetBinContent(i) - bl);
656  }
657 
658  mtqShape->Write();
659  for (unsigned int iColor = 0; iColor < nCol; iColor++) {
660  meanTree[iColor]->Write();
661  }
662  if (_debug == 1)
663  edm::LogVerbatim("EcalMatacqAnalyzzer") << "-- debug test -- writing ";
664  shapeMat->Write();
665 
666  // close the output file
667  outFile->Close();
668 
669  // Remove temporary file
670  FILE* test;
671  test = fopen(sampfile.c_str(), "r");
672  if (test) {
673  std::stringstream del2;
674  del2 << "rm " << sampfile;
675  system(del2.str().c_str());
676  }
677 
678  edm::LogVerbatim("EcalMatacqAnalyzzer") << "\t+=+ .................... done +=+";
679  edm::LogVerbatim("EcalMatacqAnalyzzer") << "\t+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+";
680 }
681 
double getWidth80()
Definition: TMatacq.h:74
Log< level::Info, true > LogVerbatim
Definition: TMTQ.h:8
const unsigned int _timeaftmax
const unsigned int _thres
#define NSIDES
EcalMatacqAnalyzer(const edm::ParameterSet &iConfig)
const unsigned int _slide
void beginJob() override
const unsigned int _lowlev
const std::string digiCollection_
T const * product() const
Definition: Handle.h:70
const unsigned int _presampleshape
std::vector< T >::const_iterator const_iterator
int compute_trise()
Definition: TMatacq.cc:347
double getTimax()
Definition: TMatacq.h:69
TMTQ * MTQ[nColor][nSide]
Log< level::Error, false > LogError
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
assert(be >=bs)
double getBaseLine()
Definition: TMatacq.h:62
const std::string resdir_
double getsigBaseLine()
Definition: TMatacq.h:63
float adcCount(const int &i) const
const std::string eventHeaderCollection_
double getFwhm()
Definition: TMatacq.h:72
TTree * meanTree[nColor]
double getsigTimpeak()
Definition: TMatacq.h:66
int iEvent
Definition: GenABIO.cc:224
Definition: TTTypes.h:54
void analyze(const edm::Event &e, const edm::EventSetup &c) override
const unsigned int _nevlasers
double getSlide()
Definition: TMatacq.h:75
Definition: Fit.h:32
std::vector< double > get(int)
Definition: TMTQ.cc:69
int doFit()
Definition: TMatacq.cc:213
double getAmpl()
Definition: TMatacq.h:68
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
const_iterator begin() const
int rawPulseAnalysis(Int_t, Double_t *)
Definition: TMatacq.cc:57
float tTrig() const
const unsigned int _timebefmax
const_iterator end() const
const std::string eventHeaderProducer_
double getWidth20()
Definition: TMatacq.h:73
int findPeak()
Definition: TMatacq.cc:136
const unsigned int _parabnbefmax
const edm::EDGetTokenT< EcalMatacqDigiCollection > pmatToken_
static constexpr float a0
const std::string digiProducer_
double getTrise()
Definition: TMatacq.h:71
const unsigned int _nsamplesaftmax
bool isValid() const
Definition: HandleBase.h:70
HLT enums.
Definition: colors.py:1
int size() const
Definition: TMatacq.h:6
const unsigned int _nsamplesshape
Definition: tree.py:1
const unsigned int _noiseCut
const edm::EDGetTokenT< EcalRawDataCollection > dccToken_
void endJob() override
const unsigned int _highlev
const unsigned int _parabnaftmax
Definition: event.py:1
double getTimpeak()
Definition: TMatacq.h:65