CMS 3D CMS Logo

DTTTrigSyncFromDB.cc
Go to the documentation of this file.
1 /*
2  * See header file for a description of this class.
3  *
4  * \author G. Cerminara - INFN Torino
5  */
6 
7 #include "DTTTrigSyncFromDB.h"
8 
19 
20 #include <iostream>
21 
22 using namespace std;
23 using namespace edm;
24 
26  : debug(config.getUntrackedParameter<bool>("debug")),
27  // The velocity of signal propagation along the wire (cm/ns)
28  theVPropWire(config.getParameter<double>("vPropWire")),
29  // Switch on/off the T0 correction from pulses
30  doT0Correction(config.getParameter<bool>("doT0Correction")),
31  // Switch on/off the TOF correction for particles from IP
32  doTOFCorrection(config.getParameter<bool>("doTOFCorrection")),
33  theTOFCorrType(config.getParameter<int>("tofCorrType")),
34  // Switch on/off the correction for the signal propagation along the wire
35  doWirePropCorrection(config.getParameter<bool>("doWirePropCorrection")),
36  theWirePropCorrType(config.getParameter<int>("wirePropCorrType")),
37  // spacing of BX in ns
38  theBXspace(config.getUntrackedParameter<double>("bxSpace", 25.)),
39  thetTrigLabel(config.getParameter<string>("tTrigLabel")) {}
40 
42 
44  if (doT0Correction) {
45  // Get the map of t0 from pulses from the Setup
46  ESHandle<DTT0> t0Handle;
47  setup.get<DTT0Rcd>().get(t0Handle);
48  tZeroMap = &*t0Handle;
49  if (debug) {
50  cout << "[DTTTrigSyncFromDB] t0 version: " << tZeroMap->version() << endl;
51  }
52  }
53 
54  // Get the map of ttrig from the Setup
55  ESHandle<DTTtrig> ttrigHandle;
56  setup.get<DTTtrigRcd>().get(thetTrigLabel, ttrigHandle);
57  tTrigMap = &*ttrigHandle;
58  if (debug) {
59  cout << "[DTTTrigSyncFromDB] ttrig version: " << tTrigMap->version() << endl;
60  }
61 }
62 
63 double DTTTrigSyncFromDB::offset(const DTLayer* layer,
64  const DTWireId& wireId,
65  const GlobalPoint& globPos,
66  double& tTrig,
67  double& wirePropCorr,
68  double& tofCorr) const {
69  // Correction for the float to int conversion while writeing the ttrig in ns into an int variable
70  // (half a bin on average)
71  // FIXME: this should disappear as soon as the ttrig object will become a float
72  // static const float f2i_convCorr = (25./64.); // ns //FIXME: check how the conversion is performed
73 
74  tTrig = offset(wireId);
75 
76  // Compute the time spent in signal propagation along wire.
77  // NOTE: the FE is always at y>0
78  wirePropCorr = 0;
80  switch (theWirePropCorrType) {
81  // The ttrig computed from the timebox accounts on average for the signal propagation time
82  // from the center of the wire to the frontend. Here we just have to correct for
83  // the distance of the hit from the wire center.
84  case 0: {
85  float wireCoord = layer->toLocal(globPos).y();
86  wirePropCorr = -wireCoord / theVPropWire;
87  break;
88  // FIXME: What if hits used for the time box are not distributed uniformly along the wire?
89  }
90  //On simulated data you need to subtract the total propagation time
91  case 1: {
92  float halfL = layer->specificTopology().cellLenght() / 2;
93  float wireCoord = layer->toLocal(globPos).y();
94  float propgL = halfL - wireCoord;
95  wirePropCorr = propgL / theVPropWire;
96  break;
97  }
98  default: {
99  throw cms::Exception("[DTTTrigSyncFromDB]")
100  << " Invalid parameter: wirePropCorrType = " << theWirePropCorrType << std::endl;
101  break;
102  }
103  }
104  }
105 
106  // Compute TOF correction:
107  tofCorr = 0.;
108  // TOF Correction can be switched off with appropriate parameter
109  if (doTOFCorrection) {
110  float flightToHit = globPos.mag();
111  static const float cSpeed = 29.9792458; // cm/ns
112  switch (theTOFCorrType) {
113  case 0: {
114  // The ttrig computed from the real data accounts on average for the TOF correction
115  // Depending on the granularity used for the ttrig computation we just have to correct for the
116  // TOF from the center of the chamber, SL, layer or wire to the hit position.
117  // At the moment only SL granularity is considered
118  // Correction for TOF from the center of the SL to hit position
119  const DTSuperLayer* sl = layer->superLayer();
120  double flightToSL = sl->surface().position().mag();
121  tofCorr = (flightToSL - flightToHit) / cSpeed;
122  break;
123  }
124  case 1: {
125  // On simulated data you need to consider only the TOF from 3D center of the wire to hit position
126  // (because the TOF from the IP to the wire has been already subtracted in the digitization:
127  // SimMuon/DTDigitizer/DTDigiSyncTOFCorr.cc corrType=2)
128  float flightToWire =
129  layer->toGlobal(LocalPoint(layer->specificTopology().wirePosition(wireId.wire()), 0., 0.)).mag();
130  tofCorr = (flightToWire - flightToHit) / cSpeed;
131  break;
132  }
133  default: {
134  throw cms::Exception("[DTTTrigSyncFromDB]")
135  << " Invalid parameter: tofCorrType = " << theTOFCorrType << std::endl;
136  break;
137  }
138  }
139  }
140 
141  if (debug) {
142  cout << "[DTTTrigSyncFromDB] Channel: " << wireId << endl
143  << " Offset (ns): " << tTrig + wirePropCorr - tofCorr << endl
144  << " various contributions are: " << endl
145  << " tTrig + t0 (ns): " << tTrig
146  << endl
147  //<< " tZero (ns): " << t0 << endl
148  << " Propagation along wire delay (ns): " << wirePropCorr << endl
149  << " TOF correction (ns): " << tofCorr << endl
150  << endl;
151  }
152  //The global offset is the sum of various contributions
153  return tTrig + wirePropCorr - tofCorr;
154 }
155 
156 double DTTTrigSyncFromDB::offset(const DTWireId& wireId) const {
157  float t0 = 0;
158  float t0rms = 0;
159  if (doT0Correction) {
160  // Read the t0 from pulses for this wire (ns)
161  tZeroMap->get(wireId, t0, t0rms, DTTimeUnits::ns);
162  }
163 
164  // Read the ttrig for this wire
165  float ttrigMean = 0;
166  float ttrigSigma = 0;
167  float kFactor = 0;
168  // FIXME: should check the return value of the DTTtrigRcd::get(..) method
169  if (tTrigMap->get(wireId.superlayerId(), ttrigMean, ttrigSigma, kFactor, DTTimeUnits::ns) != 0) {
170  cout << "[DTTTrigSyncFromDB]*Error: ttrig not found for SL: " << wireId.superlayerId() << endl;
171  // FIXME: LogError.....
172  }
173 
174  return t0 + ttrigMean + kFactor * ttrigSigma;
175 }
176 
177 double DTTTrigSyncFromDB::emulatorOffset(const DTWireId& wireId, double& tTrig, double& t0cell) const {
178  float t0 = 0;
179  float t0rms = 0;
180  if (doT0Correction) {
181  // Read the t0 from pulses for this wire (ns)
182  tZeroMap->get(wireId, t0, t0rms, DTTimeUnits::ns);
183  }
184 
185  // Read the ttrig for this wire
186  float ttrigMean = 0;
187  float ttrigSigma = 0;
188  float kFactor = 0;
189  // FIXME: should check the return value of the DTTtrigRcd::get(..) method
190  if (tTrigMap->get(wireId.superlayerId(), ttrigMean, ttrigSigma, kFactor, DTTimeUnits::ns) != 0) {
191  cout << "[DTTTrigSyncFromDB]*Error: ttrig not found for SL: " << wireId.superlayerId() << endl;
192  // FIXME: LogError.....
193  }
194 
195  tTrig = ttrigMean + kFactor * ttrigSigma;
196  t0cell = t0;
197 
198  return int(tTrig / theBXspace) * theBXspace + t0cell;
199 }
const DTTtrig * tTrigMap
float wirePosition(int wireNumber) const
Returns the x position in the layer of a given wire number.
Definition: DTTopology.cc:59
const DTT0 * tZeroMap
Point3DBase< Scalar, LocalTag > LocalPoint
Definition: Definitions.h:30
double offset(const DTLayer *layer, const DTWireId &wireId, const GlobalPoint &globPos, double &tTrig, double &wirePropCorr, double &tofCorr) const override
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
Definition: GeomDet.h:49
T y() const
Definition: PV3DBase.h:60
const std::string & version() const
access version
Definition: DTTtrig.cc:162
LocalPoint toLocal(const GlobalPoint &gp) const
Conversion to the R.F. of the GeomDet.
Definition: GeomDet.h:58
Definition: config.py:1
void setES(const edm::EventSetup &setup) override
Pass the Event Setup to the algo at each event.
DTSuperLayerId superlayerId() const
Return the corresponding SuperLayerId.
Definition: DTLayerId.h:45
~DTTTrigSyncFromDB() override
Destructor.
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:37
int get(int wheelId, int stationId, int sectorId, int slId, int layerId, int cellId, float &t0mean, float &t0rms, DTTimeUnits::type unit) const
Definition: DTT0.cc:48
double emulatorOffset(const DTWireId &wireId, double &tTrig, double &t0cell) const override
const DTTopology & specificTopology() const
Definition: DTLayer.cc:37
T mag() const
Definition: PV3DBase.h:64
int wire() const
Return the wire number.
Definition: DTWireId.h:42
std::string thetTrigLabel
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
#define debug
Definition: HDRShower.cc:19
const DTSuperLayer * superLayer() const
Definition: DTLayer.cc:43
Definition: DTT0Rcd.h:9
HLT enums.
T get() const
Definition: EventSetup.h:73
DTTTrigSyncFromDB(const edm::ParameterSet &config)
Constructor.
const std::string & version() const
access version
Definition: DTT0.cc:82
float cellLenght() const
Definition: DTTopology.h:74
const PositionType & position() const