CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Member Functions | Private Member Functions | Private Attributes
DTLinearDriftFromDBAlgo Class Reference

#include <DTLinearDriftFromDBAlgo.h>

Inheritance diagram for DTLinearDriftFromDBAlgo:
DTRecHitBaseAlgo

Public Member Functions

virtual bool compute (const DTLayer *layer, const DTDigi &digi, LocalPoint &leftPoint, LocalPoint &rightPoint, LocalError &error) const
 
virtual bool compute (const DTLayer *layer, const DTRecHit1D &recHit1D, const float &angle, DTRecHit1D &newHit1D) const
 
virtual bool compute (const DTLayer *layer, const DTRecHit1D &recHit1D, const float &angle, const GlobalPoint &globPos, DTRecHit1D &newHit1D) const
 
 DTLinearDriftFromDBAlgo (const edm::ParameterSet &config)
 Constructor. More...
 
virtual void setES (const edm::EventSetup &setup)
 Pass the Event Setup to the algo at each event. More...
 
virtual ~DTLinearDriftFromDBAlgo ()
 Destructor. More...
 
- Public Member Functions inherited from DTRecHitBaseAlgo
 DTRecHitBaseAlgo (const edm::ParameterSet &config)
 Constructor. More...
 
virtual edm::OwnVector
< DTRecHit1DPair
reconstruct (const DTLayer *layer, const DTLayerId &layerId, const DTDigiCollection::Range &digiRange)
 Build all hits in the range associated to the layerId, at the 1st step. More...
 
virtual ~DTRecHitBaseAlgo ()
 Destructor. More...
 

Private Member Functions

virtual bool compute (const DTLayer *layer, const DTWireId &wireId, const float digiTime, const GlobalPoint &globPos, LocalPoint &leftPoint, LocalPoint &rightPoint, LocalError &error, int step) const
 
virtual bool compute (const DTLayer *layer, const DTWireId &wireId, const float digiTime, const GlobalPoint &globPos, DTRecHit1D &newHit1D, int step) const
 

Private Attributes

const bool debug
 
const bool doVdriftCorr
 
const MagneticFieldfield
 
const float maxTime
 
const float minTime
 
const DTMtimemTimeMap
 
int nominalB
 
const bool stepTwoFromDigi
 
const DTRecoUncertaintiesuncertMap
 
bool useUncertDB
 

Additional Inherited Members

- Protected Attributes inherited from DTRecHitBaseAlgo
DTTTrigBaseSynctheSync
 

Detailed Description

Concrete implementation of DTRecHitBaseAlgo. Compute drift distance using constant drift velocity read from database.

Author
S.Bolognesi - INFN Torino

Definition at line 18 of file DTLinearDriftFromDBAlgo.h.

Constructor & Destructor Documentation

DTLinearDriftFromDBAlgo::DTLinearDriftFromDBAlgo ( const edm::ParameterSet config)

Constructor.

Definition at line 26 of file DTLinearDriftFromDBAlgo.cc.

References gather_cfg::cout, debug, edm::ParameterSet::existsAs(), edm::ParameterSet::getParameter(), and useUncertDB.

26  :
27  DTRecHitBaseAlgo(config),
28  mTimeMap(0),
29  field(0),
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(false),
37  // Set verbose output
38  debug(config.getUntrackedParameter<bool>("debug"))
39 {
40  if(debug)
41  cout<<"[DTLinearDriftFromDBAlgo] Constructor called"<<endl;
42 
43  // Check for compatibility with older configurations
44  if (config.existsAs<bool>("useUncertDB")) {
45  // Assign hit uncertainties based on new uncertainties DB
46  useUncertDB= config.getParameter<bool>("useUncertDB");
47  }
48 }
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
bool existsAs(std::string const &parameterName, bool trackiness=true) const
checks if a parameter exists as a given type
Definition: ParameterSet.h:186
DTRecHitBaseAlgo(const edm::ParameterSet &config)
Constructor.
const MagneticField * field
tuple cout
Definition: gather_cfg.py:121
DTLinearDriftFromDBAlgo::~DTLinearDriftFromDBAlgo ( )
virtual

Destructor.

Definition at line 52 of file DTLinearDriftFromDBAlgo.cc.

52 {}

Member Function Documentation

bool DTLinearDriftFromDBAlgo::compute ( const DTLayer layer,
const DTDigi digi,
LocalPoint leftPoint,
LocalPoint rightPoint,
LocalError error 
) const
virtual

