00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "RecoLocalMuon/DTRecHit/plugins/DTNoDriftAlgo.h"
00011 #include "DataFormats/MuonDetId/interface/DTWireId.h"
00012 #include "Geometry/DTGeometry/interface/DTLayer.h"
00013 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00014 #include "FWCore/Framework/interface/EventSetup.h"
00015 #include "FWCore/Utilities/interface/Exception.h"
00016
00017 using namespace std;
00018 using namespace edm;
00019
00020 DTNoDriftAlgo::DTNoDriftAlgo(const ParameterSet& config) :
00021 DTRecHitBaseAlgo(config) {
00022
00023 minTime = config.getParameter<double>("minTime");
00024
00025 maxTime = config.getParameter<double>("maxTime");
00026
00027 fixedDrift = config.getParameter<double>("fixedDrift");
00028
00029 hitResolution = config.getParameter<double>("hitResolution");
00030
00031 debug = config.getUntrackedParameter<bool>("debug");
00032
00033 }
00034
00035
00036
00037 DTNoDriftAlgo::~DTNoDriftAlgo(){}
00038
00039
00040
00041 void DTNoDriftAlgo::setES(const EventSetup& setup) {
00042
00043 }
00044
00045
00046
00047
00048
00049 OwnVector<DTRecHit1DPair> DTNoDriftAlgo::reconstruct(const DTLayer* layer,
00050 const DTLayerId& layerId,
00051 const DTDigiCollection::Range& digiRange) {
00052 OwnVector<DTRecHit1DPair> result;
00053
00054
00055 for (DTDigiCollection::const_iterator digi = digiRange.first;
00056 digi != digiRange.second;
00057 digi++) {
00058
00059 DTWireId wireId(layerId, (*digi).wire());
00060
00061 bool isDouble = false;
00062 for (OwnVector<DTRecHit1DPair>::const_iterator doubleWireCheck = result.begin();
00063 doubleWireCheck != result.end();
00064 doubleWireCheck++) {
00065 if( wireId == (*doubleWireCheck).wireId()) {
00066 isDouble = true;
00067
00068 break;
00069 }
00070 }
00071
00072 if (isDouble) continue;
00073
00074 LocalError tmpErr;
00075 LocalPoint lpoint, rpoint;
00076
00077 bool OK = compute(layer, *digi, lpoint, rpoint, tmpErr);
00078
00079 if (!OK) continue;
00080
00081
00082 DTRecHit1DPair* recHitPair = new DTRecHit1DPair(wireId, *digi);
00083
00084
00085 recHitPair->setPositionAndError(DTEnums::Left, lpoint, tmpErr);
00086 recHitPair->setPositionAndError(DTEnums::Right, rpoint, tmpErr);
00087
00088 result.push_back(recHitPair);
00089 }
00090 return result;
00091 }
00092
00093
00094
00095
00096
00097
00098 bool DTNoDriftAlgo::compute(const DTLayer* layer,
00099 const DTDigi& digi,
00100 LocalPoint& leftPoint,
00101 LocalPoint& rightPoint,
00102 LocalError& error) const {
00103
00104 DTLayerId layerId = layer->id();
00105 const DTWireId wireId(layerId, digi.wire());
00106
00107
00108 if(!layer->specificTopology().isWireValid(digi.wire())) return false;
00109 LocalPoint locWirePos(layer->specificTopology().wirePosition(digi.wire()), 0, 0);
00110 const GlobalPoint globWirePos = layer->toGlobal(locWirePos);
00111
00112 return compute(layer, wireId, digi.time(), globWirePos, leftPoint, rightPoint, error, 1);
00113 }
00114
00115
00116
00117
00118 bool DTNoDriftAlgo::compute(const DTLayer* layer,
00119 const DTRecHit1D& recHit1D,
00120 const float& angle,
00121 DTRecHit1D& newHit1D) const {
00122 newHit1D.setPositionAndError(recHit1D.localPosition(), recHit1D.localPositionError());
00123 return true;
00124 }
00125
00126
00127
00128
00129 bool DTNoDriftAlgo::compute(const DTLayer* layer,
00130 const DTRecHit1D& recHit1D,
00131 const float& angle,
00132 const GlobalPoint& globPos,
00133 DTRecHit1D& newHit1D) const {
00134 return compute(layer, recHit1D.wireId(), recHit1D.digiTime(), globPos, newHit1D, 3);
00135 }
00136
00137
00138
00139
00140 bool DTNoDriftAlgo::compute(const DTLayer* layer,
00141 const DTWireId& wireId,
00142 const float digiTime,
00143 const GlobalPoint& globPos,
00144 LocalPoint& leftPoint,
00145 LocalPoint& rightPoint,
00146 LocalError& error,
00147 int step) const {
00148
00149
00150
00151
00152
00153
00154
00155 if (digiTime < minTime || digiTime > maxTime) {
00156 if (debug) cout << "[DTNoDriftAlgo]*** Drift time out of window for in-time hits "
00157 << digiTime << endl;
00158
00159 if(step == 1) {
00160
00161
00162 return false;
00163 }
00164 }
00165
00166
00167
00168 float drift = fixedDrift;
00169
00170
00171 if(!layer->specificTopology().isWireValid(wireId.wire())) return false;
00172 LocalPoint locWirePos(layer->specificTopology().wirePosition(wireId.wire()), 0, 0);
00173
00174 leftPoint = LocalPoint(locWirePos.x()-drift,
00175 locWirePos.y(),
00176 locWirePos.z());
00177 rightPoint = LocalPoint(locWirePos.x()+drift,
00178 locWirePos.y(),
00179 locWirePos.z());
00180 error = LocalError(hitResolution*hitResolution,0.,0.);
00181
00182
00183 if(debug) {
00184 cout << "[DTNoDriftAlgo] Compute drift distance, for digi at wire: " << wireId << endl
00185 << " Step: " << step << endl
00186 << " Digi time: " << digiTime << endl
00187
00188 << " Fixed Drift distance: " << drift << endl
00189 << " Hit Resolution: " << hitResolution << endl
00190 << " Left point: " << leftPoint << endl
00191 << " Right point: " << rightPoint << endl
00192 << " Error: " << error << endl;
00193 }
00194
00195
00196
00197 return true;
00198
00199 }
00200
00201
00202
00203 bool DTNoDriftAlgo::compute(const DTLayer* layer,
00204 const DTWireId& wireId,
00205 const float digiTime,
00206 const GlobalPoint& globPos,
00207 DTRecHit1D& newHit1D,
00208 int step) const {
00209 LocalPoint leftPoint;
00210 LocalPoint rightPoint;
00211 LocalError error;
00212
00213 if(compute(layer, wireId, digiTime, globPos, leftPoint, rightPoint, error, step)) {
00214
00215 switch(newHit1D.lrSide()) {
00216
00217 case DTEnums::Left:
00218 newHit1D.setPositionAndError(leftPoint, error);
00219 break;
00220
00221 case DTEnums::Right:
00222 newHit1D.setPositionAndError(rightPoint, error);
00223 break;
00224
00225 default:
00226 throw cms::Exception("InvalidDTCellSide") << "[DTNoDriftAlgo] Compute at Step "
00227 << step << ", Hit side "
00228 << newHit1D.lrSide()
00229 << " is invalid!" << endl;
00230 return false;
00231 }
00232
00233 return true;
00234 }else {
00235 return false;
00236 }
00237 }
00238
00239
00240 float DTNoDriftAlgo::fixedDrift;
00241
00242
00243 float DTNoDriftAlgo::hitResolution;
00244
00245
00246 float DTNoDriftAlgo::minTime;
00247
00248
00249 float DTNoDriftAlgo::maxTime;
00250
00251
00252 bool DTNoDriftAlgo::debug;