CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_4_5_patch3/src/CalibCalorimetry/EcalCorrelatedNoiseAnalysisAlgos/src/TEcnaNumbering.cc

Go to the documentation of this file.
00001 //----------Author's Name: B.Fabbro, F.X.Gentit + EB table from P.Jarry  DSM/IRFU/SPP CEA-Saclay
00002 //----------Copyright:Those valid for CEA software
00003 //----------Modified:24/03/2011
00004 
00005 #include "CalibCalorimetry/EcalCorrelatedNoiseAnalysisAlgos/interface/TEcnaNumbering.h"
00006 
00007 //--------------------------------------
00008 //  TEcnaNumbering.cc
00009 //  Class creation: 30 September 2005
00010 //  Documentation: see TEcnaNumbering.h
00011 //--------------------------------------
00012 
00013 ClassImp(TEcnaNumbering)
00014 //-------------------------------------------------------------------------------------------------------
00015 //
00016 //  Building of the numbering for the Ecal channels (EB and EE)
00017 //
00018 //  Convention for the names used here and in the other "TEcna" classes:
00019 //
00020 //  Name     Number                      Reference set   Range      Comment
00021 //
00022 //  SMTow  : Tower number                in SuperModule  [1,68]     (phi,eta) progression
00023 //  SMCrys : Crystal number              in SuperModule  [1,1700]   (phi,eta) progression
00024 //  SMEcha : Electronic channel number   in SuperModule  [0,1699]   S shape data reading order    
00025 //  TowEcha: Electronic channel number   in Tower        [0,24]     S shape data reading order  
00026 //
00027 //  DeeSC  : super-crystal(SC) number    in Dee          [1,200]    (IY,IX) progression
00028 //  DeeCrys: Crystal number              in Dee matrix   [1,5000]   (IY,IX) progression
00029 //  DeeEcha: Electronic channel number   in Dee matrix   [0,4999]   (IY,IX) progression (starting from 0)
00030 //  SCEcha : Electronic channel number   in SC           [1,25]     Crystal numbering for construction 
00031 //-------------------------------------------------------------------------------------------------------
00032 
00033 //====================================== constructors =========================================
00034 TEcnaNumbering::TEcnaNumbering() {
00035 // Constructor without argument: call to method Init()
00036 
00037 //  cout << "[Info Management] CLASS: TEcnaNumbering.    CREATE OBJECT: this = " << this << endl;
00038 
00039   Init();
00040 }
00041 
00042 TEcnaNumbering::TEcnaNumbering(TEcnaObject* pObjectManager, const TString SubDet) {
00043 // Constructor with argument: call to methods Init() and SetEcalSubDetector(const TString)
00044 
00045  // cout << "[Info Management] CLASS: TEcnaNumbering.    CREATE OBJECT: this = " << this << endl;
00046 
00047   Init();
00048   Long_t i_this = (Long_t)this;
00049   pObjectManager->RegisterPointer("TEcnaNumbering", i_this);
00050 
00051   //............................ fEcal  => to be changed in fParEcal
00052   fEcal = 0;
00053   Int_t iParEcal = pObjectManager->GetPointerValue("TEcnaParEcal");
00054   if( iParEcal == 0 )
00055     {fEcal = new TEcnaParEcal(pObjectManager, SubDet.Data()); /*fCnew++*/}
00056   else
00057     {fEcal = (TEcnaParEcal*)iParEcal;}
00058 
00059   SetEcalSubDetector(SubDet.Data());
00060 }
00061 
00062 
00063 TEcnaNumbering::TEcnaNumbering(const TString SubDet, const TEcnaParEcal* pEcal) {
00064 // Constructor with argument: call to methods Init() and SetEcalSubDetector(const TString)
00065 
00066  // cout << "[Info Management] CLASS: TEcnaNumbering.    CREATE OBJECT: this = " << this << endl;
00067 
00068   Init();
00069   SetEcalSubDetector(SubDet.Data(), pEcal);
00070 }
00071 
00072 //====================================== destructor =========================================
00073 TEcnaNumbering::~TEcnaNumbering() {
00074 //destructor
00075 
00076   //if (fEcal   != 0){delete fEcal;   fCdelete++;}
00077 
00078   //....................... Barrel
00079   if (fT2dSMCrys  != 0){delete [] fT2dSMCrys;  fCdelete++;}
00080   if (fT1dSMCrys  != 0){delete [] fT1dSMCrys;  fCdelete++;}
00081   if (fT1dSMTow   != 0){delete [] fT1dSMTow;   fCdelete++;}
00082   if (fT1dTowEcha != 0){delete [] fT1dTowEcha; fCdelete++;}
00083 
00084   //....................... Endcap
00085   if (fT3dDeeCrys     != 0){delete [] fT3dDeeCrys;     fCdelete++;}
00086   if (fT2dDeeCrys     != 0){delete [] fT2dDeeCrys;     fCdelete++;}
00087   if (fT1dDeeCrys     != 0){delete [] fT1dDeeCrys;     fCdelete++;}
00088   if (fT2dDeeSC       != 0){delete [] fT2dDeeSC;       fCdelete++;}
00089   if (fT1dDeeSC       != 0){delete [] fT1dDeeSC;       fCdelete++;}
00090   if (fT2dSCEcha      != 0){delete [] fT2dSCEcha;      fCdelete++;}
00091   if (fT1dSCEcha      != 0){delete [] fT1dSCEcha;      fCdelete++;}
00092   if (fT2d_jch_JY     != 0){delete [] fT2d_jch_JY;     fCdelete++;}
00093   if (fT1d_jch_JY     != 0){delete [] fT1d_jch_JY;     fCdelete++;}
00094   if (fT2d_ich_IX     != 0){delete [] fT2d_ich_IX;     fCdelete++;}
00095   if (fT1d_ich_IX     != 0){delete [] fT1d_ich_IX;     fCdelete++;}
00096   if (fT2d_DS         != 0){delete [] fT2d_DS;         fCdelete++;}
00097   if (fT1d_DS         != 0){delete [] fT1d_DS;         fCdelete++;}
00098   if (fT2d_DSSC       != 0){delete [] fT2d_DSSC;       fCdelete++;}
00099   if (fT1d_DSSC       != 0){delete [] fT1d_DSSC;       fCdelete++;}
00100   if (fT2d_DeeSCCons  != 0){delete [] fT2d_DeeSCCons;  fCdelete++;}
00101   if (fT1d_DeeSCCons  != 0){delete [] fT1d_DeeSCCons;  fCdelete++;}
00102   if (fT2d_RecovDeeSC != 0){delete [] fT2d_RecovDeeSC; fCdelete++;}
00103   if (fT1d_RecovDeeSC != 0){delete [] fT1d_RecovDeeSC; fCdelete++;}
00104 
00105  // cout << "[Info Management] CLASS: TEcnaNumbering.    DESTROY OBJECT: this = " << this << endl;
00106 
00107 }
00108 //------------------------------------------------------------- Init()
00109 void TEcnaNumbering::Init()
00110 {
00111 //Set default values and build crystal numbering table
00112 
00113   //.............................. Initialisations
00114   fTTBELL  = '\007';
00115   fgMaxCar = 512;
00116 
00117   //....................... Barrel
00118   fT2dSMCrys  = 0;
00119   fT1dSMCrys  = 0;
00120   fT1dSMTow   = 0;
00121   fT1dTowEcha = 0;
00122 
00123   fCodeChNumberingLvrbBot = "bottom";
00124   fCodeChNumberingLvrbTop = "top";
00125 
00126   //....................... Endcap
00127   fT3dDeeCrys     = 0;
00128   fT2dDeeCrys     = 0;
00129   fT1dDeeCrys     = 0;
00130   fT2dDeeSC       = 0;
00131   fT1dDeeSC       = 0;
00132   fT2dSCEcha      = 0;
00133   fT1dSCEcha      = 0;
00134   fT2d_jch_JY     = 0;
00135   fT1d_jch_JY     = 0;
00136   fT2d_ich_IX     = 0;
00137   fT1d_ich_IX     = 0;
00138   fT2d_DS         = 0;
00139   fT1d_DS         = 0;
00140   fT2d_DSSC       = 0;
00141   fT1d_DSSC       = 0;
00142   fT2d_DeeSCCons  = 0;
00143   fT1d_DeeSCCons  = 0;
00144   fT2d_RecovDeeSC = 0;
00145   fT1d_RecovDeeSC = 0;
00146 
00147   fCodeChNumberingITP1Bot = "bottom";   // ==> Type 1 Interface plate  IPT1 (a faire)
00148   fCodeChNumberingITP2Top = "top";      // ==> Type 2 Interface plate  IPT2 (a faire)
00149 
00150   //------------------ Init pointers on the CNA objects
00151   fEcal = 0;
00152 }
00153 // end of Init()
00154 //------------------------------------------------------------- SetEcalSubDetector(...)
00155 void TEcnaNumbering::SetEcalSubDetector(const TString SubDet, const TEcnaParEcal* pEcal){
00156 //Set the current subdetector flag and the current subdetector parameters
00157 
00158   fEcal = 0;
00159   if( pEcal == 0 )
00160     {fEcal = new TEcnaParEcal(SubDet.Data());  /*fCnew++*/ ;}
00161   else
00162     {fEcal = (TEcnaParEcal*)pEcal;}
00163 
00164   Int_t MaxCar = fgMaxCar;
00165   fFlagSubDet.Resize(MaxCar);
00166   fFlagSubDet = fEcal->GetEcalSubDetector();      // fFlagSubDet = "EB" or "EE"
00167 
00168   if( fFlagSubDet == "EB" ){BuildBarrelCrysTable();}
00169   if( fFlagSubDet == "EE" ){BuildEndcapCrysTable(); BuildEndcapSCTable();}
00170 }
00171 
00172 void TEcnaNumbering::SetEcalSubDetector(const TString SubDet){
00173 //Set the current subdetector flag and the current subdetector parameters
00174 
00175   Int_t MaxCar = fgMaxCar;
00176   fFlagSubDet.Resize(MaxCar);
00177   fFlagSubDet = fEcal->GetEcalSubDetector();      // fFlagSubDet = "EB" or "EE"
00178 
00179   if( fFlagSubDet == "EB" ){BuildBarrelCrysTable();}
00180   if( fFlagSubDet == "EE" ){BuildEndcapCrysTable(); BuildEndcapSCTable();}
00181 }
00182 
00183 //====================================================================================================
00184 //
00185 //
00186 //                                  B   A   R   R   E   L 
00187 //
00188 //
00189 //====================================================================================================
00190 //
00191 //               SMCrys <-> (SMTow, TowEcha) correspondance table (from Patrick Jarry)
00192 //
00193 //====================================================================================================
00194 void TEcnaNumbering::BuildBarrelCrysTable()
00195 {
00196 // Build the correspondance table: SMCrys <-> (SMTow, TowEcha) for the ECAL BARREL
00197 //
00198 //  From CMS Internal Note  "CMS ECAL Barrel channel numbering"
00199 //
00200 //       Name      Number                     Reference set   Range        Comment
00201 //
00202 //       SMTow  : Tower number               in SuperModule  [1,68]      (phi,eta) progression
00203 //       SMCrys : Crystal number             in SuperModule  [1,1700]    (phi,eta) progression
00204 //       SMEcha : Electronic channel number  in SuperModule  [0,1699]    S shape data reading order 
00205 //   
00206 //       TowEcha: Electronic channel number  in Tower        [0,24]      S shape data reading order  
00207 //
00208 //
00209 //   fill the 2D array:  fT2dSMCrys[n_SMTow][n_TowEcha]
00210 //
00211 //   and the 1d arrays:  fT1dSMTow[i_SMCrys] and fT1dTowEcha[i_SMCrys]
00212 //
00213 //-----------------------------------------------------------------------------------------------------
00214 
00215   if ( fT2dSMCrys == 0 )
00216     {
00217       Int_t MaxSMTow   = fEcal->MaxTowInSM();
00218       Int_t MaxTowEcha = fEcal->MaxCrysInTow();
00219       Int_t MaxSMCrys  = fEcal->MaxCrysInSM();
00220       
00221       //................... Allocation and Init CrysNumbersTable
00222       
00223       fT2dSMCrys = new Int_t*[MaxSMTow];                         fCnew++;  
00224       fT1dSMCrys = new  Int_t[MaxSMTow*MaxTowEcha];              fCnew++;   
00225       for(Int_t i_SMTow = 0 ; i_SMTow < MaxSMTow ; i_SMTow++){
00226         fT2dSMCrys[i_SMTow] = &fT1dSMCrys[0] + i_SMTow*MaxTowEcha;}
00227       for(Int_t i=0; i<MaxSMTow; i++)
00228         {for(Int_t j=0; j<MaxTowEcha; j++){fT2dSMCrys[i][j]=0;}}      
00229 
00230       fT1dSMTow   = new Int_t[MaxSMCrys];                        fCnew++;
00231       for(Int_t i=0; i<MaxSMCrys; i++){fT1dSMTow[i]=0;}
00232 
00233       fT1dTowEcha = new Int_t[MaxSMCrys];                        fCnew++;
00234       for(Int_t i=0; i<MaxSMCrys; i++){fT1dTowEcha[i]=0;}
00235 
00236       //........................ Build table      
00237       Int_t m2  = (Int_t)2;
00238       Int_t m26 = (Int_t)26;
00239 
00240       //      Int_t jch_type[2][26];
00241       Int_t** jch_type    = new Int_t*[m2];                      fCnew++;  
00242       Int_t*  jch_type_d1 = new Int_t[m2*m26];                   fCnew++;
00243       for(Int_t i_m2 = 0 ; i_m2 < m2 ; i_m2++){
00244         jch_type[i_m2] = &jch_type_d1[0] + i_m2*m26;}
00245 
00246       for(Int_t k=25;k>=21;k--){jch_type[0][k] = 25-k;}  //  k = 25,24,23,22,21 -> jch_type[0][k] = 0,1,2,3,4
00247       for(Int_t k=16;k<=20;k++){jch_type[0][k] = k-16;}  //  k = 16,17,18,19,20 -> jch_type[0][k] = 0,1,2,3,4
00248       for(Int_t k=15;k>=11;k--){jch_type[0][k] = 15-k;}  //  k = 15,14,12,13,11 -> jch_type[0][k] = 0,1,2,3,4
00249       for(Int_t k=6; k<=10;k++){jch_type[0][k] = k-6;}   //  k =  6, 7, 8, 9,10 -> jch_type[0][k] = 0,1,2,3,4
00250       for(Int_t k=5; k>=1; k--){jch_type[0][k] = 5-k;}   //  k =  5, 4, 3, 2, 1 -> jch_type[0][k] = 0,1,2,3,4
00251       
00252       for(Int_t k=1; k<=5; k++){jch_type[1][k] = k-1;}   //  k =  1, 2, 3, 4, 5 -> jch_type[1][k] = 0,1,2,3,4
00253       for(Int_t k=10;k>=6; k--){jch_type[1][k] = 10-k;}  //  k = 10, 9, 8, 7, 6 -> jch_type[1][k] = 0,1,2,3,4
00254       for(Int_t k=11;k<=15;k++){jch_type[1][k] = k-11;}  //  k = 11,12,13,14,15 -> jch_type[1][k] = 0,1,2,3,4
00255       for(Int_t k=20;k>=16;k--){jch_type[1][k] = 20-k;}  //  k = 20,19,18,17,16 -> jch_type[1][k] = 0,1,2,3,4
00256       for(Int_t k=21;k<=25;k++){jch_type[1][k] = k-21;}  //  k = 21,22,23,24,25 -> jch_type[1][k] = 0,1,2,3,4
00257 
00258       //      Int_t ich_type[2][26]; 
00259       Int_t** ich_type    = new Int_t*[m2];                      fCnew++;  
00260       Int_t*  ich_type_d1 = new Int_t[m2*m26];                   fCnew++;
00261       for(Int_t i_m2 = 0 ; i_m2 < m2 ; i_m2++){
00262         ich_type[i_m2] = &ich_type_d1[0] + i_m2*m26;}
00263      
00264       for(Int_t k=25;k>=21;k--){ich_type[0][k] = 0;}     //  k = 25,24,23,22,21 -> ich_type[0][k] = 0
00265       for(Int_t k=16;k<=20;k++){ich_type[0][k] = 1;}     //  k = 16,17,18,19,20 -> ich_type[0][k] = 1
00266       for(Int_t k=15;k>=11;k--){ich_type[0][k] = 2;}     //  k = 15,14,12,13,11 -> ich_type[0][k] = 2
00267       for(Int_t k=6; k<=10;k++){ich_type[0][k] = 3;}     //  k =  6, 7, 8, 9,10 -> ich_type[0][k] = 3
00268       for(Int_t k=5; k>=1; k--){ich_type[0][k] = 4;}     //  k =  5, 4, 3, 2, 1 -> ich_type[0][k] = 4
00269       
00270       for(Int_t k=1; k<=5; k++){ich_type[1][k] = 0;}     //  k =  1, 2, 3, 4, 5 -> ich_type[1][k] = 0
00271       for(Int_t k=10;k>=6; k--){ich_type[1][k] = 1;}     //  k = 10, 9, 8, 7, 6 -> ich_type[1][k] = 1
00272       for(Int_t k=11;k<=15;k++){ich_type[1][k] = 2;}     //  k = 11,12,13,14,15 -> ich_type[1][k] = 2
00273       for(Int_t k=20;k>=16;k--){ich_type[1][k] = 3;}     //  k = 20,19,18,17,16 -> ich_type[1][k] = 3
00274       for(Int_t k=21;k<=25;k++){ich_type[1][k] = 4;}     //  k = 21,22,23,24,25 -> ich_type[1][k] = 4
00275       
00276       //     Int_t type[17]={0,0,0,1,1, 0,0,1,1, 0,0,1,1, 0,0,1,1};
00277       Int_t m17 =17;
00278       Int_t* type = new Int_t[m17];                             fCnew++; 
00279 
00280       //  0 -> LVRB at the bottom, 1 -> LVRB at the top
00281       type[0] = 0;                   // M1
00282       type[1] = 0;
00283       type[2] = 0;
00284       type[3] = 1;
00285       type[4] = 1;
00286 
00287       type[5] = 0;                   // M2
00288       type[6] = 0;
00289       type[7] = 1;
00290       type[8] = 1;
00291 
00292       type[9]  = 0;                  // M3
00293       type[10] = 0;
00294       type[11] = 1;
00295       type[12] = 1;
00296 
00297       type[13] = 0;                  // M4
00298       type[14] = 0;
00299       type[15] = 1;
00300       type[16] = 1;
00301 
00302       for(Int_t tow=0; tow<MaxSMTow; tow++)                    //  tow  = 0 to 67   (MaxSMTow = 68)
00303         {
00304           for(Int_t ic=1; ic<=MaxTowEcha; ic++)                //  ic   = 1 to 25   (MaxTowEcha = 25) 
00305             {
00306               Int_t jtow = tow % 4;                            //  jtow = 0,1,2,3 
00307               Int_t itow = tow / 4;                            //  itow = 0 to 16
00308 
00309               Int_t icrys = itow*5 + ich_type[type[itow]][ic]; //  type[0->16] = 0,1 ,
00310                                                                //  ich_type[0->1][1->25] = 0,1,2,3,4
00311                                                                //  icrys = 0 to 84  (=> eta)
00312 
00313               Int_t jcrys = jtow*5 + jch_type[type[itow]][ic]; //  type[0->16] = 0,1 ,
00314                                                                //  jch_type[0->1][1->25] = 0,1,2,3,4
00315                                                                //  jcrys = 0 to 19  (=> phi)
00316 
00317               Int_t n1SMCrys = icrys*20+jcrys+1;               //  n1SMCrys = 1 to 1700
00318 
00319               fT2dSMCrys[tow][ic-1]   = n1SMCrys;      // fT2dSMCrys[]  : range = [1,1700]
00320               fT1dSMTow[n1SMCrys-1]   = tow+1;         // fT1dSMTow[]   : range = [1,68]
00321               fT1dTowEcha[n1SMCrys-1] = ic-1;          // fT1dTowEcha[] : range = [0,24]
00322             }
00323         }
00324       // cout << "#TEcnaNumbering::TBuildBarrelCrysTable()> Crys Table Building done" << endl;
00325 
00326       delete [] jch_type;                       fCdelete++;
00327       delete [] jch_type_d1;                    fCdelete++;
00328       delete [] ich_type;                       fCdelete++;
00329       delete [] ich_type_d1;                    fCdelete++;
00330       delete [] type;                           fCdelete++;
00331     }
00332   else
00333     {
00334       // cout << "#TEcnaNumbering::TBuildBarrelCrysTable()> No Building of Crys Table since it is already done." << endl;
00335     }
00336 }
00337 
00338 //===============================================================================
00339 //
00340 //        GetSMCrysFrom1SMTowAnd0TowEcha
00341 //        GetSMCrysFromSMEcha
00342 //
00343 //===============================================================================
00344 Int_t TEcnaNumbering::Get1SMCrysFrom1SMTowAnd0TowEcha(const Int_t& n1SMTow,
00345                                                       const Int_t& i0TowEcha)
00346 {
00347 //get crystal number in SM from tower number in SM
00348 // and from Electronic Channel number in tower
00349 
00350   Int_t n1SMCrys = 0;
00351 
00352   if( fT2dSMCrys == 0 ){BuildBarrelCrysTable();}
00353   
00354   if (n1SMTow >= 1 && n1SMTow <= fEcal->MaxTowInSM())
00355     {
00356       if (i0TowEcha >=0 && i0TowEcha < fEcal->MaxCrysInTow())
00357         {
00358           n1SMCrys = fT2dSMCrys[n1SMTow-1][i0TowEcha];
00359         }
00360       else
00361         {
00362           n1SMCrys = -2;   // Electronic Cnannel in Tower out of range 
00363           cout << "!TEcnaNumbering::Get1SMCrysFrom1SMTowAnd0TowEcha(...)> Electronic Channel in Tower out of range."
00364                << " i0TowEcha = " << i0TowEcha << "(n1SMTow = " << n1SMTow << ")" << fTTBELL << endl;
00365         }
00366     }
00367   else
00368     {
00369       n1SMCrys = -3;   // Tower number in SM out of range
00370       cout << "!TEcnaNumbering::Get1SMCrysFrom1SMTowAnd0TowEcha(...)> Tower number in SM out of range."
00371            << " n1SMTow = " << n1SMTow << "(i0TowEcha = " << i0TowEcha << ")" << fTTBELL << endl;
00372     }
00373 
00374   return n1SMCrys;   // Range = [1,1700]
00375 }
00376 
00377 //===============================================================================
00378 //
00379 //                Get0TowEchaFrom1SMCrys, Get1SMTowFrom1SMCrys
00380 //
00381 //===============================================================================
00382 
00383 Int_t TEcnaNumbering::Get0TowEchaFrom1SMCrys(const Int_t& n1SMCrys)
00384 {
00385 // get Electronic Channel number in Tower from Crystal number in SuperModule
00386 
00387   Int_t i0TowEcha = -1;
00388 
00389   if( n1SMCrys >= 1 && n1SMCrys <= fEcal->MaxCrysInSM() )
00390     {
00391       i0TowEcha = fT1dTowEcha[n1SMCrys-1];
00392     }
00393   else
00394     {
00395       i0TowEcha = -2;
00396       cout << "!TEcnaNumbering::Get0TowEchaFrom1SMCrys(...)> Crystal number in SM out of range."
00397            << " n1SMCrys = " << n1SMCrys << fTTBELL << endl;
00398     }
00399   return i0TowEcha;   // range = [0,24]
00400 }
00401 
00402 Int_t TEcnaNumbering::Get1SMTowFrom1SMCrys(const Int_t& n1SMCrys)
00403 {
00404 // get Tower number in SM (range [1,68]) from Crystal number in SuperModule (range [1,1700])
00405 
00406   Int_t n1SMtox = 0;
00407   
00408   if( n1SMCrys >= 1 && n1SMCrys <= fEcal->MaxCrysInSM() )
00409     {
00410       n1SMtox = fT1dSMTow[n1SMCrys-1];
00411     }
00412   else
00413     {
00414       n1SMtox = -1;
00415       cout << "!TEcnaNumbering::Get1SMTowFrom1SMCrys(...)> Crystal number in SM out of range."
00416            << " n1SMCrys = " << n1SMCrys << fTTBELL << endl;
00417     }
00418   return n1SMtox;   // range = [1,68]
00419 }
00420 
00421 //===============================================================================
00422 //
00423 //          Get0TowEchaFrom0SMEcha
00424 //          Get1SMTowFrom0SMEcha
00425 //
00426 //===============================================================================
00427 
00428 Int_t TEcnaNumbering::Get0TowEchaFrom0SMEcha(const Int_t& i0SMEcha)
00429 {
00430 //get electronic channel number in tower from electronic channel number in SM
00431 
00432   Int_t n1SMTow = i0SMEcha/fEcal->MaxCrysInTow()+1;
00433   Int_t i0TowEcha = i0SMEcha - fEcal->MaxCrysInTow()*(n1SMTow-1);
00434 
00435   return i0TowEcha;   // range = [0,24]
00436 }
00437 
00438 Int_t TEcnaNumbering::Get1SMTowFrom0SMEcha(const Int_t& i0SMEcha)
00439 {
00440 //get tower number from electronic channel number in SM
00441 
00442   Int_t n1SMTow = i0SMEcha/fEcal->MaxCrysInTow()+1;
00443 
00444   return n1SMTow;  // range = [1,68]
00445 }
00446 
00447 Int_t TEcnaNumbering::Get0SMEchaFrom1SMTowAnd0TowEcha(const Int_t& n1SMTow, const Int_t& i0TowEcha)
00448 {
00449 //get tower number from electronic channel number in SM
00450 
00451   Int_t i0SMEcha = (n1SMTow-1)*fEcal->MaxCrysInTow()+i0TowEcha;
00452 
00453   return i0SMEcha;
00454 }
00455 //===========================================================================
00456 //
00457 //                        GetHashedNumberFromIEtaAndIPhi
00458 //
00459 //===========================================================================
00460 Int_t TEcnaNumbering::GetHashedNumberFromIEtaAndIPhi(const Int_t& IEta, const Int_t& IPhi)
00461 {
00462   Int_t Hashed = 0;
00463 
00464   if( IEta > 0 ){Hashed = (85 + IEta - 1)*360 + IPhi - 1;}
00465   if( IEta < 0 ){Hashed = (85 + IEta)*360     + IPhi - 1;}
00466 
00467   return Hashed;
00468 }
00469 
00470 Int_t TEcnaNumbering::GetIEtaFromHashed(const Int_t& Hashed,  const Int_t& SMNumber)
00471 {
00472   Int_t IEta = 0;
00473 
00474   if( GetSMHalfBarrel(SMNumber) == "EB+" ){IEta = Hashed/360 - 85 + 1;}
00475   if( GetSMHalfBarrel(SMNumber) == "EB-" ){IEta = 85 + Hashed/360;}
00476 
00477   return IEta;
00478 }
00479 
00480 Int_t TEcnaNumbering::GetIPhiFromHashed(const Int_t& Hashed)
00481 {
00482   Int_t IPhi = Hashed%360 + 1;
00483 
00484   return IPhi;
00485 }
00486 //===========================================================================
00487 //
00488 //                        GetTowerLvrbType
00489 //
00490 //===========================================================================
00491 TString  TEcnaNumbering::GetStinLvrbType(const Int_t& n1SMTow)
00492 {
00493   TString lvrb_type = GetTowerLvrbType(n1SMTow);
00494   return lvrb_type;
00495 }
00496 TString  TEcnaNumbering::GetTowerLvrbType(const Int_t& n1SMTow)
00497 {
00498 //gives the LVRB type of the crystal numbering of tower
00499 
00500   TString type = fCodeChNumberingLvrbTop;   // => default value
00501 
00502   if (n1SMTow >=  1 && n1SMTow <= 12){type = fCodeChNumberingLvrbBot;}
00503   if (n1SMTow >= 21 && n1SMTow <= 28){type = fCodeChNumberingLvrbBot;}
00504   if (n1SMTow >= 37 && n1SMTow <= 44){type = fCodeChNumberingLvrbBot;}
00505   if (n1SMTow >= 53 && n1SMTow <= 60){type = fCodeChNumberingLvrbBot;}
00506 
00507   return type;
00508 }
00509 
00510 //==============================================================================
00511 //
00512 //       GetEta, GetEtaMin, GetEtaMax,  GetIEtaMin, GetIEtaMax
00513 //
00514 //==============================================================================
00515 Double_t TEcnaNumbering::GetEta(const Int_t& n1EBSM, const Int_t& n1SMTow,
00516                                 const Int_t& i0TowEcha)
00517 {
00518 //Gives Eta for a given (n1EBSM, n1SMTow, i0TowEcha)
00519   
00520   Double_t eta = (Double_t)0.;
00521 
00522   Int_t max_crys_eta_in_tower = fEcal->MaxCrysEtaInTow();
00523   Int_t max_tow_eta_in_sm     = fEcal->MaxTowEtaInSM();
00524   Int_t max_sm_in_barrel      = fEcal->MaxSMInEB();
00525 
00526   if ( n1EBSM >= 1 && n1EBSM <= max_sm_in_barrel )
00527     {
00528       for (Int_t i_sm_tow_eta = 0; i_sm_tow_eta < max_tow_eta_in_sm; i_sm_tow_eta++)
00529         {
00530           Int_t i_crys_eta_min = (Int_t)(1 + i_sm_tow_eta*(max_crys_eta_in_tower-1));
00531           Int_t i_crys_eta_max = (Int_t)((i_sm_tow_eta+1)*(max_crys_eta_in_tower-1));
00532           Int_t i_crys_eta     = (Int_t)(i_sm_tow_eta*max_crys_eta_in_tower);
00533           // = 0,..,16 -> last xtal in eta for the previous tower
00534           Double_t d_echa_eta  = (Double_t)(i0TowEcha/max_crys_eta_in_tower);    // = 0,1,2,3,4
00535 
00536             if ( n1SMTow >= i_crys_eta_min && n1SMTow <= i_crys_eta_max )
00537               {
00538                 if (GetTowerLvrbType(n1SMTow) == fCodeChNumberingLvrbTop)
00539                 {eta = (Double_t)(i_crys_eta) + d_echa_eta + 1;}
00540                 if (GetTowerLvrbType(n1SMTow) == fCodeChNumberingLvrbBot)
00541                 {eta = (Double_t)(i_crys_eta+max_crys_eta_in_tower)-d_echa_eta;}
00542               }
00543         }      
00544       if ( GetSMHalfBarrel(n1EBSM) == "EB-" ){eta = - eta;}      
00545     }
00546   else
00547     {
00548       cout << "TEcnaNumbering::GetEta(...)> SM = " << n1EBSM
00549            << ". Out of range (range = [1," << fEcal->MaxSMInEB() << "])" 
00550            << fTTBELL << endl; 
00551     }
00552   return eta;
00553 }
00554 //-------------------------------------------------------------------------------------
00555 Double_t TEcnaNumbering::GetEtaMin(const Int_t& n1EBSM, const Int_t& n1SMTow)
00556 {
00557 //Gives EtaMin for a given Tower
00558 
00559   Int_t max_tow_eta_in_sm     = fEcal->MaxTowEtaInSM();
00560   Int_t max_crys_eta_in_tower = fEcal->MaxCrysEtaInTow();
00561 
00562   Double_t eta_min = (Double_t)0.;
00563 
00564   for (Int_t i_sm_tow_eta = 0; i_sm_tow_eta < max_tow_eta_in_sm; i_sm_tow_eta++)
00565     {
00566       Int_t i_crys_eta_min =    (Int_t)(1 + i_sm_tow_eta*(max_crys_eta_in_tower-1));
00567       Int_t i_crys_eta_max =    (Int_t)((i_sm_tow_eta+1)*(max_crys_eta_in_tower-1));
00568       Int_t i_crys_eta     =    (Int_t)(i_sm_tow_eta*max_crys_eta_in_tower);
00569 
00570       if ( n1SMTow >= i_crys_eta_min && n1SMTow <= i_crys_eta_max )
00571         {
00572           if (GetSMHalfBarrel(n1EBSM) == "EB+")
00573             {eta_min = (Double_t)i_crys_eta;}
00574           if (GetSMHalfBarrel(n1EBSM) == "EB-")
00575             {eta_min = -(Double_t)(i_crys_eta + max_crys_eta_in_tower);}
00576         }
00577     }
00578   return eta_min;
00579 }
00580 //------------------------------------------------------------------------------------
00581 Double_t TEcnaNumbering::GetEtaMax(const Int_t& n1EBSM, const Int_t& n1SMTow)
00582 {
00583 //Gives EtaMax for a given Tower
00584 
00585   Int_t max_tow_eta_in_sm     = fEcal->MaxTowEtaInSM();
00586   Int_t max_crys_eta_in_tower = fEcal->MaxCrysEtaInTow();
00587 
00588   Double_t eta_max = (max_crys_eta_in_tower-1);
00589 
00590   for (Int_t i_sm_tow_eta = 0; i_sm_tow_eta < max_tow_eta_in_sm; i_sm_tow_eta++)
00591     {
00592       Int_t i_crys_eta_min = (Int_t)(1 + i_sm_tow_eta*(max_crys_eta_in_tower-1));
00593       Int_t i_crys_eta_max = (Int_t)((i_sm_tow_eta+1)*(max_crys_eta_in_tower-1));
00594       Int_t i_crys_eta     = (Int_t)(i_sm_tow_eta*max_crys_eta_in_tower);
00595 
00596       if ( n1SMTow >= i_crys_eta_min && n1SMTow <= i_crys_eta_max )
00597         {
00598           if (GetSMHalfBarrel(n1EBSM) == "EB+")
00599             {eta_max = (Double_t)(i_crys_eta + max_crys_eta_in_tower);}
00600           if (GetSMHalfBarrel(n1EBSM) == "EB-")
00601             {eta_max = -(Double_t)i_crys_eta;}
00602         }
00603     }
00604 
00605   return eta_max;
00606 }
00607 
00608 Double_t TEcnaNumbering::GetIEtaMin(const Int_t& n1EBSM, const Int_t& n1SMTow)
00609 {
00610 //Gives IEtaMin for a given (n1EBSM, n1SMTow)
00611 
00612   Double_t i_eta_min = (Int_t)0.; 
00613    
00614   if(GetSMHalfBarrel(n1EBSM) == "EB+")
00615     {i_eta_min = (Double_t)GetEtaMin(n1EBSM, n1SMTow)+(Double_t)0.5;}
00616   if(GetSMHalfBarrel(n1EBSM) == "EB-")
00617     {i_eta_min = (Double_t)GetEtaMin(n1EBSM, n1SMTow)-(Double_t)0.5;}
00618 
00619   return i_eta_min;
00620 }
00621 
00622 Double_t TEcnaNumbering::GetIEtaMax(const Int_t& n1EBSM, const Int_t& n1SMTow)
00623 {
00624 //Gives IEtaMax for a given (n1EBSM, n1SMTow)
00625 
00626   Double_t i_eta_max = (Int_t)0.; 
00627    
00628   if(GetSMHalfBarrel(n1EBSM) == "EB+")
00629     {i_eta_max = (Double_t)GetEtaMax(n1EBSM, n1SMTow)+(Double_t)0.5;}
00630   if(GetSMHalfBarrel(n1EBSM) == "EB-")
00631     {i_eta_max = (Double_t)GetEtaMax(n1EBSM, n1SMTow)-(Double_t)0.5;}
00632 
00633   return i_eta_max;
00634 }
00635 
00636 Double_t TEcnaNumbering::GetIEtaMin(const Int_t& n1EBSM)
00637 {
00638 //Gives IEtaMin for a given (n1EBSM)
00639 
00640   Double_t i_eta_min = (Int_t)0.;
00641 
00642   Int_t n1SMTowPlus  = (Int_t)1;   
00643   Int_t n1SMTowMinus = (Int_t)fEcal->MaxTowInSM();
00644 
00645   if( GetSMHalfBarrel(n1EBSM) == "EB+" )
00646     {i_eta_min = (Double_t)GetIEtaMin(n1EBSM, n1SMTowPlus );}
00647   if( GetSMHalfBarrel(n1EBSM) == "EB-" )
00648     {i_eta_min = (Double_t)GetIEtaMin(n1EBSM, n1SMTowMinus);}
00649 
00650   return i_eta_min;
00651 }
00652 
00653 Double_t TEcnaNumbering::GetIEtaMax(const Int_t& n1EBSM)
00654 {
00655 //Gives IEtaMax for a given (n1EBSM)
00656 
00657   Double_t i_eta_max = (Int_t)0.; 
00658 
00659   Int_t n1SMTowPlus  = (Int_t)fEcal->MaxTowInSM();   
00660   Int_t n1SMTowMinus = (Int_t)1;   
00661    
00662   if( GetSMHalfBarrel(n1EBSM) == "EB+")
00663     {i_eta_max = (Double_t)GetIEtaMax(n1EBSM, n1SMTowPlus );}
00664   if( GetSMHalfBarrel(n1EBSM) == "EB-")
00665     {i_eta_max = (Double_t)GetIEtaMax(n1EBSM, n1SMTowMinus);}
00666 
00667   return i_eta_max;
00668 }
00669 
00670 //==============================================================================
00671 //
00672 //    GetSMCentralPhi, GetPhiInSM, GetPhi,
00673 //    GetPhiMin, GetPhiMax, GetIPhiMin, GetIPhiMax
00674 //
00675 //==============================================================================
00676 Double_t TEcnaNumbering::GetSMCentralPhi(const Int_t& n1EBSM)
00677 {
00678 //Gives the central phi value of the SuperModule
00679 
00680   Double_t central_phi = (Double_t)10.;    //  DEFAULT = SM1
00681   
00682   if (GetSMHalfBarrel(n1EBSM) == "EB+"){central_phi = 10. + (Double_t)20.*(n1EBSM-1);}
00683   if (GetSMHalfBarrel(n1EBSM) == "EB-"){central_phi = 10. + (Double_t)20.*(n1EBSM-19);}
00684 
00685   return central_phi;
00686 }
00687 //------------------------------------------------------------------------------------
00688 Double_t TEcnaNumbering::GetPhiInSM(const Int_t& n1EBSM,
00689                                     const Int_t& n1SMTow, const Int_t& i0TowEcha)
00690 {
00691 //Gives Phi for a given (n1EBSM, n1SMTow, i0TowEcha)
00692 
00693   Double_t phi_in_SM = (Double_t)0.;
00694 
00695   Int_t rest_temp =(Int_t)(n1SMTow%(fEcal->MaxCrysPhiInTow()-1));  // "Phi" of the tower = 1,2,3,0 
00696 
00697   if ( n1EBSM >= 1 && n1EBSM <= fEcal->MaxSMInEB() )
00698     {
00699       if( rest_temp == 1 ){phi_in_SM = (Double_t)15.;}
00700       if( rest_temp == 2 ){phi_in_SM = (Double_t)10.;}
00701       if( rest_temp == 3 ){phi_in_SM = (Double_t)5.;}
00702       if( rest_temp == 0 ){phi_in_SM = (Double_t)0.;}
00703       
00704       if (GetTowerLvrbType(n1SMTow) == fCodeChNumberingLvrbTop)
00705         { 
00706           if( i0TowEcha ==  4 || i0TowEcha ==  5 || i0TowEcha == 14 || i0TowEcha == 15 || i0TowEcha == 24 )
00707             {phi_in_SM = phi_in_SM + 0;}
00708           
00709           if( i0TowEcha ==  3 || i0TowEcha ==  6 || i0TowEcha == 13 || i0TowEcha == 16 || i0TowEcha == 23 )
00710             {phi_in_SM = phi_in_SM + 1;} 
00711           
00712           if( i0TowEcha ==  2 || i0TowEcha ==  7 || i0TowEcha == 12 || i0TowEcha == 17 || i0TowEcha == 22 )
00713             {phi_in_SM = phi_in_SM + 2;}
00714           
00715           if( i0TowEcha ==  1 || i0TowEcha ==  8 || i0TowEcha == 11 || i0TowEcha == 18 || i0TowEcha == 21 )
00716             {phi_in_SM = phi_in_SM + 3;}
00717           
00718           if( i0TowEcha ==  0 || i0TowEcha ==  9 || i0TowEcha == 10 || i0TowEcha == 19 || i0TowEcha == 20 )
00719             {phi_in_SM = phi_in_SM + 4;} 
00720         }
00721       if (GetTowerLvrbType(n1SMTow) == fCodeChNumberingLvrbBot)
00722         {
00723           if( i0TowEcha == 20 || i0TowEcha == 19 || i0TowEcha == 10 || i0TowEcha ==  9 || i0TowEcha ==  0 )
00724             {phi_in_SM = phi_in_SM + 0;}
00725           
00726           if( i0TowEcha == 21 || i0TowEcha == 18 || i0TowEcha == 11 || i0TowEcha ==  8 || i0TowEcha ==  1 )
00727             {phi_in_SM = phi_in_SM + 1;}
00728  
00729           if( i0TowEcha == 22 || i0TowEcha == 17 || i0TowEcha == 12 || i0TowEcha ==  7 || i0TowEcha ==  2 )
00730             {phi_in_SM = phi_in_SM + 2;}
00731 
00732           if( i0TowEcha == 23 || i0TowEcha == 16 || i0TowEcha == 13 || i0TowEcha ==  6 || i0TowEcha ==  3 )
00733             {phi_in_SM = phi_in_SM + 3;}
00734 
00735           if( i0TowEcha == 24 || i0TowEcha == 15 || i0TowEcha == 14 || i0TowEcha ==  5 || i0TowEcha ==  4 )
00736             {phi_in_SM = phi_in_SM + 4;} 
00737           }
00738     }
00739   else
00740     {
00741       cout << "TEcnaNumbering::GetPhiInSM(...)> SM = " << n1EBSM
00742            << ". Out of range (range = [1," << fEcal->MaxSMInEB() << "])" 
00743            << fTTBELL << endl; 
00744     }
00745   phi_in_SM = 20 - phi_in_SM;
00746   return phi_in_SM;
00747 }
00748 //---------------------------------------------------------------------------------------
00749 Double_t TEcnaNumbering::GetPhi(const Int_t& n1EBSM,
00750                                 const Int_t& n1SMTow, const Int_t& i0TowEcha)
00751 {
00752 //Gives Phi for a given (n1EBSM, n1SMTow, i0TowEcha)
00753   
00754   Double_t phi = (Double_t)0.;
00755 
00756   if ( n1EBSM >= 1 && n1EBSM <= fEcal->MaxSMInEB() )
00757     {
00758       Double_t phiInSM   = GetPhiInSM(n1EBSM, n1SMTow, i0TowEcha);
00759       Double_t phi_start = GetSMCentralPhi(n1EBSM);
00760  
00761       phi = 20 - phiInSM + phi_start -(Double_t)10.;
00762     }
00763   else
00764     {
00765       cout << "TEcnaNumbering::GetPhi(...)> SM = " << n1EBSM
00766            << ". Out of range (range = [1," << fEcal->MaxSMInEB() << "])" 
00767            << fTTBELL << endl; 
00768     }
00769   return phi;
00770 }
00771 
00772 //-----------------------------------------------------------------------------------------
00773 Double_t TEcnaNumbering::GetPhiMin(const Int_t& n1EBSM, const Int_t& n1SMTow)
00774 {
00775 //Gives PhiMin for a given Tower
00776 
00777   Int_t max_crys_phi_in_tower = fEcal->MaxCrysPhiInTow();
00778 
00779   Double_t phi_min = (Double_t)0.;     // DEFAULT
00780   Double_t phi_start = GetSMCentralPhi(n1EBSM);
00781 
00782   Int_t rest_temp =(Int_t)(n1SMTow%(max_crys_phi_in_tower-1));
00783 
00784   if(GetSMHalfBarrel(n1EBSM) == "EB+")
00785     {
00786       if ( rest_temp == 1 ) {phi_min = phi_start + (Double_t)5.;}
00787       if ( rest_temp == 2 ) {phi_min = phi_start + (Double_t)0.;}
00788       if ( rest_temp == 3 ) {phi_min = phi_start - (Double_t)5.;}
00789       if ( rest_temp == 0 ) {phi_min = phi_start - (Double_t)10.;}
00790     }
00791   if(GetSMHalfBarrel(n1EBSM) == "EB-")
00792     {
00793       if ( rest_temp == 0 ) {phi_min = phi_start + (Double_t)5.;}
00794       if ( rest_temp == 3 ) {phi_min = phi_start + (Double_t)0.;}
00795       if ( rest_temp == 2 ) {phi_min = phi_start - (Double_t)5.;}
00796       if ( rest_temp == 1 ) {phi_min = phi_start - (Double_t)10.;}
00797     }
00798   return phi_min;
00799 }
00800 //-----------------------------------------------------------------------------------------
00801 Double_t TEcnaNumbering::GetPhiMax(const Int_t& n1EBSM, const Int_t& n1SMTow)
00802 {
00803 //Gives PhiMax for a given Tower
00804 
00805   Int_t max_crys_phi_in_tower = fEcal->MaxCrysPhiInTow();
00806 
00807   Double_t phi_max = (Double_t)20.;     // DEFAULT
00808   Double_t phi_start = GetSMCentralPhi(n1EBSM);
00809 
00810   Int_t rest_temp =(Int_t)(n1SMTow%(max_crys_phi_in_tower-1));
00811 
00812   if(GetSMHalfBarrel(n1EBSM) == "EB+")
00813     {
00814       if ( rest_temp == 1 ) {phi_max = phi_start + (Double_t)10.;}
00815       if ( rest_temp == 2 ) {phi_max = phi_start + (Double_t)5.;}
00816       if ( rest_temp == 3 ) {phi_max = phi_start - (Double_t)0.;}
00817       if ( rest_temp == 0 ) {phi_max = phi_start - (Double_t)5.;}
00818     }
00819 
00820   if(GetSMHalfBarrel(n1EBSM) == "EB-")
00821     {
00822       if ( rest_temp == 0 ) {phi_max = phi_start + (Double_t)10.;}
00823       if ( rest_temp == 3 ) {phi_max = phi_start + (Double_t)5.;}
00824       if ( rest_temp == 2 ) {phi_max = phi_start - (Double_t)0.;}
00825       if ( rest_temp == 1 ) {phi_max = phi_start - (Double_t)5.;}
00826     }
00827 
00828   return phi_max;
00829 }
00830 //-----------------------------------------------------------------------------------------
00831 Double_t TEcnaNumbering::GetPhiMin(const Int_t& n1EBSM)
00832 {
00833 //Gives PhiMin for a given SuperModule
00834 
00835   Double_t phi_min = GetSMCentralPhi(n1EBSM) - (Double_t)10.;
00836 
00837   return phi_min;
00838 }
00839 //-----------------------------------------------------------------------------------------
00840 Double_t TEcnaNumbering::GetPhiMax(const Int_t& n1EBSM)
00841 {
00842 //Gives PhiMax for a given SuperModule
00843 
00844   Double_t phi_max = GetSMCentralPhi(n1EBSM) + (Double_t)10.;
00845 
00846   return phi_max;
00847 }
00848 //-----------------------------------------------------------------------------------------
00849 Double_t TEcnaNumbering::GetJPhiMin(const Int_t& n1EBSM, const Int_t& n1SMTow)
00850 {
00851 //Gives JPhiMin for a given Tower
00852 
00853   Double_t j_phi_min = (Double_t)1.;
00854   Int_t max_crys_phi_in_tower = fEcal->MaxCrysPhiInTow();
00855   Int_t rest_temp =(Int_t)(n1SMTow%(max_crys_phi_in_tower-1));
00856   
00857   if ( rest_temp == 1 ){j_phi_min = (Double_t) 1. - (Double_t)0.5;}
00858   if ( rest_temp == 2 ){j_phi_min = (Double_t) 6. - (Double_t)0.5;}
00859   if ( rest_temp == 3 ){j_phi_min = (Double_t)11. - (Double_t)0.5;}
00860   if ( rest_temp == 0 ){j_phi_min = (Double_t)16. - (Double_t)0.5;}
00861 
00862   return j_phi_min;
00863 }
00864 //-----------------------------------------------------------------------------------------
00865 Double_t TEcnaNumbering::GetJPhiMax(const Int_t& n1EBSM, const Int_t& n1SMTow)
00866 {
00867 //Gives JPhiMax for a given Tower
00868 
00869   Double_t j_phi_max = (Double_t)20.;
00870   Int_t max_crys_phi_in_tower = fEcal->MaxCrysPhiInTow();
00871   Int_t rest_temp =(Int_t)(n1SMTow%(max_crys_phi_in_tower-1));
00872   
00873   if ( rest_temp == 1 ){j_phi_max = (Double_t) 5. + (Double_t)0.5;}
00874   if ( rest_temp == 2 ){j_phi_max = (Double_t)10. + (Double_t)0.5;}
00875   if ( rest_temp == 3 ){j_phi_max = (Double_t)15. + (Double_t)0.5;}
00876   if ( rest_temp == 0 ){j_phi_max = (Double_t)20. + (Double_t)0.5;}
00877 
00878   return j_phi_max;
00879 }
00880 
00881 //-----------------------------------------------------------------------------------------
00882 Double_t TEcnaNumbering::GetJPhiMin(const Int_t& n1EBSM)
00883 {
00884 //Gives JPhiMin for a given SuperModule
00885 
00886   Double_t j_phi_min = (Double_t)1. - (Double_t)0.5;
00887 
00888   return j_phi_min;
00889 }
00890 //-----------------------------------------------------------------------------------------
00891 Double_t TEcnaNumbering::GetJPhiMax(const Int_t& n1EBSM)
00892 {
00893 //Gives JPhiMax for a given SuperModule
00894 
00895   Double_t j_phi_max = (Double_t)20. + (Double_t)0.5;
00896 
00897   return j_phi_max;
00898 }
00899 
00900 //==============================================================================
00901 //
00902 //   GetXDirectionEB, GetYDirectionEB, GetJYDirectionEB
00903 //
00904 //==============================================================================
00905 
00906 //------------------------------------------------------------------
00907 TString TEcnaNumbering::GetXDirectionEB(const Int_t& SMNumber)
00908 {
00909   TString xdirection = "x";      // DEFAULT
00910 
00911   if( GetSMHalfBarrel(SMNumber) == "EB+" ){xdirection = "x";}
00912   if( GetSMHalfBarrel(SMNumber) == "EB-" ){xdirection = "x";}
00913 
00914   return xdirection;
00915 }
00916 //---------------------------------------------------------
00917 TString TEcnaNumbering::GetYDirectionEB(const Int_t& SMNumber)
00918 {
00919   TString ydirection = "-x";      // DEFAULT
00920 
00921   if( GetSMHalfBarrel(SMNumber) == "EB+" ){ydirection = "-x";}
00922   if( GetSMHalfBarrel(SMNumber) == "EB-" ){ydirection = "-x";}
00923 
00924   return ydirection;
00925 }
00926 
00927 //---------------------------------------------------------
00928 TString TEcnaNumbering::GetJYDirectionEB(const Int_t& SMNumber)
00929 {
00930   TString jydirection = "-x";      // DEFAULT
00931 
00932   if( GetSMHalfBarrel(SMNumber) == "EB+" ){jydirection = "x";}
00933   if( GetSMHalfBarrel(SMNumber) == "EB-" ){jydirection = "-x";}
00934 
00935   return jydirection;
00936 }
00937 
00938 //============================================================================
00939 TString  TEcnaNumbering::GetSMHalfBarrel(const Int_t& SMNumber)
00940 {
00941 //gives the half-barrel of the SM ("EB+" or "EB-")
00942 
00943   TString type = "EB-";   // => default value
00944 
00945   if ( SMNumber >=  1                      && SMNumber <= fEcal->MaxSMInEBPlus() ){type = "EB+";}
00946   if ( SMNumber >   fEcal->MaxSMInEBPlus() && SMNumber <= fEcal->MaxSMInEB()     ){type = "EB-";}
00947 
00948   return type;
00949 }
00950 
00951 //====================================================================================================
00952 //
00953 //
00954 //                                  E   N   D   C   A   P 
00955 //
00956 //
00957 //====================================================================================================
00958 //
00959 //               DeeCrys <-> (DeeSC, SCEcha) correspondance table
00960 //               (from the barrel table given by Patrick Jarry)
00961 //
00962 //====================================================================================================
00963 void TEcnaNumbering::BuildEndcapCrysTable()
00964 {
00965 // Build the correspondance table: DeeCrys <-> (DeeSC, SCEcha) for the ECAL ENDCAP
00966 //
00967 //  From CMS Internal Note  "CMS ECAL Endcap channel numbering"
00968 //
00969 //       Name      Number                     Reference set  Range          Comment
00970 //
00971 //       DeeSC   : Super-Crystal (SC) number    in Dee      [1,200]   (IY,IX) progression
00972 //       DeeCrys : Crystal number               in Dee      [1,5000]  (IY,IX) progression
00973 //       DeeEcha : Electronic channel number    in Dee      [0,4999]  Crystal numbering for construction 
00974 //   
00975 //       SCEcha  : Electronic channel number    in SC       [1,25]    Crystal numbering for construction  
00976 //
00977 //
00978 //   fill the 3D array:  fT3dDeeCrys[n_DeeSC][n_SCEcha][2]
00979 //
00980 //   and the 2d arrays:  fT2dDeeSC[n_DeeCrys][2] and fT2dSCEcha[n_DeeCrys][2]
00981 //
00982 //------------------------------------------------------------------------------------------------------
00983 
00984   if ( fT3dDeeCrys == 0 )
00985     {
00986       Int_t MaxDeeSC   = fEcal->MaxSCEcnaInDee();    // fEcal->MaxSCEcnaInDee() = 200
00987       Int_t MaxSCEcha  = fEcal->MaxCrysInSC();
00988       Int_t MaxDeeCrys = fEcal->MaxCrysEcnaInDee();
00989 
00990       Int_t MaxDirections = 2;    //  (2 directions: left and right)
00991 
00992       //................... Allocation and Init CrysNumbersTable
00993       fT3dDeeCrys = new Int_t**[MaxDeeSC];                         fCnew++;       
00994       fT2dDeeCrys = new  Int_t*[MaxDeeSC*MaxSCEcha];               fCnew++;  
00995       fT1dDeeCrys = new   Int_t[MaxDeeSC*MaxSCEcha*MaxDirections]; fCnew++;
00996       
00997       for(Int_t i_DeeSC = 0; i_DeeSC < MaxDeeSC; i_DeeSC++){
00998         fT3dDeeCrys[i_DeeSC] = &fT2dDeeCrys[0] + i_DeeSC*MaxSCEcha;
00999         for(Int_t i_SCEcha = 0; i_SCEcha < MaxSCEcha; i_SCEcha++){
01000           fT2dDeeCrys[i_DeeSC*MaxSCEcha + i_SCEcha] = &fT1dDeeCrys[0]
01001             + (i_DeeSC*MaxSCEcha + i_SCEcha)*MaxDirections;}}
01002       for(Int_t i=0; i<MaxDeeSC; i++)
01003         {for(Int_t j=0; j<MaxSCEcha; j++)
01004           {for(Int_t k=0; k<MaxDirections; k++){fT3dDeeCrys[i][j][k]=0;}}}      
01005 
01006       fT2dDeeSC  = new Int_t*[MaxDeeCrys];                         fCnew++;
01007       fT1dDeeSC  = new  Int_t[MaxDeeCrys*MaxDirections];           fCnew++;
01008       for(Int_t i_DeeCrys = 0 ; i_DeeCrys < MaxDeeCrys ; i_DeeCrys++){
01009         fT2dDeeSC[i_DeeCrys] = &fT1dDeeSC[0] + i_DeeCrys*MaxDirections;}
01010       for(Int_t i=0; i<MaxDeeCrys; i++)
01011         {for(Int_t j=0; j<MaxDirections; j++){fT2dDeeSC[i][j]=0;}}
01012 
01013       fT2dSCEcha = new Int_t*[MaxDeeCrys];                       fCnew++;
01014       fT1dSCEcha = new  Int_t[MaxDeeCrys*MaxDirections];                    fCnew++;   
01015       for(Int_t i_DeeCrys = 0 ; i_DeeCrys < MaxDeeCrys ; i_DeeCrys++){
01016         fT2dSCEcha[i_DeeCrys] = &fT1dSCEcha[0] + i_DeeCrys*MaxDirections;}
01017       for(Int_t i=0; i<MaxDeeCrys; i++)
01018         {for(Int_t j=0; j<MaxDirections; j++){fT2dSCEcha[i][j]=0;}}      
01019 
01020       //................................ Build table
01021       Int_t MaxTyp    = (Int_t)4;
01022       Int_t MaxCrysP1 = (Int_t)(fEcal->MaxCrysInSC()+1);
01023 
01024       //      Int_t fT2d_jch_JY[type][Echa+1]:  JY in the SC as a function of type and Echa+1
01025       fT2d_jch_JY    = new Int_t*[MaxTyp];                      fCnew++;  
01026       fT1d_jch_JY = new Int_t[MaxTyp*MaxCrysP1];             fCnew++;
01027       for(Int_t i_MaxTyp = 0 ; i_MaxTyp < MaxTyp ; i_MaxTyp++){
01028         fT2d_jch_JY[i_MaxTyp] = &fT1d_jch_JY[0] + i_MaxTyp*MaxCrysP1;}
01029 
01030       // type: 0=(top/right), 1=(top/left), 2=(bottom/left), 3=(bottom/right),  
01031 
01032       //................. top/right
01033       for(Int_t k= 5;k>= 1;k--){fT2d_jch_JY[0][k] = 4;}     //  k =  5, 4, 3, 2, 1 -> fT2d_jch_JY[0][k] = 4
01034       for(Int_t k=10;k>= 6;k--){fT2d_jch_JY[0][k] = 3;}     //  k = 10, 9, 8, 7, 6 -> fT2d_jch_JY[0][k] = 3
01035       for(Int_t k=15;k>=11;k--){fT2d_jch_JY[0][k] = 2;}     //  k = 15,14,13,12,11 -> fT2d_jch_JY[0][k] = 2
01036       for(Int_t k=20;k>=16;k--){fT2d_jch_JY[0][k] = 1;}     //  k = 20,19,18,17,16 -> fT2d_jch_JY[0][k] = 1
01037       for(Int_t k=25;k>=21;k--){fT2d_jch_JY[0][k] = 0;}     //  k = 25,24,23,22,21 -> fT2d_jch_JY[0][k] = 0
01038       //................. top/left
01039       for(Int_t k= 5;k>= 1;k--){fT2d_jch_JY[1][k] =  5-k;}  //  k =  5, 4, 3, 2, 1 -> fT2d_jch_JY[1][k] = 0,1,2,3,4
01040       for(Int_t k=10;k>= 6;k--){fT2d_jch_JY[1][k] = 10-k;}  //  k = 10, 9, 8, 7, 6 -> fT2d_jch_JY[1][k] = 0,1,2,3,4
01041       for(Int_t k=15;k>=11;k--){fT2d_jch_JY[1][k] = 15-k;}  //  k = 15,14,13,12,11 -> fT2d_jch_JY[1][k] = 0,1,2,3,4
01042       for(Int_t k=20;k>=16;k--){fT2d_jch_JY[1][k] = 20-k;}  //  k = 20,19,18,17,16 -> fT2d_jch_JY[1][k] = 0,1,2,3,4
01043       for(Int_t k=25;k>=21;k--){fT2d_jch_JY[1][k] = 25-k;}  //  k = 25,24,23,22,21 -> fT2d_jch_JY[1][k] = 0,1,2,3,4
01044       //................. bottom/left
01045       for(Int_t k= 1;k<=5; k++){fT2d_jch_JY[2][k] = 0;}     //  k =  1, 2, 3, 4, 5 -> fT2d_jch_JY[2][k] = 0
01046       for(Int_t k= 6;k<=10;k++){fT2d_jch_JY[2][k] = 1;}     //  k =  6, 7, 8, 9,10 -> fT2d_jch_JY[2][k] = 1
01047       for(Int_t k=11;k<=15;k++){fT2d_jch_JY[2][k] = 2;}     //  k = 11,12,13,14,15 -> fT2d_jch_JY[2][k] = 2
01048       for(Int_t k=16;k<=20;k++){fT2d_jch_JY[2][k] = 3;}     //  k = 16,17,18,19,20 -> fT2d_jch_JY[2][k] = 3
01049       for(Int_t k=21;k<=25;k++){fT2d_jch_JY[2][k] = 4;}     //  k = 21,22,23,24,25 -> fT2d_jch_JY[2][k] = 4
01050       //................. bottom/right
01051       for(Int_t k= 1;k<=5; k++){fT2d_jch_JY[3][k] = k-1;}   //  k =  1, 2, 3, 4, 5 -> fT2d_jch_JY[3][k] = 0,1,2,3,4
01052       for(Int_t k= 6;k<=10;k++){fT2d_jch_JY[3][k] = k-6;}   //  k =  6, 7, 8, 9,10 -> fT2d_jch_JY[3][k] = 0,1,2,3,4
01053       for(Int_t k=11;k<=15;k++){fT2d_jch_JY[3][k] = k-11;}  //  k = 11,12,13,14,15 -> fT2d_jch_JY[3][k] = 0,1,2,3,4
01054       for(Int_t k=16;k<=20;k++){fT2d_jch_JY[3][k] = k-16;}  //  k = 16,17,18,19,20 -> fT2d_jch_JY[3][k] = 0,1,2,3,4
01055       for(Int_t k=21;k<=25;k++){fT2d_jch_JY[3][k] = k-21;}  //  k = 21,22,23,24,25 -> fT2d_jch_JY[3][k] = 0,1,2,3,4
01056 
01057       //      Int_t fT2d_ich_IX[type][Echa+1]:  IX in the SC as a function of type and Echa+1
01058       fT2d_ich_IX = new Int_t*[MaxTyp];                      fCnew++;  
01059       fT1d_ich_IX = new Int_t[MaxTyp*MaxCrysP1];             fCnew++;
01060       for(Int_t i_MaxTyp = 0 ; i_MaxTyp < MaxTyp ; i_MaxTyp++){
01061         fT2d_ich_IX[i_MaxTyp] = &fT1d_ich_IX[0] + i_MaxTyp*MaxCrysP1;}
01062 
01063       //................. top/right
01064       for(Int_t k= 5;k>= 1;k--){fT2d_ich_IX[0][k] =  5-k;}  //  k =  5, 4, 3, 2, 1 -> fT2d_ich_IX[0][k] = 0,1,2,3,4
01065       for(Int_t k=10;k>= 6;k--){fT2d_ich_IX[0][k] = 10-k;}  //  k = 10, 9, 8, 7, 6 -> fT2d_ich_IX[0][k] = 0,1,2,3,4
01066       for(Int_t k=15;k>=11;k--){fT2d_ich_IX[0][k] = 15-k;}  //  k = 15,14,13,12,11 -> fT2d_ich_IX[0][k] = 0,1,2,3,4
01067       for(Int_t k=20;k>=16;k--){fT2d_ich_IX[0][k] = 20-k;}  //  k = 20,19,18,17,16 -> fT2d_ich_IX[0][k] = 0,1,2,3,4
01068       for(Int_t k=25;k>=21;k--){fT2d_ich_IX[0][k] = 25-k;}  //  k = 25,24,23,22,21 -> fT2d_ich_IX[0][k] = 0,1,2,3,4
01069       //................. top/left      
01070       for(Int_t k= 5;k>= 1;k--){fT2d_ich_IX[1][k] = 4;}     //  k =  5, 4, 3, 2, 1 -> fT2d_ich_IX[1][k] = 4
01071       for(Int_t k=10;k>= 6;k--){fT2d_ich_IX[1][k] = 3;}     //  k = 10, 9, 8, 7, 6 -> fT2d_ich_IX[1][k] = 3
01072       for(Int_t k=15;k>=11;k--){fT2d_ich_IX[1][k] = 2;}     //  k = 15,14,13,12,11 -> fT2d_ich_IX[1][k] = 2
01073       for(Int_t k=20;k>=16;k--){fT2d_ich_IX[1][k] = 1;}     //  k = 20,19,18,17,16 -> fT2d_ich_IX[1][k] = 1
01074       for(Int_t k=25;k>=21;k--){fT2d_ich_IX[1][k] = 0;}     //  k = 25,24,23,22,21 -> fT2d_ich_IX[1][k] = 0
01075       //................. bottom/left
01076       for(Int_t k=1; k<=5; k++){fT2d_ich_IX[2][k] =  5-k;}  //  k =  1, 2, 3, 4, 5 -> fT2d_ich_IX[2][k] = 0,1,2,3,4
01077       for(Int_t k=6; k<=10;k++){fT2d_ich_IX[2][k] = 10-k;}  //  k =  6, 7, 8, 9,10 -> fT2d_ich_IX[2][k] = 0,1,2,3,4
01078       for(Int_t k=11;k<=15;k++){fT2d_ich_IX[2][k] = 15-k;}  //  k = 11,12,13,14,15 -> fT2d_ich_IX[2][k] = 0,1,2,3,4
01079       for(Int_t k=16;k<=20;k++){fT2d_ich_IX[2][k] = 20-k;}  //  k = 16,17,18,19,20 -> fT2d_ich_IX[2][k] = 0,1,2,3,4
01080       for(Int_t k=21;k<=25;k++){fT2d_ich_IX[2][k] = 25-k;}  //  k = 21,22,23,24,25 -> fT2d_ich_IX[2][k] = 0,1,2,3,4
01081       //................. bottom/right      
01082       for(Int_t k= 1;k<= 5;k++){fT2d_ich_IX[3][k] = 4;}     //  k =  1, 2, 3, 4, 5 -> fT2d_ich_IX[3][k] = 4
01083       for(Int_t k= 6;k<=10;k++){fT2d_ich_IX[3][k] = 3;}     //  k =  6, 7, 8, 9,10 -> fT2d_ich_IX[3][k] = 3
01084       for(Int_t k=11;k<=15;k++){fT2d_ich_IX[3][k] = 2;}     //  k = 11,12,13,14,15 -> fT2d_ich_IX[3][k] = 2
01085       for(Int_t k=16;k<=20;k++){fT2d_ich_IX[3][k] = 1;}     //  k = 16,17,18,19,20 -> fT2d_ich_IX[3][k] = 1
01086       for(Int_t k=21;k<=25;k++){fT2d_ich_IX[3][k] = 0;}     //  k = 21,22,23,24,25 -> fT2d_ich_IX[3][k] = 0
01087 
01088       //............................................ type
01089       Int_t  Nb_DeeSC_JY  = fEcal->MaxSCIYInDee();      
01090       Int_t** type    = new Int_t*[Nb_DeeSC_JY];                   fCnew++; 
01091       Int_t*  type_d1 = new Int_t[Nb_DeeSC_JY*MaxDirections];      fCnew++;  
01092       for(Int_t i_DeeSC_JY = 0 ; i_DeeSC_JY < Nb_DeeSC_JY ; i_DeeSC_JY++){
01093         type[i_DeeSC_JY] = &type_d1[0] + i_DeeSC_JY*MaxDirections;}
01094 
01095       //  bottom = (0,9), top  = (10,19)
01096       //  right  = 0    , left = 1
01097       //  type = Quadrant number - 1
01098 
01099       type[10][0] = 0;                   // Q1 top right
01100       type[11][0] = 0;
01101       type[12][0] = 0;
01102       type[13][0] = 0;
01103       type[14][0] = 0;
01104       type[15][0] = 0;
01105       type[16][0] = 0;
01106       type[17][0] = 0;
01107       type[18][0] = 0;
01108       type[19][0] = 0;
01109  
01110       type[10][1] = 1;                   // Q2 top left    
01111       type[11][1] = 1;
01112       type[12][1] = 1;
01113       type[13][1] = 1;
01114       type[14][1] = 1;
01115       type[15][1] = 1;
01116       type[16][1] = 1;
01117       type[17][1] = 1;
01118       type[18][1] = 1;
01119       type[19][1] = 1;
01120 
01121       type[ 0][1] = 2;                   // Q3 : bottom left 
01122       type[ 1][1] = 2;
01123       type[ 2][1] = 2;
01124       type[ 3][1] = 2;
01125       type[ 4][1] = 2;
01126       type[ 5][1] = 2;
01127       type[ 6][1] = 2;
01128       type[ 7][1] = 2;
01129       type[ 8][1] = 2;
01130       type[ 9][1] = 2;
01131  
01132       type[ 0][0] = 3;                   // Q4 : bottom right 
01133       type[ 1][0] = 3;
01134       type[ 2][0] = 3;
01135       type[ 3][0] = 3;
01136       type[ 4][0] = 3;
01137       type[ 5][0] = 3;
01138       type[ 6][0] = 3;
01139       type[ 7][0] = 3;
01140       type[ 8][0] = 3;
01141       type[ 9][0] = 3;
01142 
01143       Int_t Nb_SCCrys_IX = fEcal->MaxCrysIXInSC();
01144       Int_t Nb_SCCrys_JY = fEcal->MaxCrysIYInSC();
01145 
01146       for(Int_t kSC=0; kSC<MaxDeeSC; kSC++)                   //  kSC  = 0 to 199   (MaxDeeSC = 200)
01147         {
01148           for(Int_t n_Echa=1; n_Echa<=MaxSCEcha; n_Echa++)       //  n_Echa   = 1 to 25    (MaxSCEcha = 25) 
01149             {
01150               for(Int_t idir=0; idir<2; idir++)
01151                 {
01152                   Int_t ikSC = kSC / Nb_DeeSC_JY;                 //  ikSC = 0 to 9
01153                   Int_t jkSC = kSC % Nb_DeeSC_JY;                 //  jkSC = 0,1,2,..,19 
01154                   
01155                   Int_t icrys = ikSC*Nb_SCCrys_IX + fT2d_ich_IX[type[jkSC][idir]][n_Echa];
01156                   //  type[0->9][1->2] = 0,1,2,3
01157                   //  fT2d_ich_IX[0->3][1->25] = 0,1,2,3,4
01158                   //  icrys = 0 to 49  (=> IX)
01159                   
01160                   Int_t jcrys = jkSC*Nb_SCCrys_JY + fT2d_jch_JY[type[jkSC][idir]][n_Echa];
01161                   //  type[0->9][1->2] = 0,1,2,3
01162                   //  fT2d_jch_JY[0->3][1->25] = 0,1,2,3,4
01163                   //  jcrys = 0 to 99  (=> IY)
01164                   
01165                   Int_t n_DeeCrys = icrys*Nb_DeeSC_JY*Nb_SCCrys_JY+jcrys+1;    //  n_DeeCrys = 1 to 5000
01166                   
01167                   fT3dDeeCrys[kSC][n_Echa-1][idir] = n_DeeCrys;   // fT3dDeeCrys[][][] : range = [1,5000]
01168                   fT2dDeeSC[n_DeeCrys-1][idir]     = kSC+1;       // fT2dDeeSC[][]     : range = [1,200]
01169                   fT2dSCEcha[n_DeeCrys-1][idir]    = n_Echa;      // fT2dSCEcha[][]    : range = [1,25]
01170                 }
01171             }
01172         }
01173       // cout << "#TEcnaNumbering::TBuildEndcapCrysTable()> Crys Table Building done" << endl;
01174 
01175       delete [] type;                           fCdelete++;
01176       delete [] type_d1;                        fCdelete++;
01177     }
01178   else
01179     {
01180       // cout << "#TEcnaNumbering::TBuildEndcapCrysTable()> No Building of Crys Table since it is already done " << endl;
01181     }
01182 }
01183 
01184 void TEcnaNumbering::BuildEndcapSCTable()
01185 {
01186 // Build the correspondance table: (Dee, DeeSC) <-> (DS , DSSC) for the ECAL ENDCAP
01187 //
01188 //  From CMS Internal Note  "CMS ECAL Endcap channel numbering"
01189 //
01190 //       Name       Number                     Reference set    Range     Comment
01191 //
01192 //       Dee      : Dee number                                  [1,4]
01193 //       DeeSC    : Super-Crystal (SC) number  in Dee           [1,200]   (IY,IX) progression
01194 //       DS       : Data Sector number         in EE + or -     [1,9]     (IY,IX) progression
01195 //       DSSC     : Super-Crystal (SC) number  in Data Sector   [1,32]    Crystal numbering in data sector
01196 //       DeeSCCons: Super-Crystal (SC) number  for construction [1,297]                      
01197 // 
01198 //   fill the 2d arrays:  fT2d_DS[4][200], fT2d_DSSC[4][200] and fT2d_DeeSCCons[4][200]
01199 //
01200 //------------------------------------------------------------------------------------------------------
01201 
01202 //.................. Allocations and Init
01203   Int_t MaxEEDee       = fEcal->MaxDeeInEE();
01204   Int_t MaxDeeSC       = fEcal->MaxSCEcnaInDee();
01205   Int_t MaxEESCForCons = 2*fEcal->MaxSCForConsInDee();
01206 
01207   fT2d_DS = new Int_t*[MaxEEDee];                       fCnew++;    // = DS[Dee - 1, CNA_SCInDee - 1]
01208   fT1d_DS = new  Int_t[MaxEEDee*MaxDeeSC];              fCnew++;
01209   for(Int_t i_DeeCrys = 0 ; i_DeeCrys < MaxEEDee ; i_DeeCrys++){
01210     fT2d_DS[i_DeeCrys] = &fT1d_DS[0] + i_DeeCrys*MaxDeeSC;}
01211   for(Int_t i=0; i<MaxEEDee; i++)
01212     {for(Int_t j=0; j<MaxDeeSC; j++){fT2d_DS[i][j]=0;}}
01213 
01214   fT2d_DSSC = new Int_t*[MaxEEDee];                     fCnew++;    // = SCInDS[Dee - 1, CNA_SCInDee - 1]  
01215   fT1d_DSSC = new  Int_t[MaxEEDee*MaxDeeSC];            fCnew++;
01216   for(Int_t i_DeeCrys = 0 ; i_DeeCrys < MaxEEDee ; i_DeeCrys++){
01217     fT2d_DSSC[i_DeeCrys] = &fT1d_DSSC[0] + i_DeeCrys*MaxDeeSC;}
01218   for(Int_t i=0; i<MaxEEDee; i++)
01219     {for(Int_t j=0; j<MaxDeeSC; j++){fT2d_DSSC[i][j]=0;}}
01220 
01221   fT2d_DeeSCCons = new Int_t*[MaxEEDee];                fCnew++;    // = SCConsInDee[Dee - 1, CNA_SCInDee - 1]
01222   fT1d_DeeSCCons = new  Int_t[MaxEEDee*MaxDeeSC];       fCnew++;
01223   for(Int_t i_DeeCrys = 0 ; i_DeeCrys < MaxEEDee ; i_DeeCrys++){
01224     fT2d_DeeSCCons[i_DeeCrys] = &fT1d_DeeSCCons[0] + i_DeeCrys*MaxDeeSC;}
01225   for(Int_t i=0; i<MaxEEDee; i++)
01226     {for(Int_t j=0; j<MaxDeeSC; j++){fT2d_DeeSCCons[i][j]=0;}}
01227 
01228   fT2d_RecovDeeSC = new Int_t*[MaxEEDee];               fCnew++;    // = CNA_SCInDee[Dee - 1, SCConsInDee - 1]
01229   fT1d_RecovDeeSC = new  Int_t[MaxEEDee*MaxEESCForCons];  fCnew++;
01230   for(Int_t i_DeeCrys = 0 ; i_DeeCrys < MaxEEDee ; i_DeeCrys++){
01231     fT2d_RecovDeeSC[i_DeeCrys] = &fT1d_RecovDeeSC[0] + i_DeeCrys*MaxEESCForCons;}
01232   for(Int_t i=0; i<MaxEEDee; i++)
01233     {for(Int_t j=0; j<MaxEESCForCons; j++){fT2d_RecovDeeSC[i][j]=0;}}
01234 
01235   //.............................. Data sector (DS) numbers: fT2d_DS[][]
01236   //                               isc = ECNA numbers
01237 
01238   Int_t ids = 0;
01239 
01240   //........... (D1,S1)=(D2,S9)=(D3,S9)=(D4,S1)
01241   for(Int_t dee = 1; dee<=4; dee++)
01242     {
01243       if( dee == 1 || dee == 4 ){ids = 1;}
01244       if( dee == 2 || dee == 3 ){ids = 9;}
01245       for(Int_t isc= 13; isc<= 20; isc++)fT2d_DS[dee-1][isc-1] = ids;
01246       for(Int_t isc= 33; isc<= 40; isc++)fT2d_DS[dee-1][isc-1] = ids;
01247       for(Int_t isc= 54; isc<= 60; isc++)fT2d_DS[dee-1][isc-1] = ids;
01248       for(Int_t isc= 75; isc<= 79; isc++)fT2d_DS[dee-1][isc-1] = ids;
01249       for(Int_t isc= 96; isc<= 99; isc++)fT2d_DS[dee-1][isc-1] = ids;
01250       for(Int_t isc=118; isc<=119; isc++)fT2d_DS[dee-1][isc-1] = ids;
01251     }
01252   //........... (D1,S2)=(D2,S8)=(D3,S8)=(D4,S2)
01253   for(Int_t dee = 1; dee<=4; dee++)
01254     {
01255       if( dee == 1 || dee == 4 ){ids = 2;}
01256       if( dee == 2 || dee == 3 ){ids = 8;}
01257       for(Int_t isc= 32; isc<= 32; isc++)fT2d_DS[dee-1][isc-1] = ids;
01258       for(Int_t isc= 51; isc<= 53; isc++)fT2d_DS[dee-1][isc-1] = ids;
01259       for(Int_t isc= 72; isc<= 74; isc++)fT2d_DS[dee-1][isc-1] = ids;
01260       for(Int_t isc= 92; isc<= 95; isc++)fT2d_DS[dee-1][isc-1] = ids;
01261       for(Int_t isc=112; isc<=117; isc++)fT2d_DS[dee-1][isc-1] = ids;
01262       for(Int_t isc=132; isc<=138; isc++)fT2d_DS[dee-1][isc-1] = ids;
01263       for(Int_t isc=152; isc<=157; isc++)fT2d_DS[dee-1][isc-1] = ids;
01264       for(Int_t isc=173; isc<=176; isc++)fT2d_DS[dee-1][isc-1] = ids;
01265       for(Int_t isc=193; isc<=193; isc++)fT2d_DS[dee-1][isc-1] = ids;
01266     }
01267   //........... (D1,S3)=(D2,S7)=(D3,S7)=(D4,S3)
01268   for(Int_t dee = 1; dee<=4; dee++)
01269     {
01270       if( dee == 1 || dee == 4 ){ids = 3;}
01271       if( dee == 2 || dee == 3 ){ids = 7;}
01272       for(Int_t isc= 50; isc<= 50; isc++)fT2d_DS[dee-1][isc-1] = ids;
01273       for(Int_t isc= 69; isc<= 71; isc++)fT2d_DS[dee-1][isc-1] = ids;
01274       for(Int_t isc= 88; isc<= 91; isc++)fT2d_DS[dee-1][isc-1] = ids;
01275       for(Int_t isc=108; isc<=111; isc++)fT2d_DS[dee-1][isc-1] = ids;
01276       for(Int_t isc=127; isc<=131; isc++)fT2d_DS[dee-1][isc-1] = ids;
01277       for(Int_t isc=147; isc<=151; isc++)fT2d_DS[dee-1][isc-1] = ids;
01278       for(Int_t isc=166; isc<=172; isc++)fT2d_DS[dee-1][isc-1] = ids;
01279       for(Int_t isc=188; isc<=192; isc++)fT2d_DS[dee-1][isc-1] = ids;
01280     }
01281   //........... (D1,S4)=(D2,S6)=(D3,S6)=(D4,S4)
01282   for(Int_t dee = 1; dee<=4; dee++)
01283     {
01284       if( dee == 1 || dee == 4 ){ids = 4;}
01285       if( dee == 2 || dee == 3 ){ids = 6;}
01286       for(Int_t isc= 27; isc<= 29; isc++)fT2d_DS[dee-1][isc-1] = ids;
01287       for(Int_t isc= 44; isc<= 49; isc++)fT2d_DS[dee-1][isc-1] = ids;
01288       for(Int_t isc= 62; isc<= 68; isc++)fT2d_DS[dee-1][isc-1] = ids;
01289       for(Int_t isc= 82; isc<= 87; isc++)fT2d_DS[dee-1][isc-1] = ids;
01290       for(Int_t isc=102; isc<=107; isc++)fT2d_DS[dee-1][isc-1] = ids;
01291       for(Int_t isc=123; isc<=126; isc++)fT2d_DS[dee-1][isc-1] = ids;
01292       for(Int_t isc=144; isc<=146; isc++)fT2d_DS[dee-1][isc-1] = ids;
01293       for(Int_t isc=165; isc<=165; isc++)fT2d_DS[dee-1][isc-1] = ids;
01294     }
01295   //........... (D1,S5)=(D2,S5)=(D3,S5)=(D4,S5)
01296   for(Int_t dee = 1; dee<=4; dee++)
01297     {
01298       for(Int_t isc=  1; isc<=  8; isc++)fT2d_DS[dee-1][isc-1] = 5;
01299       for(Int_t isc= 21; isc<= 26; isc++)fT2d_DS[dee-1][isc-1] = 5;
01300       for(Int_t isc= 41; isc<= 43; isc++)fT2d_DS[dee-1][isc-1] = 5;
01301     }
01302   
01303   //............................................ SC numbers in Data Sectors: fT2d_DSSC[][]
01304   //                                             fT2d_DSSC[dee-1][SC ECNA number - 1] = SC number in DS;
01305   for(Int_t dee=1; dee<=4; dee++)
01306     {
01307       for(Int_t isc=1; isc<=MaxDeeSC; isc++)
01308         {fT2d_DSSC[dee-1][isc-1] = -1;}
01309       //.......................................... S1 (D1,D4), S9 (D2,D3) ; 33 SC's
01310       fT2d_DSSC[dee-1][13-1] = 12;
01311       fT2d_DSSC[dee-1][14-1] = 11;
01312       fT2d_DSSC[dee-1][15-1] = 10;
01313       fT2d_DSSC[dee-1][16-1] =  9;
01314       fT2d_DSSC[dee-1][17-1] =  4;
01315       fT2d_DSSC[dee-1][18-1] =  3;
01316       fT2d_DSSC[dee-1][19-1] =  2;
01317       fT2d_DSSC[dee-1][20-1] =  1;
01318 
01319       fT2d_DSSC[dee-1][33-1] = 16;
01320       fT2d_DSSC[dee-1][34-1] = 15;
01321       fT2d_DSSC[dee-1][35-1] = 14;
01322       fT2d_DSSC[dee-1][36-1] = 13;
01323       fT2d_DSSC[dee-1][37-1] =  8;
01324       fT2d_DSSC[dee-1][38-1] =  7;
01325       fT2d_DSSC[dee-1][39-1] =  6;
01326       fT2d_DSSC[dee-1][40-1] =  5;
01327 
01328       fT2d_DSSC[dee-1][54-1] = 33;
01329       fT2d_DSSC[dee-1][55-1] = 31;
01330       fT2d_DSSC[dee-1][56-1] = 27;
01331       fT2d_DSSC[dee-1][57-1] = 24;
01332       fT2d_DSSC[dee-1][58-1] = 20;
01333       fT2d_DSSC[dee-1][59-1] = 17;
01334       fT2d_DSSC[dee-1][60-1] = 30;  //  (182a, 33a for construction)
01335       
01336       fT2d_DSSC[dee-1][75-1] = 32;
01337       fT2d_DSSC[dee-1][76-1] = 28;
01338       fT2d_DSSC[dee-1][77-1] = 25;
01339       fT2d_DSSC[dee-1][78-1] = 21;
01340       fT2d_DSSC[dee-1][79-1] = 18;
01341       
01342       fT2d_DSSC[dee-1][96-1] = 29;
01343       fT2d_DSSC[dee-1][97-1] = 26;
01344       fT2d_DSSC[dee-1][98-1] = 22;
01345       fT2d_DSSC[dee-1][99-1] = 19;
01346 
01347       fT2d_DSSC[dee-1][118-1] = 23;
01348       fT2d_DSSC[dee-1][119-1] = 30;  //  (182b, 33b for construction)
01349 
01350       //.......................................... S2 (D1,D4), S8(D2,D3) ; 32 SC's
01351       fT2d_DSSC[dee-1][32-1] = 25;  // also 3;  // ( (207c, 58c) also (178c, 29c) for construction)
01352 
01353       fT2d_DSSC[dee-1][51-1] = 32;
01354       fT2d_DSSC[dee-1][52-1] = 26;
01355       fT2d_DSSC[dee-1][53-1] = 18;
01356 
01357       fT2d_DSSC[dee-1][72-1] = 27;
01358       fT2d_DSSC[dee-1][73-1] = 19;
01359       fT2d_DSSC[dee-1][74-1] = 12;
01360       
01361       fT2d_DSSC[dee-1][92-1] = 28;
01362       fT2d_DSSC[dee-1][93-1] = 20;
01363       fT2d_DSSC[dee-1][94-1] = 13;
01364       fT2d_DSSC[dee-1][95-1] =  7;
01365 
01366       fT2d_DSSC[dee-1][112-1] = 29;
01367       fT2d_DSSC[dee-1][113-1] = 21;
01368       fT2d_DSSC[dee-1][114-1] = 14;
01369       fT2d_DSSC[dee-1][115-1] =  8;
01370       fT2d_DSSC[dee-1][116-1] =  4;
01371       fT2d_DSSC[dee-1][117-1] =  1;
01372 
01373       fT2d_DSSC[dee-1][132-1] = 30;
01374       fT2d_DSSC[dee-1][133-1] = 22;
01375       fT2d_DSSC[dee-1][134-1] = 15;
01376       fT2d_DSSC[dee-1][135-1] =  9;
01377       fT2d_DSSC[dee-1][136-1] =  5;
01378       fT2d_DSSC[dee-1][137-1] =  2;
01379       fT2d_DSSC[dee-1][138-1] =  3;  // (178a, 29a for construction)
01380 
01381       fT2d_DSSC[dee-1][152-1] = 31;
01382       fT2d_DSSC[dee-1][153-1] = 23;
01383       fT2d_DSSC[dee-1][154-1] = 16;
01384       fT2d_DSSC[dee-1][155-1] = 10;
01385       fT2d_DSSC[dee-1][156-1] =  6;
01386       fT2d_DSSC[dee-1][157-1] =  3;  // (178b, 29b for construction)
01387 
01388       fT2d_DSSC[dee-1][173-1] = 24;
01389       fT2d_DSSC[dee-1][174-1] = 17;
01390       fT2d_DSSC[dee-1][175-1] = 11;
01391       fT2d_DSSC[dee-1][176-1] = 25;  // (207a, 58a for construction)
01392 
01393       fT2d_DSSC[dee-1][193-1] = 25;  // (207b, 58b for construction)
01394 
01395       //.......................................... S3 (D1,D4), S7 (D2,D3)  ; 34 SC's
01396       fT2d_DSSC[dee-1][50-1] = 10;
01397 
01398       fT2d_DSSC[dee-1][69-1] = 18;
01399       fT2d_DSSC[dee-1][70-1] = 11;
01400       fT2d_DSSC[dee-1][71-1] =  3;
01401 
01402       fT2d_DSSC[dee-1][88-1] = 25;
01403       fT2d_DSSC[dee-1][89-1] = 19;
01404       fT2d_DSSC[dee-1][90-1] = 12;
01405       fT2d_DSSC[dee-1][91-1] =  4;
01406 
01407       fT2d_DSSC[dee-1][108-1] = 26;
01408       fT2d_DSSC[dee-1][109-1] = 20;
01409       fT2d_DSSC[dee-1][110-1] = 13;
01410       fT2d_DSSC[dee-1][111-1] =  5;
01411 
01412       fT2d_DSSC[dee-1][127-1] = 31;
01413       fT2d_DSSC[dee-1][128-1] = 27;
01414       fT2d_DSSC[dee-1][129-1] = 21;
01415       fT2d_DSSC[dee-1][130-1] = 14;
01416       fT2d_DSSC[dee-1][131-1] =  6;
01417 
01418       fT2d_DSSC[dee-1][147-1] = 32;
01419       fT2d_DSSC[dee-1][148-1] = 28;
01420       fT2d_DSSC[dee-1][149-1] = 22;
01421       fT2d_DSSC[dee-1][150-1] = 15;
01422       fT2d_DSSC[dee-1][151-1] =  7;
01423 
01424       fT2d_DSSC[dee-1][166-1] = 33;
01425       fT2d_DSSC[dee-1][167-1] = 30;
01426       fT2d_DSSC[dee-1][168-1] = 29;
01427       fT2d_DSSC[dee-1][169-1] = 23;
01428       fT2d_DSSC[dee-1][170-1] = 16;
01429       fT2d_DSSC[dee-1][171-1] =  8;
01430       fT2d_DSSC[dee-1][172-1] =  1;
01431 
01432       fT2d_DSSC[dee-1][188-1] = 34; // (298a, 149a for construction)
01433       fT2d_DSSC[dee-1][189-1] = 24;
01434       fT2d_DSSC[dee-1][190-1] = 17;
01435       fT2d_DSSC[dee-1][191-1] =  9;
01436       fT2d_DSSC[dee-1][192-1] =  2;
01437 
01438       //.......................................... S4 (D1,D4), S6 (D2,D3) ; 33 SC's
01439       fT2d_DSSC[dee-1][27-1] = 33;
01440       fT2d_DSSC[dee-1][28-1] = 32;
01441       fT2d_DSSC[dee-1][29-1] = 14; // also 21;  //  ( (261a, 112a) also (268a, 119a) for construction)
01442 
01443       fT2d_DSSC[dee-1][44-1] = 22;
01444       fT2d_DSSC[dee-1][45-1] = 15;
01445       fT2d_DSSC[dee-1][46-1] =  8;
01446       fT2d_DSSC[dee-1][47-1] =  4;
01447       fT2d_DSSC[dee-1][48-1] =  2;
01448       fT2d_DSSC[dee-1][49-1] =  1;
01449 
01450       fT2d_DSSC[dee-1][62-1] = 29;
01451       fT2d_DSSC[dee-1][63-1] = 28;
01452       fT2d_DSSC[dee-1][64-1] = 23;
01453       fT2d_DSSC[dee-1][65-1] = 16;
01454       fT2d_DSSC[dee-1][66-1] =  9;
01455       fT2d_DSSC[dee-1][67-1] =  5;
01456       fT2d_DSSC[dee-1][68-1] =  3;
01457 
01458       fT2d_DSSC[dee-1][82-1] = 31;
01459       fT2d_DSSC[dee-1][83-1] = 30;
01460       fT2d_DSSC[dee-1][84-1] = 24;
01461       fT2d_DSSC[dee-1][85-1] = 17;
01462       fT2d_DSSC[dee-1][86-1] = 10;
01463       fT2d_DSSC[dee-1][87-1] =  6;
01464 
01465       fT2d_DSSC[dee-1][102-1] = 21;  //   (268c, 119c for construction)
01466       fT2d_DSSC[dee-1][103-1] = 27;
01467       fT2d_DSSC[dee-1][104-1] = 25;
01468       fT2d_DSSC[dee-1][105-1] = 18;
01469       fT2d_DSSC[dee-1][106-1] = 11;
01470       fT2d_DSSC[dee-1][107-1] =  7;
01471 
01472       fT2d_DSSC[dee-1][123-1] = 21;  //   (268b, 119b for construction)
01473       fT2d_DSSC[dee-1][124-1] = 26;
01474       fT2d_DSSC[dee-1][125-1] = 19;
01475       fT2d_DSSC[dee-1][126-1] = 12;
01476 
01477       fT2d_DSSC[dee-1][144-1] = 14;  //   (261c, 112c for construction)
01478       fT2d_DSSC[dee-1][145-1] = 20;
01479       fT2d_DSSC[dee-1][146-1] = 13;
01480 
01481       fT2d_DSSC[dee-1][165-1] = 14;  //   (261b, 112b for construction)
01482 
01483       //.......................................... S5   (2*17 = 34 SC's)
01484       if(dee == 1 || dee == 3)
01485         {
01486           fT2d_DSSC[dee-1][1-1] = 34;
01487           fT2d_DSSC[dee-1][2-1] = 33;
01488           fT2d_DSSC[dee-1][3-1] = 32;
01489           fT2d_DSSC[dee-1][4-1] = 31;
01490           fT2d_DSSC[dee-1][5-1] = 26;
01491           fT2d_DSSC[dee-1][6-1] = 25;
01492           fT2d_DSSC[dee-1][7-1] = 24;
01493           fT2d_DSSC[dee-1][8-1] = 23;
01494 
01495           fT2d_DSSC[dee-1][21-1] = 30;
01496           fT2d_DSSC[dee-1][22-1] = 29;
01497           fT2d_DSSC[dee-1][23-1] = 28;
01498           fT2d_DSSC[dee-1][24-1] = 27;
01499           fT2d_DSSC[dee-1][25-1] = 22;
01500           fT2d_DSSC[dee-1][26-1] = 21;
01501 
01502           fT2d_DSSC[dee-1][41-1] = 20;  //   (281a for construction)
01503           fT2d_DSSC[dee-1][42-1] = 19;
01504           fT2d_DSSC[dee-1][43-1] = 18;
01505         }
01506 
01507       if(dee == 2 || dee == 4)
01508         {
01509           fT2d_DSSC[dee-1][1-1] = 17;
01510           fT2d_DSSC[dee-1][2-1] = 16;
01511           fT2d_DSSC[dee-1][3-1] = 15;
01512           fT2d_DSSC[dee-1][4-1] = 14;
01513           fT2d_DSSC[dee-1][5-1] =  9;
01514           fT2d_DSSC[dee-1][6-1] =  8;
01515           fT2d_DSSC[dee-1][7-1] =  7;
01516           fT2d_DSSC[dee-1][8-1] =  6;
01517 
01518           fT2d_DSSC[dee-1][21-1] = 13;
01519           fT2d_DSSC[dee-1][22-1] = 12;
01520           fT2d_DSSC[dee-1][23-1] = 11;
01521           fT2d_DSSC[dee-1][24-1] = 10;
01522           fT2d_DSSC[dee-1][25-1] =  5;
01523           fT2d_DSSC[dee-1][26-1] =  4;
01524 
01525           fT2d_DSSC[dee-1][41-1] = 3;  //   (132a for construction)
01526           fT2d_DSSC[dee-1][42-1] = 2;
01527           fT2d_DSSC[dee-1][43-1] = 1;
01528         }
01529     }
01530   //............................... Numbers for construction: fT2d_DeeSCCons[][]
01531   //                                fT2d_DeeSCCons[dee-1][SC ECNA number - 1] = SC number for construction;
01532 
01533   //............................... init to -1
01534   for(Int_t dee=1; dee<=4; dee++)
01535     {for(Int_t isc=1; isc<=MaxDeeSC; isc++)
01536         {fT2d_DeeSCCons[dee-1][isc-1] = -1;}}
01537 
01538   for(Int_t i_dee_type=1; i_dee_type<=2; i_dee_type++)
01539     {
01540       Int_t dee = -1;
01541       if( i_dee_type == 1 ){dee = 1;}
01542       if( i_dee_type == 2 ){dee = 3;}
01543       
01544       //.......................................... (D1,S1 or D3,S9) AND (D2,S9 or D4,S1)
01545       //  number in comment = fT2d_DSSC[dee-1][SC ECNA nb - 1] (= SC number in DS)
01546       fT2d_DeeSCCons[dee-1][13-1] = 161; fT2d_DeeSCCons[dee][13-1] = 12; // 12;
01547       fT2d_DeeSCCons[dee-1][14-1] = 160; fT2d_DeeSCCons[dee][14-1] = 11; // 11;
01548       fT2d_DeeSCCons[dee-1][15-1] = 159; fT2d_DeeSCCons[dee][15-1] = 10; // 10;
01549       fT2d_DeeSCCons[dee-1][16-1] = 158; fT2d_DeeSCCons[dee][16-1] =  9; //  9;
01550       fT2d_DeeSCCons[dee-1][17-1] = 153; fT2d_DeeSCCons[dee][17-1] =  4; //  4;
01551       fT2d_DeeSCCons[dee-1][18-1] = 152; fT2d_DeeSCCons[dee][18-1] =  3; //  3;
01552       fT2d_DeeSCCons[dee-1][19-1] = 151; fT2d_DeeSCCons[dee][19-1] =  2; //  2;
01553       fT2d_DeeSCCons[dee-1][20-1] = 150; fT2d_DeeSCCons[dee][20-1] =  1; //  1;
01554       
01555       fT2d_DeeSCCons[dee-1][33-1] = 165; fT2d_DeeSCCons[dee][33-1] = 16; // 16;
01556       fT2d_DeeSCCons[dee-1][34-1] = 164; fT2d_DeeSCCons[dee][34-1] = 15; // 15;
01557       fT2d_DeeSCCons[dee-1][35-1] = 163; fT2d_DeeSCCons[dee][35-1] = 14; // 14;
01558       fT2d_DeeSCCons[dee-1][36-1] = 162; fT2d_DeeSCCons[dee][36-1] = 13; // 13;
01559       fT2d_DeeSCCons[dee-1][37-1] = 157; fT2d_DeeSCCons[dee][37-1] =  8; //  8;
01560       fT2d_DeeSCCons[dee-1][38-1] = 156; fT2d_DeeSCCons[dee][38-1] =  7; //  7;
01561       fT2d_DeeSCCons[dee-1][39-1] = 155; fT2d_DeeSCCons[dee][39-1] =  6; //  6;
01562       fT2d_DeeSCCons[dee-1][40-1] = 154; fT2d_DeeSCCons[dee][40-1] =  5; //  5;
01563       
01564       fT2d_DeeSCCons[dee-1][54-1] = 193; fT2d_DeeSCCons[dee][54-1] = 44; // 33; 
01565       fT2d_DeeSCCons[dee-1][55-1] = 186; fT2d_DeeSCCons[dee][55-1] = 37; // 31;
01566       fT2d_DeeSCCons[dee-1][56-1] = 179; fT2d_DeeSCCons[dee][56-1] = 30; // 27;
01567       fT2d_DeeSCCons[dee-1][57-1] = 173; fT2d_DeeSCCons[dee][57-1] = 24; // 24;
01568       fT2d_DeeSCCons[dee-1][58-1] = 169; fT2d_DeeSCCons[dee][58-1] = 20; // 20;
01569       fT2d_DeeSCCons[dee-1][59-1] = 166; fT2d_DeeSCCons[dee][59-1] = 17; // 17;
01570       fT2d_DeeSCCons[dee-1][60-1] = 182; fT2d_DeeSCCons[dee][60-1] = 33; // 30;    // 182a ;  33a;
01571 
01572       fT2d_DeeSCCons[dee-1][75-1] = 187; fT2d_DeeSCCons[dee][75-1] = 38; // 32;
01573       fT2d_DeeSCCons[dee-1][76-1] = 180; fT2d_DeeSCCons[dee][76-1] = 31; // 28;
01574       fT2d_DeeSCCons[dee-1][77-1] = 174; fT2d_DeeSCCons[dee][77-1] = 25; // 25;
01575       fT2d_DeeSCCons[dee-1][78-1] = 170; fT2d_DeeSCCons[dee][78-1] = 21; // 21;
01576       fT2d_DeeSCCons[dee-1][79-1] = 167; fT2d_DeeSCCons[dee][79-1] = 18; // 18;
01577       
01578       fT2d_DeeSCCons[dee-1][96-1] = 181; fT2d_DeeSCCons[dee][96-1] = 32; // 29;
01579       fT2d_DeeSCCons[dee-1][97-1] = 175; fT2d_DeeSCCons[dee][97-1] = 26; // 26;
01580       fT2d_DeeSCCons[dee-1][98-1] = 171; fT2d_DeeSCCons[dee][98-1] = 22; // 22;
01581       fT2d_DeeSCCons[dee-1][99-1] = 168; fT2d_DeeSCCons[dee][99-1] = 19; // 19;
01582       
01583       fT2d_DeeSCCons[dee-1][118-1] = 172; fT2d_DeeSCCons[dee][118-1] = 23; // 23;
01584       fT2d_DeeSCCons[dee-1][119-1] = 182; fT2d_DeeSCCons[dee][119-1] = 33; // 30;    // 182b ;  33b;
01585      
01586       //.......................................... (D1,S2 or D3,S8) AND (D2,S8 or D4,S2)
01587       fT2d_DeeSCCons[dee-1][32-1] = 178; fT2d_DeeSCCons[dee][32-1] = 29; // 25-3;   // 178c-207c ; 29c-58c;
01588 
01589       fT2d_DeeSCCons[dee-1][51-1] = 216; fT2d_DeeSCCons[dee][51-1] = 67; // 32;
01590       fT2d_DeeSCCons[dee-1][52-1] = 208; fT2d_DeeSCCons[dee][52-1] = 59; // 26;
01591       fT2d_DeeSCCons[dee-1][53-1] = 200; fT2d_DeeSCCons[dee][53-1] = 51; // 18;
01592       
01593       fT2d_DeeSCCons[dee-1][72-1] = 209; fT2d_DeeSCCons[dee][72-1] = 60; // 27;
01594       fT2d_DeeSCCons[dee-1][73-1] = 201; fT2d_DeeSCCons[dee][73-1] = 52; // 19;
01595       fT2d_DeeSCCons[dee-1][74-1] = 194; fT2d_DeeSCCons[dee][74-1] = 45; // 12;
01596       
01597       fT2d_DeeSCCons[dee-1][92-1] = 210; fT2d_DeeSCCons[dee][92-1] = 61; // 28;
01598       fT2d_DeeSCCons[dee-1][93-1] = 202; fT2d_DeeSCCons[dee][93-1] = 53; // 20;
01599       fT2d_DeeSCCons[dee-1][94-1] = 195; fT2d_DeeSCCons[dee][94-1] = 46; // 13;
01600       fT2d_DeeSCCons[dee-1][95-1] = 188; fT2d_DeeSCCons[dee][95-1] = 39; //  7;
01601       
01602       fT2d_DeeSCCons[dee-1][112-1] = 211; fT2d_DeeSCCons[dee][112-1] = 62; // 29;
01603       fT2d_DeeSCCons[dee-1][113-1] = 203; fT2d_DeeSCCons[dee][113-1] = 54; // 21;
01604       fT2d_DeeSCCons[dee-1][114-1] = 196; fT2d_DeeSCCons[dee][114-1] = 47; // 14;
01605       fT2d_DeeSCCons[dee-1][115-1] = 189; fT2d_DeeSCCons[dee][115-1] = 40; //  8;
01606       fT2d_DeeSCCons[dee-1][116-1] = 183; fT2d_DeeSCCons[dee][116-1] = 34; //  4;
01607       fT2d_DeeSCCons[dee-1][117-1] = 176; fT2d_DeeSCCons[dee][117-1] = 27; //  1;
01608       
01609       fT2d_DeeSCCons[dee-1][132-1] = 212; fT2d_DeeSCCons[dee][132-1] = 63; // 30;
01610       fT2d_DeeSCCons[dee-1][133-1] = 204; fT2d_DeeSCCons[dee][133-1] = 55; // 22;
01611       fT2d_DeeSCCons[dee-1][134-1] = 197; fT2d_DeeSCCons[dee][134-1] = 48; // 15;
01612       fT2d_DeeSCCons[dee-1][135-1] = 190; fT2d_DeeSCCons[dee][135-1] = 41; //  9;
01613       fT2d_DeeSCCons[dee-1][136-1] = 184; fT2d_DeeSCCons[dee][136-1] = 35; //  5;
01614       fT2d_DeeSCCons[dee-1][137-1] = 177; fT2d_DeeSCCons[dee][137-1] = 28; //  2;
01615       fT2d_DeeSCCons[dee-1][138-1] = 178; fT2d_DeeSCCons[dee][138-1] = 29; //  3; //  178a ;  29a;
01616       
01617       fT2d_DeeSCCons[dee-1][152-1] = 213; fT2d_DeeSCCons[dee][152-1] = 64; // 31;
01618       fT2d_DeeSCCons[dee-1][153-1] = 205; fT2d_DeeSCCons[dee][153-1] = 56; // 23;
01619       fT2d_DeeSCCons[dee-1][154-1] = 198; fT2d_DeeSCCons[dee][154-1] = 49; // 16;
01620       fT2d_DeeSCCons[dee-1][155-1] = 191; fT2d_DeeSCCons[dee][155-1] = 42; // 10;
01621       fT2d_DeeSCCons[dee-1][156-1] = 185; fT2d_DeeSCCons[dee][156-1] = 36; //  6;
01622       fT2d_DeeSCCons[dee-1][157-1] = 178; fT2d_DeeSCCons[dee][157-1] = 29; //  3; //  178b ;  29b;
01623       
01624       fT2d_DeeSCCons[dee-1][173-1] = 206; fT2d_DeeSCCons[dee][173-1] = 57; // 24;
01625       fT2d_DeeSCCons[dee-1][174-1] = 199; fT2d_DeeSCCons[dee][174-1] = 50; // 17;
01626       fT2d_DeeSCCons[dee-1][175-1] = 192; fT2d_DeeSCCons[dee][175-1] = 43; // 11;
01627       fT2d_DeeSCCons[dee-1][176-1] = 207; fT2d_DeeSCCons[dee][176-1] = 58; // 25; //  58a ;  207a;
01628  
01629       fT2d_DeeSCCons[dee-1][193-1] = 207; fT2d_DeeSCCons[dee][193-1] = 58; // 25; //  58b ;  207b;
01630     
01631       //.......................................... (D1,S3 or D3,S7) AND  (D2,S7 or D4,S3) 
01632       fT2d_DeeSCCons[dee-1][50-1] = 224; fT2d_DeeSCCons[dee][50-1] = 75; // 10;
01633       
01634       fT2d_DeeSCCons[dee-1][69-1] = 233; fT2d_DeeSCCons[dee][69-1] = 84; // 18;
01635       fT2d_DeeSCCons[dee-1][70-1] = 225; fT2d_DeeSCCons[dee][70-1] = 76; // 11;
01636       fT2d_DeeSCCons[dee-1][71-1] = 217; fT2d_DeeSCCons[dee][71-1] = 68; //  3;
01637       
01638       fT2d_DeeSCCons[dee-1][88-1] = 242; fT2d_DeeSCCons[dee][88-1] = 93; // 25;
01639       fT2d_DeeSCCons[dee-1][89-1] = 234; fT2d_DeeSCCons[dee][89-1] = 85; // 19;
01640       fT2d_DeeSCCons[dee-1][90-1] = 226; fT2d_DeeSCCons[dee][90-1] = 77; // 12;
01641       fT2d_DeeSCCons[dee-1][91-1] = 218; fT2d_DeeSCCons[dee][91-1] = 69; //  4;
01642       
01643       fT2d_DeeSCCons[dee-1][108-1] = 243; fT2d_DeeSCCons[dee][108-1] = 94; // 26;
01644       fT2d_DeeSCCons[dee-1][109-1] = 235; fT2d_DeeSCCons[dee][109-1] = 86; // 20;
01645       fT2d_DeeSCCons[dee-1][110-1] = 227; fT2d_DeeSCCons[dee][110-1] = 78; // 13;
01646       fT2d_DeeSCCons[dee-1][111-1] = 219; fT2d_DeeSCCons[dee][111-1] = 70; //  5;
01647       
01648       fT2d_DeeSCCons[dee-1][127-1] = 252; fT2d_DeeSCCons[dee][127-1] = 103; // 31;
01649       fT2d_DeeSCCons[dee-1][128-1] = 244; fT2d_DeeSCCons[dee][128-1] =  95; // 27;
01650       fT2d_DeeSCCons[dee-1][129-1] = 236; fT2d_DeeSCCons[dee][129-1] =  87; // 21;
01651       fT2d_DeeSCCons[dee-1][130-1] = 228; fT2d_DeeSCCons[dee][130-1] =  79; // 14;
01652       fT2d_DeeSCCons[dee-1][131-1] = 220; fT2d_DeeSCCons[dee][131-1] =  71; //  6;
01653       
01654       fT2d_DeeSCCons[dee-1][147-1] = 253; fT2d_DeeSCCons[dee][147-1] = 104; // 32;
01655       fT2d_DeeSCCons[dee-1][148-1] = 245; fT2d_DeeSCCons[dee][148-1] =  96; // 28;
01656       fT2d_DeeSCCons[dee-1][149-1] = 237; fT2d_DeeSCCons[dee][149-1] =  88; // 22;
01657       fT2d_DeeSCCons[dee-1][150-1] = 229; fT2d_DeeSCCons[dee][150-1] =  80; // 15;
01658       fT2d_DeeSCCons[dee-1][151-1] = 221; fT2d_DeeSCCons[dee][151-1] =  72; //  7;
01659       
01660       fT2d_DeeSCCons[dee-1][166-1] = 254; fT2d_DeeSCCons[dee][166-1] = 105; // 33;
01661       fT2d_DeeSCCons[dee-1][167-1] = 247; fT2d_DeeSCCons[dee][167-1] =  98; // 30;
01662       fT2d_DeeSCCons[dee-1][168-1] = 246; fT2d_DeeSCCons[dee][168-1] =  97; // 29;
01663       fT2d_DeeSCCons[dee-1][169-1] = 238; fT2d_DeeSCCons[dee][169-1] =  89; // 23;
01664       fT2d_DeeSCCons[dee-1][170-1] = 230; fT2d_DeeSCCons[dee][170-1] =  81; // 16;
01665       fT2d_DeeSCCons[dee-1][171-1] = 222; fT2d_DeeSCCons[dee][171-1] =  73; //  8;
01666       fT2d_DeeSCCons[dee-1][172-1] = 214; fT2d_DeeSCCons[dee][172-1] =  65; //  1;
01667       
01668       fT2d_DeeSCCons[dee-1][188-1] = 298; fT2d_DeeSCCons[dee][188-1] = 149; // 24; //  298a ;  149a;
01669       fT2d_DeeSCCons[dee-1][189-1] = 239; fT2d_DeeSCCons[dee][189-1] =  90; // 24;
01670       fT2d_DeeSCCons[dee-1][190-1] = 231; fT2d_DeeSCCons[dee][190-1] =  82; // 17;
01671       fT2d_DeeSCCons[dee-1][191-1] = 223; fT2d_DeeSCCons[dee][191-1] =  74; //  9;
01672       fT2d_DeeSCCons[dee-1][192-1] = 215; fT2d_DeeSCCons[dee][192-1] =  66; //  2;
01673   
01674       //.......................................... (D1,S4 or D3,S6) AND  (D2,S6 or D4,S4)
01675       fT2d_DeeSCCons[dee-1][29-1] = 261; fT2d_DeeSCCons[dee][29-1] = 112; // 14-21;   // 261a-268a ; 112a-119a;
01676       fT2d_DeeSCCons[dee-1][27-1] = 283; fT2d_DeeSCCons[dee][27-1] = 134; // 33;
01677       fT2d_DeeSCCons[dee-1][28-1] = 282; fT2d_DeeSCCons[dee][28-1] = 133; // 32;
01678       
01679       fT2d_DeeSCCons[dee-1][44-1] = 269; fT2d_DeeSCCons[dee][44-1] = 120; // 22;
01680       fT2d_DeeSCCons[dee-1][45-1] = 262; fT2d_DeeSCCons[dee][45-1] = 113; // 15;
01681       fT2d_DeeSCCons[dee-1][46-1] = 255; fT2d_DeeSCCons[dee][46-1] = 106; //  8;
01682       fT2d_DeeSCCons[dee-1][47-1] = 248; fT2d_DeeSCCons[dee][47-1] =  99; //  4;
01683       fT2d_DeeSCCons[dee-1][48-1] = 240; fT2d_DeeSCCons[dee][48-1] =  91; //  2;
01684       fT2d_DeeSCCons[dee-1][49-1] = 232; fT2d_DeeSCCons[dee][49-1] =  83; //  1;
01685       
01686       fT2d_DeeSCCons[dee-1][62-1] = 276; fT2d_DeeSCCons[dee][62-1] = 127; // 29;
01687       fT2d_DeeSCCons[dee-1][63-1] = 275; fT2d_DeeSCCons[dee][63-1] = 126; // 28;
01688       fT2d_DeeSCCons[dee-1][64-1] = 270; fT2d_DeeSCCons[dee][64-1] = 121; // 23;
01689       fT2d_DeeSCCons[dee-1][65-1] = 263; fT2d_DeeSCCons[dee][65-1] = 114; // 16;
01690       fT2d_DeeSCCons[dee-1][66-1] = 256; fT2d_DeeSCCons[dee][66-1] = 107; //  9;
01691       fT2d_DeeSCCons[dee-1][67-1] = 249; fT2d_DeeSCCons[dee][67-1] = 100; //  5;
01692       fT2d_DeeSCCons[dee-1][68-1] = 241; fT2d_DeeSCCons[dee][68-1] =  92; //  3;
01693       
01694       fT2d_DeeSCCons[dee-1][82-1] = 278; fT2d_DeeSCCons[dee][82-1] = 129; // 31;
01695       fT2d_DeeSCCons[dee-1][83-1] = 277; fT2d_DeeSCCons[dee][83-1] = 128; // 30;
01696       fT2d_DeeSCCons[dee-1][84-1] = 271; fT2d_DeeSCCons[dee][84-1] = 122; // 24;
01697       fT2d_DeeSCCons[dee-1][85-1] = 264; fT2d_DeeSCCons[dee][85-1] = 115; // 17;
01698       fT2d_DeeSCCons[dee-1][86-1] = 257; fT2d_DeeSCCons[dee][86-1] = 108; // 10;
01699       fT2d_DeeSCCons[dee-1][87-1] = 250; fT2d_DeeSCCons[dee][87-1] = 101; //  6;
01700       
01701       fT2d_DeeSCCons[dee-1][102-1] = 268; fT2d_DeeSCCons[dee][102-1] = 119; // 21; //  268c ;  119c;
01702       fT2d_DeeSCCons[dee-1][103-1] = 274; fT2d_DeeSCCons[dee][103-1] = 125; // 27;
01703       fT2d_DeeSCCons[dee-1][104-1] = 272; fT2d_DeeSCCons[dee][104-1] = 123; // 25;
01704       fT2d_DeeSCCons[dee-1][105-1] = 265; fT2d_DeeSCCons[dee][105-1] = 116; // 18;
01705       fT2d_DeeSCCons[dee-1][106-1] = 258; fT2d_DeeSCCons[dee][106-1] = 109; // 11;
01706       fT2d_DeeSCCons[dee-1][107-1] = 251; fT2d_DeeSCCons[dee][107-1] = 102; //  7;
01707       
01708       fT2d_DeeSCCons[dee-1][123-1] = 268; fT2d_DeeSCCons[dee][123-1] = 119; // 27; //  268b ;  119b;
01709       fT2d_DeeSCCons[dee-1][124-1] = 273; fT2d_DeeSCCons[dee][124-1] = 124; // 26;
01710       fT2d_DeeSCCons[dee-1][125-1] = 266; fT2d_DeeSCCons[dee][125-1] = 117; // 19;
01711       fT2d_DeeSCCons[dee-1][126-1] = 259; fT2d_DeeSCCons[dee][126-1] = 110; // 12;
01712 
01713       fT2d_DeeSCCons[dee-1][144-1] = 261; fT2d_DeeSCCons[dee][144-1] = 112; // 27; //  261c ;  112c;      
01714       fT2d_DeeSCCons[dee-1][145-1] = 267; fT2d_DeeSCCons[dee][145-1] = 118; // 20;
01715       fT2d_DeeSCCons[dee-1][146-1] = 260; fT2d_DeeSCCons[dee][146-1] = 111; // 13;
01716 
01717       fT2d_DeeSCCons[dee-1][165-1] = 261; fT2d_DeeSCCons[dee][165-1] = 112; // 27; //  261b ;  112b;
01718       
01719       //.......................................... D1 or D3, right half of S5 
01720       fT2d_DeeSCCons[dee-1][1-1] = 297; // 34;
01721       fT2d_DeeSCCons[dee-1][2-1] = 296; // 33;
01722       fT2d_DeeSCCons[dee-1][3-1] = 295; // 32;
01723       fT2d_DeeSCCons[dee-1][4-1] = 294; // 31;
01724       fT2d_DeeSCCons[dee-1][5-1] = 289; // 26;
01725       fT2d_DeeSCCons[dee-1][6-1] = 288; // 25;
01726       fT2d_DeeSCCons[dee-1][7-1] = 287; // 24;
01727       fT2d_DeeSCCons[dee-1][8-1] = 286; // 23;
01728       
01729       fT2d_DeeSCCons[dee-1][21-1] = 293; // 30;
01730       fT2d_DeeSCCons[dee-1][22-1] = 292; // 29;
01731       fT2d_DeeSCCons[dee-1][23-1] = 291; // 28;
01732       fT2d_DeeSCCons[dee-1][24-1] = 290; // 27;
01733       fT2d_DeeSCCons[dee-1][25-1] = 285; // 22;
01734       fT2d_DeeSCCons[dee-1][26-1] = 284; // 21;
01735       
01736       fT2d_DeeSCCons[dee-1][41-1] = 281; // 20; //  281a
01737       fT2d_DeeSCCons[dee-1][42-1] = 280; // 19;
01738       fT2d_DeeSCCons[dee-1][43-1] = 279; // 18;
01739       
01740       //.......................................... D2 or D4, left half of S5
01741       fT2d_DeeSCCons[dee][1-1] = 148; // 17;
01742       fT2d_DeeSCCons[dee][2-1] = 147; // 16;
01743       fT2d_DeeSCCons[dee][3-1] = 146; // 15;
01744       fT2d_DeeSCCons[dee][4-1] = 145; // 14;
01745       fT2d_DeeSCCons[dee][5-1] = 140; //  9;
01746       fT2d_DeeSCCons[dee][6-1] = 139; //  8;
01747       fT2d_DeeSCCons[dee][7-1] = 138; //  7;
01748       fT2d_DeeSCCons[dee][8-1] = 137; //  6;
01749       
01750       fT2d_DeeSCCons[dee][21-1] = 144; // 13;
01751       fT2d_DeeSCCons[dee][22-1] = 143; // 12;
01752       fT2d_DeeSCCons[dee][23-1] = 142; // 11;
01753       fT2d_DeeSCCons[dee][24-1] = 141; // 10;
01754       fT2d_DeeSCCons[dee][25-1] = 136; //  5;
01755       fT2d_DeeSCCons[dee][26-1] = 135; //  4;
01756      
01757       fT2d_DeeSCCons[dee][41-1] = 132; // 3; //  132a
01758       fT2d_DeeSCCons[dee][42-1] = 131; // 2;
01759       fT2d_DeeSCCons[dee][43-1] = 130; // 1;
01760     }
01761 
01762   //........................ ECNA numbers from numbers for constructions: fT2d_RecovDeeSC[][]
01763 
01764   for(Int_t i0EEDee=0; i0EEDee<MaxEEDee; i0EEDee++)
01765     {
01766       for(Int_t i_ecna=0; i_ecna<MaxDeeSC; i_ecna++)
01767         {
01768           //....... test to avoid the -1 init value in 2nd index of array fT2d_RecovDeeSC[][]
01769           //        (part of the matrix without real SC counterpart)
01770           if( fT2d_DeeSCCons[i0EEDee][i_ecna] >= 0 && fT2d_DeeSCCons[i0EEDee][i_ecna] <= MaxEESCForCons )
01771             {
01772               fT2d_RecovDeeSC[i0EEDee][fT2d_DeeSCCons[i0EEDee][i_ecna]-1] = i_ecna+1;
01773             }
01774         }
01775     }
01776 }
01777 //------------ (end of BuildEndcapSCTable) -------------------------
01778 
01779 //===============================================================================
01780 //
01781 //        Get1DeeCrysFrom1DeeSCEcnaAnd0SCEcha
01782 //        GetDeeCrysFromDeeEcha
01783 //
01784 //===============================================================================
01785 Int_t TEcnaNumbering::Get1DeeCrysFrom1DeeSCEcnaAnd0SCEcha(const Int_t&  n1DeeSCEcna,
01786                                                           const Int_t&  i0SCEcha,
01787                                                           const TString sDeeDir)
01788 {
01789 //get crystal number in Dee from SC number in Dee
01790 // and from Electronic Channel number in super-crystal
01791 
01792   Int_t n1DeeCrys = 0;
01793   Int_t i0DeeDir = GetDeeDirIndex(sDeeDir);
01794 
01795   if( fT3dDeeCrys == 0 ){BuildEndcapCrysTable();}
01796 
01797   if( (n1DeeSCEcna >= 1) && (n1DeeSCEcna <= fEcal->MaxSCEcnaInDee()) )
01798     {
01799       if (i0SCEcha >=0 && i0SCEcha < fEcal->MaxCrysInSC())
01800         {
01801           n1DeeCrys = fT3dDeeCrys[n1DeeSCEcna-1][i0SCEcha][i0DeeDir];
01802         }
01803       else
01804         {
01805           n1DeeCrys = -2;   // Electronic Cnannel in Super-Crystal out of range
01806           cout << "!TEcnaNumbering::Get1DeeCrysFrom1DeeSCEcnaAnd0SCEcha(...)> Electronic Channel in SuperCrystal = "
01807                << i0SCEcha+1 << ". Out of range (range = [1," << fEcal->MaxCrysInSC() << "])" << fTTBELL << endl;
01808         }
01809     }
01810   else
01811     {
01812       n1DeeCrys = -3;   // Super-Crystal number in Dee out of range
01813       cout << "!TEcnaNumbering::Get1DeeCrysFrom1DeeSCEcnaAnd0SCEcha(...)> Super-Crystal number in Dee out of range."
01814            << " n1DeeSCEcna = " << n1DeeSCEcna << fTTBELL << endl;
01815     }
01816 
01817   return n1DeeCrys;  // Range = [1,5000]
01818 }
01819 
01820 //===============================================================================
01821 //
01822 //                Get1SCEchaFrom1DeeCrys, Get1DeeSCEcnaFrom1DeeCrys
01823 //
01824 //===============================================================================
01825 
01826 Int_t TEcnaNumbering::Get1SCEchaFrom1DeeCrys(const Int_t& n1DeeCrys, const TString sDeeDir)
01827 {
01828 // get Electronic Channel number in Super-Crystal from Crystal ECNA number in Dee
01829 
01830   Int_t n1SCEcha = -1;
01831   Int_t iDeeDir  = GetDeeDirIndex(sDeeDir);
01832 
01833   if( n1DeeCrys >= 1 && n1DeeCrys <= fEcal->MaxCrysEcnaInDee() )
01834     {
01835       n1SCEcha = fT2dSCEcha[n1DeeCrys-1][iDeeDir];
01836     }
01837   else
01838     {
01839       n1SCEcha = -2;
01840       cout << "!TEcnaNumbering::Get1SCEchaFrom1DeeCrys(...)> Crystal number in Dee out of range."
01841            << " n1DeeCrys = " << n1DeeCrys << "(max = " << fEcal->MaxCrysEcnaInDee() << ")" << fTTBELL << endl;
01842     }
01843   return n1SCEcha;   // range = [1,25]
01844 }
01845 
01846 Int_t TEcnaNumbering::Get1DeeSCEcnaFrom1DeeCrys(const Int_t& n1DeeCrys, const TString sDeeDir)
01847 {
01848 // get Super-Crystal number in Dee from Crystal number in Dee
01849 
01850   Int_t n1DeeSCEcna = 0;
01851   Int_t iDeeDir    = GetDeeDirIndex(sDeeDir);
01852   
01853   if( n1DeeCrys >= 1 && n1DeeCrys <= fEcal->MaxCrysEcnaInDee() )
01854     {
01855       n1DeeSCEcna = fT2dDeeSC[n1DeeCrys-1][iDeeDir];
01856     }
01857   else
01858     {
01859       n1DeeSCEcna = -1;
01860       cout << "!TEcnaNumbering::Get1DeeSCEcnaFrom1DeeCrys(...)> Crystal number in Dee out of range."
01861            << " n1DeeCrys = " << n1DeeCrys << "(max = " << fEcal->MaxCrysEcnaInDee() << ")" << fTTBELL << endl;
01862     }
01863   return n1DeeSCEcna;  // range = [1,200]
01864 }
01865 
01866 //===============================================================================
01867 //
01868 //          GetSCEchaFromDeeEcha
01869 //          Get1DeeSCEcnaFromDeeEcha
01870 //
01871 //===============================================================================
01872 
01873 Int_t TEcnaNumbering::Get1SCEchaFrom0DeeEcha(const Int_t& i0DeeEcha)
01874 {
01875 //get electronic channel number in super-crystal from electronic channel number in Dee
01876 
01877   Int_t i0DeeSC = i0DeeEcha/fEcal->MaxCrysInSC();
01878   Int_t n1SCEcha = i0DeeEcha - fEcal->MaxCrysInSC()*i0DeeSC + 1;
01879 
01880   return n1SCEcha;  //  range = [1,25]
01881 }
01882 
01883 Int_t TEcnaNumbering::Get1DeeSCEcnaFrom0DeeEcha(const Int_t& i0DeeEcha)
01884 {
01885 //get super-crystal number from electronic channel number in Dee
01886 
01887   Int_t n1DeeSC = i0DeeEcha/fEcal->MaxCrysInSC()+1;
01888 
01889   return n1DeeSC;  //  range = [1,200]
01890 }
01891 
01892 //--------------------------------------------------------------------------------
01893 //
01894 //       Correspondance (n1DeeNumber, DeeSC)  <->  (DS, DSSC, DeeSCCons)
01895 //
01896 //       GetDSFrom1DeeSCEcna,        GetDSSCFrom1DeeSCEcna,
01897 //       GetDeeSCConsFrom1DeeSCEcna, Get1DeeSCEcnaFromDeeSCCons
01898 //      
01899 //       Get the values from the relevant arrays
01900 //       with cross-check of the index values in argument
01901 //--------------------------------------------------------------------------------
01902 
01903 Int_t TEcnaNumbering::GetDSFrom1DeeSCEcna(const Int_t& n1DeeNumber, const Int_t& n1DeeSCEcna)
01904 {
01905 // Get Data Sector number from SC ECNA number in Dee 
01906 
01907   Int_t data_sector = -1;
01908 
01909   if( n1DeeNumber > 0 && n1DeeNumber <= fEcal->MaxDeeInEE() )
01910     {
01911       if( n1DeeSCEcna > 0  &&  n1DeeSCEcna <= fEcal->MaxSCEcnaInDee() )
01912         {
01913           data_sector = fT2d_DS[n1DeeNumber-1][n1DeeSCEcna-1];
01914         }
01915       else
01916         {
01917           cout << "!TEcnaNumbering::GetDSFrom1DeeSCEcna(...)> n1DeeSCEcna = " << n1DeeSCEcna
01918                << ". Out of range ( range = [1," << fEcal->MaxSCEcnaInDee() << "] )"
01919                << fTTBELL << endl;
01920         }
01921     }
01922   else
01923     {
01924       if( n1DeeNumber != 0 )
01925         {
01926           cout << "!TEcnaNumbering::GetDSFrom1DeeSCEcna(...)> n1DeeNumber = " << n1DeeNumber 
01927                << ". Out of range ( range = [1," << fEcal->MaxDeeInEE() << "] )"
01928                << fTTBELL << endl;
01929         }
01930       else
01931         {
01932           cout << "TEcnaNumbering::GetDSFrom1DeeSCEcna(...)> Dee = " << n1DeeNumber
01933                << ". Out of range (range = [1," << fEcal->MaxDeeInEE() << "])" 
01934                << fTTBELL << endl; 
01935         }
01936     }
01937   return data_sector;
01938 }
01939 //..........................................................................................
01940 Int_t TEcnaNumbering::GetDSSCFrom1DeeSCEcna(const Int_t& n1DeeNumber, const Int_t& n1DeeSCEcna,
01941                                             const Int_t& n1SCEcha)
01942 {
01943   //.......... Get the correct SC number for the unconnected SC's (inner border)
01944   Int_t ds_sc = GetDSSCFrom1DeeSCEcna(n1DeeNumber, n1DeeSCEcna);
01945 
01946   if( n1DeeSCEcna == 29 || n1DeeSCEcna == 32 )
01947     {
01948       if( n1SCEcha == 11 )
01949         {
01950           if( ds_sc == 14 ){ds_sc= 21;}  // 14 <=> 261/BR OR 112/BL
01951         }
01952       if( n1SCEcha == 1 || n1SCEcha == 2 || n1SCEcha == 3 ||
01953           n1SCEcha == 6 || n1SCEcha == 7 )
01954         {
01955           if( ds_sc ==  3 ){ds_sc = 25;}  // 3 <=> 178/TR OR 29/TL
01956         }
01957     }
01958   return ds_sc;
01959 }
01960 //..........................................................................................
01961 Int_t TEcnaNumbering::GetDSSCFrom1DeeSCEcna(const Int_t& n1DeeNumber, const Int_t& n1DeeSCEcna)
01962 {
01963 // Get SC number in Data Sector from SC Ecna number in Dee 
01964 
01965   Int_t ds_sc = -1;
01966 
01967   if( n1DeeNumber > 0 && n1DeeNumber <= fEcal->MaxDeeInEE() )
01968     {
01969       if( n1DeeSCEcna > 0  &&  n1DeeSCEcna <= fEcal->MaxSCEcnaInDee() )
01970         {
01971           ds_sc = fT2d_DSSC[n1DeeNumber-1][n1DeeSCEcna-1]; // 25 (not 3) or 14 (not 21) if n1DeeSCEcna = 32 or 29
01972                                                            // 25 and 14 => 5 Xtals,  3 and 21 => 1 Xtal
01973         }
01974       else
01975         {
01976           cout << "!TEcnaNumbering::GetDSSCFrom1DeeSCEcna(...)> n1DeeSCEcna = " << n1DeeSCEcna
01977                << ". Out of range ( range = [1," << fEcal->MaxSCEcnaInDee() << "] )"
01978                << fTTBELL << endl;
01979         }
01980     }
01981   else
01982     {
01983       if( n1DeeNumber != 0 )
01984         {
01985           cout << "!TEcnaNumbering::GetDSSCFrom1DeeSCEcna(...)> n1DeeNumber = " << n1DeeNumber 
01986                << ". Out of range ( range = [1," << fEcal->MaxDeeInEE() << "] )"
01987                << fTTBELL << endl;
01988         }
01989       else
01990         {
01991           cout << "TEcnaNumbering::GetDSSCFrom1DeeSCEcna(...)> Dee = " << n1DeeNumber
01992                << ". Out of range (range = [1," << fEcal->MaxDeeInEE() << "])" 
01993                << fTTBELL << endl;
01994         }
01995     }
01996   return ds_sc;
01997 }
01998 //..........................................................................................
01999 Int_t TEcnaNumbering::GetDeeSCConsFrom1DeeSCEcna(const Int_t& n1DeeNumber, const Int_t& n1DeeSCEcna)
02000 {
02001 // Get SC number for Construction in Dee from SC ECNA number in Dee
02002 
02003   Int_t dee_sc_cons = -1;
02004 
02005   if( n1DeeNumber > 0 && n1DeeNumber <= fEcal->MaxDeeInEE() )
02006     {
02007       if( n1DeeSCEcna > 0  &&  n1DeeSCEcna <= fEcal->MaxSCEcnaInDee() )
02008         {
02009           dee_sc_cons = fT2d_DeeSCCons[n1DeeNumber-1][n1DeeSCEcna-1];
02010         }
02011       else
02012         {
02013           cout << "!TEcnaNumbering::GetDeeSCConsFrom1DeeSCEcna(...)> *** WARNING *** n1DeeSCEcna = " << n1DeeSCEcna
02014                << ". Out of range ( range = [1," << fEcal->MaxSCEcnaInDee()
02015                << "] ). Nb for const. forced to " << fT2d_DeeSCCons[n1DeeNumber-1][19] << "." << endl;
02016           dee_sc_cons = fT2d_DeeSCCons[n1DeeNumber-1][19];
02017         }
02018     }
02019   else
02020     {
02021       if( n1DeeNumber != 0 )
02022         {
02023           cout << "!TEcnaNumbering::GetDeeSCConsFrom1DeeSCEcna(...)> n1DeeNumber = " << n1DeeNumber 
02024                << ". Out of range ( range = [1," << fEcal->MaxDeeInEE() << "] )"
02025                << fTTBELL << endl;
02026         }
02027       else
02028         {
02029           cout << "TEcnaNumbering::GetDeeSCConsFrom1DeeSCEcna(...)> Dee = " << n1DeeNumber
02030                << ". Out of range (range = [1," << fEcal->MaxDeeInEE() << "])" 
02031                << fTTBELL << endl;
02032         }
02033     }
02034   return dee_sc_cons;
02035 }
02036 //..........................................................................................
02037 Int_t TEcnaNumbering::GetDeeSCConsFrom1DeeSCEcna(const Int_t& n1DeeNumber, const Int_t& n1DeeSCEcna,
02038                                                  const Int_t& n1SCEcha)
02039 {
02040   //.......... Get the correct SC number (for cons) for the unconnected SC's (inner border)
02041   Int_t dee_sc_cons = GetDeeSCConsFrom1DeeSCEcna(n1DeeNumber, n1DeeSCEcna);
02042 
02043   if( n1DeeSCEcna == 29 || n1DeeSCEcna == 32 )
02044     {
02045       if( n1SCEcha == 11 )
02046         {
02047           if( dee_sc_cons == 261 ){dee_sc_cons = 268;}  // 261<=>14/BR
02048           if( dee_sc_cons == 112 ){dee_sc_cons = 119;}  // 112<=>14/BL
02049         }
02050       if( n1SCEcha == 1 ||  n1SCEcha == 2 || n1SCEcha == 3 ||
02051           n1SCEcha == 6 ||  n1SCEcha == 7 )
02052         {
02053           if( dee_sc_cons == 178 ){dee_sc_cons = 207;}  // 178<=>3/TR
02054           if( dee_sc_cons ==  29 ){dee_sc_cons =  58;}  //  29<=>3/TL
02055         }
02056     }
02057   return dee_sc_cons;
02058 }
02059 //..........................................................................................
02060 Int_t TEcnaNumbering::Get1DeeSCEcnaFromDeeSCCons(const Int_t& n1DeeNumber, const Int_t& DeeSCCons)
02061 {
02062 // Get SC Ecna number in Dee from SC number for Construction in Dee
02063  
02064   Int_t dee_sc_ecna = -1;
02065 
02066   if( n1DeeNumber > 0 && n1DeeNumber <= fEcal->MaxDeeInEE() )
02067     {
02068       Int_t off_set_cons = 0;
02069       if( n1DeeNumber == 1 || n1DeeNumber == 3 ){off_set_cons = fEcal->MaxSCForConsInDee();}
02070       
02071       if( DeeSCCons > off_set_cons  &&  DeeSCCons <= fEcal->MaxSCForConsInDee()+off_set_cons )
02072         {
02073           dee_sc_ecna = fT2d_RecovDeeSC[n1DeeNumber-1][DeeSCCons-1];
02074         }
02075       else
02076         {
02077           cout << "!TEcnaNumbering::Get1DeeSCEcnaFromDeeSCCons(...)> DeeSCCons = " << DeeSCCons
02078                << ". Out of range ( range = [ " << off_set_cons+1
02079                << "," << fEcal->MaxSCForConsInDee()+off_set_cons << "] )"
02080                << fTTBELL << endl;
02081         }
02082     }
02083   else
02084     {
02085       if( n1DeeNumber != 0 )
02086         {
02087           cout << "!TEcnaNumbering::Get1DeeSCEcnaFromDeeSCCons(...)> n1DeeNumber = " << n1DeeNumber 
02088                << ". Out of range ( range = [1," << fEcal->MaxDeeInEE() << "] )"
02089                << fTTBELL << endl;
02090         }
02091       else
02092         {
02093           cout << "TEcnaNumbering::Get1DeeSCEcnaFromDeeSCCons(...)> Dee = " << n1DeeNumber
02094                << ". Out of range (range = [1," << fEcal->MaxDeeInEE() << "])" 
02095                << fTTBELL << endl;
02096         }
02097     }
02098   return dee_sc_ecna;
02099 }
02100 
02101 TString TEcnaNumbering::GetSCType(const Int_t& nb_for_cons)
02102 {
02103 // gives the special not connected SC's
02104 
02105   TString SCType = "Connected";   // => default type
02106 
02107   if( nb_for_cons == 182 || nb_for_cons ==  33 ){SCType = "NotConnected";}  // (D1,S1) (D3,S9) || (D2,S9) (D4,S1)
02108 
02109   if( nb_for_cons == 178 || nb_for_cons ==  29 ){SCType = "NotConnected";}  // (D1,S2) (D3,S8) || (D2,S8) (D4,S2)
02110   if( nb_for_cons == 207 || nb_for_cons ==  58 ){SCType = "NotConnected";}
02111 
02112   if( nb_for_cons == 298 || nb_for_cons == 149 ){SCType = "NotConnected";}  // (D1,S3) (D3,S7) || (D2,S7) (D4,S3)
02113 
02114   if( nb_for_cons == 261 || nb_for_cons == 112 ){SCType = "NotConnected";}  // (D1,S4) (D3,S6) || (D2,S6) (D4,S4)
02115   if( nb_for_cons == 268 || nb_for_cons == 119 ){SCType = "NotConnected";}
02116 
02117   if( nb_for_cons == 281 || nb_for_cons == 132 ){SCType = "NotConnected";}  // (D1,S5) (D3,S5) || (D2,S5) (D4,S5)
02118 
02119   if( nb_for_cons == 161 || nb_for_cons ==  12 ){SCType = "NotComplete";}   // (D1,S1) (D3,S9) || (D2,S9) (D4,S1)
02120   if( nb_for_cons == 216 || nb_for_cons ==  67 ){SCType = "NotComplete";}   // (D1,S2) (D3,S8) || (D2,S8) (D4,S2)
02121   if( nb_for_cons == 224 || nb_for_cons ==  75 ){SCType = "NotComplete";}   // (D1,S3) (D3,S7) || (D2,S7) (D4,S3)
02122   if( nb_for_cons == 286 || nb_for_cons == 137 ){SCType = "NotComplete";}   // (D1,S5) (D3,S5) || (D2,S5) (D4,S5)
02123 
02124   return SCType;
02125 }
02126 
02127 Int_t TEcnaNumbering::StexEchaForCons(const Int_t& n1DeeNumber, const Int_t& i0StexEcha)
02128 {
02129   Int_t n1StexStin = Get1StexStinFrom0StexEcha(i0StexEcha);
02130   return fT2d_DeeSCCons[n1DeeNumber-1][n1StexStin-1];
02131 }
02132   // return -1 if the SC does not correspond to a real SC; return the number for construction otherwise
02133 
02134 //===========================================================================
02135 //
02136 //                        GetSCQuadFrom1DeeSCEcna
02137 //
02138 //===========================================================================  
02139 
02140 TString  TEcnaNumbering::GetSCQuadFrom1DeeSCEcna(const Int_t& n1DeeSCEcna)
02141 {
02142 //gives the quadrant type ("top" or "bottom") from the SC number in Dee
02143 
02144   TString SCQuad = "top";   // => default value
02145 
02146   if (n1DeeSCEcna >=   1 && n1DeeSCEcna <=  10){SCQuad = "bottom";}
02147   if (n1DeeSCEcna >=  21 && n1DeeSCEcna <=  30){SCQuad = "bottom";}
02148   if (n1DeeSCEcna >=  41 && n1DeeSCEcna <=  50){SCQuad = "bottom";}
02149   if (n1DeeSCEcna >=  61 && n1DeeSCEcna <=  70){SCQuad = "bottom";}
02150   if (n1DeeSCEcna >=  81 && n1DeeSCEcna <=  90){SCQuad = "bottom";}
02151   if (n1DeeSCEcna >= 101 && n1DeeSCEcna <= 110){SCQuad = "bottom";}
02152   if (n1DeeSCEcna >= 121 && n1DeeSCEcna <= 130){SCQuad = "bottom";}
02153   if (n1DeeSCEcna >= 141 && n1DeeSCEcna <= 150){SCQuad = "bottom";}
02154   if (n1DeeSCEcna >= 161 && n1DeeSCEcna <= 170){SCQuad = "bottom";}
02155   if (n1DeeSCEcna >= 181 && n1DeeSCEcna <= 190){SCQuad = "bottom";}
02156 
02157   return SCQuad;
02158 }
02159 Int_t TEcnaNumbering::GetSCQuadTypeIndex(const TString SCQuadType, const TString sDeeDir)
02160 {
02161 //gives the index of the SC quadrant type (top/right, top/left, bottom/left, bottom/right)
02162 // = quadrant number - 1
02163 
02164   Int_t itype = 0;   // => default
02165   if ( SCQuadType == "top"    && sDeeDir == "right" ){itype = 0;}
02166   if ( SCQuadType == "top"    && sDeeDir == "left"  ){itype = 1;}
02167   if ( SCQuadType == "bottom" && sDeeDir == "left"  ){itype = 2;}
02168   if ( SCQuadType == "bottom" && sDeeDir == "right" ){itype = 3;}
02169   return itype;
02170 }
02171 //===========================================================================
02172 //
02173 //                    GetEEDeeType, GetDeeDirViewedFromIP
02174 //
02175 //===========================================================================  
02176 TString TEcnaNumbering::GetEEDeeEndcap(const Int_t& n1DeeNumber)
02177 {
02178 //gives the Endcap (EE+ or EE-) of the Dee (H. Heath, CMS NOTE 2006/027)
02179 
02180   TString eetype = "EE+";   // => default
02181   if ( n1DeeNumber == 1 || n1DeeNumber == 2 ){eetype = "EE+";}
02182   if ( n1DeeNumber == 3 || n1DeeNumber == 4 ){eetype = "EE-";}
02183   return eetype;
02184 }
02185 TString TEcnaNumbering::GetEEDeeType(const Int_t& n1DeeNumber)
02186 {
02187 //gives the EE +/- and Forward/Near of the Dee (H. Heath, CMS NOTE 2006/027)
02188 
02189   TString type = "EE+F";   // => default
02190   if ( n1DeeNumber == 1 ){type = "EE+F";}
02191   if ( n1DeeNumber == 2 ){type = "EE+N";}
02192   if ( n1DeeNumber == 3 ){type = "EE-N";}
02193   if ( n1DeeNumber == 4 ){type = "EE-F";}
02194   return type;
02195 }
02196 
02197 TString TEcnaNumbering::GetDeeDirViewedFromIP(const Int_t& n1DeeNumber)
02198 {
02199 //gives the direction (left/right) of the IX axis of the Dee
02200 // looking from the interaction point
02201 
02202   TString sDeeDir = "right";   // => default
02203   if ( (n1DeeNumber == 1) || (n1DeeNumber == 3) ){sDeeDir = "right";}
02204   if ( (n1DeeNumber == 2) || (n1DeeNumber == 4) ){sDeeDir = "left" ;}
02205   return sDeeDir;
02206 }
02207 Int_t TEcnaNumbering::GetDeeDirIndex(const TString sDeeDir)
02208 {
02209 //gives the index of the direction (left,right) of the IX axis of the Dee
02210 // looking from the interaction point (right = 0, left = 1)
02211 
02212   Int_t iDeeDir = 0;   // => default
02213   if ( sDeeDir == "right" ){iDeeDir = 0;}
02214   if ( sDeeDir == "left"  ){iDeeDir = 1;}
02215   return iDeeDir;
02216 }
02217 
02218 //==============================================================================
02219 //
02220 //    GetIXCrysInSC,  GetJYCrysInSC
02221 //    GetIXSCInDee,   GetJYSCInDee
02222 //    GetIXCrysInDee, GetJYCrysInDConsFrom1DeeSCEcna(fStexNumber, StexStinEcna);
02223 //
02224 //==============================================================================
02225 Int_t TEcnaNumbering::GetIXCrysInSC(const Int_t& n1DeeNumber, const Int_t& DeeSC,
02226                                     const Int_t& i0SCEcha)
02227 {
02228 //Gives Crys IX in SC for a given (n1DeeNumber, DeeSC, i0SCEcha)
02229   
02230   TString SCQuadType = GetSCQuadFrom1DeeSCEcna(DeeSC);
02231   TString sDeeDir    = GetDeeDirViewedFromIP(n1DeeNumber);
02232   Int_t type_index   = GetSCQuadTypeIndex(SCQuadType, sDeeDir);
02233   Int_t IXCrysInSC   = fT2d_ich_IX[type_index][i0SCEcha+1] + 1;
02234   return IXCrysInSC;   // possible values: 1,2,3,4,5
02235 }
02236 
02237 Int_t TEcnaNumbering::GetIXSCInDee(const Int_t& DeeSC)
02238 {
02239 //Gives SC IX in Dee for a given (DeeSC)
02240   
02241   Int_t IXSCInDee = (DeeSC-1)/fEcal->MaxSCIYInDee() + 1;
02242   return IXSCInDee;  //  possible values: 1,2,...,9,10
02243 }
02244 
02245 Int_t TEcnaNumbering::GetIXCrysInDee(const Int_t& n1DeeNumber, const Int_t& DeeSC,
02246                                      const Int_t& i0SCEcha)
02247 {
02248 //Gives Crys IX in Dee for a given (n1DeeNumber, DeeSC, i0SCEcha)
02249 
02250   Int_t IXCrysInDee =
02251     (GetIXSCInDee(DeeSC)-1)*fEcal->MaxCrysIXInSC() +
02252     GetIXCrysInSC(n1DeeNumber, DeeSC, i0SCEcha);
02253   return IXCrysInDee;  // possible values: 1,2,...,49,50
02254 }
02255 //---------------------------------------------------------------------------------
02256 Int_t TEcnaNumbering::GetJYCrysInSC(const Int_t& n1DeeNumber, const Int_t& DeeSC,
02257                                     const Int_t& i0SCEcha)
02258 {
02259 //Gives Crys JY in SC  for a given (n1DeeNumber, DeeSC, i0SCEcha)
02260 
02261   TString SCQuadType = GetSCQuadFrom1DeeSCEcna(DeeSC);
02262   TString sDeeDir    = GetDeeDirViewedFromIP(n1DeeNumber);
02263   Int_t type_index   = GetSCQuadTypeIndex(SCQuadType, sDeeDir);
02264   Int_t JYCrysInSC   = fT2d_jch_JY[type_index][i0SCEcha+1] + 1;
02265   return JYCrysInSC;   // possible values: 1,2,3,4,5
02266 }
02267 
02268 Int_t TEcnaNumbering::GetJYSCInDee(const Int_t& DeeSC)
02269 {
02270 //Gives SC JY in Dee for a given (n1DeeNumber, DeeSC, i0SCEcha)
02271   
02272   Int_t JYSCInDee = (DeeSC-1)%fEcal->MaxSCIYInDee() + 1;
02273   return JYSCInDee;  //  possible values: 1,2,...,19,20
02274 }
02275 
02276 Int_t TEcnaNumbering::GetJYCrysInDee(const Int_t& n1DeeNumber, const Int_t& DeeSC,
02277                                      const Int_t& i0SCEcha)
02278 {
02279 //Gives Crys JY in Dee for a given (n1DeeNumber, DeeSC, i0SCEcha)
02280 
02281   Int_t JYCrysInDee =
02282     (GetJYSCInDee(DeeSC)-1)*fEcal->MaxCrysIYInSC() +
02283     GetJYCrysInSC(n1DeeNumber, DeeSC, i0SCEcha);
02284   return JYCrysInDee;  // possible values: 1,2,...,99,100 
02285 }
02286 //---------------------------------------------------------------------------------
02287 Int_t TEcnaNumbering::GetMaxSCInDS(const Int_t& DeeDS)
02288 {
02289 // Gives the number of SC's in Data Sector DeeDS
02290 
02291   Int_t nb_of_sc = -1;
02292   if( DeeDS == 1 || DeeDS == 9 ){nb_of_sc = 33;}
02293   if( DeeDS == 2 || DeeDS == 8 ){nb_of_sc = 32;}
02294   if( DeeDS == 3 || DeeDS == 7 ){nb_of_sc = 34;}
02295   if( DeeDS == 4 || DeeDS == 6 ){nb_of_sc = 33;}
02296   if( DeeDS == 5){nb_of_sc = 34;}
02297   return nb_of_sc;
02298 }
02299 
02300 
02301 //==============================================================================
02302 //
02303 //       GetIXMin, GetIXMax,  GetIIXMin, GetIIXMax
02304 //
02305 //==============================================================================
02306 Double_t TEcnaNumbering::GetIIXMin(const Int_t& DeeSC)
02307 {
02308 //Gives IIXMin for a given DeeSC , unit = crystal
02309 
02310   Double_t IX_min   = (Double_t)((DeeSC-1)/fEcal->MaxSCIYInDee())*fEcal->MaxCrysIXInSC() + 1.;
02311   return IX_min;
02312 }
02313 
02314 Double_t TEcnaNumbering::GetIIXMax(const Int_t& DeeSC)
02315 {
02316 //Gives IIXMax for a given DeeSC , unit = crystal
02317 
02318   Double_t IX_max  = ((Double_t)((DeeSC-1)/fEcal->MaxSCIYInDee())+1.)*fEcal->MaxCrysIXInSC();
02319   return IX_max;
02320 }
02321 
02322 Double_t TEcnaNumbering::GetIIXMin()
02323 {
02324 //Gives IIXMin for Dee , unit = Super-crystal
02325 
02326   Double_t i_IX_min = (Int_t)1.;
02327   return i_IX_min;
02328 }
02329 
02330 Double_t TEcnaNumbering::GetIIXMax()
02331 {
02332 //Gives IIXMax for Dee , unit = Super-crystal
02333 
02334   Double_t i_IX_max = (Int_t)fEcal->MaxSCIXInDee(); 
02335   return i_IX_max;
02336 }
02337 
02338 //==============================================================================
02339 //
02340 //     GetIIYMin, GetIIYMax
02341 //
02342 //==============================================================================
02343 Double_t TEcnaNumbering::GetJIYMin(const Int_t& n1DeeNumber, const Int_t& DeeSC)
02344 {
02345 //Gives JIYMin for a given Super-Crystal
02346 
02347   Double_t IY_DeeSC = DeeSC%fEcal->MaxSCIYInDee();
02348   if( IY_DeeSC == 0. ){IY_DeeSC = fEcal->MaxSCIYInDee();}
02349 
02350   Double_t j_IY_min = (IY_DeeSC-1)*fEcal->MaxCrysIYInSC() + 1.;
02351  
02352   return j_IY_min;
02353 }
02354 //-----------------------------------------------------------------------------------------
02355 Double_t TEcnaNumbering::GetJIYMax(const Int_t& n1DeeNumber, const Int_t& DeeSC)
02356 {
02357 //Gives JIYMax for a given Super-Crystal
02358 
02359   Double_t IY_DeeSC = DeeSC%fEcal->MaxSCIYInDee();
02360   if( IY_DeeSC == 0  ){IY_DeeSC = fEcal->MaxSCIYInDee();}
02361 
02362   Double_t j_IY_max = IY_DeeSC*fEcal->MaxCrysIYInSC();
02363 
02364   return j_IY_max;
02365 }
02366 
02367 //-----------------------------------------------------------------------------------------
02368 Double_t TEcnaNumbering::GetJIYMin(const Int_t& n1DeeNumber)
02369 {
02370 //Gives JIYMin for a given Dee
02371 
02372   Double_t j_IY_min = (Double_t)1.;
02373 
02374   return j_IY_min;
02375 }
02376 //-----------------------------------------------------------------------------------------
02377 Double_t TEcnaNumbering::GetJIYMax(const Int_t& n1DeeNumber)
02378 {
02379 //Gives JIYMax for a given Dee
02380 
02381   Double_t j_IY_max = (Double_t)fEcal->MaxSCIYInDee();
02382 
02383   return j_IY_max;
02384 }
02385 //=====================================================================
02386 TString  TEcnaNumbering::GetDeeHalfEndcap(const Int_t& n1DeeNumber)
02387 {
02388 //gives the half-endcap of the Dee ("EE+" or "EE-")
02389 
02390   TString type = "EE-";   // => default value
02391 
02392   if ( n1DeeNumber == 1 || n1DeeNumber == 2 ){type = "EE+";}
02393   if ( n1DeeNumber == 3 || n1DeeNumber == 4 ){type = "EE-";}
02394 
02395   return type;
02396 }
02397 //==============================================================================
02398 //
02399 //   GetXDirectionEE, GetYDirectionEE, GetJYDirectionEE
02400 //
02401 //==============================================================================
02402 TString TEcnaNumbering::GetXDirectionEE(const Int_t& n1DeeNumber)
02403 {
02404   TString xdirection = "x";      // DEFAULT
02405 
02406   if( GetEEDeeType(n1DeeNumber) == "EE+F" ){xdirection = "-x";}   //  Dee 1
02407   if( GetEEDeeType(n1DeeNumber) == "EE+N" ){xdirection = "-x";}   //  Dee 2
02408   if( GetEEDeeType(n1DeeNumber) == "EE-N" ){xdirection = "x";}    //  Dee 3
02409   if( GetEEDeeType(n1DeeNumber) == "EE-F" ){xdirection = "x";}    //  Dee 4
02410 
02411   return xdirection;
02412 }
02413 //---------------------------------------------------------
02414 TString TEcnaNumbering::GetYDirectionEE(const Int_t& n1DeeNumber)
02415 {
02416   TString ydirection = "-x";      // DEFAULT
02417 
02418   if( GetEEDeeType(n1DeeNumber) == "endcap+" ){ydirection = "-x";}
02419   if( GetEEDeeType(n1DeeNumber) == "endcap-" ){ydirection = "-x";}
02420 
02421   return ydirection;
02422 }
02423 
02424 //---------------------------------------------------------
02425 TString TEcnaNumbering::GetJYDirectionEE(const Int_t& n1DeeNumber)
02426 {
02427   TString jydirection = "x";      // ALWAYS IN THIS CASE
02428   return jydirection;
02429 }
02430 
02431 //==========================================================================================================
02432 //
02433 //
02434 //                               B A R R E L    A N D    E N D C A P 
02435 //
02436 //
02437 //
02438 //==========================================================================================================
02439 //===============================================================================
02440 //
02441 //        Get1StexStinFrom0StexEcha
02442 //     // GetStinEchaFromStexEcha
02443 //        Get0StexEchaFrom1StexStinAnd0StinEcha
02444 //        Get1StexCrysFrom1StexStinAnd0StinEcha
02445 //
02446 //===============================================================================
02447 Int_t TEcnaNumbering::Get1StexStinFrom0StexEcha(const Int_t& i0StexEcha)
02448 {
02449   Int_t n1StexStin = 0;
02450 
02451   if( fFlagSubDet == "EB" ){n1StexStin = Get1SMTowFrom0SMEcha(i0StexEcha);}
02452   if( fFlagSubDet == "EE" ){n1StexStin = Get1DeeSCEcnaFrom0DeeEcha(i0StexEcha);}
02453 
02454   return n1StexStin;
02455 }
02456 
02457 Int_t TEcnaNumbering::Get0StexEchaFrom1StexStinAnd0StinEcha(const Int_t& n1StexStin,
02458                                                             const Int_t& i0StinEcha)
02459 {
02460 // Electronic Channel number in Stex from Stin number in Stex
02461 // and from Electronic Channel number in Stin
02462 
02463   Int_t StexEcha = (Int_t)(-1.);
02464                     
02465   if ( n1StexStin >  0 && n1StexStin <= fEcal->MaxStinEcnaInStex() &&
02466        i0StinEcha >= 0 && i0StinEcha < fEcal->MaxCrysInStin()  )
02467     {StexEcha = (n1StexStin-1)*fEcal->MaxCrysInStin() + i0StinEcha;}
02468   else
02469     {
02470       cout << "!TEcnaNumbering::Get0StexEchaFrom1StexStinAnd0StinEcha *** ERROR ***> VALUE"
02471            << " OUT OF RANGE. Forced to -1. Argument values: n1StexStin = " << n1StexStin
02472            << ", channel = " << i0StinEcha
02473            << fTTBELL << endl;
02474     }
02475   return StexEcha;
02476 }
02477 Int_t TEcnaNumbering::Get1StexCrysFrom1StexStinAnd0StinEcha(const Int_t& n1StexStin,
02478                                                             const Int_t& i0StinEcha, const Int_t& StexNumber)
02479 {
02480 // Crystal number in Stex from Stin number in Stex
02481 // and from Electronic Channel number in Stin (for the StexNumber_th Stex)
02482 // argument StexNumber used only in "EE" case
02483 
02484   Int_t n1StexCrys = (Int_t)0;
02485   if( fFlagSubDet ==  "EB" ){n1StexCrys = Get1SMCrysFrom1SMTowAnd0TowEcha(n1StexStin, i0StinEcha);}
02486   if( fFlagSubDet ==  "EE" ){TString sDeeDir = GetDeeDirViewedFromIP(StexNumber);
02487   n1StexCrys = Get1DeeCrysFrom1DeeSCEcnaAnd0SCEcha(n1StexStin, i0StinEcha, sDeeDir);}
02488   
02489   return n1StexCrys;
02490 }
02491 //===============================================================================
02492 //
02493 //        GetIHocoMin, GetIHocoMax, GetVecoMin, GetVecoMax
02494 //        GetJVecoMin, GetJVecoMax
02495 //
02496 //===============================================================================
02497 Double_t TEcnaNumbering::GetIHocoMin(const Int_t& Stex, const Int_t& StexStin)
02498 {
02499   Double_t IHocoMin = (Double_t)0.;
02500   if(fFlagSubDet == "EB" ){IHocoMin = GetIEtaMin(Stex, StexStin);}
02501   if(fFlagSubDet == "EE" ){IHocoMin = GetIIXMin(StexStin);}
02502   return IHocoMin;
02503 }
02504 
02505 Double_t TEcnaNumbering::GetIHocoMax(const Int_t& Stex, const Int_t& StexStin)
02506 {
02507   Double_t IHocoMax = (Double_t)0.;
02508   if(fFlagSubDet == "EB" ){IHocoMax = GetIEtaMax(Stex, StexStin);}
02509   if(fFlagSubDet == "EE" ){IHocoMax = GetIIXMax(StexStin);}
02510   return IHocoMax;
02511 }
02512 
02513 Double_t TEcnaNumbering::GetVecoMin(const Int_t& Stex, const Int_t& StexStin)
02514 {
02515   Double_t IVecoMin = (Double_t)0.;
02516   if(fFlagSubDet == "EB" ){IVecoMin = GetPhiMin(Stex, StexStin);}
02517   if(fFlagSubDet == "EE" ){IVecoMin = GetJIYMin(Stex, StexStin);}
02518   return IVecoMin;
02519 }
02520 
02521 Double_t TEcnaNumbering::GetVecoMax(const Int_t& Stex, const Int_t& StexStin)
02522 {
02523   Double_t IVecoMax = (Double_t)0.;
02524   if(fFlagSubDet == "EB" ){IVecoMax = GetPhiMax(Stex, StexStin);}
02525   if(fFlagSubDet == "EE" ){IVecoMax = GetJIYMax(Stex, StexStin);}
02526   return IVecoMax;
02527 }
02528 
02529 Double_t TEcnaNumbering::GetJVecoMin(const Int_t& Stex, const Int_t& StexStin)
02530 {
02531   Double_t JVecoMin = (Double_t)0.;
02532   if(fFlagSubDet == "EB" ){JVecoMin = GetJPhiMin(Stex, StexStin);}
02533   if(fFlagSubDet == "EE" ){JVecoMin = GetJIYMin(Stex, StexStin);}   // not used
02534   return JVecoMin;
02535 }
02536 Double_t TEcnaNumbering::GetJVecoMax(const Int_t& Stex, const Int_t& StexStin)
02537 {
02538   Double_t JVecoMax = (Double_t)0.;
02539   if(fFlagSubDet == "EB" ){JVecoMax = GetJPhiMax(Stex, StexStin);}
02540   if(fFlagSubDet == "EE" ){JVecoMax = GetJIYMax(Stex, StexStin);}   // not used
02541   return JVecoMax;
02542 }
02543 //===========================================================================
02544 //
02545 //                        GetStexHalfBarrel   
02546 //
02547 //===========================================================================  
02548 TString  TEcnaNumbering::GetStexHalfStas(const Int_t& SMNumber)
02549 {
02550   TString half_stas = "EB? EE?";
02551 
02552   if( fFlagSubDet == "EB" ){half_stas = GetSMHalfBarrel(SMNumber);}
02553   if( fFlagSubDet == "EE" ){half_stas = GetDeeHalfEndcap(SMNumber);}
02554 
02555   return half_stas;
02556 }
02557 //===========================================================================
02558 //
02559 //                  GetSMFromFED, GetDSFromFED
02560 //
02561 //=========================================================================== 
02562 Int_t TEcnaNumbering::GetSMFromFED(const Int_t& FEDNumber)
02563 {
02564   Int_t EBSMNumber = 0;    // SM = Super Module
02565   if( FEDNumber >= 610 && FEDNumber <= 645 ){EBSMNumber = FEDNumber - 609;}
02566   return EBSMNumber;
02567 }
02568 
02569 Int_t TEcnaNumbering::GetDSFromFED(const Int_t& FEDNumber)
02570 {
02571   Int_t EEDSNumber = 0;    // DS = Data Sector
02572 
02573   if( FEDNumber >= 600 && FEDNumber <= 609 ){EEDSNumber = FEDNumber - 599;} 
02574   if( FEDNumber >= 646 && FEDNumber <= 655 ){EEDSNumber = FEDNumber - 645;} 
02575 
02576   return EEDSNumber;
02577 }
02578 
02579 //--------------------------------------------
02580 Int_t TEcnaNumbering::MaxCrysInStinEcna(const Int_t& n1DeeNumber, const Int_t& n1DeeSCEcna, const TString s_option)
02581 {
02582 // Number of Xtals in "Ecna SC" for not complete and not connected SC's.
02583 // Also valid for all connected and complete SC's and for towers of EB
02584 
02585   Int_t max_crys = fEcal->MaxCrysInStin();   // valid for EB and for connected and complete SC's of EE
02586 
02587   // Number of Xtals in SC for not complete and not connected SC's
02588 
02589   if(fFlagSubDet == "EE")
02590     {
02591       Int_t n_for_cons = GetDeeSCConsFrom1DeeSCEcna(n1DeeNumber, n1DeeSCEcna);
02592 
02593       //............ not complete SC's (inner border)
02594       if( n_for_cons ==  12 || n_for_cons ==  67 || n_for_cons ==  75 || n_for_cons == 137 ||
02595           n_for_cons == 161 || n_for_cons == 216 || n_for_cons == 224 || n_for_cons == 286 ){max_crys = 20;}
02596 
02597       //............ not connected SC's
02598       if( (n_for_cons == 182 || n_for_cons ==  33) && (n1DeeSCEcna ==  60 || n1DeeSCEcna == 119) ){max_crys = 10;}
02599 
02600       if( (n_for_cons == 178 || n_for_cons ==  29) && (n1DeeSCEcna == 138 || n1DeeSCEcna == 157) ){max_crys = 10;}
02601       if( (n_for_cons == 207 || n_for_cons ==  58) && (n1DeeSCEcna == 176 || n1DeeSCEcna == 193) ){max_crys = 10;}
02602 
02603       if( (n_for_cons == 298 || n_for_cons == 149) && (n1DeeSCEcna == 188) ){max_crys = 10;}
02604 
02605       if( (n_for_cons == 261 || n_for_cons == 112) && (n1DeeSCEcna == 144 || n1DeeSCEcna == 165) ){max_crys = 10;}
02606       if( (n_for_cons == 268 || n_for_cons == 119) && (n1DeeSCEcna == 102 || n1DeeSCEcna == 123) ){max_crys = 10;}
02607 
02608       if( (n_for_cons == 281 || n_for_cons == 132) && (n1DeeSCEcna ==  41) ){max_crys = 10;}
02609 
02610       //............. not connected and mixed Ecna SC's
02611       if( s_option == "TEcnaRun" || s_option == "TEcnaRead" )
02612         {
02613           if( s_option == "TEcnaRun" )
02614             {
02615               // special translation of Xtal 11 of SCEcna 29 and 32 to respectively Xtal 11 of SCEcna 10 and 11
02616               if( n1DeeSCEcna == 29 || n1DeeSCEcna == 32 ){max_crys = 5;} 
02617               if( n1DeeSCEcna == 10 || n1DeeSCEcna == 11 ){max_crys = 1;}
02618             }
02619           if( s_option == "TEcnaRead" )
02620             {
02621               //if( n1DeeSCEcna == 29 || n1DeeSCEcna == 32 ){max_crys = 6;}
02622               if( n1DeeSCEcna == 29 || n1DeeSCEcna == 32 ){max_crys = 5;}
02623               if( n1DeeSCEcna == 10 || n1DeeSCEcna == 11 ){max_crys = 1;}
02624             }
02625         }
02626       else
02627         {
02628           cout << "!TEcnaNumbering::MaxCrysInStinEcna(...)> " << s_option
02629                << ": unknown option." << fTTBELL << endl;
02630         }
02631     }
02632   return max_crys;
02633 }