CMS 3D CMS Logo

DTNoiseTask.cc
Go to the documentation of this file.
1 
2 /*
3  * See header file for a description of this class.
4  *
5  * \authors G. Mila , G. Cerminara - INFN Torino
6  */
7 
8 #include "DTNoiseTask.h"
9 
10 // Framework
15 
17 
18 // Geometry
22 
23 // Digi
27 
28 // Database
30 
31 #include <sstream>
32 #include <string>
33 
34 using namespace edm;
35 using namespace std;
36 
38  : evtNumber(0),
39  muonGeomToken_(esConsumes<edm::Transition::BeginRun>()),
40  tTrigMapToken_(esConsumes<edm::Transition::BeginRun>()) {
41  LogVerbatim("DTNoiseTask") << "[DTNoiseTask]: Constructor" << endl;
42 
43  //switch for timeBox booking
44  doTimeBoxHistos = ps.getUntrackedParameter<bool>("doTbHistos", false);
45 
46  // The label to retrieve the digis
47  dtDigiToken_ = consumes<DTDigiCollection>(ps.getParameter<InputTag>("dtDigiLabel"));
48 
49  // the name of the 4D rec hits collection
50  recHits4DToken_ = consumes<DTRecSegment4DCollection>(edm::InputTag(ps.getParameter<string>("recHits4DLabel")));
51 
52  // switch for segment veto
53  doSegmentVeto = ps.getUntrackedParameter<bool>("doSegmentVeto", false);
54 
55  // safe margin (ns) between ttrig and beginning of counting area
56  safeMargin = ps.getUntrackedParameter<double>("safeMargin", 200.);
57 }
58 
60 
63  evtNumber++;
65 
66  if (evtNumber % 1000 == 0)
67  LogVerbatim("DTNoiseTask") << "[DTNoiseTask]: Analyzing evt number :" << evtNumber << endl;
68 
69  // map of the chambers with at least 1 segment
70  std::map<DTChamberId, int> segmentsChId;
71 
72  // Get the 4D segment collection from the event
74  if (doSegmentVeto) {
75  e.getByToken(recHits4DToken_, all4DSegments);
76 
77  // Loop over all chambers containing a segment and look for the number of segments
79  for (chamberId = all4DSegments->id_begin(); chamberId != all4DSegments->id_end(); ++chamberId) {
80  segmentsChId[*chamberId] = 1;
81  }
82  }
83 
84  // Get the digis from the event
86  e.getByToken(dtDigiToken_, dtdigis);
87 
88  // LOOP OVER ALL THE DIGIS OF THE EVENT
90  for (dtLayerId_It = dtdigis->begin(); dtLayerId_It != dtdigis->end(); ++dtLayerId_It) {
91  for (DTDigiCollection::const_iterator digiIt = ((*dtLayerId_It).second).first;
92  digiIt != ((*dtLayerId_It).second).second;
93  ++digiIt) {
94  //Check the TDC trigger width
95  int tdcTime = (*digiIt).countsTDC();
96  double upperLimit = tTrigStMap[(*dtLayerId_It).first.superlayerId().chamberId()] - safeMargin;
97  if (doTimeBoxHistos)
98  tbHistos[(*dtLayerId_It).first.superlayerId()]->Fill(tdcTime);
99  if (tdcTime > upperLimit)
100  continue;
101 
102  //Check the chamber has no 4D segments (optional)
103  if (doSegmentVeto && segmentsChId.find((*dtLayerId_It).first.superlayerId().chamberId()) != segmentsChId.end())
104  continue;
105 
106  // fill the occupancy histo
107  // FIXME: needs to be optimized: no need to rescale the histo for each digi
108  TH2F* noise_root = noiseHistos[(*dtLayerId_It).first.superlayerId().chamberId()]->getTH2F();
109  double normalization = 0;
110  if (mapEvt.find((*dtLayerId_It).first.superlayerId().chamberId()) != mapEvt.end()) {
111  LogVerbatim("DTNoiseTask") << " Last fill: # of events: "
112  << mapEvt[(*dtLayerId_It).first.superlayerId().chamberId()] << endl;
113  normalization = 1e-9 * upperLimit * mapEvt[(*dtLayerId_It).first.superlayerId().chamberId()];
114  // revert back to # of entries
115  noise_root->Scale(normalization);
116  }
117  int yBin = (*dtLayerId_It).first.layer() + (4 * ((*dtLayerId_It).first.superlayerId().superlayer() - 1));
118  noise_root->Fill((*digiIt).wire(), yBin);
119  // normalize the occupancy histo
120  mapEvt[(*dtLayerId_It).first.superlayerId().chamberId()] = evtNumber;
121  LogVerbatim("DTNoiseTask") << (*dtLayerId_It).first << " wire: " << (*digiIt).wire()
122  << " # counts: " << noise_root->GetBinContent((*digiIt).wire(), yBin)
123  << " Time interval: " << upperLimit << " # of events: " << evtNumber << endl;
124  ;
125  normalization = double(1e-9 * upperLimit * mapEvt[(*dtLayerId_It).first.superlayerId().chamberId()]);
126  // update the rate
127  noise_root->Scale(1. / normalization);
128  LogVerbatim("DTNoiseTask") << " noise rate: " << noise_root->GetBinContent((*digiIt).wire(), yBin) << endl;
129  }
130  }
131 }
132 
134  // set the folder
135  stringstream wheel;
136  wheel << chId.wheel();
137  stringstream station;
138  station << chId.station();
139  stringstream sector;
140  sector << chId.sector();
141 
142  ibooker.setCurrentFolder("DT/05-Noise/Wheel" + wheel.str() +
143  // "/Station" + station.str() +
144  "/Sector" + sector.str());
145 
146  // Build the histo name
147  string histoName = string("NoiseRate") + "_W" + wheel.str() + "_St" + station.str() + "_Sec" + sector.str();
148 
149  LogVerbatim("DTNoiseTask") << "[DTNoiseTask]: booking chamber histo:" << endl;
150  LogVerbatim("DTNoiseTask") << " folder "
151  << "DT/05-Noise/Wheel" + wheel.str() +
152  // "/Station" + station.str() +
153  "/Sector" + sector.str() + "/"
154  << endl;
155  LogVerbatim("DTNoiseTask") << " histoName " << histoName << endl;
156 
157  // Get the chamber from the geometry
158  int nWires_max = 0;
159  const DTChamber* dtchamber = dtGeom->chamber(chId);
160  const vector<const DTSuperLayer*>& superlayers = dtchamber->superLayers();
161 
162  // Loop over layers and find the max # of wires
163  for (vector<const DTSuperLayer*>::const_iterator sl = superlayers.begin(); sl != superlayers.end();
164  ++sl) { // loop over SLs
165  vector<const DTLayer*> layers = (*sl)->layers();
166  for (vector<const DTLayer*>::const_iterator lay = layers.begin(); lay != layers.end(); ++lay) { // loop over layers
167  int nWires = (*lay)->specificTopology().channels();
168  if (nWires > nWires_max)
169  nWires_max = nWires;
170  }
171  }
172 
173  noiseHistos[chId] =
174  ibooker.book2D(histoName, "Noise rate (Hz) per channel", nWires_max, 1, nWires_max + 1, 12, 1, 13);
175  noiseHistos[chId]->setAxisTitle("wire number", 1);
176  noiseHistos[chId]->setBinLabel(1, "SL1-L1", 2);
177  noiseHistos[chId]->setBinLabel(2, "SL1-L2", 2);
178  noiseHistos[chId]->setBinLabel(3, "SL1-L3", 2);
179  noiseHistos[chId]->setBinLabel(4, "SL1-L4", 2);
180  noiseHistos[chId]->setBinLabel(5, "SL2-L1", 2);
181  noiseHistos[chId]->setBinLabel(6, "SL2-L2", 2);
182  noiseHistos[chId]->setBinLabel(7, "SL2-L3", 2);
183  noiseHistos[chId]->setBinLabel(8, "SL2-L4", 2);
184  noiseHistos[chId]->setBinLabel(9, "SL3-L1", 2);
185  noiseHistos[chId]->setBinLabel(10, "SL3-L2", 2);
186  noiseHistos[chId]->setBinLabel(11, "SL3-L3", 2);
187  noiseHistos[chId]->setBinLabel(12, "SL3-L4", 2);
188 }
189 
191  // set the folder
192  stringstream wheel;
193  wheel << slId.chamberId().wheel();
194  stringstream station;
195  station << slId.chamberId().station();
196  stringstream sector;
197  sector << slId.chamberId().sector();
198  stringstream superlayer;
199  superlayer << slId.superlayer();
200 
201  ibooker.setCurrentFolder("DT/05-Noise/Wheel" + wheel.str() + "/Station" + station.str() + "/Sector" + sector.str());
202 
203  // Build the histo name
204  string histoName =
205  string("TimeBox") + "_W" + wheel.str() + "_St" + station.str() + "_Sec" + sector.str() + "_SL" + superlayer.str();
206 
207  LogVerbatim("DTNoiseTask") << "[DTNoiseTask]: booking SL histo:" << endl;
208  LogVerbatim("DTNoiseTask") << " folder "
209  << "DT/05-Noise/Wheel" + wheel.str() + "/Station" + station.str() + "/Sector" +
210  sector.str() + "/"
211  << endl;
212  LogVerbatim("DTNoiseTask") << " histoName " << histoName << endl;
213 
214  tbHistos[slId] = ibooker.book1D(histoName, "Time Box (TDC counts)", 1000, 0, 6000);
215 }
216 
218  LogVerbatim("DTNoiseTask") << "[DTNoiseTask]: Begin of run" << endl;
219 
220  // tTrig Map
221  tTrigMap = &setup.getData(tTrigMapToken_);
222 
223  // get the geometry
224  dtGeom = &setup.getData(muonGeomToken_);
225 }
226 
228  ibooker.setCurrentFolder("DT/EventInfo/Counters");
229  nEventMonitor = ibooker.bookFloat("nProcessedEventsNoise");
230 
231  // Loop over all the chambers
232  vector<const DTChamber*>::const_iterator ch_it = dtGeom->chambers().begin();
233  vector<const DTChamber*>::const_iterator ch_end = dtGeom->chambers().end();
234  for (; ch_it != ch_end; ++ch_it) {
235  DTChamberId chId = (*ch_it)->id();
236  // histo booking
237  bookHistos(ibooker, chId);
238  vector<const DTSuperLayer*>::const_iterator sl_it = (*ch_it)->superLayers().begin();
239  vector<const DTSuperLayer*>::const_iterator sl_end = (*ch_it)->superLayers().end();
240  // Loop over the SLs
241  for (; sl_it != sl_end; ++sl_it) {
242  DTSuperLayerId slId = (*sl_it)->id();
243  if (doTimeBoxHistos)
244  bookHistos(ibooker, slId);
245  float tTrig, tTrigRMS, kFactor;
246  tTrigMap->get(slId, tTrig, tTrigRMS, kFactor, DTTimeUnits::ns);
247  // tTrig mapping per station
248  // check that the ttrig is the lowest of the 3 SLs
249  if (tTrigStMap.find(chId) == tTrigStMap.end() ||
250  (tTrigStMap.find(chId) != tTrigStMap.end() && tTrig < tTrigStMap[chId]))
251  tTrigStMap[chId] = tTrig;
252  }
253  }
254 }
255 
257  LogVerbatim("DTNoiseTask") << "[DTNoiseTask]: End LS, update rates in all histos" << endl;
258 
259  // update the rate of all histos (usefull for histos with few entries: they are not updated very often
260  for (map<DTChamberId, MonitorElement*>::const_iterator meAndChamber = noiseHistos.begin();
261  meAndChamber != noiseHistos.end();
262  ++meAndChamber) {
263  DTChamberId chId = (*meAndChamber).first;
264  TH2F* noise_root = (*meAndChamber).second->getTH2F();
265  double upperLimit = tTrigStMap[chId] - safeMargin;
266 
267  double normalization = 0;
268  if (mapEvt.find(chId) != mapEvt.end()) {
269  LogVerbatim("DTNoiseTask") << " Ch: " << chId << " Last fill: # of events: " << mapEvt[chId] << endl;
270  normalization = 1e-9 * upperLimit * mapEvt[chId];
271  // revert back to # of entries
272  noise_root->Scale(normalization);
273  }
274  //check that event analyzed != 0 might happen oline
275  if (evtNumber) {
276  // set the # of events analyzed until this update
277  LogVerbatim("DTNoiseTask") << " Update for events: " << evtNumber << endl;
278  mapEvt[chId] = evtNumber;
279  // update the rate
280  normalization = double(1e-9 * upperLimit * evtNumber);
281  noise_root->Scale(1. / normalization);
282  }
283  }
284 }
285 
286 // Local Variables:
287 // show-trailing-whitespace: t
288 // truncate-lines: t
289 // End:
Log< level::Info, true > LogVerbatim
int station() const
Return the station number.
Definition: DTChamberId.h:42
std::map< DTChamberId, int > mapEvt
Definition: DTNoiseTask.h:86
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
MonitorElement * bookFloat(TString const &name, FUNC onbooking=NOOP())
Definition: DQMStore.h:80
virtual void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:32
identifier iterator
Definition: RangeMap.h:130
MonitorElement * nEventMonitor
Definition: DTNoiseTask.h:91
bool doSegmentVeto
Definition: DTNoiseTask.h:72
void dqmBeginRun(const edm::Run &, const edm::EventSetup &) override
Definition: DTNoiseTask.cc:217
T getUntrackedParameter(std::string const &, T const &) const
void Fill(long long x)
U second(std::pair< T, U > const &p)
DTChamberId chamberId() const
Return the corresponding ChamberId.
void analyze(const edm::Event &e, const edm::EventSetup &c) override
Analyze.
Definition: DTNoiseTask.cc:62
edm::EDGetTokenT< DTRecSegment4DCollection > recHits4DToken_
Definition: DTNoiseTask.h:70
void endLuminosityBlock(const edm::LuminosityBlock &lumiSeg, const edm::EventSetup &setup) override
Definition: DTNoiseTask.cc:256
Transition
Definition: Transition.h:12
edm::EDGetTokenT< DTDigiCollection > dtDigiToken_
Definition: DTNoiseTask.h:64
double safeMargin
Definition: DTNoiseTask.h:94
const std::vector< const DTSuperLayer * > & superLayers() const
Return the superlayers in the chamber.
Definition: DTChamber.cc:51
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
Definition: DTNoiseTask.cc:227
std::map< DTSuperLayerId, MonitorElement * > tbHistos
Definition: DTNoiseTask.h:89
void bookHistos(DQMStore::IBooker &, DTChamberId chId)
Definition: DTNoiseTask.cc:133
int superlayer() const
Return the superlayer number (deprecated method name)
std::map< DTChamberId, double > tTrigStMap
Definition: DTNoiseTask.h:80
MonitorElement * book2D(TString const &name, TString const &title, int nchX, double lowX, double highX, int nchY, double lowY, double highY, FUNC onbooking=NOOP())
Definition: DQMStore.h:212
const DTGeometry * dtGeom
Definition: DTNoiseTask.h:75
std::vector< DigiType >::const_iterator const_iterator
int get(int wheelId, int stationId, int sectorId, int slId, float &tTrig, float &tTrms, float &kFact, DTTimeUnits::type unit) const
get content
Definition: DTTtrig.cc:59
edm::ESGetToken< DTTtrig, DTTtrigRcd > tTrigMapToken_
Definition: DTNoiseTask.h:76
int wheel() const
Return the wheel number.
Definition: DTChamberId.h:39
HLT enums.
int sector() const
Definition: DTChamberId.h:49
DTNoiseTask(const edm::ParameterSet &ps)
Constructor.
Definition: DTNoiseTask.cc:37
bool doTimeBoxHistos
Definition: DTNoiseTask.h:68
std::map< DTChamberId, MonitorElement * > noiseHistos
Definition: DTNoiseTask.h:83
const std::vector< const DTChamber * > & chambers() const
Return a vector of all Chamber.
Definition: DTGeometry.cc:84
const DTTtrig * tTrigMap
Definition: DTNoiseTask.h:77
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX, FUNC onbooking=NOOP())
Definition: DQMStore.h:98
const DTChamber * chamber(const DTChamberId &id) const
Return a DTChamber given its id.
Definition: DTGeometry.cc:90
edm::ESGetToken< DTGeometry, MuonGeometryRecord > muonGeomToken_
Definition: DTNoiseTask.h:74
Definition: Run.h:45
~DTNoiseTask() override
Destructor.
Definition: DTNoiseTask.cc:59