First step in computation of Left/Right hits from a Digi. The results are the local position (in DTLayer frame) of the Left and Right hit, and the error (which is common). Returns false on failure. The hit is assumed to be at the wire center.

Implements DTRecHitBaseAlgo.

Definition at line 89 of file DTLinearDriftFromDBAlgo.cc.

References relativeConstraints::error, DTLayer::id(), DTTopology::isWireValid(), DTLayer::specificTopology(), DTDigi::time(), GeomDet::toGlobal(), DTDigi::wire(), and DTTopology::wirePosition().

Referenced by compute().

93  {
94  // Get the wireId
95  DTLayerId layerId = layer->id();
96  const DTWireId wireId(layerId, digi.wire());
97 
98  // Get Wire position
99  if(!layer->specificTopology().isWireValid(digi.wire())) return false;
100  LocalPoint locWirePos(layer->specificTopology().wirePosition(digi.wire()), 0, 0);
101  const GlobalPoint globWirePos = layer->toGlobal(locWirePos);
102 
103  return compute(layer, wireId, digi.time(), globWirePos, leftPoint, rightPoint, error, 1);
104 }
float wirePosition(int wireNumber) const
Returns the x position in the layer of a given wire number.
Definition: DTTopology.cc:86
DTLayerId id() const
Return the DetId of this SL.
Definition: DTLayer.cc:46
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
Definition: GeomDet.h:52
virtual bool compute(const DTLayer *layer, const DTDigi &digi, LocalPoint &leftPoint, LocalPoint &rightPoint, LocalError &error) const
int wire() const
Return wire number.
Definition: DTDigi.cc:67
const DTTopology & specificTopology() const
Definition: DTLayer.cc:42
double time() const
Get time in ns.
Definition: DTDigi.cc:63
bool isWireValid(const int wireNumber) const
Definition: DTTopology.h:65
bool DTLinearDriftFromDBAlgo::compute ( const DTLayer layer,
const DTRecHit1D recHit1D,
const float &  angle,
DTRecHit1D newHit1D 
) const
virtual

Second step in hit position computation. It is the same as first step since the angular information is not used NOTE: Only position and error of the new hit are modified

Implements DTRecHitBaseAlgo.

Definition at line 109 of file DTLinearDriftFromDBAlgo.cc.

References compute(), DTRecHit1D::digiTime(), DTTopology::isWireValid(), DTRecHit1D::localPosition(), DTRecHit1D::localPositionError(), DTRecHit1D::setPositionAndError(), DTLayer::specificTopology(), stepTwoFromDigi, GeomDet::toGlobal(), DTWireId::wire(), DTRecHit1D::wireId(), and DTTopology::wirePosition().

112  {
113 
114  if (!stepTwoFromDigi) {
115  newHit1D.setPositionAndError(recHit1D.localPosition(), recHit1D.localPositionError());
116  return true;
117  }
118 
119  const DTWireId wireId = recHit1D.wireId();
120 
121  // Get Wire position
122  if(!layer->specificTopology().isWireValid(wireId.wire())) return false;
123  LocalPoint locWirePos(layer->specificTopology().wirePosition(wireId.wire()), 0, 0);
124  const GlobalPoint globWirePos = layer->toGlobal(locWirePos);
125 
126  return compute(layer, wireId, recHit1D.digiTime(), globWirePos, newHit1D, 2);
127 
128 }
float wirePosition(int wireNumber) const
Returns the x position in the layer of a given wire number.
Definition: DTTopology.cc:86
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
Definition: GeomDet.h:52
virtual bool compute(const DTLayer *layer, const DTDigi &digi, LocalPoint &leftPoint, LocalPoint &rightPoint, LocalError &error) const
const DTTopology & specificTopology() const
Definition: DTLayer.cc:42
float digiTime() const
Return the time (ns) of the digi used to build the rechit.
Definition: DTRecHit1D.h:113
virtual LocalError localPositionError() const
Return the 3-dimensional error on the local position.
Definition: DTRecHit1D.h:66
virtual LocalPoint localPosition() const
Return the 3-dimensional local position.
Definition: DTRecHit1D.h:60
int wire() const
Return the wire number.
Definition: DTWireId.h:56
bool isWireValid(const int wireNumber) const
Definition: DTTopology.h:65
void setPositionAndError(LocalPoint pos, LocalError err)
Set the local position and its error.
Definition: DTRecHit1D.h:100
DTWireId wireId() const
Return the wireId.
Definition: DTRecHit1D.h:107
bool DTLinearDriftFromDBAlgo::compute ( const DTLayer layer,
const DTRecHit1D recHit1D,
const float &  angle,
const GlobalPoint globPos,
DTRecHit1D newHit1D 
) const
virtual

