CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
DTVDriftCalibration.cc
Go to the documentation of this file.
1 
2 /*
3  * See header file for a description of this class.
4  *
5  * $Date: 2008/10/03 08:34:49 $
6  * $Revision: 1.5 $
7  * \author M. Giunta
8  */
9 
13 
16 
19 
22 
25 
28 
29 /* C++ Headers */
30 #include <map>
31 #include <iostream>
32 #include <fstream>
33 #include <string>
34 #include <sstream>
35 #include "TFile.h"
36 #include "TH1.h"
37 #include "TF1.h"
38 #include "TROOT.h"
39 
40 // Declare histograms.
41 TH1F * hChi2;
42 extern void bookHistos();
43 
44 using namespace std;
45 using namespace edm;
46 using namespace dttmaxenums;
47 
48 
50  // the root file which will contain the histos
51  string rootFileName = pset.getUntrackedParameter<string>("rootFileName");
52  theFile = new TFile(rootFileName.c_str(), "RECREATE");
53  theFile->cd();
54 
55  debug = pset.getUntrackedParameter<bool>("debug", "false");
56 
57  theFitter = new DTMeanTimerFitter(theFile);
58  if(debug)
59  theFitter->setVerbosity(1);
60 
61  hChi2 = new TH1F("hChi2","Chi squared tracks",100,0,100);
62  h2DSegmRPhi = new h2DSegm("SLRPhi");
63  h2DSegmRZ = new h2DSegm("SLRZ");
64  h4DSegmAllCh = new h4DSegm("AllCh");
65  bookHistos();
66 
67  findVDriftAndT0 = pset.getUntrackedParameter<bool>("fitAndWrite", "false");
68 
69  // Chamber/s to calibrate
70  theCalibChamber = pset.getUntrackedParameter<string>("calibChamber", "All");
71 
72  // the name of the 4D rec hits collection
73  theRecHits4DLabel = pset.getUntrackedParameter<string>("recHits4DLabel");
74 
75  // the txt file which will contain the calibrated constants
76  theVDriftOutputFile = pset.getUntrackedParameter<string>("vDriftFileName");
77 
78  //get the switch to check the noisy channels
79  checkNoisyChannels = pset.getUntrackedParameter<bool>("checkNoisyChannels","false");
80 
81  // Get the synchronizer
82  theSync = DTTTrigSyncFactory::get()->create(pset.getUntrackedParameter<string>("tTrigMode"),
83  pset.getUntrackedParameter<ParameterSet>("tTrigModeConfig"));
84 
85  // get parameter set for DTCalibrationMap constructor
86  theCalibFilePar = pset.getUntrackedParameter<ParameterSet>("calibFileConfig");
87 
88  // get maximum chi2 value
89  theMaxChi2 = pset.getParameter<double>("maxChi2");
90 
91  // Maximum incidence angle for Phi SL
92  theMaxPhiAngle = pset.getParameter<double>("maxAnglePhi");
93 
94  // Maximum incidence angle for Theta SL
95  theMaxZAngle = pset.getParameter<double>("maxAngleZ");
96 
97  // the granularity to be used for tMax
98  string tMaxGranularity = pset.getUntrackedParameter<string>("tMaxGranularity","bySL");
99 
100  // Initialize correctly the enum which specify the granularity for the calibration
101  if(tMaxGranularity == "bySL") {
102  theGranularity = bySL;
103  } else if(tMaxGranularity == "byChamber"){
104  theGranularity = byChamber;
105  } else if(tMaxGranularity== "byPartition") {
106  theGranularity = byPartition;
107  } else {
108  cout << "[DTVDriftCalibration]###Warning: Check parameter tMaxGranularity: "
109  << tMaxGranularity << " options not available!" << endl;
110  }
111 
112  if(debug)
113  cout << "[DTVDriftCalibration]Constructor called!" << endl;
114 }
115 
117  theFile->Close();
118  delete theFitter;
119  if(debug)
120  cout << "[DTVDriftCalibration]Destructor called!" << endl;
121 }
122 
123 
124 
125 void DTVDriftCalibration::analyze(const Event & event, const EventSetup& eventSetup) {
126  cout << endl<<"--- [DTVDriftCalibration] Event analysed #Run: " << event.id().run()
127  << " #Event: " << event.id().event() << endl;
128  theFile->cd();
129  DTChamberId chosenChamberId;
130 
131  if(theCalibChamber != "All") {
132  stringstream linestr;
133  int selWheel, selStation, selSector;
134  linestr << theCalibChamber;
135  linestr >> selWheel >> selStation >> selSector;
136  chosenChamberId = DTChamberId(selWheel, selStation, selSector);
137  cout << "chosen chamber " << chosenChamberId << endl;
138  }
139 
140  // Get the DT Geometry
141  ESHandle<DTGeometry> dtGeom;
142  eventSetup.get<MuonGeometryRecord>().get(dtGeom);
143 
144  // Get the rechit collection from the event
145  Handle<DTRecSegment4DCollection> all4DSegments;
146  event.getByLabel(theRecHits4DLabel, all4DSegments);
147 
148  // Get the map of noisy channels
150  if(checkNoisyChannels) {
151  eventSetup.get<DTStatusFlagRcd>().get(statusMap);
152  }
153 
154  // Set the event setup in the Synchronizer
155  theSync->setES(eventSetup);
156 
157  // Loop over segments by chamber
159  for (chamberIdIt = all4DSegments->id_begin();
160  chamberIdIt != all4DSegments->id_end();
161  ++chamberIdIt){
162 
163  // Get the chamber from the setup
164  const DTChamber* chamber = dtGeom->chamber(*chamberIdIt);
165  if(debug)
166  cout << "Chamber Id: " << *chamberIdIt << endl;
167 
168 
169  // Calibrate just the chosen chamber/s
170  if((theCalibChamber != "All") && ((*chamberIdIt) != chosenChamberId))
171  continue;
172 
173  // Get the range for the corresponding ChamberId
174  DTRecSegment4DCollection::range range = all4DSegments->get((*chamberIdIt));
175 
176  // Loop over the rechits of this DetUnit
177  for (DTRecSegment4DCollection::const_iterator segment = range.first;
178  segment!=range.second; ++segment){
179 
180  if(debug) {
181  cout << "Segment local pos (in chamber RF): " << (*segment).localPosition() << endl;
182  cout << "Segment global pos: " << chamber->toGlobal((*segment).localPosition()) << endl;;
183  }
184 
185  //get the segment chi2
186  double chiSquare = ((*segment).chi2()/(*segment).degreesOfFreedom());
187  // cut on the segment chi2
188  if(chiSquare > theMaxChi2) continue;
189 
190  // get the Phi 2D segment and plot the angle in the chamber RF
191  if(!((*segment).phiSegment())){
192  cout<<"No phi segment"<<endl;
193  }
194  LocalPoint phiSeg2DPosInCham;
195  LocalVector phiSeg2DDirInCham;
196 
197  bool segmNoisy = false;
198  map<DTSuperLayerId,vector<DTRecHit1D> > hitsBySLMap;
199 
200  if((*segment).hasPhi()){
201  const DTChamberRecSegment2D* phiSeg = (*segment).phiSegment(); // phiSeg lives in the chamber RF
202  phiSeg2DPosInCham = phiSeg->localPosition();
203  phiSeg2DDirInCham = phiSeg->localDirection();
204 
205  vector<DTRecHit1D> phiHits = phiSeg->specificRecHits();
206  for(vector<DTRecHit1D>::const_iterator hit = phiHits.begin();
207  hit != phiHits.end(); ++hit) {
208  DTWireId wireId = (*hit).wireId();
209  DTSuperLayerId slId = wireId.superlayerId();
210  hitsBySLMap[slId].push_back(*hit);
211 
212  // Check for noisy channels to skip them
213  if(checkNoisyChannels) {
214  bool isNoisy = false;
215  bool isFEMasked = false;
216  bool isTDCMasked = false;
217  bool isTrigMask = false;
218  bool isDead = false;
219  bool isNohv = false;
220  statusMap->cellStatus(wireId, isNoisy, isFEMasked, isTDCMasked, isTrigMask, isDead, isNohv);
221  if(isNoisy) {
222  if(debug)
223  cout << "Wire: " << wireId << " is noisy, skipping!" << endl;
224  segmNoisy = true;
225  }
226  }
227  }
228  }
229 
230  // get the Theta 2D segment and plot the angle in the chamber RF
231  LocalVector zSeg2DDirInCham;
232  LocalPoint zSeg2DPosInCham;
233  if((*segment).hasZed()) {
234  const DTSLRecSegment2D* zSeg = (*segment).zSegment(); // zSeg lives in the SL RF
235  const DTSuperLayer* sl = chamber->superLayer(zSeg->superLayerId());
236  zSeg2DPosInCham = chamber->toLocal(sl->toGlobal((*zSeg).localPosition()));
237  zSeg2DDirInCham = chamber->toLocal(sl->toGlobal((*zSeg).localDirection()));
238  hitsBySLMap[zSeg->superLayerId()] = zSeg->specificRecHits();
239 
240  // Check for noisy channels to skip them
241  vector<DTRecHit1D> zHits = zSeg->specificRecHits();
242  for(vector<DTRecHit1D>::const_iterator hit = zHits.begin();
243  hit != zHits.end(); ++hit) {
244  DTWireId wireId = (*hit).wireId();
245  if(checkNoisyChannels) {
246  bool isNoisy = false;
247  bool isFEMasked = false;
248  bool isTDCMasked = false;
249  bool isTrigMask = false;
250  bool isDead = false;
251  bool isNohv = false;
252  statusMap->cellStatus(wireId, isNoisy, isFEMasked, isTDCMasked, isTrigMask, isDead, isNohv);
253  if(isNoisy) {
254  if(debug)
255  cout << "Wire: " << wireId << " is noisy, skipping!" << endl;
256  segmNoisy = true;
257  }
258  }
259  }
260  }
261 
262  if (segmNoisy) continue;
263 
264  LocalPoint segment4DLocalPos = (*segment).localPosition();
265  LocalVector segment4DLocalDir = (*segment).localDirection();
266  if(fabs(atan(segment4DLocalDir.y()/segment4DLocalDir.z())* 180./Geom::pi()) > theMaxZAngle) continue; // cut on the angle
267  if(fabs(atan(segment4DLocalDir.x()/segment4DLocalDir.z())* 180./Geom::pi()) > theMaxPhiAngle) continue; // cut on the angle
268 
269  hChi2->Fill(chiSquare);
270  if((*segment).hasPhi())
271  h2DSegmRPhi->Fill(phiSeg2DPosInCham.x(), phiSeg2DDirInCham.x()/phiSeg2DDirInCham.z());
272  if((*segment).hasZed())
273  h2DSegmRZ->Fill(zSeg2DPosInCham.y(), zSeg2DDirInCham.y()/zSeg2DDirInCham.z());
274 
275  if((*segment).hasZed() && (*segment).hasPhi())
276  h4DSegmAllCh->Fill(segment4DLocalPos.x(),
277  segment4DLocalPos.y(),
278  atan(segment4DLocalDir.x()/segment4DLocalDir.z())* 180./Geom::pi(),
279  atan(segment4DLocalDir.y()/segment4DLocalDir.z())* 180./Geom::pi(),
280  180 - segment4DLocalDir.theta()* 180./Geom::pi());
281  else if((*segment).hasPhi())
282  h4DSegmAllCh->Fill(segment4DLocalPos.x(),
283  atan(segment4DLocalDir.x()/segment4DLocalDir.z())* 180./Geom::pi());
284  else if((*segment).hasZed())
285  cout<<"4d segment with only Z"<<endl;
286  else{
287  cout<<"ERROR: 4D segment without Z and Phi. Aborting!"<<endl;
288  abort();
289  }
290 
291  //loop over the segments
292  for(map<DTSuperLayerId,vector<DTRecHit1D> >::const_iterator slIdAndHits = hitsBySLMap.begin(); slIdAndHits != hitsBySLMap.end(); ++slIdAndHits) {
293  if (slIdAndHits->second.size() < 3) continue;
294  DTSuperLayerId slId = slIdAndHits->first;
295 
296  // Create the DTTMax, that computes the 4 TMax
297  DTTMax slSeg(slIdAndHits->second, *(chamber->superLayer(slIdAndHits->first)),chamber->toGlobal((*segment).localDirection()), chamber->toGlobal((*segment).localPosition()), theSync);
298 
299  if(theGranularity == bySL) {
300  vector<const TMax*> tMaxes = slSeg.getTMax(slId);
301  DTWireId wireId(slId, 0, 0);
302  theFile->cd();
303  cellInfo* cell = theWireIdAndCellMap[wireId];
304  if (cell==0) {
305  TString name = (((((TString) "TMax"+(long) slId.wheel()) +(long) slId.station())
306  +(long) slId.sector())+(long) slId.superLayer());
307  cell = new cellInfo(name);
308  theWireIdAndCellMap[wireId] = cell;
309  }
310  cell->add(tMaxes);
311  cell->update(); // FIXME to reset the counter to avoid triple counting, which actually is not used...
312  }
313  else {
314  cout << "[DTVDriftCalibration]###Warning: the chosen granularity is not implemented yet, only bySL available!" << endl;
315  }
316  // to be implemented: granularity different from bySL
317 
318  // else if (theGranularity == byPartition) {
319  // // Use the custom granularity defined by partition();
320  // // in this case, add() should be called once for each Tmax of each layer
321  // // and triple counting should be avoided within add()
322  // vector<cellInfo*> cells;
323  // for (int i=1; i<=4; i++) {
324  // const DTTMax::InfoLayer* iLayer = slSeg.getInfoLayer(i);
325  // if(iLayer == 0) continue;
326  // cellInfo * cell = partition(iLayer->idWire);
327  // cells.push_back(cell);
328  // vector<const TMax*> tMaxes = slSeg.getTMax(iLayer->idWire);
329  // cell->add(tMaxes);
330  // }
331  // //reset the counter to avoid triple counting
332  // for (vector<cellInfo*>::const_iterator i = cells.begin();
333  // i!= cells.end(); i++) {
334  // (*i)->update();
335  // }
336  // }
337  }
338  }
339  }
340 }
341 
343  theFile->cd();
344  gROOT->GetList()->Write();
345  h2DSegmRPhi->Write();
346  h2DSegmRZ->Write();
347  h4DSegmAllCh->Write();
348  hChi2->Write();
349  // Instantiate a DTCalibrationMap object if you want to calculate the calibration constants
350  DTCalibrationMap calibValuesFile(theCalibFilePar);
351  // Create the object to be written to DB
352  DTMtime* mTime = new DTMtime();
353 
354  // write the TMax histograms of each SL to the root file
355  if(theGranularity == bySL) {
356  for(map<DTWireId, cellInfo*>::const_iterator wireCell = theWireIdAndCellMap.begin();
357  wireCell != theWireIdAndCellMap.end(); wireCell++) {
358  cellInfo* cell= theWireIdAndCellMap[(*wireCell).first];
359  hTMaxCell* cellHists = cell->getHists();
360  theFile->cd();
361  cellHists->Write();
362  if(findVDriftAndT0) { // if TRUE: evaluate calibration constants from TMax hists filled in this job
363  // evaluate v_drift and sigma from the TMax histograms
364  DTWireId wireId = (*wireCell).first;
365  vector<float> newConstants;
366  TString N=(((((TString) "TMax"+(long) wireId.wheel()) +(long) wireId.station())
367  +(long) wireId.sector())+(long) wireId.superLayer());
368  vector<float> vDriftAndReso = theFitter->evaluateVDriftAndReso(N);
369 
370  // Don't write the constants for the SL if the vdrift was not computed
371  if(vDriftAndReso.front() == -1)
372  continue;
373  const DTCalibrationMap::CalibConsts* oldConstants = calibValuesFile.getConsts(wireId);
374  if(oldConstants != 0) {
375  newConstants.push_back((*oldConstants)[0]);
376  newConstants.push_back((*oldConstants)[1]);
377  newConstants.push_back((*oldConstants)[2]);
378  } else {
379  newConstants.push_back(-1);
380  newConstants.push_back(-1);
381  newConstants.push_back(-1);
382  }
383  for(int ivd=0; ivd<=5;ivd++) {
384  // 0=vdrift, 1=reso, 2=(3deltat0-2deltat0), 3=(2deltat0-1deltat0),
385  // 4=(1deltat0-0deltat0), 5=deltat0 from hists with max entries,
386  newConstants.push_back(vDriftAndReso[ivd]);
387  }
388 
389  calibValuesFile.addCell(calibValuesFile.getKey(wireId), newConstants);
390 
391  // vdrift is cm/ns , resolution is cm
392  mTime->set((wireId.layerId()).superlayerId(),
393  vDriftAndReso[0],
394  vDriftAndReso[1],
396  if(debug) {
397  cout << " SL: " << (wireId.layerId()).superlayerId()
398  << " vDrift = " << vDriftAndReso[0]
399  << " reso = " << vDriftAndReso[1] << endl;
400  }
401  }
402  }
403  }
404 
405  // to be implemented: granularity different from bySL
406 
407  // if(theGranularity == "byChamber") {
408  // const vector<DTChamber*> chambers = dMap.chambers();
409 
410  // // Loop over all chambers
411  // for(vector<MuBarChamber*>::const_iterator chamber = chambers.begin();
412  // chamber != chambers.end(); chamber ++) {
413  // MuBarChamberId chamber_id = (*chamber)->id();
414  // MuBarDigiParameters::Key wire_id(chamber_id, 0, 0, 0);
415  // vector<float> newConstants;
416  // vector<float> vDriftAndReso = evaluateVDriftAndReso(wire_id, f);
417  // const CalibConsts* oldConstants = digiParams.getConsts(wire_id);
418  // if(oldConstants !=0) {
419  // newConstants = *oldConstants;
420  // newConstants.push_back(vDriftAndReso[0]);
421  // newConstants.push_back(vDriftAndReso[1]);
422  // newConstants.push_back(vDriftAndReso[2]);
423  // newConstants.push_back(vDriftAndReso[3]);
424  // } else {
425  // newConstants.push_back(-1);
426  // newConstants.push_back(-1);
427  // newConstants.push_back(vDriftAndReso[0]);
428  // newConstants.push_back(vDriftAndReso[1]);
429  // newConstants.push_back(vDriftAndReso[2]);
430  // newConstants.push_back(vDriftAndReso[3]);
431  // }
432  // digiParams.addCell(wire_id, newConstants);
433  // }
434  // }
435 
436  //write values to a table
437  calibValuesFile.writeConsts(theVDriftOutputFile);
438 
439  if(debug)
440  cout << "[DTVDriftCalibration]Writing vdrift object to DB!" << endl;
441 
442  // Write the vdrift object to DB
443  string record = "DTMtimeRcd";
444  DTCalibDBUtils::writeToDB<DTMtime>(record, mTime);
445 
446 }
447 
448 
449 
450 // to be implemented: granularity different from bySL
451 
452 // // Create partitions
453 // DTVDriftCalibration::cellInfo* DTVDriftCalibration::partition(const DTWireId& wireId) {
454 // for( map<MuBarWireId, cellInfo*>::const_iterator iter =
455 // mapCellTmaxPart.begin(); iter != mapCellTmaxPart.end(); iter++) {
456 // // Divide wires per SL (with phi symmetry)
457 // if(iter->first.wheel() == wireId.wheel() &&
458 // iter->first.station() == wireId.station() &&
459 // // iter->first.sector() == wireId.sector() && // phi symmetry!
460 // iter->first.superlayer() == wireId.superlayer()) {
461 // return iter->second;
462 // }
463 // }
464 // cellInfo * result = new cellInfo("dummy string"); // FIXME: change constructor; create tree?
465 // mapCellTmaxPart.insert(make_pair(wireId, result));
466 // return result;
467 //}
468 
469 
470 void DTVDriftCalibration::cellInfo::add(vector<const TMax*> tMaxes) {
471  float tmax123 = -1.;
472  float tmax124 = -1.;
473  float tmax134 = -1.;
474  float tmax234 = -1.;
475  SigmaFactor s124 = noR;
476  SigmaFactor s134 = noR;
477  unsigned t0_123 = 0;
478  unsigned t0_124 = 0;
479  unsigned t0_134 = 0;
480  unsigned t0_234 = 0;
481  unsigned hSubGroup = 0;
482  for (vector<const TMax*>::const_iterator it=tMaxes.begin(); it!=tMaxes.end();
483  ++it) {
484  if(*it == 0) {
485  continue;
486  }
487  else {
488  //FIXME check cached,
489  if (addedCells.size()==4 ||
490  find(addedCells.begin(), addedCells.end(), (*it)->cells)
491  != addedCells.end()) {
492  continue;
493  }
494  addedCells.push_back((*it)->cells);
495  SigmaFactor sigma = (*it)->sigma;
496  float t = (*it)->t;
497  TMaxCells cells = (*it)->cells;
498  unsigned t0Factor = (*it)->t0Factor;
499  hSubGroup = (*it)->hSubGroup;
500  if(t < 0.) continue;
501  switch(cells) {
502  case notInit : cout << "Error: no cell type assigned to TMax" << endl; break;
503  case c123 : tmax123 =t; t0_123 = t0Factor; break;
504  case c124 : tmax124 =t; s124 = sigma; t0_124 = t0Factor; break;
505  case c134 : tmax134 =t; s134 = sigma; t0_134 = t0Factor; break;
506  case c234 : tmax234 =t; t0_234 = t0Factor; break;
507  }
508  }
509  }
510  //add entries to the TMax histograms
511  histos->Fill(tmax123, tmax124, tmax134, tmax234, s124, s134, t0_123,
512  t0_124, t0_134, t0_234, hSubGroup);
513 }
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
Key getKey(DTWireId wireId) const
void writeConsts(const std::string &outputFileName) const
std::pair< const_iterator, const_iterator > range
iterator range
Definition: RangeMap.h:52
JetCorrectorParameters::Record record
Definition: classes.h:11
int set(int wheelId, int stationId, int sectorId, int slId, float mTime, float mTrms, DTTimeUnits::type unit)
Definition: DTMtime.cc:266
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
Definition: GeomDet.h:49
Definition: DTTMax.h:34
T y() const
Definition: PV3DBase.h:57
LocalPoint toLocal(const GlobalPoint &gp) const
Conversion to the R.F. of the GeomDet.
Definition: GeomDet.h:64
identifier iterator
Definition: RangeMap.h:138
DTSuperLayerId superlayerId() const
Return the corresponding SuperLayerId.
Definition: DTLayerId.h:61
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:7
std::vector< const TMax * > getTMax(const DTWireId &idWire)
Definition: DTTMax.cc:327
dictionary map
Definition: Association.py:160
void bookHistos()
Definition: Histogram.h:33
Geom::Theta< T > theta() const
Definition: PV3DBase.h:69
C::const_iterator const_iterator
constant access iterator type
Definition: RangeMap.h:45
T z() const
Definition: PV3DBase.h:58
std::vector< float > CalibConsts
int superLayer() const
Return the superlayer number.
void addCell(Key wireId, const CalibConsts &calibConst)
tuple pset
Definition: CrabTask.py:85
TH1F * hChi2
void analyze(const edm::Event &event, const edm::EventSetup &eventSetup)
void Write()
Definition: vDriftHistos.h:358
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
virtual ~DTVDriftCalibration()
Destructor.
std::vector< DTRecHit1D > specificRecHits() const
Access to specific components.
DTSuperLayerId superLayerId() const
The id of the superlayer on which reside the segment.
virtual LocalPoint localPosition() const
local position in SL frame
dictionary histos
Definition: combine.py:3
const T & get() const
Definition: EventSetup.h:55
const CalibConsts * getConsts(DTWireId wireId) const
DTLayerId layerId() const
Return the corresponding LayerId.
Definition: DTWireId.h:64
double pi()
Definition: Pi.h:31
int sector() const
Definition: DTChamberId.h:63
DTVDriftCalibration(const edm::ParameterSet &pset)
Constructor.
virtual LocalVector localDirection() const
the local direction in SL frame
tuple cout
Definition: gather_cfg.py:41
int station() const
Return the station number.
Definition: DTChamberId.h:53
#define debug
Definition: MEtoEDMFormat.h:34
int wheel() const
Return the wheel number.
Definition: DTChamberId.h:47
void add(std::vector< const TMax * > tMaxes)
T x() const
Definition: PV3DBase.h:56
T get(const Candidate &c)
Definition: component.h:56
const DTSuperLayer * superLayer(DTSuperLayerId id) const
Return the superlayer corresponding to the given id.
Definition: DTChamber.cc:67