CMS 3D CMS Logo

DTNoiseComputation.cc
Go to the documentation of this file.
1 /*
2  * See header file for a description of this class.
3  *
4  * \author G. Mila - INFN Torino
5  */
6 
9 
10 // Framework
16 
17 // Geometry
22 
23 // Digis
28 
29 #include "TH1F.h"
30 #include "TH2F.h"
31 #include "TFile.h"
32 #include "TF1.h"
33 #include "TProfile.h"
34 #include "TPostScript.h"
35 #include "TCanvas.h"
36 #include "TLegend.h"
37 
38 using namespace edm;
39 using namespace std;
40 
42  cout << "[DTNoiseComputation]: Constructor" << endl;
43 
44  // Get the debug parameter for verbose output
45  debug = ps.getUntrackedParameter<bool>("debug");
46 
47  // The analysis type
48  fastAnalysis = ps.getUntrackedParameter<bool>("fastAnalysis", true);
49 
50  // The root file which contain the histos
51  string rootFileName = ps.getUntrackedParameter<string>("rootFileName");
52  theFile = new TFile(rootFileName.c_str(), "READ");
53 
54  // The new root file which contain the histos
55  string newRootFileName = ps.getUntrackedParameter<string>("newRootFileName");
56  theNewFile = new TFile(newRootFileName.c_str(), "RECREATE");
57 
58  // The maximum number of events to analyze
59  MaxEvents = ps.getUntrackedParameter<int>("MaxEvents");
60 }
61 
63  // Get the DT Geometry
64  dtGeom = setup.getHandle(dtGeomToken_);
65 
66  static int count = 0;
67 
68  if (count == 0) {
69  string CheckHistoName;
70 
71  TH1F *hOccHisto;
72  TH1F *hAverageNoiseHisto;
73  TH1F *hAverageNoiseIntegratedHisto;
74  TH1F *hAverageNoiseHistoPerCh;
75  TH1F *hAverageNoiseIntegratedHistoPerCh;
76  TH2F *hEvtHisto;
77  string HistoName;
78  string Histo2Name;
79  string AverageNoiseName;
80  string AverageNoiseIntegratedName;
81  string AverageNoiseNamePerCh;
82  string AverageNoiseIntegratedNamePerCh;
83  TH1F *hnoisyC;
84  TH1F *hsomeHowNoisyC;
85 
86  // Loop over all the chambers
87  vector<const DTChamber *>::const_iterator ch_it = dtGeom->chambers().begin();
88  vector<const DTChamber *>::const_iterator ch_end = dtGeom->chambers().end();
89  // Loop over the SLs
90  for (; ch_it != ch_end; ++ch_it) {
91  DTChamberId ch = (*ch_it)->id();
92  vector<const DTSuperLayer *>::const_iterator sl_it = (*ch_it)->superLayers().begin();
93  vector<const DTSuperLayer *>::const_iterator sl_end = (*ch_it)->superLayers().end();
94  // Loop over the SLs
95  for (; sl_it != sl_end; ++sl_it) {
96  // DTSuperLayerId sl = (*sl_it)->id();
97  vector<const DTLayer *>::const_iterator l_it = (*sl_it)->layers().begin();
98  vector<const DTLayer *>::const_iterator l_end = (*sl_it)->layers().end();
99  // Loop over the Ls
100  for (; l_it != l_end; ++l_it) {
101  DTLayerId dtLId = (*l_it)->id();
102 
103  //check if the layer has digi
104  theFile->cd();
105  CheckHistoName = "DigiOccupancy_" + getLayerName(dtLId);
106  TH1F *hCheckHisto = (TH1F *)theFile->Get(CheckHistoName.c_str());
107  if (hCheckHisto) {
108  delete hCheckHisto;
109  string wheel = std::to_string(ch.wheel());
110  string station = std::to_string(ch.station());
111 
112  if (someHowNoisyC.find(make_pair(ch.wheel(), ch.station())) == someHowNoisyC.end()) {
113  TString histoName_someHowNoisy = "somehowNoisyCell_W" + wheel + "_St" + station;
114  hsomeHowNoisyC =
115  new TH1F(histoName_someHowNoisy, histoName_someHowNoisy, getMaxNumBins(ch), 1, getMaxNumBins(ch) + 1);
116  someHowNoisyC[make_pair(ch.wheel(), ch.station())] = hsomeHowNoisyC;
117  }
118 
119  if (noisyC.find(make_pair(ch.wheel(), ch.station())) == noisyC.end()) {
120  TString histoName_noisy = "noisyCell_W" + wheel + "_St" + station;
121  hnoisyC = new TH1F(histoName_noisy, histoName_noisy, getMaxNumBins(ch), 1, getMaxNumBins(ch) + 1);
122  noisyC[make_pair(ch.wheel(), ch.station())] = hnoisyC;
123  }
124 
125  //to fill a map with the average noise per wire and fill new noise histo
126  if (AvNoisePerSuperLayer.find(dtLId.superlayerId()) == AvNoisePerSuperLayer.end()) {
127  AverageNoiseName = "AverageNoise_" + getSuperLayerName(dtLId.superlayerId());
128  hAverageNoiseHisto = new TH1F(AverageNoiseName.c_str(), AverageNoiseName.c_str(), 200, 0, 10000);
129  AverageNoiseIntegratedName = "AverageNoiseIntegrated_" + getSuperLayerName(dtLId.superlayerId());
130  hAverageNoiseIntegratedHisto =
131  new TH1F(AverageNoiseIntegratedName.c_str(), AverageNoiseIntegratedName.c_str(), 200, 0, 10000);
132  AvNoisePerSuperLayer[dtLId.superlayerId()] = hAverageNoiseHisto;
133  AvNoiseIntegratedPerSuperLayer[dtLId.superlayerId()] = hAverageNoiseIntegratedHisto;
134  if (debug) {
135  cout << " New Average Noise Histo per SuperLayer : " << hAverageNoiseHisto->GetName() << endl;
136  cout << " New Average Noise Integrated Histo per SuperLayer : " << hAverageNoiseHisto->GetName()
137  << endl;
138  }
139  }
140  if (AvNoisePerChamber.find(dtLId.superlayerId().chamberId()) == AvNoisePerChamber.end()) {
141  AverageNoiseNamePerCh = "AverageNoise_" + getChamberName(dtLId);
142  hAverageNoiseHistoPerCh =
143  new TH1F(AverageNoiseNamePerCh.c_str(), AverageNoiseNamePerCh.c_str(), 200, 0, 10000);
144  AverageNoiseIntegratedNamePerCh = "AverageNoiseIntegrated_" + getChamberName(dtLId);
145  hAverageNoiseIntegratedHistoPerCh = new TH1F(
146  AverageNoiseIntegratedNamePerCh.c_str(), AverageNoiseIntegratedNamePerCh.c_str(), 200, 0, 10000);
147  AvNoisePerChamber[dtLId.superlayerId().chamberId()] = hAverageNoiseHistoPerCh;
148  AvNoiseIntegratedPerChamber[dtLId.superlayerId().chamberId()] = hAverageNoiseIntegratedHistoPerCh;
149  if (debug)
150  cout << " New Average Noise Histo per chamber : " << hAverageNoiseHistoPerCh->GetName() << endl;
151  }
152 
153  HistoName = "DigiOccupancy_" + getLayerName(dtLId);
154  theFile->cd();
155  hOccHisto = (TH1F *)theFile->Get(HistoName.c_str());
156  int numBin = hOccHisto->GetXaxis()->GetNbins();
157  for (int bin = 1; bin <= numBin; bin++) {
158  DTWireId wireID(dtLId, bin);
159  theAverageNoise[wireID] = hOccHisto->GetBinContent(bin);
160  if (theAverageNoise[wireID] != 0) {
161  AvNoisePerSuperLayer[dtLId.superlayerId()]->Fill(theAverageNoise[wireID]);
162  AvNoisePerChamber[dtLId.superlayerId().chamberId()]->Fill(theAverageNoise[wireID]);
163  }
164  }
165 
166  //to compute the average noise per layer (excluding the noisy cells)
167  double numCell = 0;
168  double AvNoise = 0;
169  HistoName = "DigiOccupancy_" + getLayerName(dtLId);
170  theFile->cd();
171  hOccHisto = (TH1F *)theFile->Get(HistoName.c_str());
172  numBin = hOccHisto->GetXaxis()->GetNbins();
173  for (int bin = 1; bin <= numBin; bin++) {
174  DTWireId wireID(dtLId, bin);
175  theAverageNoise[wireID] = hOccHisto->GetBinContent(bin);
176  if (hOccHisto->GetBinContent(bin) < 100) {
177  numCell++;
178  AvNoise += hOccHisto->GetBinContent(bin);
179  }
180  if (hOccHisto->GetBinContent(bin) > 100 && hOccHisto->GetBinContent(bin) < 500) {
181  someHowNoisyC[make_pair(ch.wheel(), ch.station())]->Fill(bin);
182  cout << "filling somehow noisy cell" << endl;
183  }
184  if (hOccHisto->GetBinContent(bin) > 500) {
185  noisyC[make_pair(ch.wheel(), ch.station())]->Fill(bin);
186  cout << "filling noisy cell" << endl;
187  }
188  }
189  AvNoise = AvNoise / numCell;
190  cout << "theAverageNoise for layer " << getLayerName(dtLId) << " is : " << AvNoise << endl;
191 
192  // book the digi event plots every 1000 events
193  int updates = MaxEvents / 1000;
194  for (int evt = 0; evt < updates; evt++) {
195  Histo2Name = "DigiPerWirePerEvent_" + getLayerName(dtLId) + "_" + std::to_string(evt);
196  theFile->cd();
197  hEvtHisto = (TH2F *)theFile->Get(Histo2Name.c_str());
198  if (hEvtHisto) {
199  if (debug)
200  cout << " New Histo with the number of events per evt per wire: " << hEvtHisto->GetName() << endl;
201  theEvtMap[dtLId].push_back(hEvtHisto);
202  }
203  }
204 
205  } // done if the layer has digi
206  } // loop over layers
207  } // loop over superlayers
208  } // loop over chambers
209 
210  count++;
211  }
212 }
213 
215  cout << "[DTNoiseComputation] endjob called!" << endl;
216  TH1F *hEvtDistance = nullptr;
217  TF1 *ExpoFit = new TF1("ExpoFit", "expo", 0.5, 1000.5);
218  ExpoFit->SetMarkerColor(); //just silence gcc complaining about unused vars
219  TProfile *theNoiseHisto = new TProfile("theNoiseHisto", "Time Constant versus Average Noise", 100000, 0, 100000);
220 
221  //compute the time constant
222  for (map<DTLayerId, vector<TH2F *> >::const_iterator lHisto = theEvtMap.begin(); lHisto != theEvtMap.end();
223  ++lHisto) {
224  for (int bin = 1; bin < (*lHisto).second[0]->GetYaxis()->GetNbins(); bin++) {
225  int distanceEvt = 1;
226  DTWireId wire((*lHisto).first, bin);
227  for (int i = 0; i < int((*lHisto).second.size()); i++) {
228  for (int evt = 1; evt <= (*lHisto).second[i]->GetXaxis()->GetNbins(); evt++) {
229  if ((*lHisto).second[i]->GetBinContent(evt, bin) == 0)
230  distanceEvt++;
231  else {
232  if (toDel.find(wire) == toDel.end()) {
233  toDel[wire] = false;
234  string Histo = "EvtDistancePerWire_" + getLayerName((*lHisto).first) + "_" + std::to_string(bin);
235  hEvtDistance = new TH1F(Histo.c_str(), Histo.c_str(), 50000, 0.5, 50000.5);
236  }
237  hEvtDistance->Fill(distanceEvt);
238  distanceEvt = 1;
239  }
240  }
241  }
242  if (toDel.find(wire) != toDel.end()) {
243  theHistoEvtDistancePerWire[wire] = hEvtDistance;
244  theNewFile->cd();
245  theHistoEvtDistancePerWire[wire]->Fit("ExpoFit", "R");
246  TF1 *funct = theHistoEvtDistancePerWire[wire]->GetFunction("ExpoFit");
247  double par0 = funct->GetParameter(0);
248  double par1 = funct->GetParameter(1);
249  cout << "par0: " << par0 << " par1: " << par1 << endl;
250  double chi2rid = funct->GetChisquare() / funct->GetNDF();
251  if (chi2rid > 10)
252  theTimeConstant[wire] = 1;
253  else
254  theTimeConstant[wire] = par1;
255  toDel[wire] = true;
256  theHistoEvtDistancePerWire[wire]->Write();
257  delete hEvtDistance;
258  }
259  }
260  }
261 
262  if (!fastAnalysis) {
263  //fill the histo with the time constant as a function of the average noise
264  for (map<DTWireId, double>::const_iterator AvNoise = theAverageNoise.begin(); AvNoise != theAverageNoise.end();
265  ++AvNoise) {
266  DTWireId wire = (*AvNoise).first;
267  theNoiseHisto->Fill((*AvNoise).second, theTimeConstant[wire]);
268  cout << "Layer: " << getLayerName(wire.layerId()) << " wire: " << wire.wire() << endl;
269  cout << "The Average noise: " << (*AvNoise).second << endl;
270  cout << "The time constant: " << theTimeConstant[wire] << endl;
271  }
272  theNewFile->cd();
273  theNoiseHisto->Write();
274  }
275 
276  // histos with the integrated noise per layer
277  int numBin;
278  double integratedNoise, bin, halfBin, maxBin;
279  for (map<DTSuperLayerId, TH1F *>::const_iterator AvNoiseHisto = AvNoisePerSuperLayer.begin();
280  AvNoiseHisto != AvNoisePerSuperLayer.end();
281  ++AvNoiseHisto) {
282  integratedNoise = 0;
283  numBin = (*AvNoiseHisto).second->GetXaxis()->GetNbins();
284  maxBin = (*AvNoiseHisto).second->GetXaxis()->GetXmax();
285  bin = double(maxBin / numBin);
286  halfBin = double(bin / 2);
287  theNewFile->cd();
288  (*AvNoiseHisto).second->Write();
289  for (int i = 1; i < numBin; i++) {
290  integratedNoise += (*AvNoiseHisto).second->GetBinContent(i);
291  AvNoiseIntegratedPerSuperLayer[(*AvNoiseHisto).first]->Fill(halfBin, integratedNoise);
292  halfBin += bin;
293  }
294  theNewFile->cd();
295  AvNoiseIntegratedPerSuperLayer[(*AvNoiseHisto).first]->Write();
296  }
297  // histos with the integrated noise per chamber
298  for (map<DTChamberId, TH1F *>::const_iterator AvNoiseHisto = AvNoisePerChamber.begin();
299  AvNoiseHisto != AvNoisePerChamber.end();
300  ++AvNoiseHisto) {
301  integratedNoise = 0;
302  numBin = (*AvNoiseHisto).second->GetXaxis()->GetNbins();
303  maxBin = (*AvNoiseHisto).second->GetXaxis()->GetXmax();
304  bin = maxBin / numBin;
305  halfBin = bin / 2;
306  theNewFile->cd();
307  (*AvNoiseHisto).second->Write();
308  for (int i = 1; i < numBin; i++) {
309  integratedNoise += (*AvNoiseHisto).second->GetBinContent(i);
310  AvNoiseIntegratedPerChamber[(*AvNoiseHisto).first]->Fill(halfBin, integratedNoise);
311  halfBin += bin;
312  }
313  theNewFile->cd();
314  AvNoiseIntegratedPerChamber[(*AvNoiseHisto).first]->Write();
315  }
316 
317  //overimpose the average noise histo
318  bool histo = false;
319  vector<const DTChamber *>::const_iterator chamber_it = dtGeom->chambers().begin();
320  vector<const DTChamber *>::const_iterator chamber_end = dtGeom->chambers().end();
321  // Loop over the chambers
322  for (; chamber_it != chamber_end; ++chamber_it) {
323  vector<const DTSuperLayer *>::const_iterator sl_it = (*chamber_it)->superLayers().begin();
324  vector<const DTSuperLayer *>::const_iterator sl_end = (*chamber_it)->superLayers().end();
325  // Loop over the SLs
326  for (; sl_it != sl_end; ++sl_it) {
327  DTSuperLayerId sl = (*sl_it)->id();
328  vector<const DTLayer *>::const_iterator l_it = (*sl_it)->layers().begin();
329  vector<const DTLayer *>::const_iterator l_end = (*sl_it)->layers().end();
330 
331  string canvasName = "c" + getSuperLayerName(sl);
332  TCanvas c1(canvasName.c_str(), canvasName.c_str(), 600, 780);
333  TLegend *leg = new TLegend(0.5, 0.6, 0.7, 0.8);
334  for (; l_it != l_end; ++l_it) {
335  DTLayerId layerId = (*l_it)->id();
336  string HistoName = "DigiOccupancy_" + getLayerName(layerId);
337  theFile->cd();
338  TH1F *hOccHisto = (TH1F *)theFile->Get(HistoName.c_str());
339  if (hOccHisto) {
340  string TitleHisto = "AverageNoise_" + getSuperLayerName(sl);
341  cout << "TitleHisto : " << TitleHisto << endl;
342  hOccHisto->SetTitle(TitleHisto.c_str());
343  string legendHisto = "layer " + std::to_string(layerId.layer());
344  leg->AddEntry(hOccHisto, legendHisto.c_str(), "L");
345  hOccHisto->SetMaximum(getYMaximum(sl));
346  histo = true;
347  if (layerId.layer() == 1)
348  hOccHisto->Draw();
349  else
350  hOccHisto->Draw("same");
351  hOccHisto->SetLineColor(layerId.layer());
352  }
353  }
354  if (histo) {
355  leg->Draw("same");
356  theNewFile->cd();
357  c1.Write();
358  }
359  }
360  histo = false;
361  }
362 
363  //write on file the noisy plots
364  for (map<pair<int, int>, TH1F *>::const_iterator nCell = noisyC.begin(); nCell != noisyC.end(); ++nCell) {
365  theNewFile->cd();
366  (*nCell).second->Write();
367  }
368  for (map<pair<int, int>, TH1F *>::const_iterator somehownCell = someHowNoisyC.begin();
369  somehownCell != someHowNoisyC.end();
370  ++somehownCell) {
371  theNewFile->cd();
372  (*somehownCell).second->Write();
373  }
374 }
375 
377  theFile->Close();
378  theNewFile->Close();
379 }
380 
381 string DTNoiseComputation::getLayerName(const DTLayerId &lId) const {
382  const DTSuperLayerId dtSLId = lId.superlayerId();
383  const DTChamberId dtChId = dtSLId.chamberId();
384  string layerName = "W" + std::to_string(dtChId.wheel()) + "_St" + std::to_string(dtChId.station()) + "_Sec" +
385  std::to_string(dtChId.sector()) + "_SL" + std::to_string(dtSLId.superlayer()) + "_L" +
386  std::to_string(lId.layer());
387 
388  return layerName;
389 }
390 
392  const DTChamberId dtChId = dtSLId.chamberId();
393 
394  string superLayerName = "W" + std::to_string(dtChId.wheel()) + "_St" + std::to_string(dtChId.station()) + "_Sec" +
395  std::to_string(dtChId.sector()) + "_SL" + std::to_string(dtSLId.superlayer());
396 
397  return superLayerName;
398 }
399 
401  const DTSuperLayerId dtSLId = lId.superlayerId();
402  const DTChamberId dtChId = dtSLId.chamberId();
403  string chamberName = "W" + std::to_string(dtChId.wheel()) + "_St" + std::to_string(dtChId.station()) + "_Sec" +
404  std::to_string(dtChId.sector());
405 
406  return chamberName;
407 }
408 
410  int maximum = 0;
411 
412  for (int SL = 1; SL <= 3; SL++) {
413  if (!(chId.station() == 4 && SL == 2)) {
414  for (int L = 1; L <= 4; L++) {
415  DTLayerId layerId = DTLayerId(chId, SL, L);
416  string HistoName = "DigiOccupancy_" + getLayerName(layerId);
417  theFile->cd();
418  TH1F *hOccHisto = (TH1F *)theFile->Get(HistoName.c_str());
419  if (hOccHisto) {
420  if (hOccHisto->GetXaxis()->GetXmax() > maximum)
421  maximum = hOccHisto->GetXaxis()->GetNbins();
422  }
423  }
424  }
425  }
426  return maximum;
427 }
428 
430  double maximum = 0;
431  double dummy = pow(10., 10.);
432 
433  for (int L = 1; L <= 4; L++) {
434  DTLayerId layerId = DTLayerId(slId, L);
435  string HistoName = "DigiOccupancy_" + getLayerName(layerId);
436  theFile->cd();
437  TH1F *hOccHisto = (TH1F *)theFile->Get(HistoName.c_str());
438  if (hOccHisto) {
439  if (hOccHisto->GetMaximum(dummy) > maximum)
440  maximum = hOccHisto->GetMaximum(dummy);
441  }
442  }
443  return maximum;
444 }
DTNoiseComputation(const edm::ParameterSet &ps)
Constructor.
int station() const
Return the station number.
Definition: DTChamberId.h:42
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
Definition: Abs.h:5
edm::ESHandle< DTGeometry > dtGeom
std::string to_string(const V &value)
Definition: OMSAccess.h:77
std::map< DTLayerId, std::vector< TH2F * > > theEvtMap
constexpr unsigned int maxBin
int getMaxNumBins(const DTChamberId &chId) const
T getUntrackedParameter(std::string const &, T const &) const
std::map< DTWireId, TH1F * > theHistoEvtDistancePerWire
std::map< DTWireId, bool > toDel
DTChamberId chamberId() const
Return the corresponding ChamberId.
void endJob() override
Endjob.
void Fill(HcalDetId &id, double val, std::vector< TH2F > &depth)
std::string getLayerName(const DTLayerId &lId) const
Get the name of the layer.
std::map< std::pair< int, int >, TH1F * > noisyC
std::map< DTWireId, double > theAverageNoise
~DTNoiseComputation() override
Destructor.
std::map< DTChamberId, TH1F * > AvNoisePerChamber
int superlayer() const
Return the superlayer number (deprecated method name)
std::map< DTSuperLayerId, TH1F * > AvNoiseIntegratedPerSuperLayer
std::string HistoName
int layer() const
Return the layer number.
Definition: DTLayerId.h:42
std::map< std::pair< int, int >, TH1F * > someHowNoisyC
int wheel() const
Return the wheel number.
Definition: DTChamberId.h:39
HLT enums.
int sector() const
Definition: DTChamberId.h:49
std::map< DTSuperLayerId, TH1F * > AvNoisePerSuperLayer
std::map< DTWireId, double > theTimeConstant
DTSuperLayerId superlayerId() const
Return the corresponding SuperLayerId.
Definition: DTLayerId.h:45
const std::vector< const DTChamber * > & chambers() const
Return a vector of all Chamber.
Definition: DTGeometry.cc:84
std::string getChamberName(const DTLayerId &lId) const
Get the name of the chamber.
void beginRun(const edm::Run &, const edm::EventSetup &setup) override
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:29
const edm::ESGetToken< DTGeometry, MuonGeometryRecord > dtGeomToken_
Definition: Run.h:45
std::string getSuperLayerName(const DTSuperLayerId &slId) const
Get the name of the superLayer.
std::map< DTChamberId, TH1F * > AvNoiseIntegratedPerChamber
double getYMaximum(const DTSuperLayerId &slId) const