00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "CalibMuon/DTCalibration/interface/DTTMax.h"
00010 #include "Geometry/DTGeometry/interface/DTLayer.h"
00011 #include "Geometry/DTGeometry/interface/DTSuperLayer.h"
00012 #include "CalibMuon/DTDigiSync/interface/DTTTrigBaseSync.h"
00013
00014 #include "CalibMuon/DTCalibration/plugins/Histogram.h"
00015
00016 #include <map>
00017 #include <iostream>
00018
00019 using namespace std;
00020 using namespace dttmaxenums;
00021 using namespace DTEnums;
00022
00023 DTTMax::InfoLayer::InfoLayer(DTRecHit1D rh_, const DTSuperLayer & isl, GlobalVector dir,
00024 GlobalPoint pos, DTTTrigBaseSync* sync):
00025 rh(rh_), idWire(rh.wireId()), lr(rh.lrSide()) {
00026 const DTLayer* layer = isl.layer(idWire.layerId());
00027 LocalPoint wirePosInLayer(layer->specificTopology().wirePosition(idWire.wire()), 0, 0);
00028 LocalPoint wirePosInSL=isl.toLocal(layer->toGlobal(wirePosInLayer));
00029 wireX = wirePosInSL.x();
00030
00031
00032 LocalVector segDir = layer->toLocal(dir);
00033 LocalPoint segPos = layer->toLocal(pos);
00034 LocalPoint segPosAtLayer = segPos + segDir*(-segPos.z())/cos(segDir.theta());
00035 LocalPoint hitPos(rh.localPosition().x() ,segPosAtLayer.y(),0.);
00036 time = rh.digiTime() - sync->offset(layer, idWire, layer->toGlobal(hitPos));
00037
00038 if (time < 0. || time > 415.) {
00039
00040 cout << " *** WARNING time = " << time << endl;
00041 }
00042 }
00043
00044
00045 DTTMax::DTTMax(const vector<DTRecHit1D>& hits, const DTSuperLayer & isl, GlobalVector dir,
00046 GlobalPoint pos, DTTTrigBaseSync* sync):
00047 theInfoLayers(4,(InfoLayer*)0),
00048 theTMaxes(4,(TMax*)0)
00049 {
00050
00051 debug = "true";
00052
00053
00054 for (vector<DTRecHit1D>::const_iterator hit=hits.begin(); hit!=hits.end();
00055 ++hit) {
00056
00057
00058 InfoLayer* layInfo = new InfoLayer((*hit), isl, dir, pos, sync);
00059 int ilay = layInfo->idWire.layer();
00060 if (getInfoLayer(ilay)==0) {
00061 getInfoLayer(ilay) = layInfo;
00062 } else {
00063
00064 delete layInfo;
00065 }
00066 }
00067
00068
00069 theSegDir = ((isl.toLocal(dir).x() < 0)? L : R);
00070
00071 int layersIn = 0;
00072 int nGoodHits=0;
00073 for(vector<InfoLayer*>::const_iterator ilay = theInfoLayers.begin();
00074 ilay != theInfoLayers.end(); ilay++) {
00075 if ((*ilay) == 0 ) {
00076 theSegType+= "X";
00077 continue;
00078 }
00079 DTEnums::DTCellSide lOrR =(*ilay)->lr;
00080 if(lOrR == Left) theSegType+= "L";
00081 else if (lOrR == Right) theSegType+="R";
00082 else theSegType+= "X";
00083
00084
00085
00086
00087
00088
00089 layersIn += (*ilay)->idWire.layer();
00090 nGoodHits++;
00091 }
00092
00093 if(nGoodHits >=3 && (theSegType != "RRRR" && theSegType != "LLLL")) {
00094 float t1 = 0.;
00095 float t2 = 0.;
00096 float t3 = 0.;
00097 float t4 = 0.;
00098 float x1 = 0.;
00099 float x2 = 0.;
00100 float x3 = 0.;
00101 float x4 = 0.;
00102
00103 if(layersIn <= 8 || layersIn == 10) {
00104 t1 = getInfoLayer(1)->time;
00105 x1 = getInfoLayer(1)->wireX;
00106 }
00107 if(layersIn <= 7 || layersIn >= 9) {
00108 t2 = getInfoLayer(2)->time;
00109 x2 = getInfoLayer(2)->wireX;
00110 }
00111 if(layersIn == 6 || layersIn >= 8) {
00112 t3 = getInfoLayer(3)->time;
00113 x3 = getInfoLayer(3)->wireX;
00114 }
00115 if( layersIn >= 7) {
00116 t4 = getInfoLayer(4)->time;
00117 x4 = getInfoLayer(4)->wireX;
00118 }
00119
00120 float t = 0.;
00121 TMaxCells cGroup = notInit;
00122 string type;
00123 SigmaFactor sigma = noR;
00124 float halfCell = 2.1;
00125 float delta = 0.5;
00126 unsigned t0Factor = 99;
00127
00128
00129 if (debug) {
00130 cout << "seg. type: " << theSegType << " and dir: " << theSegDir << endl;
00131 cout << "t1, t2, t3, t4: " << t1 << " " << t2 << " " << t3 << " " << t4 << endl;
00132 cout << "x1, x2, x3, x4: " << x1 << " " << x2 << " " << x3 << " " << x4 << endl;
00133 }
00134
00135
00136 unsigned hSubGroup = 99;
00137 if(t1 == 0. || t2 == 0. || t3 == 0. || t4 == 0.)
00138 hSubGroup = 0;
00139 else if(t1<=5. || t2<=5. || t3<=5. || t4<=5.)
00140 hSubGroup = 1;
00141 else if(t1<=10. || t2<=10. || t3<=10. || t4<=10.)
00142 hSubGroup = 2;
00143 else if(t1<=20. || t2<=20. || t3<=20. || t4<=20.)
00144 hSubGroup = 3;
00145 else if(t1<=50. || t2<=50. || t3<=50. || t4<=50.)
00146 hSubGroup = 4;
00147
00148 if((layersIn == 6 || layersIn == 10) && (fabs(x1-x3)<delta)) {
00149 cGroup = c123;
00150 ((type+=theSegType[0])+=theSegType[1])+=theSegType[2];
00151 sigma = r32;
00152 if(type == "LRL" || type == "RLR") {
00153 t0Factor = 2;
00154 t = (t1+t3)/2.+t2;
00155 hT123LRL->Fill(t);
00156 }
00157 else if((type == "LLR" && theSegDir == R) ||
00158 (type == "RRL" && theSegDir == L)) {
00159 t0Factor = 1;
00160 t = (t3-t1)/2.+t2;
00161 hT123LLR->Fill(t);
00162 }
00163 else if((type == "LRR" && theSegDir == R) ||
00164 (type == "RLL" && theSegDir == L)) {
00165 t0Factor = 1;
00166 t = (t1-t3)/2.+t2;
00167 hT123LRR->Fill(t);
00168 }
00169 else {
00170 t = -1.;
00171 sigma = noR;
00172 hT123Bad->Fill(t);
00173 }
00174 theTMaxes[cGroup] = new TMax(t,cGroup,type,sigma,t0Factor,hSubGroup);
00175 if(debug) cout << "tmax123 " << t << " " << type << endl;
00176 }
00177 if(layersIn == 7 || layersIn == 10) {
00178 cGroup = c124;
00179 type.clear();
00180 sigma = r72;
00181 ((type+=theSegType[0])+=theSegType[1])+=theSegType[3];
00182 if((theSegType == "LRLR" && type == "LRR" && x1 > x4) ||
00183 (theSegType == "RLRL" && type == "RLL" && x1 < x4)) {
00184 t0Factor = 2;
00185 t = 1.5*t2+t1-t4/2.;
00186 hT124LRR1gt4->Fill(t);
00187 }
00188 else if((type == "LLR" && theSegDir == R && (fabs(x2-x4)<delta) && x1 < x2) ||
00189 (type == "RRL" && theSegDir == L && (fabs(x2-x4)<delta) && x1 > x2)) {
00190 t0Factor = 1;
00191 t = 1.5*t2-t1+t4/2.;
00192 hT124LLR->Fill(t);
00193 }
00194 else if((type == "LLL" && theSegDir == R && (fabs(x2-x4)<delta) && x1 < x2) ||
00195 (type == "RRR" && theSegDir == L && (fabs(x2-x4)<delta) && x1 > x2)) {
00196 t0Factor = 0;
00197 t = 1.5*t2-t1-t4/2.;
00198 hT124LLLR->Fill(t);
00199 }
00200 else if((type == "LLL" && theSegDir == L && (fabs(x2-x4)<delta)) ||
00201 (type == "RRR" && theSegDir == R && (fabs(x2-x4)<delta))) {
00202 t0Factor = 0;
00203 t = -1.5*t2+t1+t4/2.;
00204 hT124LLLL->Fill(t);
00205 }
00206 else if((type == "LRL" && theSegDir == L && (fabs(x2-x4)<delta)) ||
00207 (type == "RLR" && theSegDir == R && (fabs(x2-x4)<delta))) {
00208 t0Factor = 3;
00209 t = 1.5*t2+t1+t4/2.;
00210 hT124LRLL->Fill(t);
00211 }
00212 else if((type == "LRL" && theSegDir == R && (fabs(x1-x4)<(halfCell+delta))) ||
00213 (type == "RLR" && theSegDir == L && (fabs(x1-x4)<(halfCell+delta)))) {
00214 t0Factor = 99;
00215 t = 3./4.*t2+t1/2.+t4/4.;
00216 sigma = r78;
00217 hT124LRLR->Fill(t);
00218 }
00219 else if((type == "LRR" && theSegDir == R && x1 < x4 && (fabs(x1-x4)<(halfCell+delta)))||
00220 (type == "RLL" && theSegDir == L && x1 > x4 && (fabs(x1-x4)<(halfCell+delta)))) {
00221 t0Factor = 1;
00222 t = 3./4.*t2+t1/2.-t4/4.;
00223 sigma = r78;
00224 hT124LRR1lt4->Fill(t);
00225 }
00226 else {
00227 t = -1.;
00228 sigma = noR;
00229 hT124Bad->Fill(t);
00230 }
00231 theTMaxes[cGroup] = new TMax(t,cGroup,type,sigma,t0Factor,hSubGroup);
00232 if(debug) cout << "tmax124 " << t << " " << t0Factor << " " << type << endl;
00233 }
00234 if(layersIn == 8 || layersIn == 10) {
00235 cGroup = c134;
00236 type.clear();
00237 ((type+=theSegType[0])+=theSegType[2])+=theSegType[3];
00238 sigma = r72;
00239 if((type == "LLR" && x1 > x4 && theSegType == "LRLR") ||
00240 (type == "RRL" && x1 < x4 && theSegType == "RLRL")) {
00241 t0Factor = 2;
00242 t = 1.5*t3+t4-t1/2.;
00243 hT134LLR1gt4->Fill(t);
00244 }
00245 else if((type == "LLR" && x1 < x4 && (fabs(x1-x4)<(halfCell+delta))) ||
00246 (type == "RRL" && x1 > x4 && (fabs(x1-x4)<(halfCell+delta)))) {
00247 t0Factor = 1;
00248 t = 3./4.*t3+t4/2.-t1/4.;
00249 sigma = r78;
00250 hT134LLR1lt4->Fill(t);
00251 }
00252 else if((type == "LRR" && theSegDir == R && x1 < x4 && (fabs(x1-x3)<delta)) ||
00253 (type == "RLL" && theSegDir == L && x1 > x4 &&(fabs(x1-x3)<delta))) {
00254 t0Factor = 1;
00255 t = 1.5*t3-t4+t1/2.;
00256 hT134LRR->Fill(t);
00257 }
00258 else if((type == "LRL" && theSegDir == R && (fabs(x1-x3)<delta)) ||
00259 (type == "RLR" && theSegDir == L && (fabs(x1-x3)<delta))) {
00260 t0Factor = 3;
00261 t = 1.5*t3+t4+t1/2.;
00262 hT134LRLR->Fill(t);
00263 }
00264 else if((type == "LRL" && theSegDir == L && (fabs(x1-x3)<(2.*halfCell+delta))) ||
00265 (type == "RLR" && theSegDir == R && (fabs(x1-x3)<(2.*halfCell+delta)))) {
00266 t0Factor = 99;
00267 t = 3./4.*t3+t4/2.+t1/4.;
00268 sigma = r78;
00269 hT134LRLL->Fill(t);
00270 }
00271 else if((type == "LLL" && theSegDir == L && x1 > x4 && (fabs(x1-x3)<delta)) ||
00272 (type == "RRR" && theSegDir == R && x1 < x4 && (fabs(x1-x3)<delta))) {
00273 t0Factor = 0;
00274 t = 1.5*t3-t4-t1/2.;
00275 hT134LLLL->Fill(t);
00276 }
00277 else if((type == "LLL" && theSegDir == R && (fabs(x1-x3)<delta)) ||
00278 (type == "RRR" && theSegDir == L && (fabs(x1-x3)<delta))) {
00279 t0Factor = 0;
00280 t = -1.5*t3+t4+t1/2.;
00281 hT134LLLR->Fill(t);
00282 }
00283 else {
00284 t = -1;
00285 sigma = noR;
00286 hT134Bad->Fill(t);
00287 }
00288 theTMaxes[cGroup] = new TMax(t,cGroup,type,sigma,t0Factor,hSubGroup);
00289 if(debug) cout << "tmax134 " << t << " " << t0Factor << " " << type << endl;
00290 }
00291 if((layersIn == 9 || layersIn == 10) && (fabs(x2-x4)<delta)) {
00292 cGroup = c234;
00293 type.clear();
00294 ((type+=theSegType[1])+=theSegType[2])+=theSegType[3];
00295 sigma = r32;
00296 if((type == "LRL" ) ||
00297 (type == "RLR" )) {
00298 t0Factor = 2;
00299 t = (t2+t4)/2.+t3;
00300 hT234LRL->Fill(t);
00301 }
00302 else if((type == "LRR" && theSegDir == R) ||
00303 (type == "RLL" && theSegDir == L)) {
00304 t0Factor = 1;
00305 t = (t2-t4)/2.+t3;
00306 hT234LRR->Fill(t);
00307 }
00308 else if((type == "LLR" && theSegDir == R) ||
00309 (type == "RRL" && theSegDir == L)) {
00310 t0Factor = 1;
00311 t = (t4-t2)/2.+t3;
00312 hT234LLR->Fill(t);
00313 }
00314 else {
00315 t = -1;
00316 sigma = noR;
00317 hT234Bad->Fill(t);
00318 }
00319 theTMaxes[cGroup] = new TMax(t,cGroup,type,sigma,t0Factor,hSubGroup);
00320 if(debug) cout << "tmax234 " << t << " " << type << endl;
00321 }
00322 }
00323
00324 }
00325
00326
00327 vector<const DTTMax::TMax*> DTTMax::getTMax(const DTWireId & idWire) {
00328 vector<const TMax*> v;
00329 if(idWire.layer()==1) {
00330 v.push_back(getTMax(c123));
00331 v.push_back(getTMax(c124));
00332 v.push_back(getTMax(c134));
00333 }
00334 else if(idWire.layer()==2) {
00335 v.push_back(getTMax(c123));
00336 v.push_back(getTMax(c124));
00337 v.push_back(getTMax(c234));
00338 }
00339 else if(idWire.layer()==3) {
00340 v.push_back(getTMax(c123));
00341 v.push_back(getTMax(c134));
00342 v.push_back(getTMax(c234));
00343 }
00344 else {
00345 v.push_back(getTMax(c124));
00346 v.push_back(getTMax(c134));
00347 v.push_back(getTMax(c234));
00348 }
00349 return v;
00350 }
00351
00352
00353
00354 vector<const DTTMax::TMax*> DTTMax::getTMax(const DTSuperLayerId & isl) {
00355 vector<const TMax*> v;
00356
00357 if((int)getTMax(c123) != 0) v.push_back(getTMax(c123));
00358 if((int)getTMax(c124) != 0) v.push_back(getTMax(c124));
00359 if((int)getTMax(c134) != 0) v.push_back(getTMax(c134));
00360 if((int)getTMax(c234) != 0) v.push_back(getTMax(c234));
00361 return v;
00362 }
00363
00364
00365 const DTTMax::TMax* DTTMax::getTMax(TMaxCells cCase){
00366 return theTMaxes[cCase];
00367 }
00368
00369
00370 DTTMax::~DTTMax(){
00371 for (vector<InfoLayer*>::const_iterator ilay = theInfoLayers.begin();
00372 ilay != theInfoLayers.end(); ilay++) {
00373 delete (*ilay);
00374 }
00375
00376 for (vector<TMax*>::const_iterator iTmax = theTMaxes.begin();
00377 iTmax != theTMaxes.end(); iTmax++) {
00378 delete (*iTmax);
00379 }
00380 }