00001 #include <iostream>
00002 #include <stdlib.h>
00003 #include <string>
00004 #include <assert.h>
00005 using namespace std;
00006
00007 #include "CalibCalorimetry/EcalLaserAnalyzer/interface/ME.h"
00008 #include "CalibCalorimetry/EcalLaserAnalyzer/interface/MEEBGeom.h"
00009
00010 #include <TGraph.h>
00011
00012
00013
00014 int
00015 MEEBGeom::barrel( EBGlobalCoord ieta, EBGlobalCoord iphi )
00016 {
00017 int iz=1;
00018 if( ieta<0 ) iz=-1;
00019 ieta *= iz;
00020 assert( ieta>0 && ieta<=85 );
00021 if( iphi<0 ) iphi+=360;
00022 assert( iphi>0 && iphi<=360 );
00023 return iz;
00024 }
00025
00026 int
00027 MEEBGeom::sm( EBGlobalCoord ieta, EBGlobalCoord iphi )
00028 {
00029 int iz=1;
00030 if( ieta<0 ) iz=-1;
00031 ieta *= iz;
00032 assert( ieta>0 && ieta<=85 );
00033
00034
00035 int iphi_ = iphi;
00036 if( iphi_>360 ) iphi_-=360;
00037 assert( iphi_>0 && iphi_<=360 );
00038
00039 int ism = (iphi_-1)/20 + 1;
00040 assert( ism>=1 && ism<=18 );
00041
00042 if( iz==-1 ) ism += 18;
00043
00044 return ism;
00045 }
00046
00047 int
00048 MEEBGeom::dcc( EBGlobalCoord ieta, EBGlobalCoord iphi )
00049 {
00050 int ism = sm( ieta, iphi );
00051 return dccFromSm( ism );
00052 }
00053
00054 int
00055 MEEBGeom::dccFromSm( int ism )
00056 {
00057 assert( ism>=1 && ism<=36 );
00058 int iz=1;
00059 if( ism>18 ) iz=-1;
00060 if( iz==-1 ) ism-=18;
00061 assert( ism>=1 && ism<=18 );
00062 int idcc = 9+ism;
00063 if( iz==+1 ) idcc+=18;
00064 return idcc;
00065 }
00066
00067 int
00068 MEEBGeom::smFromDcc( int idcc )
00069 {
00070 if( idcc>600 ) idcc-=600;
00071 assert( idcc>=10 && idcc<=45 );
00072 int ism=idcc-9;
00073 if( ism>18 ) ism-=18;
00074 else ism+=18;
00075 return ism;
00076 }
00077
00078 TString
00079 MEEBGeom::smName( int ism )
00080 {
00081 assert( ism>=1 && ism<=36 );
00082 TString out = "EB+";
00083 if( ism>18 )
00084 {
00085 out = "EB-";
00086 ism -= 18;
00087 }
00088 out += ism;
00089 return out;
00090 }
00091
00092 int
00093 MEEBGeom::lmmod( EBGlobalCoord ieta, EBGlobalCoord iphi )
00094 {
00095 std::pair<EBLocalCoord,EBLocalCoord> ixy = localCoord( ieta, iphi );
00096 return lm_channel( ixy.first/5, ixy.second/5 );
00097 }
00098
00099 int
00100 MEEBGeom::tt( EBGlobalCoord ieta, EBGlobalCoord iphi )
00101 {
00102 std::pair<EBLocalCoord,EBLocalCoord> ixy = localCoord( ieta, iphi );
00103 return tt_channel( ixy.first/5, ixy.second/5 );
00104 }
00105
00106 int
00107 MEEBGeom::crystal( EBGlobalCoord ieta, EBGlobalCoord iphi )
00108 {
00109 std::pair<EBLocalCoord,EBLocalCoord> ixy = localCoord( ieta, iphi );
00110 return crystal_channel( ixy.first, ixy.second );
00111 }
00112
00113 int
00114 MEEBGeom::side( EBGlobalCoord ieta, EBGlobalCoord iphi )
00115 {
00116 int ilmmod = lmmod( ieta, iphi );
00117 return (ilmmod%2==0)?1:0;
00118 }
00119
00120 int
00121 MEEBGeom::lmr( EBGlobalCoord ieta, EBGlobalCoord iphi )
00122 {
00123 int idcc = dcc( ieta, iphi );
00124 int ism = idcc-9;
00125 int iside = side( ieta, iphi );
00126 int ilmr = 1 + 2*(ism-1) + iside;
00127 return ilmr;
00128 }
00129
00130 std::pair< MEEBGeom::EBLocalCoord, MEEBGeom::EBLocalCoord >
00131 MEEBGeom::localCoord( MEEBGeom::EBGlobalCoord ieta, MEEBGeom::EBGlobalCoord iphi )
00132 {
00133 int iz=1;
00134 if( ieta<0 ) iz=-1;
00135 ieta *= iz;
00136 assert( ieta>0 && ieta<=85 );
00137
00138
00139 int iphi_ = iphi;
00140 if( iphi_>360 ) iphi_-=360;
00141 assert( iphi_>0 && iphi_<=360 );
00142
00143 int ix = ieta-1;
00144
00145 int iy = (iphi_-1)%20;
00146 if( iz==-1 ) iy = 19-iy;
00147
00148
00149 return std::pair< EBLocalCoord, EBLocalCoord >(ix,iy);
00150 }
00151
00152 std::pair< MEEBGeom::EBLocalCoord, MEEBGeom::EBLocalCoord >
00153 MEEBGeom::localCoord( int icr )
00154 {
00155 assert( icr>=1 && icr<=1700 );
00156 int ix = (icr-1)/20;
00157 int iy = 19 - (icr-1)%20;
00158 return std::pair< EBLocalCoord, EBLocalCoord >(ix,iy);
00159 }
00160
00161 std::pair< MEEBGeom::EBGlobalCoord, MEEBGeom::EBGlobalCoord >
00162 MEEBGeom::globalCoord( int ism, MEEBGeom::EBLocalCoord ix, MEEBGeom::EBLocalCoord iy )
00163 {
00164 assert( ism>=1 && ism<=36 );
00165 assert( ix>=0 && ix<85 );
00166 assert( iy>=0 && iy<20 );
00167
00168 int iz=1;
00169 if( ism>18 )
00170 {
00171 iz=-1;
00172 ism -= 18;
00173 }
00174 if( iz==-1 ) iy = 19-iy;
00175
00176
00177 int ieta = ix+1;
00178 ieta *= iz;
00179
00180 int iphi = 1 + iy + 20*(ism-1);
00181
00182 return std::pair< EBGlobalCoord, EBGlobalCoord >(ieta,iphi);
00183 }
00184
00185 std::pair< float, float >
00186 MEEBGeom::globalCoord( int ism, float x, float y )
00187 {
00188 assert( ism>=1 && ism<=36 );
00189 int iz=1;
00190 if( ism>18 )
00191 {
00192 iz=-1;
00193 ism -= 18;
00194 }
00195 if( iz==-1 ) y = 19-y;
00196
00197 float eta = x+1;
00198 eta *= iz;
00199
00200 float phi = 1 + y + 20*(ism-1);
00201
00202 return std::pair< float, float >(eta,phi);
00203 }
00204
00205 std::pair< MEEBGeom::EBGlobalCoord, MEEBGeom::EBGlobalCoord >
00206 MEEBGeom::globalCoord( int ism, int icr )
00207 {
00208 assert( ism>=1 && ism<=36 );
00209 assert( icr>=1 && icr<=1700 );
00210
00211 int ix = (icr-1)/20;
00212 int iy = 19 - (icr-1)%20;
00213
00214 return globalCoord( ism, ix, iy );
00215 }
00216
00217 int
00218 MEEBGeom::lm_channel( EBTTLocalCoord iX, EBTTLocalCoord iY )
00219 {
00220 static const int
00221 idx_[] =
00222 {
00223
00224 1, 2, 2, 2, 2, 4, 4, 4, 4, 6, 6, 6, 6, 8, 8, 8, 8,
00225 1, 2, 2, 2, 2, 4, 4, 4, 4, 6, 6, 6, 6, 8, 8, 8, 8,
00226 1, 3, 3, 3, 3, 5, 5, 5, 5, 7, 7, 7, 7, 9, 9, 9, 9,
00227 1, 3, 3, 3, 3, 5, 5, 5, 5, 7, 7, 7, 7, 9, 9, 9, 9
00228
00229 };
00230
00231 int iym, ixm, il, ic, ii;
00232 iym=4;
00233 ixm=17;
00234 int iX_ = iX+1;
00235 int iY_ = iY+1;
00236 il=iym-iY_;
00237 ic=iX_-1;
00238 ii=il*ixm+ic;
00239 if(ii < 0 || ii > (int)(sizeof(idx_)/sizeof(int))) { return -1; };
00240 return idx_[ii];
00241 }
00242
00243 int
00244 MEEBGeom::tt_type( EBTTLocalCoord iX, EBTTLocalCoord iY )
00245 {
00246 static const int
00247 idx_[] =
00248 {
00249
00250 1, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2,
00251 1, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2,
00252 1, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2,
00253 1, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2
00254
00255 };
00256
00257 int iym, ixm, il, ic, ii;
00258 iym=4;
00259 ixm=17;
00260 int iX_ = iX+1;
00261 int iY_ = iY+1;
00262 il=iym-iY_;
00263 ic=iX_-1;
00264 ii=il*ixm+ic;
00265 if(ii < 0 || ii > (int)(sizeof(idx_)/sizeof(int))) { return -1; };
00266 return idx_[ii];
00267 }
00268
00269 int
00270 MEEBGeom::hv_channel( EBTTLocalCoord iX, EBTTLocalCoord iY )
00271 {
00272 static const int
00273 idx_[] =
00274 {
00275
00276 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33,
00277 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33,
00278 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34,
00279 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34
00280
00281 };
00282
00283 int iym, ixm, il, ic, ii;
00284 iym=4;
00285 ixm=17;
00286 int iX_ = iX+1;
00287 int iY_ = iY+1;
00288 il=iym-iY_;
00289 ic=iX_-1;
00290 ii=il*ixm+ic;
00291 if(ii < 0 || ii > (int)(sizeof(idx_)/sizeof(int))) { return -1; };
00292 return idx_[ii];
00293 }
00294
00295 int
00296 MEEBGeom::lv_channel( EBTTLocalCoord iX, EBTTLocalCoord iY )
00297 {
00298 static const int
00299 idx_[] =
00300 {
00301
00302 1, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16,
00303 1, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16,
00304 1, 3, 3, 5, 5, 7, 7, 9, 9, 11, 11, 13, 13, 15, 15, 17, 17,
00305 1, 3, 3, 5, 5, 7, 7, 9, 9, 11, 11, 13, 13, 15, 15, 17, 17
00306
00307 };
00308
00309 int iym, ixm, il, ic, ii;
00310 iym=4;
00311 ixm=17;
00312 int iX_ = iX+1;
00313 int iY_ = iY+1;
00314 il=iym-iY_;
00315 ic=iX_-1;
00316 ii=il*ixm+ic;
00317 if(ii < 0 || ii > (int)(sizeof(idx_)/sizeof(int))) { return -1; };
00318 return idx_[ii];
00319 }
00320
00321 int
00322 MEEBGeom::tt_channel( EBTTLocalCoord iX, EBTTLocalCoord iY )
00323 {
00324
00325 int itt = 4*iX+4-iY;
00326
00327 return itt;
00328
00329 }
00330
00331 int
00332 MEEBGeom::crystal_channel( EBLocalCoord ix, EBLocalCoord iy )
00333 {
00334
00335 int icr = 20*ix + 19-iy + 1;
00336
00337 return icr;
00338 }
00339
00340 int
00341 MEEBGeom::electronic_channel( EBLocalCoord ix, EBLocalCoord iy )
00342 {
00343 int iX = ix/5;
00344 int iY = iy/5;
00345 int itt = tt_channel( iX, iY );
00346 int type = tt_type( iX, iY );
00347
00348 int iVFE = ix%5+1;
00349 int islot = iy%5+1;
00350 if( iVFE%2==1 ) islot = 6-islot;
00351 int icr = 5*(iVFE-1)+(islot-1);
00352
00353 if( type==1 )
00354 {
00355 icr = 24-icr;
00356 }
00357 icr += 25*(itt-1);
00358
00359 return icr;
00360 }
00361
00362 TGraph*
00363 MEEBGeom::getGraphBoundary( int type, int num, bool global )
00364 {
00365 int ism_=0;
00366 if( type==iSuperModule )
00367 {
00368 ism_ = num;
00369 }
00370 else if( type==iLMRegion )
00371 {
00372 ism_ = (num-1)/2+1;
00373 if( ism_>18 )
00374 ism_-=18;
00375 else
00376 ism_+=18;
00377 }
00378 else
00379 abort();
00380
00381 int ism=1;
00382 if( global ) ism = ism_;
00383
00384
00385
00386
00387
00388
00389 float ix[100];
00390 float iy[100];
00391 int ixmin = 0;
00392 int ixmax = 84;
00393 int iymin = 0;
00394 int iymax = 19;
00395
00396 int n(0);
00397 if( type==iSuperModule )
00398 {
00399 n=5;
00400 ix[0] = ixmin-0.5;
00401 iy[0] = iymin-0.5;
00402 ix[1] = ixmin-0.5;
00403 iy[1] = iymax+0.5;
00404 ix[2] = ixmax+0.5;
00405 iy[2] = iymax+0.5;
00406 ix[3] = ixmax+0.5;
00407 iy[3] = iymin-0.5;
00408 ix[4] = ix[0];
00409 iy[4] = iy[0];
00410 }
00411 else if( type==iLMRegion )
00412 {
00413 int iside = num;
00414 if( global )
00415 {
00416 iside = (num-1)%2;
00417 }
00418
00419 if( iside==1 )
00420 {
00421 n=5;
00422 ix[0] = ixmin+5-0.5;
00423 iy[0] = iymin+10-0.5;
00424 ix[1] = ixmin+5-0.5;
00425 iy[1] = iymax+0.5;
00426 ix[2] = ixmax+0.5;
00427 iy[2] = iymax+0.5;
00428 ix[3] = ixmax+0.5;
00429 iy[3] = iymin+10-0.5;
00430 ix[4] = ix[0];
00431 iy[4] = iy[0];
00432 }
00433 else
00434 {
00435 n=7;
00436 ix[0] = ixmin-0.5;
00437 iy[0] = iymin-0.5;
00438 ix[1] = ixmin-0.5;
00439 iy[1] = iymax+0.5;
00440 ix[2] = ixmin+5-0.5;
00441 iy[2] = iymax+0.5;
00442 ix[3] = ixmin+5-0.5;
00443 iy[3] = iymax-10+0.5;
00444 ix[4] = ixmax+0.5;
00445 iy[4] = iymax-10+0.5;
00446 ix[5] = ixmax+0.5;
00447 iy[5] = iymin-0.5;
00448 ix[6] = ix[0];
00449 iy[6] = iy[0];
00450 }
00451 }
00452
00453 if( global )
00454 {
00455 for( int ii=0; ii<n; ii ++ )
00456 {
00457 std::pair<float,float> xy = globalCoord( ism, ix[ii], iy[ii] );
00458 ix[ii] = xy.first;
00459 iy[ii] = xy.second;
00460 }
00461 }
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475 return new TGraph( n, ix, iy );
00476 }
00477
00478 std::pair< int, int >
00479 MEEBGeom::pn( int ilmmod )
00480 {
00481 switch( ilmmod )
00482 {
00483 case 1: return std::pair<int,int>( 0, 5 );
00484 case 2: return std::pair<int,int>( 1, 6 );
00485 case 3: return std::pair<int,int>( 1, 6 );
00486 case 4: return std::pair<int,int>( 2, 7 );
00487 case 5: return std::pair<int,int>( 2, 7 );
00488 case 6: return std::pair<int,int>( 3, 8 );
00489 case 7: return std::pair<int,int>( 3, 8 );
00490 case 8: return std::pair<int,int>( 4, 9 );
00491 case 9: return std::pair<int,int>( 4, 9 );
00492 default:
00493 abort();
00494 }
00495 return std::pair<int,int>(-1,-1);
00496 }
00497
00498 std::pair<int,int>
00499 MEEBGeom::memFromLmr( int ilmr )
00500 {
00501 std::pair< int, int > dccAndSide_ = ME::dccAndSide( ilmr );
00502 int idcc = dccAndSide_.first;
00503 return std::pair<int,int>( idcc, idcc );
00504 }
00505
00506 std::vector<int>
00507 MEEBGeom::lmmodFromLmr( int ilmr )
00508 {
00509 std::pair< int, int > dccAndSide_ = ME::dccAndSide( ilmr );
00510 int iside = dccAndSide_.second;
00511 std::vector< int > vec;
00512 for( int ilmmod=1; ilmmod<=9; ilmmod++ )
00513 {
00514 if( (ilmmod+iside)%2==1 ) vec.push_back(ilmmod);
00515 }
00516 return vec;
00517 }
00518
00519 int
00520 MEEBGeom::apdRefTower( int ilmmod )
00521 {
00522 switch( ilmmod )
00523 {
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534 case 1: return 2;
00535 case 2: return 6;
00536 case 3: return 8;
00537 case 4: return 22;
00538 case 5: return 24;
00539 case 6: return 38;
00540 case 7: return 40;
00541 case 8: return 54;
00542 case 9: return 56;
00543 default:
00544 abort();
00545 }
00546 return 0;
00547 }
00548
00549
00550 std::vector< int >
00551 MEEBGeom::apdRefChannels( int ilmmod )
00552 {
00553
00554 std::vector< int > vec;
00555 switch( ilmmod )
00556 {
00557 case 1: vec.push_back(0); vec.push_back(24); break;
00558 case 2: vec.push_back(0); vec.push_back(24); break;
00559 case 3: vec.push_back(0); vec.push_back(24); break;
00560 case 4: vec.push_back(0); vec.push_back(24); break;
00561 case 5: vec.push_back(0); vec.push_back(24); break;
00562 case 6: vec.push_back(0); vec.push_back(24); break;
00563 case 7: vec.push_back(0); vec.push_back(24); break;
00564 case 8: vec.push_back(0); vec.push_back(24); break;
00565 case 9: vec.push_back(0); vec.push_back(24); break;
00566 default:
00567 abort();
00568 }
00569 return vec;
00570 }
00571