Third (and final) step in hits position computation. Also the hit position along the wire is available and can be used to correct the drift time for particle TOF and propagation of signal along the wire. NOTE: Only position and error of the new hit are modified

Implements DTRecHitBaseAlgo.

Definition at line 133 of file DTLinearDriftFromDBAlgo.cc.

References compute(), DTRecHit1D::digiTime(), and DTRecHit1D::wireId().

137  {
138  return compute(layer, recHit1D.wireId(), recHit1D.digiTime(), globPos, newHit1D, 3);
139 }
virtual bool compute(const DTLayer *layer, const DTDigi &digi, LocalPoint &leftPoint, LocalPoint &rightPoint, LocalError &error) const
float digiTime() const
Return the time (ns) of the digi used to build the rechit.
Definition: DTRecHit1D.h:113
DTWireId wireId() const
Return the wireId.
Definition: DTRecHit1D.h:107
bool DTLinearDriftFromDBAlgo::compute ( const DTLayer layer,
const DTWireId wireId,
const float  digiTime,
const GlobalPoint globPos,
LocalPoint leftPoint,
LocalPoint rightPoint,
LocalError error,
int  step 
) const
privatevirtual

cf. http://arxiv.org/PS_cache/arxiv/pdf/0911/0911.4895v2.pdf

Definition at line 144 of file DTLinearDriftFromDBAlgo.cc.

References funct::abs(), DTVelocityUnits::cm_per_ns, gather_cfg::cout, debug, doVdriftCorr, shallow::drift(), DTRecoUncertainties::get(), DTMtime::get(), DTTopology::isWireValid(), maxTime, mTimeMap, nominalB, DTTTrigBaseSync::offset(), DTLayer::specificTopology(), DTChamberId::station(), DTSuperLayerId::superLayer(), DTLayerId::superlayerId(), DTRecHitBaseAlgo::theSync, GeomDet::toLocal(), uncertMap, useUncertDB, DTChamberId::wheel(), DTWireId::wire(), DTTopology::wirePosition(), PV3DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::y(), and PV3DBase< T, PVType, FrameType >::z().

