00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "L1Trigger/DTUtilities/interface/DTTrigGeom.h"
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include <iostream>
00029 #include <iomanip>
00030 #include <fstream>
00031 #include <sstream>
00032 #include <cstring>
00033
00034
00035
00036
00037 #include "Geometry/DTGeometry/interface/DTTopology.h"
00038 #include "Geometry/DTGeometry/interface/DTLayer.h"
00039 #include "Geometry/DTGeometry/interface/DTSuperLayer.h"
00040 #include "Geometry/DTGeometry/interface/DTChamber.h"
00041 #include "DataFormats/GeometryVector/interface/GlobalPoint.h"
00042 #include "DataFormats/GeometryVector/interface/GlobalVector.h"
00043 #include "DataFormats/GeometryVector/interface/LocalPoint.h"
00044 #include "DataFormats/GeometryVector/interface/LocalVector.h"
00045
00046 using namespace std;
00047
00048
00049
00050
00051
00052 DTTrigGeom::DTTrigGeom(DTChamber* stat, bool debug) : _stat(stat) , _debug(debug) {
00053
00054 getGeom();
00055
00056 }
00057
00058
00059
00060
00061
00062
00063 DTTrigGeom::~DTTrigGeom() {}
00064
00065
00066
00067
00068
00069
00070 float
00071 DTTrigGeom::phiSLOffset(){
00072
00073 float x1 = tubePosInCh(1,1,1).x();
00074 float x3 = tubePosInCh(3,1,1).x();
00075 float offset = x1-x3;
00076
00077
00078
00079 return offset;
00080 }
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143 int
00144 DTTrigGeom::mapTubeInFEch(int nsl, int nlay, int ntube) const {
00145 int nch = 0;
00146 if(station()==4 && nsl==2){
00147 std::cout << "No theta superlayer in station 4!" << std::endl;
00148 }
00149 else{
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160 nch =ntube;
00161
00162
00163
00164 }
00165 return nch;
00166 }
00167
00168 LocalPoint
00169 DTTrigGeom::tubePosInCh(int nsl, int nlay, int ntube) const {
00170 if ( nlay==4 && ntube==1) {
00171 std::cout << "ATTENTION: no wire nuber 1 for 4th layer!!!" << std::endl;
00172 LocalPoint dummyLP(0,0,0);
00173 return dummyLP;
00174 }
00175 const DTSuperLayer* sl = _stat->superLayer(DTSuperLayerId(statId(),nsl));
00176 const DTLayer* lay = sl->layer(DTLayerId(statId(),nsl,nlay));
00177
00178 float localX = lay->specificTopology().wirePosition(ntube);
00179 LocalPoint posInLayer(localX,0,0);
00180 LocalPoint posInChamber = _stat->surface().toLocal(lay->toGlobal(posInLayer));
00181
00182
00183
00184
00185
00186
00187 return posInChamber;
00188 }
00189
00190 int
00191 DTTrigGeom::posFE(int sl) const {
00192 if( station()!=4 || sl!=2 ) {
00193
00194 return 1;
00195 }
00196 else{
00197 std::cout << "No theta superlayer in station 4!" << std::endl;
00198 return 0;
00199 }
00200 }
00201
00202 void
00203 DTTrigGeom::setGeom(const DTChamber* stat) {
00204
00205 _stat=stat;
00206 getGeom();
00207
00208 }
00209
00210 void
00211 DTTrigGeom::getGeom() {
00212
00213
00214
00215 _PITCH = 4.2;
00216
00217 _H = 1.3;
00218
00219 _PHICH = _stat->surface().toGlobal(LocalVector(0,0,-1)).phi();
00220
00221
00222 DTSuperLayer* sl[3];
00223 DTLayer* l1[3];
00224 int i = 0;
00225 for(i=0; i<3; i++) {
00226 if(station()==4&&i==1) {
00227 _ZSL[i] = -999;
00228 _NCELL[i] = 0;
00229 } else {
00230 sl[i] = (DTSuperLayer*) _stat->superLayer(DTSuperLayerId(statId(),i+1));
00231 l1[i] = (DTLayer*) sl[i]->layer(DTLayerId(statId(),i+1,1));
00232 _ZSL[i] = _stat->surface().toLocal(sl[i]->position()).z();
00233
00234 const DTTopology& tp=l1[i]->specificTopology();
00235 float posX=tp.wirePosition(tp.firstChannel());
00236 LocalPoint posInLayer(posX,0,0);
00237 _NCELL[i] = l1[i]->specificTopology().channels();
00238 }
00239 }
00240
00241
00242 if(_debug){
00243 std::cout << setiosflags(std::ios::showpoint | std::ios::fixed) << std::setw(4) <<
00244 std::setprecision(1);
00245 std::cout << "Identification: wheel=" << wheel();
00246 std::cout << ", station=" << station();
00247 std::cout << ", sector=" << sector() << std::endl;
00248 GlobalPoint pp = _stat->toGlobal(LocalPoint(0,0,0));
00249 std::cout << "Position: Mag=" << pp.mag() << "cm, Phi=" << pp.phi()*180/3.14159;
00250 std::cout << " deg, Z=" << pp.z() << " cm" << std::endl;
00251 std::cout << "Rotation: ANGLE=" << phiCh()*180/3.14159 << std::endl;
00252
00253 std::cout << "Z of superlayers: phi=" << ZSL(1) << ", ";
00254 std::cout << ZSL(3) << " theta=" << ZSL(2);
00255 std::cout << " (DeltaY = " << distSL() << ")" << std::endl;
00256 std::cout << " ncell: sl 1 " << nCell(1) << " sl 2 " << nCell(2) <<
00257 " sl 3 " << nCell(3) << std::endl;
00258
00259 }
00260
00261
00262 }
00263
00264 float
00265 DTTrigGeom::ZSL(int sl) const {
00266 if(sl<1||sl>3){
00267 std::cout << "DTTrigGeom::ZSL: wrong SL number: " << sl;
00268 std::cout << -999 << " returned" << std::endl;
00269 return -999;
00270 }
00271 return _ZSL[sl-1];
00272 }
00273
00274
00275 void
00276 DTTrigGeom::dumpGeom() const {
00277 std::cout << "Identification: wheel=" << wheel();
00278 std::cout << ", station=" << station();
00279 std::cout << ", sector=" << sector() << std::endl;
00280 GlobalPoint pp = _stat->toGlobal(LocalPoint(0,0,0));
00281 std::cout << "Position: Mag=" << pp.mag() << "cm, Phi=" << pp.phi()*180/3.14159;
00282 std::cout << " deg, Z=" << pp.z() << " cm" << std::endl;
00283 std::cout << "Rotation: ANGLE=" << phiCh()*180/3.14159 << std::endl;
00284 std::cout << "Z of superlayers: phi=" << ZSL(1) << ", ";
00285 std::cout << ZSL(3) << " theta=" << ZSL(2) << std::endl;
00286 std::cout << "Number of cells: SL1=" << nCell(1) << " SL2=" << nCell(2) <<
00287 " SL3=" << nCell(3) << std::endl;
00288 std::cout << "First wire positions:" << std::endl;
00289 int ii=0;
00290 int jj=0;
00291 for( ii = 1; ii<=3; ii++ ) {
00292 if(station()!=4||ii!=2){
00293 for ( jj =1; jj<=4; jj++ ) {
00294 std::cout << " SL=" << ii << ", lay=" << jj << ", wire 1 position=";
00295 if ( jj ==4)
00296 std::cout << tubePosInCh( ii, jj, 2) << std::endl;
00297 else
00298 std::cout << tubePosInCh( ii, jj, 1) << std::endl;
00299 }
00300 }
00301 }
00302
00303 GlobalPoint gp1 = CMSPosition(DTBtiId(statId(),1,1));
00304
00305
00306 std::cout << "First BTI position:";
00307 std::cout << " SL1:" << localPosition(DTBtiId(statId(),1,1)) << std::endl;
00308 std::cout << " Position: R=" << gp1.perp() << "cm, Phi=" << gp1.phi()*180/3.14159 << " deg, Z=" << gp1.z() << " cm" << std::endl;
00309
00310 if(station()!=4)
00311 {
00312 GlobalPoint gp2 = CMSPosition(DTBtiId(statId(),2,1));
00313 std::cout << " SL2:" << localPosition(DTBtiId(statId(),2,1))<< std::endl;
00314 std::cout << " Position: R=" << gp2.perp() << "cm, Phi=" << gp2.phi()*180/3.14159 << " deg, Z=" << gp2.z() << " cm" << std::endl;
00315 }
00316
00317 GlobalPoint gp3 = CMSPosition(DTBtiId(statId(),3,1));
00318 std::cout << " SL3:" << localPosition(DTBtiId(statId(),3,1)) << std::endl;
00319 std::cout << " Position: R=" << gp3.perp() << "cm, Phi=" << gp3.phi()*180/3.14159 << " deg, Z=" << gp3.z() << " cm" << std::endl;
00320
00321 std::cout << "First TRACO position:";
00322 std::cout << localPosition(DTTracoId(statId(),1)) << std::endl;
00323 std::cout << "******************************************************" << std::endl;
00324 }
00325
00326 void
00327 DTTrigGeom::dumpLUT(short int btic) {
00328
00329
00330 int wh = wheel();
00331 int st = station();
00332 int se = sector();
00333
00334
00335 string name = "Lut_from_CMSSW_geom";
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351 name += ".txt";
00352
00353 ofstream fout;
00354 fout.open(name.c_str(),ofstream::app);
00355
00356
00357
00358
00359
00360 fout << wh;
00361 fout << "\t" << st;
00362 fout << "\t" << se;
00363
00364
00365 float xBTI1_3 = localPosition( DTBtiId(DTSuperLayerId(wheel(),station(),sector(),3),1) ).x();
00366 float xBTI1_1 = localPosition( DTBtiId(DTSuperLayerId(wheel(),station(),sector(),1),1) ).x();
00367 float SL_shift = xBTI1_3 - xBTI1_1;
00368
00369
00370
00371 LocalPoint traco1 = localPosition(DTTracoId(statId(),1));
00372 LocalPoint traco2 = localPosition(DTTracoId(statId(),2));
00373 GlobalPoint traco_1 = toGlobal(traco1);
00374 GlobalPoint traco_2 = toGlobal(traco2);
00375
00376
00377 float d;
00378 float xcn;
00379 int xcn_sign;
00380 GlobalPoint pp = _stat->toGlobal(LocalPoint(0,0,ZcenterSL()));
00381
00382
00383 if(sector()==1 || sector() ==7){
00384 d = fabs(traco_1.x());
00385 xcn = fabs(traco_1.y());
00386
00387 if (SL_shift > 0)
00388 xcn = xcn+SL_shift;
00389 xcn_sign = static_cast<int>(pp.y()/fabs(pp.y()))*static_cast<int>(traco_1.y()/fabs(traco_1.y()));
00390 if(station() == 2 || (station() == 4 && sector() == 1))
00391 xcn_sign = - xcn_sign;
00392 xcn = xcn*xcn_sign;
00393 }
00394 else {
00395 float m1 = (traco_2.y()-traco_1.y())/(traco_2.x()-traco_1.x());
00396 float q1 = traco_1.y()-m1*traco_1.x();
00397 float m = tan(phiCh());
00398 float xn = q1/(m-m1);
00399 float yn = m*xn;
00400
00401 d = sqrt(xn*xn+yn*yn);
00402 xcn = sqrt( (xn-traco_1.x())*(xn-traco_1.x()) + (yn-traco_1.y())*(yn-traco_1.y()) );
00403
00404 if (SL_shift > 0)
00405 xcn = xcn+SL_shift;
00406
00407 float diff = (pp.x()-traco_1.x())*traco_1.y();
00408 xcn_sign = static_cast<int>(diff/fabs(diff));
00409 xcn = xcn*xcn_sign;
00410 }
00411
00412
00413
00414
00415
00416 fout << "\tA8";
00417
00418
00419 short int Low_byte = (btic & 0x00FF);
00420 short int High_byte =( btic>>8 & 0x00FF);
00421 fout << setw(2) << setfill('0') << hex << High_byte << setw(2) << setfill('0') << Low_byte;
00422
00423
00424 short int DSPmantissa = 0;
00425 short int DSPexp = 0;
00426
00427
00428 IEEE32toDSP(d, DSPmantissa, DSPexp);
00429 Low_byte = (DSPmantissa & 0x00FF);
00430 High_byte =( DSPmantissa>>8 & 0x00FF);
00431 fout << setw(2) << setfill('0') << hex << High_byte << setw(2) << setfill('0') << Low_byte;
00432 Low_byte = (DSPexp & 0x00FF);
00433 High_byte =( DSPexp>>8 & 0x00FF);
00434 fout << setw(2) << setfill('0') << High_byte << setw(2) << setfill('0') << Low_byte;
00435
00436
00437 DSPmantissa = 0;
00438 DSPexp = 0;
00439 IEEE32toDSP(xcn, DSPmantissa, DSPexp);
00440 Low_byte = (DSPmantissa & 0x00FF);
00441 High_byte =( DSPmantissa>>8 & 0x00FF);
00442 fout << setw(2) << setfill('0') << hex << High_byte << setw(2) << setfill('0') << Low_byte;
00443 Low_byte = (DSPexp & 0x00FF);
00444 High_byte =( DSPexp>>8 & 0x00FF);
00445 fout << setw(2) << setfill('0') << High_byte << setw(2) << setfill('0') << Low_byte;
00446
00447
00448 Low_byte = (xcn_sign & 0x00FF);
00449 High_byte =( xcn_sign>>8 & 0x00FF);
00450 fout << setw(2) << setfill('0') << hex << High_byte << setw(2) << setfill('0') << Low_byte << dec << "\n";
00451
00452 fout.close();
00453
00454 return;
00455
00456 }
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492 void
00493 DTTrigGeom::IEEE32toDSP(float f, short int & DSPmantissa, short int & DSPexp)
00494 {
00495 long int lm;
00496 long int pl = 0;
00497
00498 bool sign=false;
00499
00500 DSPmantissa = 0;
00501 DSPexp = 0;
00502
00503 if( f!=0.0 )
00504 {
00505 memcpy(&pl,&f,sizeof(float));
00506
00507 if((pl & 0x80000000)!=0)
00508 sign=true;
00509 lm = ( 0x800000 | (pl & 0x7FFFFF));
00510 lm >>= 9;
00511 lm &= 0x7FFF;
00512 DSPexp = ((pl>>23)&0xFF)-126;
00513 DSPmantissa = (short)lm;
00514 if(sign)
00515 DSPmantissa = - DSPmantissa;
00516
00517 }
00518 return;
00519 }
00520
00521
00522 LocalPoint
00523 DTTrigGeom::localPosition(const DTBtiId id) const {
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562
00563
00564 int nsl = id.superlayer();
00565 const DTSuperLayer* sl = _stat->superLayer(DTSuperLayerId(statId(),nsl));
00566 const DTLayer* lay = sl->layer(DTLayerId(statId(),nsl,1));
00567 int tube = id.bti();
00568 float localX = lay->specificTopology().wirePosition(tube);
00569 float xt = -cellPitch()/2.;
00570 float zt = -cellH() * 3./2.;
00571
00572 LocalPoint posInLayer1(localX+xt,0,zt);
00573 LocalPoint posInChamber = _stat->surface().toLocal(lay->toGlobal(posInLayer1));
00574
00575
00576
00577
00578
00579
00580 return posInChamber;
00581 }
00582
00583 LocalPoint
00584 DTTrigGeom::localPosition(const DTTracoId id) const {
00585
00586
00587
00588
00589
00590
00591
00592
00593
00594
00595 float x = localPosition( DTBtiId(DTSuperLayerId(wheel(),station(),sector(),3),1) ).x();
00596
00597
00598
00599
00600 x += (id.traco()-2)*DTConfig::NBTITC * cellPitch();
00601
00602 float y = 0;
00603 float z = ZcenterSL();
00604
00605 return LocalPoint(x,y,z);
00606 }