CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
DTNoiseCalibration.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  * A. Vilela Pereira - INFN Torino
6  */
7 
8 #include "DTNoiseCalibration.h"
9 
10 // Framework
16 
17 // Geometry
22 
23 // Digis
29 
30 // Database
33 
35 
36 #include "TH2F.h"
37 #include "TFile.h"
38 
39 using namespace edm;
40 using namespace std;
41 
43  digiLabel_( pset.getParameter<InputTag>("digiLabel") ),
44  useTimeWindow_( pset.getParameter<bool>("useTimeWindow") ),
45  triggerWidth_( pset.getParameter<double>("triggerWidth") ),
46  timeWindowOffset_( pset.getParameter<int>("timeWindowOffset") ),
47  maximumNoiseRate_( pset.getParameter<double>("maximumNoiseRate") ),
48  useAbsoluteRate_( pset.getParameter<bool>("useAbsoluteRate") ),
49  readDB_(true), defaultTtrig_(0),
50  dbLabel_( pset.getUntrackedParameter<string>("dbLabel", "") ),
51  //fastAnalysis_( pset.getParameter<bool>("fastAnalysis", true) ),
52  wireIdWithHisto_( std::vector<DTWireId>() ),
53  lumiMax_(3000)
54  {
55 
56  // Get the debug parameter for verbose output
57  //debug = ps.getUntrackedParameter<bool>("debug");
58  /*// The analysis type
59  // The wheel & sector interested for the time-dependent analysis
60  wh = ps.getUntrackedParameter<int>("wheel", 0);
61  sect = ps.getUntrackedParameter<int>("sector", 6);*/
62 
63  if( pset.exists("defaultTtrig") ){
64  readDB_ = false;
65  defaultTtrig_ = pset.getParameter<int>("defaultTtrig");
66  }
67 
68  if( pset.exists("cellsWithHisto") ){
69  vector<string> cellsWithHisto = pset.getParameter<vector<string> >("cellsWithHisto");
70  for(vector<string>::const_iterator cell = cellsWithHisto.begin(); cell != cellsWithHisto.end(); ++cell){
71  //FIXME: Use regex to check whether format is right
72  if( (*cell) != "" && (*cell) != "None"){
73  stringstream linestr;
74  int wheel,station,sector,sl,layer,wire;
75  linestr << (*cell);
76  linestr >> wheel >> station >> sector >> sl >> layer >> wire;
77  wireIdWithHisto_.push_back(DTWireId(wheel,station,sector,sl,layer,wire));
78  }
79  }
80  }
81 
82  // The root file which will contain the histos
83  string rootFileName = pset.getUntrackedParameter<string>("rootFileName","noise.root");
84  rootFile_ = new TFile(rootFileName.c_str(), "RECREATE");
85  rootFile_->cd();
86 }
87 
89  LogVerbatim("Calibration") << "[DTNoiseCalibration]: Begin job";
90 
91  nevents_ = 0;
92 
93  TH1::SetDefaultSumw2(true);
94  int numBin = (triggerWidth_*32/25)/50;
95  hTDCTriggerWidth_ = new TH1F("TDC_Time_Distribution", "TDC_Time_Distribution", numBin, 0, triggerWidth_*32/25);
96 }
97 
99 
100  // Get the DT Geometry
101  setup.get<MuonGeometryRecord>().get(dtGeom_);
102 
103  // tTrig
104  if( readDB_ ) setup.get<DTTtrigRcd>().get(dbLabel_,tTrigMap_);
105 
106  runBeginTime_ = time_t(run.beginTime().value()>>32);
107  runEndTime_ = time_t(run.endTime().value()>>32);
108  /*
109  nevents = 0;
110  counter = 0;
111 
112  // TDC time distribution
113  int numBin = (triggerWidth_*(32/25))/50;
114  hTDCTriggerWidth = new TH1F("TDC_Time_Distribution", "TDC_Time_Distribution", numBin, 0, triggerWidth_*(32/25));*/
115 
116 }
117 
119  ++nevents_;
120 
121  // Get the digis from the event
122  Handle<DTDigiCollection> dtdigis;
123  event.getByLabel(digiLabel_, dtdigis);
124 
125  /*TH1F *hOccupancyHisto;
126  TH2F *hEvtPerWireH;
127  string Histo2Name;*/
128 
129  //RunNumber_t runNumber = event.id().run();
130  time_t eventTime = time_t(event.time().value()>>32);
131  unsigned int lumiSection = event.luminosityBlock();
132 
133  // Loop over digis
135  for (dtLayerId_It=dtdigis->begin(); dtLayerId_It!=dtdigis->end(); ++dtLayerId_It){
136  // Define time window
137  float upperLimit = 0.;
138  if(useTimeWindow_){
139  if( readDB_ ){
140  float tTrig,tTrigRMS,kFactor;
141  DTSuperLayerId slId = ((*dtLayerId_It).first).superlayerId();
142  int status = tTrigMap_->get( slId, tTrig, tTrigRMS, kFactor, DTTimeUnits::counts );
143  if(status != 0) throw cms::Exception("DTNoiseCalibration") << "Could not find tTrig entry in DB for" << slId << endl;
144  upperLimit = tTrig - timeWindowOffset_;
145  } else {
146  upperLimit = defaultTtrig_ - timeWindowOffset_;
147  }
148  }
149 
150  double triggerWidth_s = 0.;
151  if(useTimeWindow_) triggerWidth_s = ( (upperLimit*25)/32 )/1e9;
152  else triggerWidth_s = double(triggerWidth_/1e9);
153  LogTrace("Calibration") << ((*dtLayerId_It).first).superlayerId() << " Trigger width (s): " << triggerWidth_s;
154 
155  for (DTDigiCollection::const_iterator digiIt = ((*dtLayerId_It).second).first;
156  digiIt!=((*dtLayerId_It).second).second; ++digiIt){
157 
158  //Check the TDC trigger width
159  int tdcTime = (*digiIt).countsTDC();
160  if( !useTimeWindow_ ){
161  if( ( ((float)tdcTime*25)/32 ) > triggerWidth_ ){
162  LogError("Calibration") << "Digi has a TDC time (ns) higher than the pre-defined TDC trigger width: " << ((float)tdcTime*25)/32;
163  continue;
164  }
165  }
166 
167  hTDCTriggerWidth_->Fill(tdcTime);
168 
169  if( useTimeWindow_ && tdcTime > upperLimit) continue;
170 
171  /*LogTrace("Calibration") << "TDC time (ns): " << ((float)tdcTime*25)/32
172  <<" --- trigger width (ns): " << ((float)upperLimit*25)/32;*/
173 
174  const DTLayerId dtLId = (*dtLayerId_It).first;
175  const DTTopology& dtTopo = dtGeom_->layer(dtLId)->specificTopology();
176  const int firstWire = dtTopo.firstChannel();
177  const int lastWire = dtTopo.lastChannel();
178  //const int nWires = dtTopo.channels();
179  const int nWires = lastWire - firstWire + 1;
180 
181  // Book the occupancy histos
182  if( theHistoOccupancyMap_.find(dtLId) == theHistoOccupancyMap_.end() ){
183  string histoName = "DigiOccupancy_" + getLayerName(dtLId);
184  rootFile_->cd();
185  TH1F* hOccupancyHisto = new TH1F(histoName.c_str(), histoName.c_str(), nWires, firstWire, lastWire+1);
186  LogTrace("Calibration") << " Created occupancy Histo: " << hOccupancyHisto->GetName();
187  theHistoOccupancyMap_[dtLId] = hOccupancyHisto;
188  }
189  theHistoOccupancyMap_[dtLId]->Fill( (*digiIt).wire(), 1./triggerWidth_s );
190 
191  // Histos vs lumi section
192  const DTChamberId dtChId = dtLId.chamberId();
193  if( chamberOccupancyVsLumiMap_.find(dtChId) == chamberOccupancyVsLumiMap_.end() ){
194  string histoName = "OccupancyVsLumi_" + getChamberName(dtChId);
195  rootFile_->cd();
196  TH1F* hOccupancyVsLumiHisto = new TH1F(histoName.c_str(), histoName.c_str(), lumiMax_, 0, lumiMax_);
197  LogTrace("Calibration") << " Created occupancy histo: " << hOccupancyVsLumiHisto->GetName();
198  chamberOccupancyVsLumiMap_[dtChId] = hOccupancyVsLumiHisto;
199  }
200  chamberOccupancyVsLumiMap_[dtChId]->Fill( lumiSection, 1./triggerWidth_s );
201 
202  const DTWireId wireId(dtLId, (*digiIt).wire());
203  if( find(wireIdWithHisto_.begin(),wireIdWithHisto_.end(),wireId) != wireIdWithHisto_.end() ){
204  if( theHistoOccupancyVsLumiMap_.find(wireId) == theHistoOccupancyVsLumiMap_.end() ){
205  string histoName = "OccupancyVsLumi_" + getChannelName(wireId);
206  rootFile_->cd();
207  TH1F* hOccupancyVsLumiHisto = new TH1F(histoName.c_str(), histoName.c_str(), lumiMax_, 0, lumiMax_);
208  LogTrace("Calibration") << " Created occupancy histo: " << hOccupancyVsLumiHisto->GetName();
209  theHistoOccupancyVsLumiMap_[wireId] = hOccupancyVsLumiHisto;
210  }
211  theHistoOccupancyVsLumiMap_[wireId]->Fill( lumiSection, 1./triggerWidth_s );
212  }
213 
214  // Histos vs time
215  if( chamberOccupancyVsTimeMap_.find(dtChId) == chamberOccupancyVsTimeMap_.end() ){
216  string histoName = "OccupancyVsTime_" + getChamberName(dtChId);
217  float secPerBin = 20.0;
218  unsigned int nBins = ( (unsigned int)(runEndTime_ - runBeginTime_) )/secPerBin;
219  rootFile_->cd();
220  TH1F* hOccupancyVsTimeHisto = new TH1F(histoName.c_str(), histoName.c_str(),
221  nBins, (unsigned int)runBeginTime_,
222  (unsigned int)runEndTime_);
223  for(int k = 0; k < hOccupancyVsTimeHisto->GetNbinsX(); ++k){
224  if( k%10 == 0 ){
225  unsigned int binLowEdge = hOccupancyVsTimeHisto->GetBinLowEdge(k+1);
226  time_t timeValue = time_t(binLowEdge);
227  hOccupancyVsTimeHisto->GetXaxis()->SetBinLabel( (k+1),ctime(&timeValue) );
228  }
229  }
230  size_t lastBin = hOccupancyVsTimeHisto->GetNbinsX();
231  unsigned int binUpperEdge = hOccupancyVsTimeHisto->GetBinLowEdge(lastBin) +
232  hOccupancyVsTimeHisto->GetBinWidth(lastBin);
233  time_t timeValue = time_t(binUpperEdge);
234  hOccupancyVsTimeHisto->GetXaxis()->SetBinLabel( (lastBin),ctime(&timeValue) );
235 
236  LogTrace("Calibration") << " Created occupancy histo: " << hOccupancyVsTimeHisto->GetName();
237  chamberOccupancyVsTimeMap_[dtChId] = hOccupancyVsTimeHisto;
238  }
239  chamberOccupancyVsTimeMap_[dtChId]->Fill( (unsigned int)eventTime, 1./triggerWidth_s );
240 
241  /*// Book the digi event plot every 1000 events if the analysis is not "fast" and if is the correct sector
242  if(!fastAnalysis &&
243  dtLId.superlayerId().chamberId().wheel()==wh &&
244  dtLId.superlayerId().chamberId().sector()==sect) {
245  if(theHistoEvtPerWireMap.find(dtLId) == theHistoEvtPerWireMap.end() ||
246  (theHistoEvtPerWireMap.find(dtLId) != theHistoEvtPerWireMap.end() &&
247  skippedPlot[dtLId] != counter)){
248  skippedPlot[dtLId] = counter;
249  stringstream toAppend; toAppend << counter;
250  Histo2Name = "DigiPerWirePerEvent_" + getLayerName(dtLId) + "_" + toAppend.str();
251  theFile->cd();
252  hEvtPerWireH = new TH2F(Histo2Name.c_str(), Histo2Name.c_str(), 1000,0.5,1000.5,nWires, firstWire, lastWire+1);
253  if(hEvtPerWireH){
254  if(debug)
255  cout << " New Histo with the number of digi per evt per wire: " << hEvtPerWireH->GetName() << endl;
256  theHistoEvtPerWireMap[dtLId]=hEvtPerWireH;
257  }
258  }
259  }*/
260  }
261  }
262 
263  /*//Fill the plot of the number of digi per event per wire
264  std::map<int,int > DigiPerWirePerEvent;
265  // LOOP OVER ALL THE CHAMBERS
266  vector<DTChamber*>::const_iterator ch_it = dtGeom->chambers().begin();
267  vector<DTChamber*>::const_iterator ch_end = dtGeom->chambers().end();
268  for (; ch_it != ch_end; ++ch_it) {
269  DTChamberId ch = (*ch_it)->id();
270  vector<const DTSuperLayer*>::const_iterator sl_it = (*ch_it)->superLayers().begin();
271  vector<const DTSuperLayer*>::const_iterator sl_end = (*ch_it)->superLayers().end();
272  // Loop over the SLs
273  for(; sl_it != sl_end; ++sl_it) {
274  DTSuperLayerId sl = (*sl_it)->id();
275  vector<const DTLayer*>::const_iterator l_it = (*sl_it)->layers().begin();
276  vector<const DTLayer*>::const_iterator l_end = (*sl_it)->layers().end();
277  // Loop over the Ls
278  for(; l_it != l_end; ++l_it) {
279  DTLayerId layerId = (*l_it)->id();
280 
281  // Get the number of wires
282  const DTTopology& dtTopo = dtGeom->layer(layerId)->specificTopology();
283  const int firstWire = dtTopo.firstChannel();
284  const int lastWire = dtTopo.lastChannel();
285 
286  if (theHistoEvtPerWireMap.find(layerId) != theHistoEvtPerWireMap.end() &&
287  skippedPlot[layerId] == counter) {
288 
289  for (int wire=firstWire; wire<=lastWire; wire++) {
290  DigiPerWirePerEvent[wire]= 0;
291  }
292  // loop over all the digis of the event
293  DTDigiCollection::Range layerDigi= dtdigis->get(layerId);
294  for (DTDigiCollection::const_iterator digi = layerDigi.first;
295  digi!=layerDigi.second;
296  ++digi){
297  if((cosmicRun && (*digi).countsTDC()<upperLimit) || (!cosmicRun))
298  DigiPerWirePerEvent[(*digi).wire()]+=1;
299  }
300  // fill the digi event histo
301  for (int wire=firstWire; wire<=lastWire; wire++) {
302  theFile->cd();
303  int histoEvents = nevents - (counter*1000);
304  theHistoEvtPerWireMap[layerId]->Fill(histoEvents,wire,DigiPerWirePerEvent[wire]);
305  }
306  }
307  } //Loop Ls
308  } //Loop SLs
309  } //Loop chambers
310 
311 
312  if(nevents % 1000 == 0) {
313  counter++;
314  // save the digis event plot on file
315  for(map<DTLayerId, TH2F* >::const_iterator lHisto = theHistoEvtPerWireMap.begin();
316  lHisto != theHistoEvtPerWireMap.end();
317  lHisto++) {
318  theFile->cd();
319  if((*lHisto).second)
320  (*lHisto).second->Write();
321  }
322  theHistoEvtPerWireMap.clear();
323  }*/
324 
325 }
326 
328 
329  //LogVerbatim("Calibration") << "[DTNoiseCalibration] endjob called!";
330  LogVerbatim("Calibration") << "[DTNoiseCalibration] Total number of events analyzed: " << nevents_;
331 
332  // Save the TDC digi plot
333  rootFile_->cd();
334  hTDCTriggerWidth_->Write();
335 
336  double normalization = 1./double(nevents_);
337 
338  for(map<DTWireId, TH1F*>::const_iterator wHisto = theHistoOccupancyVsLumiMap_.begin();
339  wHisto != theHistoOccupancyVsLumiMap_.end(); ++wHisto){
340  (*wHisto).second->Scale(normalization);
341  (*wHisto).second->Write();
342  }
343 
344  for(map<DTChamberId, TH1F*>::const_iterator chHisto = chamberOccupancyVsLumiMap_.begin();
345  chHisto != chamberOccupancyVsLumiMap_.end(); ++chHisto){
346  (*chHisto).second->Scale(normalization);
347  (*chHisto).second->Write();
348  }
349 
350  for(map<DTChamberId, TH1F*>::const_iterator chHisto = chamberOccupancyVsTimeMap_.begin();
351  chHisto != chamberOccupancyVsTimeMap_.end(); ++chHisto){
352  (*chHisto).second->Scale(normalization);
353  (*chHisto).second->Write();
354  }
355 
356  // Save on file the occupancy histos and write the list of noisy cells
358  for(map<DTLayerId, TH1F*>::const_iterator lHisto = theHistoOccupancyMap_.begin();
359  lHisto != theHistoOccupancyMap_.end();
360  ++lHisto){
361  /*double triggerWidth_s = 0.;
362  if( useTimeWindow_ ){
363  double triggerWidth_ns = 0.;
364  if( readDB_ ){
365  float tTrig, tTrigRMS, kFactor;
366  DTSuperLayerId slId = ((*lHisto).first).superlayerId();
367  int status = tTrigMap_->get( slId, tTrig, tTrigRMS, kFactor, DTTimeUnits::counts );
368  if(status != 0) throw cms::Exception("DTNoiseCalibration") << "Could not find tTrig entry in DB for" << slId << endl;
369  triggerWidth_ns = tTrig - timeWindowOffset_;
370  } else{
371  triggerWidth_ns = defaultTtrig_ - timeWindowOffset_;
372  }
373  triggerWidth_ns = (triggerWidth_ns*25)/32;
374  triggerWidth_s = triggerWidth_ns/1e9;
375  } else{
376  triggerWidth_s = double(triggerWidth_/1e9);
377  }
378  LogTrace("Calibration") << (*lHisto).second->GetName() << " trigger width (s): " << triggerWidth_s;*/
379 
380  //double normalization = 1./(nevents_*triggerWidth_s);
381  if((*lHisto).second){
382  (*lHisto).second->Scale(normalization);
383  rootFile_->cd();
384  (*lHisto).second->Write();
385  const DTTopology& dtTopo = dtGeom_->layer((*lHisto).first)->specificTopology();
386  const int firstWire = dtTopo.firstChannel();
387  const int lastWire = dtTopo.lastChannel();
388  //const int nWires = dtTopo.channels();
389  const int nWires = lastWire - firstWire + 1;
390  // Find average in layer
391  double averageRate = 0.;
392  for(int bin = 1; bin <= (*lHisto).second->GetNbinsX(); ++bin)
393  averageRate += (*lHisto).second->GetBinContent(bin);
394 
395  if(nWires) averageRate /= nWires;
396  LogTrace("Calibration") << " Average rate = " << averageRate;
397 
398  for(int i_wire = firstWire; i_wire <= lastWire; ++i_wire){
399  // From definition of "noisy cell"
400  int bin = i_wire - firstWire + 1;
401  double channelRate = (*lHisto).second->GetBinContent(bin);
402  double rateOffset = (useAbsoluteRate_) ? 0. : averageRate;
403  if( (channelRate - rateOffset) > maximumNoiseRate_ ){
404  DTWireId wireID((*lHisto).first, i_wire);
405  statusMap->setCellNoise(wireID,1);
406  LogVerbatim("Calibration") << ">>> Channel noisy: " << wireID;
407  }
408  }
409  }
410  }
411  LogVerbatim("Calibration") << "Writing noise map object to DB";
412  string record = "DTStatusFlagRcd";
413  DTCalibDBUtils::writeToDB<DTStatusFlag>(record, statusMap);
414 }
415 
417  rootFile_->Close();
418 }
419 
421  stringstream channelName;
422  channelName << "Wh" << wId.wheel() << "_St" << wId.station() << "_Sec" << wId.sector()
423  << "_SL" << wId.superlayer() << "_L" << wId.layer() << "_W"<< wId.wire();
424 
425  return channelName.str();
426 }
427 
429 
430  const DTSuperLayerId dtSLId = lId.superlayerId();
431  const DTChamberId dtChId = dtSLId.chamberId();
432  stringstream Layer; Layer << lId.layer();
433  stringstream superLayer; superLayer << dtSLId.superlayer();
434  stringstream wheel; wheel << dtChId.wheel();
435  stringstream station; station << dtChId.station();
436  stringstream sector; sector << dtChId.sector();
437 
438  string layerName =
439  "W" + wheel.str()
440  + "_St" + station.str()
441  + "_Sec" + sector.str()
442  + "_SL" + superLayer.str()
443  + "_L" + Layer.str();
444 
445  return layerName;
446 }
447 
449 
450  const DTChamberId dtChId = dtSLId.chamberId();
451  stringstream superLayer; superLayer << dtSLId.superlayer();
452  stringstream wheel; wheel << dtChId.wheel();
453  stringstream station; station << dtChId.station();
454  stringstream sector; sector << dtChId.sector();
455 
456  string superLayerName =
457  "W" + wheel.str()
458  + "_St" + station.str()
459  + "_Sec" + sector.str()
460  + "_SL" + superLayer.str();
461 
462  return superLayerName;
463 }
464 
466 
467  stringstream wheel; wheel << dtChId.wheel();
468  stringstream station; station << dtChId.station();
469  stringstream sector; sector << dtChId.sector();
470 
471  string chamberName =
472  "W" + wheel.str()
473  + "_St" + station.str()
474  + "_Sec" + sector.str();
475 
476  return chamberName;
477 }
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
Timestamp const & endTime() const
Definition: RunBase.h:44
DTChamberId chamberId() const
Return the corresponding ChamberId.
std::vector< DTWireId > wireIdWithHisto_
bool exists(std::string const &parameterName) const
checks if a parameter exists
std::string getChannelName(const DTWireId &) const
int layer() const
Return the layer number.
Definition: DTLayerId.h:53
DTSuperLayerId superlayerId() const
Return the corresponding SuperLayerId.
Definition: DTLayerId.h:59
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:7
std::string getChamberName(const DTChamberId &) const
int firstChannel() const
Returns the wire number of the first wire.
Definition: DTTopology.h:78
std::string getLayerName(const DTLayerId &) const
DTNoiseCalibration(const edm::ParameterSet &ps)
Constructor.
SeedingLayerSetsHits::SeedingLayer Layer
Definition: LayerTriplets.h:14
U second(std::pair< T, U > const &p)
int lastChannel() const
Returns the wire number of the last wire.
Definition: DTTopology.h:80
int setCellNoise(int wheelId, int stationId, int sectorId, int slId, int layerId, int cellId, bool flag)
void beginRun(const edm::Run &run, const edm::EventSetup &setup)
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
#define LogTrace(id)
virtual ~DTNoiseCalibration()
Destructor.
void analyze(const edm::Event &e, const edm::EventSetup &c)
int k[5][pyjets_maxn]
int wire() const
Return the wire number.
Definition: DTWireId.h:56
int superlayer() const
Return the superlayer number (deprecated method name)
const T & get() const
Definition: EventSetup.h:55
std::vector< DTDigi >::const_iterator const_iterator
Timestamp const & beginTime() const
Definition: RunBase.h:43
int sector() const
Definition: DTChamberId.h:61
tuple status
Definition: ntuplemaker.py:245
int station() const
Return the station number.
Definition: DTChamberId.h:51
int wheel() const
Return the wheel number.
Definition: DTChamberId.h:45
void setup(std::vector< TH2F > &depth, std::string name, std::string units="")
TimeValue_t value() const
Definition: Timestamp.h:56
std::string getSuperLayerName(const DTSuperLayerId &) const
edm::Timestamp time() const
Definition: EventBase.h:57
Definition: Run.h:41