CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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 
17 
18 using namespace std;
19 using namespace edm;
20 
22  DTRecHitBaseAlgo(config),
23  minTime(config.getParameter<double>("minTime")),
24  maxTime(config.getParameter<double>("maxTime")),
25  doVdriftCorr(config.getParameter<bool>("doVdriftCorr")),
26  // Option to force going back to digi time at Step 2
27  stepTwoFromDigi(config.getParameter<bool>("stepTwoFromDigi")),
28  // Set verbose output
29  debug(config.getUntrackedParameter<bool>("debug"))
30 {
31  if(debug)
32  cout<<"[DTLinearDriftFromDBAlgo] Constructor called"<<endl;
33  }
34 
35 
36 
38 
39 
40 
42  if(debug)
43  cout<<"[DTLinearDriftFromDBAlgo] setES called"<<endl;
44  theSync->setES(setup);
45  // Get the map of ttrig from the Setup
46  ESHandle<DTMtime> mTimeHandle;
47  setup.get<DTMtimeRcd>().get(mTimeHandle);
48  mTimeMap = &*mTimeHandle;
49 
50  if(debug)
51  cout << "[DTLinearDriftFromDBAlgo] meanTimer version: " << mTimeMap->version()<<endl;
52 }
53 
54 
55 
56 // First Step
58  const DTDigi& digi,
59  LocalPoint& leftPoint,
60  LocalPoint& rightPoint,
61  LocalError& error) const {
62  // Get the wireId
63  DTLayerId layerId = layer->id();
64  const DTWireId wireId(layerId, digi.wire());
65 
66  // Get Wire position
67  if(!layer->specificTopology().isWireValid(digi.wire())) return false;
68  LocalPoint locWirePos(layer->specificTopology().wirePosition(digi.wire()), 0, 0);
69  const GlobalPoint globWirePos = layer->toGlobal(locWirePos);
70 
71  return compute(layer, wireId, digi.time(), globWirePos, leftPoint, rightPoint, error, 1);
72 }
73 
74 
75 
76 // Second step: the same as 1st step (optionally, redo 1st step starting from digi time)
78  const DTRecHit1D& recHit1D,
79  const float& angle,
80  DTRecHit1D& newHit1D) const {
81 
82  if (!stepTwoFromDigi) {
83  newHit1D.setPositionAndError(recHit1D.localPosition(), recHit1D.localPositionError());
84  return true;
85  }
86 
87  const DTWireId wireId = recHit1D.wireId();
88 
89  // Get Wire position
90  if(!layer->specificTopology().isWireValid(wireId.wire())) return false;
91  LocalPoint locWirePos(layer->specificTopology().wirePosition(wireId.wire()), 0, 0);
92  const GlobalPoint globWirePos = layer->toGlobal(locWirePos);
93 
94  return compute(layer, wireId, recHit1D.digiTime(), globWirePos, newHit1D, 2);
95 
96 }
97 
98 
99 
100 // Third step.
102  const DTRecHit1D& recHit1D,
103  const float& angle,
104  const GlobalPoint& globPos,
105  DTRecHit1D& newHit1D) const {
106  return compute(layer, recHit1D.wireId(), recHit1D.digiTime(), globPos, newHit1D, 3);
107 }
108 
109 
110 
111 // Do the actual work.
113  const DTWireId& wireId,
114  const float digiTime,
115  const GlobalPoint& globPos,
116  LocalPoint& leftPoint,
117  LocalPoint& rightPoint,
118  LocalError& error,
119  int step) const {
120  // Subtract the offset to the digi time accordingly to the DTTTrigBaseSync concrete instance
121  float driftTime = digiTime - theSync->offset(layer, wireId, globPos);
122 
123  // check for out-of-time
124  if (driftTime < minTime || driftTime > maxTime) {
125  if (debug) cout << "[DTLinearDriftFromDBAlgo]*** Drift time out of window for in-time hits "
126  << driftTime << endl;
127 
128  if(step == 1) { //FIXME: protection against failure at 2nd and 3rd steps, must be checked!!!
129  // Hits are interpreted as coming from out-of-time pile-up and recHit
130  // is ignored.
131  return false;
132  }
133  }
134 
135  // Small negative times interpreted as hits close to the wire.
136  if (driftTime<0.) driftTime=0;
137 
138  // Read the vDrift and reso for this wire
139  float vDrift = 0;
140  float hitResolution = 0;//FIXME: should use this!
141  // vdrift is cm/ns , resolution is cm
142  mTimeMap->get(wireId.superlayerId(),
143  vDrift,
144  hitResolution,
146 
147  //only in step 3
148  if(doVdriftCorr && step == 3){
149  if (abs(wireId.wheel()) == 2 &&
150  wireId.station() == 1 &&
151  wireId.superLayer() != 2) {
152  // Variation of vdrift along Y due to B field,
154  // vdrift is lower a negative Y (lower global |Z|)
155  const float k_param = 1.2e-04;
156  LocalPoint local_pos = layer->toLocal(globPos);
157  vDrift = vDrift*(1. - k_param*local_pos.y());
158  }
159  }
160 
161  // Compute the drift distance
162  float drift = driftTime * vDrift;
163 
164  // Get Wire position
165  if(!layer->specificTopology().isWireValid(wireId.wire())) return false;
166  LocalPoint locWirePos(layer->specificTopology().wirePosition(wireId.wire()), 0, 0);
167  //Build the two possible points and the error on the position
168  leftPoint = LocalPoint(locWirePos.x()-drift,
169  locWirePos.y(),
170  locWirePos.z());
171  rightPoint = LocalPoint(locWirePos.x()+drift,
172  locWirePos.y(),
173  locWirePos.z());
174  error = LocalError(hitResolution*hitResolution,0.,0.);
175 
176 
177  if(debug) {
178  cout << "[DTLinearDriftFromDBAlgo] Compute drift distance, for digi at wire: " << wireId << endl
179  << " Step: " << step << endl
180  << " Digi time: " << digiTime << endl
181  << " Drift time: " << driftTime << endl
182  << " Drift distance: " << drift << endl
183  << " Hit Resolution: " << hitResolution << endl
184  << " Left point: " << leftPoint << endl
185  << " Right point: " << rightPoint << endl
186  << " Error: " << error << endl;
187  }
188 
189  return true;
190 
191 }
192 
193 
194 // Interface to the method which does the actual work suited for 2nd and 3rd steps
196  const DTWireId& wireId,
197  const float digiTime,
198  const GlobalPoint& globPos,
199  DTRecHit1D& newHit1D,
200  int step) const {
201  LocalPoint leftPoint;
202  LocalPoint rightPoint;
204 
205  if(compute(layer, wireId, digiTime, globPos, leftPoint, rightPoint, error, step)) {
206  // Set the position and the error of the rechit which is being updated
207  switch(newHit1D.lrSide()) {
208 
209  case DTEnums::Left:
210  {
211  // Keep the original y position of newHit1D: for step==3, it's the
212  // position along the wire. Needed for rotation alignment
213  LocalPoint leftPoint3D(leftPoint.x(), newHit1D.localPosition().y(), leftPoint.z());
214  newHit1D.setPositionAndError(leftPoint3D, error);
215  break;
216  }
217 
218  case DTEnums::Right:
219  {
220  // as above: 3d position
221  LocalPoint rightPoint3D(rightPoint.x(), newHit1D.localPosition().y(), rightPoint.z());
222  newHit1D.setPositionAndError(rightPoint3D, error);
223  break;
224  }
225 
226  default:
227  throw cms::Exception("InvalidDTCellSide") << "[DTLinearDriftFromDBAlgo] Compute at Step "
228  << step << ", Hit side "
229  << newHit1D.lrSide()
230  << " is invalid!" << endl;
231  return false;
232  }
233 
234  return true;
235  }else {
236  return false;
237  }
238 }
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:47
double offset(const DTLayer *layer, const DTWireId &wireId, const GlobalPoint &globalPos)
virtual bool compute(const DTLayer *layer, const DTDigi &digi, LocalPoint &leftPoint, LocalPoint &rightPoint, LocalError &error) const
LocalVector drift(const StripGeomDetUnit *, const MagneticField &, const SiStripLorentzAngle &)
Definition: ShallowTools.cc:39
T y() const
Definition: PV3DBase.h:63
LocalPoint toLocal(const GlobalPoint &gp) const
Conversion to the R.F. of the GeomDet.
Definition: GeomDet.h:62
int wire() const
Return wire number.
Definition: DTDigi.cc:67
DTSuperLayerId superlayerId() const
Return the corresponding SuperLayerId.
Definition: DTLayerId.h:59
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:42
double time() const
Get time in ns.
Definition: DTDigi.cc:63
T z() const
Definition: PV3DBase.h:64
int superLayer() const
Return the superlayer number.
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
virtual ~DTLinearDriftFromDBAlgo()
Destructor.
float digiTime() const
Return the time (ns) of the digi used to build the rechit.
Definition: DTRecHit1D.h:113
virtual void setES(const edm::EventSetup &setup)
Pass the Event Setup to the algo at each event.
Definition: DTDigi.h:17
virtual LocalError localPositionError() const
Return the 3-dimensional error on the local position.
Definition: DTRecHit1D.h:66
DTTTrigBaseSync * theSync
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
#define debug
Definition: HDRShower.cc:19
DTLinearDriftFromDBAlgo(const edm::ParameterSet &config)
Constructor.
const T & get() const
Definition: EventSetup.h:55
const std::string & version() const
access version
Definition: DTMtime.cc:247
int get(int wheelId, int stationId, int sectorId, int slId, float &mTime, float &mTrms, DTTimeUnits::type unit) const
Definition: DTMtime.cc:86
bool isWireValid(const int wireNumber) const
Definition: DTTopology.h:65
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:100
int station() const
Return the station number.
Definition: DTChamberId.h:51
int wheel() const
Return the wheel number.
Definition: DTChamberId.h:45
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:82
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:107