CMS 3D CMS Logo

DTLinearDriftFromDBAlgo.cc
Go to the documentation of this file.
1 /*
2  * See header file for a description of this class.
3  *
4  * \author S. Bolognesi - INFN Torino
5  */
6 
22 
23 using namespace std;
24 using namespace edm;
25 
28  mTimeMap(nullptr),
29  field(nullptr),
30  nominalB(-1),
31  minTime(config.getParameter<double>("minTime")),
32  maxTime(config.getParameter<double>("maxTime")),
33  doVdriftCorr(config.getParameter<bool>("doVdriftCorr")),
34  // Option to force going back to digi time at Step 2
35  stepTwoFromDigi(config.getParameter<bool>("stepTwoFromDigi")),
36  useUncertDB(config.getParameter<bool>("useUncertDB")),
37  // Set verbose output
38  debug(config.getUntrackedParameter<bool>("debug")) {}
39 
41 
43  if (debug)
44  cout << "[DTLinearDriftFromDBAlgo] setES called" << endl;
45  theSync->setES(setup);
46  // Get the map of ttrig from the Setup
47  ESHandle<DTMtime> mTimeHandle;
48  setup.get<DTMtimeRcd>().get(mTimeHandle);
49  mTimeMap = &*mTimeHandle;
50 
53  field = &*magfield;
55 
56  if (useUncertDB) {
58  setup.get<DTRecoConditionsUncertRcd>().get(uncerts);
59  uncertMap = &*uncerts;
60  if (uncertMap->version() > 1)
61  edm::LogError("NotImplemented") << "DT Uncertainty DB version unsupported: " << uncertMap->version();
62  }
63 
64  if (debug) {
65  cout << "[DTLinearDriftFromDBAlgo] meanTimer version: " << mTimeMap->version() << endl;
66  if (useUncertDB)
67  cout << " uncertDB version: " << uncertMap->version() << endl;
68  }
69 }
70 
71 // First Step
73  const DTLayer* layer, const DTDigi& digi, LocalPoint& leftPoint, LocalPoint& rightPoint, LocalError& error) const {
74  // Get the wireId
75  DTLayerId layerId = layer->id();
76  const DTWireId wireId(layerId, digi.wire());
77 
78  // Get Wire position
79  if (!layer->specificTopology().isWireValid(digi.wire()))
80  return false;
81  LocalPoint locWirePos(layer->specificTopology().wirePosition(digi.wire()), 0, 0);
82  const GlobalPoint globWirePos = layer->toGlobal(locWirePos);
83 
84  return compute(layer, wireId, digi.time(), globWirePos, leftPoint, rightPoint, error, 1);
85 }
86 
87 // Second step: the same as 1st step (optionally, redo 1st step starting from digi time)
89  const DTRecHit1D& recHit1D,
90  const float& angle,
91  DTRecHit1D& newHit1D) const {
92  if (!stepTwoFromDigi) {
93  newHit1D.setPositionAndError(recHit1D.localPosition(), recHit1D.localPositionError());
94  return true;
95  }
96 
97  const DTWireId wireId = recHit1D.wireId();
98 
99  // Get Wire position
100  if (!layer->specificTopology().isWireValid(wireId.wire()))
101  return false;
102  LocalPoint locWirePos(layer->specificTopology().wirePosition(wireId.wire()), 0, 0);
103  const GlobalPoint globWirePos = layer->toGlobal(locWirePos);
104 
105  return compute(layer, wireId, recHit1D.digiTime(), globWirePos, newHit1D, 2);
106 }
107 
108 // Third step.
110  const DTRecHit1D& recHit1D,
111  const float& angle,
112  const GlobalPoint& globPos,
113  DTRecHit1D& newHit1D) const {
114  return compute(layer, recHit1D.wireId(), recHit1D.digiTime(), globPos, newHit1D, 3);
115 }
116 
117 // Do the actual work.
119  const DTWireId& wireId,
120  const float digiTime,
121  const GlobalPoint& globPos,
122  LocalPoint& leftPoint,
123  LocalPoint& rightPoint,
124  LocalError& error,
125  int step) const {
126  // Subtract the offset to the digi time accordingly to the DTTTrigBaseSync concrete instance
127  float driftTime = digiTime - theSync->offset(layer, wireId, globPos);
128 
129  // check for out-of-time
130  if (driftTime < minTime || driftTime > maxTime) {
131  if (debug)
132  cout << "[DTLinearDriftFromDBAlgo]*** Drift time out of window for in-time hits " << driftTime << endl;
133 
134  if (step == 1) { //FIXME: protection against failure at 2nd and 3rd steps, must be checked!!!
135  // Hits are interpreted as coming from out-of-time pile-up and recHit
136  // is ignored.
137  return false;
138  }
139  }
140 
141  // Small negative times interpreted as hits close to the wire.
142  if (driftTime < 0.)
143  driftTime = 0;
144 
145  // Read the vDrift and reso for this wire
146  float vDrift = 0;
147  float hitResolution = 0;
148  // vdrift is cm/ns , resolution is cm
149  mTimeMap->get(wireId.superlayerId(),
150  vDrift,
151  hitResolution, // Value from vdrift DB; replaced below if useUncertDB card is set
153 
154  if (useUncertDB) {
155  // Read the uncertainty from the DB for the given channel and step
156  double args[1] = {double(step - 1)};
157  hitResolution = uncertMap->get(wireId, args);
158  }
159 
160  //only in step 3
161  if (doVdriftCorr && step == 3 && nominalB != 0) {
162  if (abs(wireId.wheel()) == 2 && wireId.station() == 1 && wireId.superLayer() != 2) {
163  // Variation of vdrift along Y due to B field,
165  // vdrift is lower a negative Y (lower global |Z|)
166  const float k_param = 1.2e-04;
167  LocalPoint local_pos = layer->toLocal(globPos);
168  vDrift = vDrift * (1. - k_param * local_pos.y());
169  }
170  }
171 
172  // Compute the drift distance
173  float drift = driftTime * vDrift;
174 
175  // Get Wire position
176  if (!layer->specificTopology().isWireValid(wireId.wire()))
177  return false;
178  LocalPoint locWirePos(layer->specificTopology().wirePosition(wireId.wire()), 0, 0);
179  //Build the two possible points and the error on the position
180  leftPoint = LocalPoint(locWirePos.x() - drift, locWirePos.y(), locWirePos.z());
181  rightPoint = LocalPoint(locWirePos.x() + drift, locWirePos.y(), locWirePos.z());
183 
184  if (debug) {
185  cout << "[DTLinearDriftFromDBAlgo] Compute drift distance, for digi at wire: " << wireId << endl
186  << " Step: " << step << endl
187  << " Digi time: " << digiTime << endl
188  << " Drift time: " << driftTime << endl
189  << " Drift distance: " << drift << endl
190  << " Hit Resolution: " << hitResolution << endl
191  << " Left point: " << leftPoint << endl
192  << " Right point: " << rightPoint << endl
193  << " Error: " << error << endl;
194  }
195 
196  return true;
197 }
198 
199 // Interface to the method which does the actual work suited for 2nd and 3rd steps
201  const DTWireId& wireId,
202  const float digiTime,
203  const GlobalPoint& globPos,
204  DTRecHit1D& newHit1D,
205  int step) const {
206  LocalPoint leftPoint;
207  LocalPoint rightPoint;
209 
210  if (compute(layer, wireId, digiTime, globPos, leftPoint, rightPoint, error, step)) {
211  // Set the position and the error of the rechit which is being updated
212  switch (newHit1D.lrSide()) {
213  case DTEnums::Left: {
214  // Keep the original y position of newHit1D: for step==3, it's the
215  // position along the wire. Needed for rotation alignment
216  LocalPoint leftPoint3D(leftPoint.x(), newHit1D.localPosition().y(), leftPoint.z());
217  newHit1D.setPositionAndError(leftPoint3D, error);
218  break;
219  }
220 
221  case DTEnums::Right: {
222  // as above: 3d position
223  LocalPoint rightPoint3D(rightPoint.x(), newHit1D.localPosition().y(), rightPoint.z());
224  newHit1D.setPositionAndError(rightPoint3D, error);
225  break;
226  }
227 
228  default:
229  throw cms::Exception("InvalidDTCellSide") << "[DTLinearDriftFromDBAlgo] Compute at Step " << step
230  << ", Hit side " << newHit1D.lrSide() << " is invalid!" << endl;
231  return false;
232  }
233 
234  return true;
235  } else {
236  return false;
237  }
238 }
writedatasetfile.args
args
Definition: writedatasetfile.py:18
DTWireId::wire
int wire() const
Return the wire number.
Definition: DTWireId.h:42
electrons_cff.bool
bool
Definition: electrons_cff.py:366
HLT_FULL_cff.doVdriftCorr
doVdriftCorr
Definition: HLT_FULL_cff.py:8961
MessageLogger.h
DTMtime.h
ESHandle.h
step
step
Definition: StallMonitor.cc:94
HLT_FULL_cff.minTime
minTime
Definition: HLT_FULL_cff.py:8962
PV3DBase::x
T x() const
Definition: PV3DBase.h:59
DTRecHit1D::lrSide
DTEnums::DTCellSide lrSide() const
The side of the cell.
Definition: DTRecHit1D.h:61
edm
HLT enums.
Definition: AlignableModifier.h:19
DTLinearDriftFromDBAlgo::useUncertDB
bool useUncertDB
Definition: DTLinearDriftFromDBAlgo.h:104
DTRecHitBaseAlgo
Definition: DTRecHitBaseAlgo.h:29
DTLinearDriftFromDBAlgo::maxTime
const float maxTime
Definition: DTLinearDriftFromDBAlgo.h:93
gather_cfg.cout
cout
Definition: gather_cfg.py:144
DTRecHit1D
Definition: DTRecHit1D.h:25
DTRecoConditionsUncertRcd.h
DTSuperLayerId::superLayer
int superLayer() const
Return the superlayer number.
Definition: DTSuperLayerId.h:39
align::LocalPoint
Point3DBase< Scalar, LocalTag > LocalPoint
Definition: Definitions.h:30
DTRecHit1D::localPositionError
LocalError localPositionError() const override
Return the 3-dimensional error on the local position.
Definition: DTRecHit1D.h:50
relativeConstraints.error
error
Definition: relativeConstraints.py:53
DTDigi::time
double time() const
Get time in ns.
Definition: DTDigi.cc:37
HLT_FULL_cff.maxTime
maxTime
Definition: HLT_FULL_cff.py:8946
singleTopDQM_cfi.setup
setup
Definition: singleTopDQM_cfi.py:37
DTRecoConditions::get
float get(const DTWireId &wireid, double *x=nullptr) const
Get the value correspoding to the given WireId, / using x[] as parameters of the parametrization when...
Definition: DTRecoConditions.cc:42
DTRecHit1D::setPositionAndError
void setPositionAndError(LocalPoint pos, LocalError err)
Set the local position and its error.
Definition: DTRecHit1D.h:70
PV3DBase::z
T z() const
Definition: PV3DBase.h:61
IdealMagneticFieldRecord
Definition: IdealMagneticFieldRecord.h:11
config
Definition: config.py:1
DTRecHit1D::wireId
DTWireId wireId() const
Return the wireId.
Definition: DTRecHit1D.h:76
DTEnums::Left
Definition: DTEnums.h:15
debug
#define debug
Definition: HDRShower.cc:19
shallow::drift
LocalVector drift(const StripGeomDetUnit *, const MagneticField &, const SiStripLorentzAngle &)
Definition: ShallowTools.cc:36
DTDigi::wire
int wire() const
Return wire number.
Definition: DTDigi.cc:41
DTRecoConditions::version
int version() const
Version numer specifying the structure of the payload. See .cc file for details.
Definition: DTRecoConditions.h:43
DTRecoConditions.h
DTLinearDriftFromDBAlgo::doVdriftCorr
const bool doVdriftCorr
Definition: DTLinearDriftFromDBAlgo.h:96
DTRecHitBaseAlgo::theSync
std::unique_ptr< DTTTrigBaseSync > theSync
Definition: DTRecHitBaseAlgo.h:81
DTWireId
Definition: DTWireId.h:12
IdealMagneticFieldRecord.h
edm::ESHandle< DTMtime >
MagneticField::nominalValue
int nominalValue() const
The nominal field value for this map in kGauss.
Definition: MagneticField.h:49
Point3DBase< float, LocalTag >
DTLayerId
Definition: DTLayerId.h:12
DTLayer.h
phase1PixelTopology::layer
constexpr std::array< uint8_t, layerIndexSize > layer
Definition: phase1PixelTopology.h:99
DTRecHit1D::localPosition
LocalPoint localPosition() const override
Return the 3-dimensional local position.
Definition: DTRecHit1D.h:47
edm::ParameterSet
Definition: ParameterSet.h:47
HLT_FULL_cff.useUncertDB
useUncertDB
Definition: HLT_FULL_cff.py:8960
DTVelocityUnits::cm_per_ns
Definition: DTVelocityUnits.h:32
DTMtimeRcd.h
LocalError
Definition: LocalError.h:12
DTLinearDriftFromDBAlgo::uncertMap
const DTRecoConditions * uncertMap
Definition: DTLinearDriftFromDBAlgo.h:87
DTLinearDriftFromDBAlgo::setES
void setES(const edm::EventSetup &setup) override
Pass the Event Setup to the algo at each event.
Definition: DTLinearDriftFromDBAlgo.cc:42
PV3DBase::y
T y() const
Definition: PV3DBase.h:60
DTMtime::version
const std::string & version() const
access version
Definition: DTMtime.cc:158
DTLinearDriftFromDBAlgo::nominalB
int nominalB
Definition: DTLinearDriftFromDBAlgo.h:84
DTTTrigBaseSync.h
DTLinearDriftFromDBAlgo::DTLinearDriftFromDBAlgo
DTLinearDriftFromDBAlgo(const edm::ParameterSet &config)
Constructor.
Definition: DTLinearDriftFromDBAlgo.cc:26
DTLinearDriftFromDBAlgo::debug
const bool debug
Definition: DTLinearDriftFromDBAlgo.h:107
MagneticField.h
DTRecoConditionsUncertRcd
Definition: DTRecoConditionsUncertRcd.h:5
edm::EventSetup
Definition: EventSetup.h:58
DTLinearDriftFromDBAlgo::mTimeMap
const DTMtime * mTimeMap
Definition: DTLinearDriftFromDBAlgo.h:80
DTLinearDriftFromDBAlgo::~DTLinearDriftFromDBAlgo
~DTLinearDriftFromDBAlgo() override
Destructor.
Definition: DTLinearDriftFromDBAlgo.cc:40
get
#define get
DTLinearDriftAlgo_cfi.hitResolution
hitResolution
Definition: DTLinearDriftAlgo_cfi.py:13
DTLayer
Definition: DTLayer.h:25
DTRecHit1D::digiTime
float digiTime() const
Return the time (ns) of the digi used to build the rechit.
Definition: DTRecHit1D.h:79
DTLinearDriftFromDBAlgo::field
const MagneticField * field
Definition: DTLinearDriftFromDBAlgo.h:83
DTEnums::Right
Definition: DTEnums.h:15
std
Definition: JetResolutionObject.h:76
HLT_FULL_cff.stepTwoFromDigi
stepTwoFromDigi
Definition: HLT_FULL_cff.py:8948
DTWireId.h
DTLinearDriftFromDBAlgo::stepTwoFromDigi
const bool stepTwoFromDigi
Definition: DTLinearDriftFromDBAlgo.h:100
DTLinearDriftFromDBAlgo::compute
bool compute(const DTLayer *layer, const DTDigi &digi, LocalPoint &leftPoint, LocalPoint &rightPoint, LocalError &error) const override
Definition: DTLinearDriftFromDBAlgo.cc:72
Exception
Definition: hltDiff.cc:245
DTLayerId::superlayerId
DTSuperLayerId superlayerId() const
Return the corresponding SuperLayerId.
Definition: DTLayerId.h:45
angle
T angle(T x1, T y1, T z1, T x2, T y2, T z2)
Definition: angle.h:11
DTDigi
Definition: DTDigi.h:17
EventSetup.h
Exception.h
DTLinearDriftFromDBAlgo.h
funct::abs
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
ParameterSet.h
edm::Log
Definition: MessageLogger.h:70
volumeBasedMagneticField_160812_cfi.magfield
magfield
Definition: volumeBasedMagneticField_160812_cfi.py:11
DTMtime::get
int get(int wheelId, int stationId, int sectorId, int slId, float &mTime, float &mTrms, DTTimeUnits::type unit) const
Definition: DTMtime.cc:56
DTChamberId::wheel
int wheel() const
Return the wheel number.
Definition: DTChamberId.h:39
DTChamberId::station
int station() const
Return the station number.
Definition: DTChamberId.h:42
DTMtimeRcd
Definition: DTMtimeRcd.h:5