CMS 3D CMS Logo

List of all members | Public Member Functions | Private Member Functions | Private Attributes
DTLinearDriftAlgo Class Reference

#include <DTLinearDriftAlgo.h>

Inheritance diagram for DTLinearDriftAlgo:
DTRecHitBaseAlgo

Public Member Functions

bool compute (const DTLayer *layer, const DTDigi &digi, LocalPoint &leftPoint, LocalPoint &rightPoint, LocalError &error) const override
 
bool compute (const DTLayer *layer, const DTRecHit1D &recHit1D, const float &angle, DTRecHit1D &newHit1D) const override
 
bool compute (const DTLayer *layer, const DTRecHit1D &recHit1D, const float &angle, const GlobalPoint &globPos, DTRecHit1D &newHit1D) const override
 
 DTLinearDriftAlgo (const edm::ParameterSet &config)
 Constructor. More...
 
void setES (const edm::EventSetup &setup) override
 Pass the Event Setup to the algo at each event. More...
 
 ~DTLinearDriftAlgo () override
 Destructor. More...
 
- Public Member Functions inherited from DTRecHitBaseAlgo
 DTRecHitBaseAlgo (const edm::ParameterSet &config)
 Constructor. More...
 
virtual edm::OwnVector< DTRecHit1DPairreconstruct (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 float hitResolution
 
const float maxTime
 
const float minTime
 
const float vDrift
 

Additional Inherited Members

- Protected Attributes inherited from DTRecHitBaseAlgo
std::unique_ptr< DTTTrigBaseSynctheSync
 

Detailed Description

Concrete implementation of DTRecHitBaseAlgo. Compute drift distance using constant drift velocity as defined in the "driftVelocity" parameter.

Author
G. Cerminara - INFN Torino

Definition at line 14 of file DTLinearDriftAlgo.h.

Constructor & Destructor Documentation

DTLinearDriftAlgo::DTLinearDriftAlgo ( const edm::ParameterSet config)

Constructor.

Definition at line 18 of file DTLinearDriftAlgo.cc.

19  : DTRecHitBaseAlgo(config),
20  // Get the Drift Velocity from parameter set.
21  vDrift(config.getParameter<double>("driftVelocity")), // FIXME: Default was 0.00543 cm/ns
22  hitResolution(config.getParameter<double>("hitResolution")), // FIXME: Default is
23  // vDriftMB1W1(config.getParameter<double>("driftVelocityMB1W1")), // FIXME: Default was 0.00543 cm/ns
24  minTime(config.getParameter<double>("minTime")), // FIXME: Default was -3 ns
25  maxTime(config.getParameter<double>("maxTime")), // FIXME: Default was 415 ns
26  // Set verbose output
27  debug(config.getUntrackedParameter<bool>("debug")) {}
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
DTRecHitBaseAlgo(const edm::ParameterSet &config)
Constructor.
const float hitResolution
DTLinearDriftAlgo::~DTLinearDriftAlgo ( )
override

Destructor.

Definition at line 29 of file DTLinearDriftAlgo.cc.

29 {}

Member Function Documentation

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

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 34 of file DTLinearDriftAlgo.cc.

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

Referenced by compute().

35  {
36  // Get the wireId
37  DTLayerId layerId = layer->id();
38  const DTWireId wireId(layerId, digi.wire());
39 
40  // Get Wire position
41  if (!layer->specificTopology().isWireValid(digi.wire()))
42  return false;
43  LocalPoint locWirePos(layer->specificTopology().wirePosition(digi.wire()), 0, 0);
44  const GlobalPoint globWirePos = layer->toGlobal(locWirePos);
45 
46  return compute(layer, wireId, digi.time(), globWirePos, leftPoint, rightPoint, error, 1);
47 }
float wirePosition(int wireNumber) const
Returns the x position in the layer of a given wire number.
Definition: DTTopology.cc:59
DTLayerId id() const
Return the DetId of this SL.
Definition: DTLayer.cc:39
bool compute(const DTLayer *layer, const DTDigi &digi, LocalPoint &leftPoint, LocalPoint &rightPoint, LocalError &error) const override
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
Definition: GeomDet.h:49
int wire() const
Return wire number.
Definition: DTDigi.cc:41
const DTTopology & specificTopology() const
Definition: DTLayer.cc:37
double time() const
Get time in ns.
Definition: DTDigi.cc:37
bool isWireValid(const int wireNumber) const
Definition: DTTopology.h:64
bool DTLinearDriftAlgo::compute ( const DTLayer layer,
const DTRecHit1D recHit1D,
const float &  angle,
DTRecHit1D newHit1D 
) const
overridevirtual

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 50 of file DTLinearDriftAlgo.cc.

References DTRecHit1D::localPosition(), DTRecHit1D::localPositionError(), and DTRecHit1D::setPositionAndError().

53  {
54  newHit1D.setPositionAndError(recHit1D.localPosition(), recHit1D.localPositionError());
55  return true;
56 }
LocalPoint localPosition() const override
Return the 3-dimensional local position.
Definition: DTRecHit1D.h:47
LocalError localPositionError() const override
Return the 3-dimensional error on the local position.
Definition: DTRecHit1D.h:50
void setPositionAndError(LocalPoint pos, LocalError err)
Set the local position and its error.
Definition: DTRecHit1D.h:70
bool DTLinearDriftAlgo::compute ( const DTLayer layer,
const DTRecHit1D recHit1D,
const float &  angle,
const GlobalPoint globPos,
DTRecHit1D newHit1D 
) const
overridevirtual

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 59 of file DTLinearDriftAlgo.cc.

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

63  {
64  return compute(layer, recHit1D.wireId(), recHit1D.digiTime(), globPos, newHit1D, 3);
65 }
bool compute(const DTLayer *layer, const DTDigi &digi, LocalPoint &leftPoint, LocalPoint &rightPoint, LocalError &error) const override
float digiTime() const
Return the time (ns) of the digi used to build the rechit.
Definition: DTRecHit1D.h:79
DTWireId wireId() const
Return the wireId.
Definition: DTRecHit1D.h:76
bool DTLinearDriftAlgo::compute ( const DTLayer layer,
const DTWireId wireId,
const float  digiTime,
const GlobalPoint globPos,
LocalPoint leftPoint,
LocalPoint rightPoint,
LocalError error,
int  step 
) const
privatevirtual

Definition at line 68 of file DTLinearDriftAlgo.cc.

References gather_cfg::cout, debug, shallow::drift(), hitResolution, DTTopology::isWireValid(), maxTime, DTLayer::specificTopology(), DTRecHitBaseAlgo::theSync, vDrift, DTWireId::wire(), DTTopology::wirePosition(), PV3DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::y(), and PV3DBase< T, PVType, FrameType >::z().

75  {
76  // Subtract the offset to the digi time accordingly to the DTTTrigBaseSync concrete instance
77  float driftTime = digiTime - theSync->offset(layer, wireId, globPos);
78 
79  // check for out-of-time
80  if (driftTime < minTime || driftTime > maxTime) {
81  if (debug)
82  cout << "[DTLinearDriftAlgo]*** Drift time out of window for in-time hits " << driftTime << endl;
83 
84  if (step == 1) { //FIXME: protection against failure at 2nd and 3rd steps, must be checked!!!
85  // Hits are interpreted as coming from out-of-time pile-up and recHit
86  // is ignored.
87  return false;
88  }
89  }
90 
91  // Small negative times interpreted as hits close to the wire.
92  if (driftTime < 0.)
93  driftTime = 0;
94 
95  // Compute the drift distance
96  // SL 21-Dec-2006: Use specific Drift for MB1W1 (non fluxed chamber)
97  float vd = vDrift;
98  // if (wireId.wheel()==1 && wireId.station()==1) {
99  // vd=vDriftMB1W1;
100  // //cout << "Using Vd " << vd<< endl;
101  // }
102 
103  float drift = driftTime * vd;
104 
105  // Get Wire position
106  if (!layer->specificTopology().isWireValid(wireId.wire()))
107  return false;
108  LocalPoint locWirePos(layer->specificTopology().wirePosition(wireId.wire()), 0, 0);
109  //Build the two possible points and the error on the position
110  leftPoint = LocalPoint(locWirePos.x() - drift, locWirePos.y(), locWirePos.z());
111  rightPoint = LocalPoint(locWirePos.x() + drift, locWirePos.y(), locWirePos.z());
112  error = LocalError(hitResolution * hitResolution, 0., 0.);
113 
114  if (debug) {
115  cout << "[DTLinearDriftAlgo] Compute drift distance, for digi at wire: " << wireId << endl
116  << " Step: " << step << endl
117  << " Digi time: " << digiTime << endl
118  << " Drift time: " << driftTime << endl
119  << " Drift distance: " << drift << endl
120  << " Hit Resolution: " << hitResolution << endl
121  << " Left point: " << leftPoint << endl
122  << " Right point: " << rightPoint << endl
123  << " Error: " << error << endl;
124  }
125 
126  return true;
127 }
float wirePosition(int wireNumber) const
Returns the x position in the layer of a given wire number.
Definition: DTTopology.cc:59
Point3DBase< Scalar, LocalTag > LocalPoint
Definition: Definitions.h:30
LocalVector drift(const StripGeomDetUnit *, const MagneticField &, const SiStripLorentzAngle &)
Definition: ShallowTools.cc:36
T y() const
Definition: PV3DBase.h:60
const DTTopology & specificTopology() const
Definition: DTLayer.cc:37
std::vector< DeviationSensor2D * > vd
int wire() const
Return the wire number.
Definition: DTWireId.h:42
const float hitResolution
std::unique_ptr< DTTTrigBaseSync > theSync
bool isWireValid(const int wireNumber) const
Definition: DTTopology.h:64
step
Definition: StallMonitor.cc:94
bool DTLinearDriftAlgo::compute ( const DTLayer layer,
const DTWireId wireId,
const float  digiTime,
const GlobalPoint globPos,
DTRecHit1D newHit1D,
int  step 
) const
privatevirtual

Definition at line 130 of file DTLinearDriftAlgo.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().

135  {
136  LocalPoint leftPoint;
137  LocalPoint rightPoint;
139 
140  if (compute(layer, wireId, digiTime, globPos, leftPoint, rightPoint, error, step)) {
141  // Set the position and the error of the rechit which is being updated
142  switch (newHit1D.lrSide()) {
143  case DTEnums::Left: {
144  // Keep the original y position of newHit1D: for step==3, it's the
145  // position along the wire. Needed for rotation alignment
146  LocalPoint leftPoint3D(leftPoint.x(), newHit1D.localPosition().y(), leftPoint.z());
147  newHit1D.setPositionAndError(leftPoint3D, error);
148  break;
149  }
150 
151  case DTEnums::Right: {
152  // as above: 3d position
153  LocalPoint rightPoint3D(rightPoint.x(), newHit1D.localPosition().y(), rightPoint.z());
154  newHit1D.setPositionAndError(rightPoint3D, error);
155  break;
156  }
157 
158  default:
159  throw cms::Exception("InvalidDTCellSide") << "[DTLinearDriftAlgo] Compute at Step " << step << ", Hit side "
160  << newHit1D.lrSide() << " is invalid!" << endl;
161  return false;
162  }
163 
164  return true;
165  } else {
166  return false;
167  }
168 }
LocalPoint localPosition() const override
Return the 3-dimensional local position.
Definition: DTRecHit1D.h:47
bool compute(const DTLayer *layer, const DTDigi &digi, LocalPoint &leftPoint, LocalPoint &rightPoint, LocalError &error) const override
T y() const
Definition: PV3DBase.h:60
T z() const
Definition: PV3DBase.h:61
step
Definition: StallMonitor.cc:94
void setPositionAndError(LocalPoint pos, LocalError err)
Set the local position and its error.
Definition: DTRecHit1D.h:70
T x() const
Definition: PV3DBase.h:59
DTEnums::DTCellSide lrSide() const
The side of the cell.
Definition: DTRecHit1D.h:61
void DTLinearDriftAlgo::setES ( const edm::EventSetup setup)
overridevirtual

Pass the Event Setup to the algo at each event.

Implements DTRecHitBaseAlgo.

Definition at line 31 of file DTLinearDriftAlgo.cc.

References DTRecHitBaseAlgo::theSync.

31 { theSync->setES(setup); }
std::unique_ptr< DTTTrigBaseSync > theSync

Member Data Documentation

const bool DTLinearDriftAlgo::debug
private
const float DTLinearDriftAlgo::hitResolution
private

Definition at line 81 of file DTLinearDriftAlgo.h.

Referenced by compute().

const float DTLinearDriftAlgo::maxTime
private

Definition at line 87 of file DTLinearDriftAlgo.h.

Referenced by compute().

const float DTLinearDriftAlgo::minTime
private

Definition at line 84 of file DTLinearDriftAlgo.h.

const float DTLinearDriftAlgo::vDrift
private

Definition at line 76 of file DTLinearDriftAlgo.h.

Referenced by compute().