151  {
152  // Subtract the offset to the digi time accordingly to the DTTTrigBaseSync concrete instance
153  float driftTime = digiTime - theSync->offset(layer, wireId, globPos);
154 
155  // check for out-of-time
156  if (driftTime < minTime || driftTime > maxTime) {
157  if (debug) cout << "[DTLinearDriftFromDBAlgo]*** Drift time out of window for in-time hits "
158  << driftTime << endl;
159 
160  if(step == 1) { //FIXME: protection against failure at 2nd and 3rd steps, must be checked!!!
161  // Hits are interpreted as coming from out-of-time pile-up and recHit
162  // is ignored.
163  return false;
164  }
165  }
166 
167  // Small negative times interpreted as hits close to the wire.
168  if (driftTime<0.) driftTime=0;
169 
170  // Read the vDrift and reso for this wire
171  float vDrift = 0;
172  float hitResolution = 0;
173  // vdrift is cm/ns , resolution is cm
174  mTimeMap->get(wireId.superlayerId(),
175  vDrift,
176  hitResolution, // Value from vdrift DB; replaced below if useUncertDB card is set
178 
179  if (useUncertDB) {
180  // Read the uncertainty from the DB for the given channel and step
181  hitResolution = uncertMap->get(wireId, step-1);
182  }
183 
184  //only in step 3
185  if(doVdriftCorr && step == 3 && nominalB !=0){
186  if (abs(wireId.wheel()) == 2 &&
187  wireId.station() == 1 &&
188  wireId.superLayer() != 2) {
189  // Variation of vdrift along Y due to B field,
191  // vdrift is lower a negative Y (lower global |Z|)
192  const float k_param = 1.2e-04;
193  LocalPoint local_pos = layer->toLocal(globPos);
194  vDrift = vDrift*(1. - k_param*local_pos.y());
195  }
196  }
197 
198  // Compute the drift distance
199  float drift = driftTime * vDrift;
200 
201  // Get Wire position
202  if(!layer->specificTopology().isWireValid(wireId.wire())) return false;
203  LocalPoint locWirePos(layer->specificTopology().wirePosition(wireId.wire()), 0, 0);
204  //Build the two possible points and the error on the position
205  leftPoint = LocalPoint(locWirePos.x()-drift,
206  locWirePos.y(),
207  locWirePos.z());
208  rightPoint = LocalPoint(locWirePos.x()+drift,
209  locWirePos.y(),
210  locWirePos.z());
211  error = LocalError(hitResolution*hitResolution,0.,0.);
212 
213 
214  if(debug) {
215  cout << "[DTLinearDriftFromDBAlgo] Compute drift distance, for digi at wire: " << wireId << endl
216  << " Step: " << step << endl
217  << " Digi time: " << digiTime << endl
218  << " Drift time: " << driftTime << endl
219  << " Drift distance: " << drift << endl
220  << " Hit Resolution: " << hitResolution << endl
221  << " Left point: " << leftPoint << endl
222  << " Right point: " << rightPoint << endl
223  << " Error: " << error << endl;
224  }
225 
226  return true;
227 
228 }
float wirePosition(int wireNumber) const
Returns the x position in the layer of a given wire number.
Definition: DTTopology.cc:86
float get(const DTWireId &wireid, unsigned int index) const
get the uncertainties for the SL correspoding to the given WireId and for the correct step as defined...
double offset(const DTLayer *layer, const DTWireId &wireId, const GlobalPoint &globalPos)
LocalVector drift(const StripGeomDetUnit *, const MagneticField &, const SiStripLorentzAngle &)
Definition: ShallowTools.cc:39
T y() const
Definition: PV3DBase.h:63
const DTRecoUncertainties * uncertMap
LocalPoint toLocal(const GlobalPoint &gp) const
Conversion to the R.F. of the GeomDet.
Definition: GeomDet.h:67
DTSuperLayerId superlayerId() const
Return the corresponding SuperLayerId.
Definition: DTLayerId.h:59
const DTTopology & specificTopology() const
Definition: DTLayer.cc:42
int superLayer() const
Return the superlayer number.
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
DTTTrigBaseSync * theSync
int wire() const
Return the wire number.
Definition: DTWireId.h:56
int get(int wheelId, int stationId, int sectorId, int slId, float &mTime, float &mTrms, DTTimeUnits::type unit) const
Definition: DTMtime.cc:82
bool isWireValid(const int wireNumber) const
Definition: DTTopology.h:65
Local3DPoint LocalPoint
Definition: LocalPoint.h:11
tuple cout
Definition: gather_cfg.py:121
int station() const
Return the station number.
Definition: DTChamberId.h:51
int wheel() const
Return the wheel number.
Definition: DTChamberId.h:45
bool DTLinearDriftFromDBAlgo::compute ( const DTLayer layer,
const DTWireId wireId,
const float  digiTime,
const GlobalPoint globPos,
DTRecHit1D newHit1D,
int  step 
) const
privatevirtual

Definition at line 232 of file DTLinearDriftFromDBAlgo.cc.

References compute(), relativeConstraints::error, Exception, DTEnums::Left, DTRecHit1D::localPosition(), DTRecHit1D::lrSide(), DTEnums::Right, DTRecHit1D::setPositionAndError(), PV3DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::y(), and PV3DBase< T, PVType, FrameType >::z().

237  {
238  LocalPoint leftPoint;
239  LocalPoint rightPoint;
241 
242  if(compute(layer, wireId, digiTime, globPos, leftPoint, rightPoint, error, step)) {
243  // Set the position and the error of the rechit which is being updated
244  switch(newHit1D.lrSide()) {
245 
246  case DTEnums::Left:
247  {
248  // Keep the original y position of newHit1D: for step==3, it's the
249  // position along the wire. Needed for rotation alignment
250  LocalPoint leftPoint3D(leftPoint.x(), newHit1D.localPosition().y(), leftPoint.z());
251  newHit1D.setPositionAndError(leftPoint3D, error);
252  break;
253  }
254 
255  case DTEnums::Right:
256  {
257  // as above: 3d position
258  LocalPoint rightPoint3D(rightPoint.x(), newHit1D.localPosition().y(), rightPoint.z());
259  newHit1D.setPositionAndError(rightPoint3D, error);
260  break;
261  }
262 
263  default:
264  throw cms::Exception("InvalidDTCellSide") << "[DTLinearDriftFromDBAlgo] Compute at Step "
265  << step << ", Hit side "
266  << newHit1D.lrSide()
267  << " is invalid!" << endl;
268  return false;
269  }
270 
271  return true;
272  }else {
273  return false;
274  }
275 }
virtual bool compute(const DTLayer *layer, const DTDigi &digi, LocalPoint &leftPoint, LocalPoint &rightPoint, LocalError &error) const
T y() const
Definition: PV3DBase.h:63
T z() const
Definition: PV3DBase.h:64
virtual LocalPoint localPosition() const
Return the 3-dimensional local position.
Definition: DTRecHit1D.h:60
void setPositionAndError(LocalPoint pos, LocalError err)
Set the local position and its error.
Definition: DTRecHit1D.h:100
T x() const
Definition: PV3DBase.h:62
DTEnums::DTCellSide lrSide() const
The side of the cell.
Definition: DTRecHit1D.h:82
void DTLinearDriftFromDBAlgo::setES ( const edm::EventSetup setup)
virtual

Pass the Event Setup to the algo at each event.

Implements DTRecHitBaseAlgo.

Definition at line 56 of file DTLinearDriftFromDBAlgo.cc.

References gather_cfg::cout, debug, field, edm::EventSetup::get(), HLT_ES_cff::magfield, mTimeMap, nominalB, MagneticField::nominalValue(), DTTTrigBaseSync::setES(), DTRecHitBaseAlgo::theSync, uncertMap, useUncertDB, DTRecoUncertainties::version(), and DTMtime::version().

56  {
57  if(debug)
58  cout<<"[DTLinearDriftFromDBAlgo] setES called"<<endl;
59  theSync->setES(setup);
60  // Get the map of ttrig from the Setup
61  ESHandle<DTMtime> mTimeHandle;
62  setup.get<DTMtimeRcd>().get(mTimeHandle);
63  mTimeMap = &*mTimeHandle;
64 
66  setup.get<IdealMagneticFieldRecord>().get(magfield);
67  field = &*magfield;
69 
70  if (useUncertDB) {
72  setup.get<DTRecoUncertaintiesRcd>().get(uncerts);
73  uncertMap = &*uncerts;
74 
75  // check uncertainty map type
76  if (uncertMap->version()>1) edm::LogError("NotImplemented") << "DT Uncertainty DB version unknown: " << uncertMap->version();
77  }
78 
79  if(debug) {
80  cout << "[DTLinearDriftFromDBAlgo] meanTimer version: " << mTimeMap->version()<<endl;
81  if (useUncertDB) cout << " uncertDB version: " << uncertMap->version()<<endl;
82  }
83 
84 }
int nominalValue() const
The nominal field value for this map in kGauss.
Definition: MagneticField.h:56
tuple magfield
Definition: HLT_ES_cff.py:2311
const DTRecoUncertainties * uncertMap
virtual void setES(const edm::EventSetup &setup)=0
Pass the Event Setup to the synchronization module at each event.
const MagneticField * field
DTTTrigBaseSync * theSync
const T & get() const
Definition: EventSetup.h:55
const std::string & version() const
access version
Definition: DTMtime.cc:233
tuple cout
Definition: gather_cfg.py:121

Member Data Documentation

const bool DTLinearDriftFromDBAlgo::debug
private

Definition at line 112 of file DTLinearDriftFromDBAlgo.h.

Referenced by compute(), DTLinearDriftFromDBAlgo(), and setES().

const bool DTLinearDriftFromDBAlgo::doVdriftCorr
private

Definition at line 101 of file DTLinearDriftFromDBAlgo.h.

Referenced by compute().

const MagneticField* DTLinearDriftFromDBAlgo::field
private

Definition at line 88 of file DTLinearDriftFromDBAlgo.h.

Referenced by setES().

const float DTLinearDriftFromDBAlgo::maxTime
private

Definition at line 98 of file DTLinearDriftFromDBAlgo.h.

Referenced by compute().

const float DTLinearDriftFromDBAlgo::minTime
private

Definition at line 95 of file DTLinearDriftFromDBAlgo.h.

const DTMtime* DTLinearDriftFromDBAlgo::mTimeMap
private

Definition at line 85 of file DTLinearDriftFromDBAlgo.h.

Referenced by compute(), and setES().

int DTLinearDriftFromDBAlgo::nominalB
private

Definition at line 89 of file DTLinearDriftFromDBAlgo.h.

Referenced by compute(), and setES().

const bool DTLinearDriftFromDBAlgo::stepTwoFromDigi
private

Definition at line 105 of file DTLinearDriftFromDBAlgo.h.

Referenced by compute().

const DTRecoUncertainties* DTLinearDriftFromDBAlgo::uncertMap
private

Definition at line 92 of file DTLinearDriftFromDBAlgo.h.

Referenced by compute(), and setES().

bool DTLinearDriftFromDBAlgo::useUncertDB
private

Definition at line 109 of file DTLinearDriftFromDBAlgo.h.

Referenced by compute(), DTLinearDriftFromDBAlgo(), and setES().