CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
DTLinearDriftAlgo.cc
Go to the documentation of this file.
1 /*
2  * See header file for a description of this class.
3  *
4  * $Date: 2009/04/30 09:30:06 $
5  * $Revision: 1.3 $
6  * \author G. Cerminara - INFN Torino
7  */
8 
16 
17 using namespace std;
18 using namespace edm;
19 
21  DTRecHitBaseAlgo(config) {
22  // Get the Drift Velocity from parameter set.
23  vDrift = config.getParameter<double>("driftVelocity"); // FIXME: Default was 0.00543 cm/ns
24  // vDriftMB1W1 = config.getParameter<double>("driftVelocityMB1W1"); // FIXME: Default was 0.00543 cm/ns
25 
26  minTime = config.getParameter<double>("minTime"); // FIXME: Default was -3 ns
27 
28  maxTime = config.getParameter<double>("maxTime"); // FIXME: Default was 415 ns
29 
30  hitResolution = config.getParameter<double>("hitResolution"); // FIXME: Default is
31  // Set verbose output
32  debug = config.getUntrackedParameter<bool>("debug");
33 
34  }
35 
36 
37 
39 
40 
41 
43  theSync->setES(setup);
44 }
45 
46 
47 
48 // First Step
50  const DTDigi& digi,
51  LocalPoint& leftPoint,
52  LocalPoint& rightPoint,
53  LocalError& error) const {
54  // Get the wireId
55  DTLayerId layerId = layer->id();
56  const DTWireId wireId(layerId, digi.wire());
57 
58  // Get Wire position
59  if(!layer->specificTopology().isWireValid(digi.wire())) return false;
60  LocalPoint locWirePos(layer->specificTopology().wirePosition(digi.wire()), 0, 0);
61  const GlobalPoint globWirePos = layer->toGlobal(locWirePos);
62 
63  return compute(layer, wireId, digi.time(), globWirePos, leftPoint, rightPoint, error, 1);
64 }
65 
66 
67 
68 // Second step: the same as 1st step
70  const DTRecHit1D& recHit1D,
71  const float& angle,
72  DTRecHit1D& newHit1D) const {
73  newHit1D.setPositionAndError(recHit1D.localPosition(), recHit1D.localPositionError());
74  return true;
75 }
76 
77 
78 
79 // Third step.
81  const DTRecHit1D& recHit1D,
82  const float& angle,
83  const GlobalPoint& globPos,
84  DTRecHit1D& newHit1D) const {
85  return compute(layer, recHit1D.wireId(), recHit1D.digiTime(), globPos, newHit1D, 3);
86 }
87 
88 
89 
90 // Do the actual work.
92  const DTWireId& wireId,
93  const float digiTime,
94  const GlobalPoint& globPos,
95  LocalPoint& leftPoint,
96  LocalPoint& rightPoint,
98  int step) const {
99  // Subtract the offset to the digi time accordingly to the DTTTrigBaseSync concrete instance
100  float driftTime = digiTime - theSync->offset(layer, wireId, globPos);
101 
102  // check for out-of-time
103  if (driftTime < minTime || driftTime > maxTime) {
104  if (debug) cout << "[DTLinearDriftAlgo]*** Drift time out of window for in-time hits "
105  << driftTime << endl;
106 
107  if(step == 1) { //FIXME: protection against failure at 2nd and 3rd steps, must be checked!!!
108  // Hits are interpreted as coming from out-of-time pile-up and recHit
109  // is ignored.
110  return false;
111  }
112  }
113 
114  // Small negative times interpreted as hits close to the wire.
115  if (driftTime<0.) driftTime=0;
116 
117  // Compute the drift distance
118  // SL 21-Dec-2006: Use specific Drift for MB1W1 (non fluxed chamber)
119  float vd=vDrift;
120  // if (wireId.wheel()==1 && wireId.station()==1) {
121  // vd=vDriftMB1W1;
122  // //cout << "Using Vd " << vd<< endl;
123  // }
124 
125  float drift = driftTime * vd;
126 
127  // Get Wire position
128  if(!layer->specificTopology().isWireValid(wireId.wire())) return false;
129  LocalPoint locWirePos(layer->specificTopology().wirePosition(wireId.wire()), 0, 0);
130  //Build the two possible points and the error on the position
131  leftPoint = LocalPoint(locWirePos.x()-drift,
132  locWirePos.y(),
133  locWirePos.z());
134  rightPoint = LocalPoint(locWirePos.x()+drift,
135  locWirePos.y(),
136  locWirePos.z());
137  error = LocalError(hitResolution*hitResolution,0.,0.);
138 
139 
140  if(debug) {
141  cout << "[DTLinearDriftAlgo] Compute drift distance, for digi at wire: " << wireId << endl
142  << " Step: " << step << endl
143  << " Digi time: " << digiTime << endl
144  << " Drift time: " << driftTime << endl
145  << " Drift distance: " << drift << endl
146  << " Hit Resolution: " << hitResolution << endl
147  << " Left point: " << leftPoint << endl
148  << " Right point: " << rightPoint << endl
149  << " Error: " << error << endl;
150  }
151 
152  return true;
153 
154 }
155 
156 
157 // Interface to the method which does the actual work suited for 2nd and 3rd steps
159  const DTWireId& wireId,
160  const float digiTime,
161  const GlobalPoint& globPos,
162  DTRecHit1D& newHit1D,
163  int step) const {
164  LocalPoint leftPoint;
165  LocalPoint rightPoint;
167 
168  if(compute(layer, wireId, digiTime, globPos, leftPoint, rightPoint, error, step)) {
169  // Set the position and the error of the rechit which is being updated
170  switch(newHit1D.lrSide()) {
171 
172  case DTEnums::Left:
173  {
174  // Keep the original y position of newHit1D: for step==3, it's the
175  // position along the wire. Needed for rotation alignment
176  LocalPoint leftPoint3D(leftPoint.x(), newHit1D.localPosition().y(), leftPoint.z());
177  newHit1D.setPositionAndError(leftPoint3D, error);
178  break;
179  }
180 
181  case DTEnums::Right:
182  {
183  // as above: 3d position
184  LocalPoint rightPoint3D(rightPoint.x(), newHit1D.localPosition().y(), rightPoint.z());
185  newHit1D.setPositionAndError(rightPoint3D, error);
186  break;
187  }
188 
189  default:
190  throw cms::Exception("InvalidDTCellSide") << "[DTLinearDriftAlgo] Compute at Step "
191  << step << ", Hit side "
192  << newHit1D.lrSide()
193  << " is invalid!" << endl;
194  return false;
195  }
196 
197  return true;
198  }else {
199  return false;
200  }
201 }
202 
203 
205 //float DTLinearDriftAlgo::vDriftMB1W1;
206 
207 
209 
210 
212 
213 
215 
216 
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
float wirePosition(int wireNumber) const
Returns the x position in the layer of a given wire number.
Definition: DTTopology.cc:88
DTLayerId id() const
Return the DetId of this SL.
Definition: DTLayer.cc:48
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
Definition: GeomDet.h:47
double offset(const DTLayer *layer, const DTWireId &wireId, const GlobalPoint &globalPos)
static float minTime
LocalVector drift(const StripGeomDetUnit *, const MagneticField &, const SiStripLorentzAngle &)
Definition: ShallowTools.cc:39
T y() const
Definition: PV3DBase.h:63
virtual void setES(const edm::EventSetup &setup)
Pass the Event Setup to the algo at each event.
static float maxTime
static float hitResolution
int wire() const
Return wire number.
Definition: DTDigi.cc:69
virtual void setES(const edm::EventSetup &setup)=0
Pass the Event Setup to the synchronization module at each event.
const DTTopology & specificTopology() const
Definition: DTLayer.cc:44
double time() const
Get time in ns.
Definition: DTDigi.cc:65
std::vector< DeviationSensor2D * > vd
T z() const
Definition: PV3DBase.h:64
float digiTime() const
Return the time (ns) of the digi used to build the rechit.
Definition: DTRecHit1D.h:115
Definition: DTDigi.h:19
virtual LocalError localPositionError() const
Return the 3-dimensional error on the local position.
Definition: DTRecHit1D.h:68
DTTTrigBaseSync * theSync
virtual LocalPoint localPosition() const
Return the 3-dimensional local position.
Definition: DTRecHit1D.h:62
int wire() const
Return the wire number.
Definition: DTWireId.h:58
DTLinearDriftAlgo(const edm::ParameterSet &config)
Constructor.
virtual bool compute(const DTLayer *layer, const DTDigi &digi, LocalPoint &leftPoint, LocalPoint &rightPoint, LocalError &error) const
virtual ~DTLinearDriftAlgo()
Destructor.
bool isWireValid(const int wireNumber) const
Definition: DTTopology.h:67
Local3DPoint LocalPoint
Definition: LocalPoint.h:11
tuple cout
Definition: gather_cfg.py:121
void setPositionAndError(LocalPoint pos, LocalError err)
Set the local position and its error.
Definition: DTRecHit1D.h:102
T x() const
Definition: PV3DBase.h:62
void setup(std::vector< TH2F > &depth, std::string name, std::string units="")
DTEnums::DTCellSide lrSide() const
The side of the cell.
Definition: DTRecHit1D.h:84
T angle(T x1, T y1, T z1, T x2, T y2, T z2)
Definition: angle.h:11
DTWireId wireId() const
Return the wireId.
Definition: DTRecHit1D.h:109