CMS 3D CMS Logo

CMSSW_4_4_3_patch1/src/L1Trigger/DTUtilities/src/DTTrigGeom.cc

Go to the documentation of this file.
00001 //-------------------------------------------------
00002 //
00003 //   Class: DTTrigGeom
00004 //
00005 //   Description: Muon Barrel Trigger Geometry
00006 //
00007 //
00008 //   Author List:
00009 //   C. Grandi
00010 //   Modifications: 
00011 //   S. Vanini : NEWGEO implementation
00012 //   S. Vanini 090902 : dumpLUT method implemented
00013 //--------------------------------------------------
00014 
00015 //-----------------------
00016 // This Class's Header --
00017 //-----------------------
00018 #include "L1Trigger/DTUtilities/interface/DTTrigGeom.h"
00019 
00020 //-------------
00021 // C Headers --
00022 //-------------
00023 
00024 //---------------
00025 // C++ Headers --
00026 //---------------
00027 #include <iostream>
00028 #include <iomanip>
00029 #include <fstream>
00030 #include <sstream>
00031 #include <cstring>
00032 
00033 //-------------------------------
00034 // Collaborating Class Headers --
00035 //-------------------------------
00036 #include "Geometry/DTGeometry/interface/DTTopology.h"
00037 #include "Geometry/DTGeometry/interface/DTLayer.h"
00038 #include "Geometry/DTGeometry/interface/DTSuperLayer.h"
00039 #include "Geometry/DTGeometry/interface/DTChamber.h"
00040 #include "DataFormats/GeometryVector/interface/GlobalPoint.h"
00041 #include "DataFormats/GeometryVector/interface/GlobalVector.h"
00042 #include "DataFormats/GeometryVector/interface/LocalPoint.h"
00043 #include "DataFormats/GeometryVector/interface/LocalVector.h"
00044 
00045 using namespace std;
00046 
00047 //----------------
00048 // Constructors --
00049 //----------------
00050 
00051 DTTrigGeom::DTTrigGeom(DTChamber* stat, bool debug) : _stat(stat) , _debug(debug) {
00052 
00053   getGeom();
00054 
00055 }
00056 
00057 
00058 //--------------
00059 // Destructor --
00060 //--------------
00061 
00062 DTTrigGeom::~DTTrigGeom() {}
00063 
00064 
00065 //--------------
00066 // Operations --
00067 //--------------
00068 
00069 float 
00070 DTTrigGeom::phiSLOffset(){
00071   //sl1 offset respect to sl3 - in Front End view!!
00072   float x1 = tubePosInCh(1,1,1).x();
00073   float x3 = tubePosInCh(3,1,1).x();
00074   float offset = x1-x3;
00075   //   if(posFE(1)==1)        // Obsolete in
00076   //     offset = - offset;   // CMSSW
00077   
00078   return offset;
00079 }
00080 
00081 /* OBSOLETE - MAYBE - 19/06/06
00082 int
00083 DTTrigGeom::layerFEStaggering(int nsl, int nlay) const {
00084 
00085   NB the staggering is in FE view!
00086   return cell staggering respect to first wire in layer 1 in cell units
00087   the following is the default: staggering 0 of each layer 
00088      +---------+---------+---------+
00089      | 1  o    | 2  o    | 3  o    |
00090      +----+----+----+----+----+----+
00091           | 1  o    |  2 o    |
00092      +----+----+----+----+----+
00093      | 1  o    | 2  o    |
00094      +----+----+----+----+----+
00095           | 1  o    | 2  o    |
00096           +---------+---------+   ------------> x (y coming out of video) in SL frame
00097  
00098 
00099   int stag = 0;
00100 
00101   if(station()==4 && nsl==2){
00102     std::cout << "No theta superlayer in station 4!" << std::endl;
00103     return 0;
00104   }
00105   //position in chamber of wire 1 in layer 1
00106   LocalPoint posInCh_lay1      = tubePosInCh(nsl,1,1);
00107   //position in chamber of wire 1 in layer nlay
00108   int n1stwire = (nlay==4 ? 2 : 1); 
00109   LocalPoint posInCh_lay       = tubePosInCh(nsl,nlay,n1stwire);
00110 
00111  cout << endl;
00112  cout << nlay << posInCh_lay1 << posInCh_lay << endl;
00113  cout <<endl ;
00114 
00115 
00116   //NB PITCH-0.01 for computer approximation bug
00117   if(nsl==2){//SL2: first wire is toward positive y 
00118     stag = static_cast<int>((-posInCh_lay.y()+posInCh_lay1.y())/(_PITCH-0.01) + 0.5*(fmod(nlay,2.)==0?1:0));
00119   }
00120   else{//SL1 and SL3: first wire is toward negative x
00121           if (nlay==4) {
00122                   stag = static_cast<int>((+posInCh_lay.x()-posInCh_lay1.x()+_PITCH)/(_PITCH-0.01) + 0.5*(fmod(nlay,2.)==0?1:0));
00123           }
00124           else {
00125                 stag = static_cast<int>((+posInCh_lay.x()-posInCh_lay1.x())/(_PITCH-0.01) + 0.5*(fmod(nlay,2.)==0?1:0));
00126           }
00127   }
00128 
00129   //FEP=1 means in y negative in layer frame
00130   const DTLayer* lay  = _stat->superLayer(DTSuperLayerId(statId(),nsl))->layer(DTLayerId(statId(),nsl,nlay));
00131   const DTLayer* lay1 = _stat->superLayer(DTSuperLayerId(statId(),nsl))->layer(DTLayerId(statId(),nsl,1));   
00132 
00133   if(lay->getFEPosition()==1){ //FE staggering is reverted                                    //MODIFICARE DOPO!!!!!!
00134     int nWire  = lay->specificTopology().channels();  
00135     int nWire1 = lay1->specificTopology().channels();
00136     stag = - nWire + nWire1 - stag + (fmod(nlay,2.)==0?1:0);
00137   }
00138   return stag;
00139 }
00140 */
00141 
00142 int
00143 DTTrigGeom::mapTubeInFEch(int nsl, int nlay, int ntube) const {
00144   int nch = 0;
00145   if(station()==4 && nsl==2){
00146     std::cout << "No theta superlayer in station 4!" << std::endl;
00147   }
00148   else{
00149     // obsolete 19/06/2006  const DTLayer* lay = _stat->superLayer(DTSuperLayerId(statId(),nsl))->layer(DTLayerId(statId(),nsl,nlay));
00150           
00151 /* obsolete 19/6/06
00152  if(lay->getFEPosition()==0)         //FE is in Y negative: opposite numbering                
00153           nch = lay->specificTopology().channels() - ntube + 1;   
00154 //   if(lay->getFEPosition()==1)         //FE is in Y positive: same numbering digi-trig        
00155 //     nch = ntube;
00156 //  }
00157 */      
00158         // in new geometry depends on SL: theta tube numbering is reverted wrt hardware
00159         nch =ntube;
00160 /*      if(nsl==2){     
00161                 nch = lay->specificTopology().channels() - ntube + 1;
00162         }*/
00163   }
00164   return nch;
00165 }
00166 
00167 LocalPoint 
00168 DTTrigGeom::tubePosInCh(int nsl, int nlay, int ntube) const {
00169   if ( nlay==4 && ntube==1) {
00170     std::cout << "ATTENTION: no wire nuber 1 for 4th layer!!!" << std::endl;
00171     LocalPoint dummyLP(0,0,0);
00172     return dummyLP;
00173   }
00174   const DTSuperLayer* sl   = _stat->superLayer(DTSuperLayerId(statId(),nsl));
00175   const DTLayer* lay       = sl->layer(DTLayerId(statId(),nsl,nlay));
00176   
00177    float localX             = lay->specificTopology().wirePosition(ntube);
00178    LocalPoint posInLayer(localX,0,0);
00179    LocalPoint posInChamber  = _stat->surface().toLocal(lay->toGlobal(posInLayer));
00180    //obsolete 19/06/2006 GlobalPoint  posInCMS = lay->toGlobal(posInLayer);
00181   
00182  /* cout <<endl;
00183   cout << "tube " << ntube << " nlay " << nlay << endl;
00184   cout << "posinlayer " << posInLayer << "posinchamb " << posInChamber << "posinCMS " << posInCMS << endl;*/
00185   
00186   return posInChamber;
00187 }
00188 
00189 int
00190 DTTrigGeom::posFE(int sl) const {
00191    if( station()!=4 || sl!=2 ) {
00192      // obsolete 19/0602006 const DTLayer* lay  = _stat->superLayer(DTSuperLayerId(statId(),sl))->layer(DTLayerId(statId(),sl,1));
00193      return 1/*lay->getFEPosition()*/;                                               
00194    }
00195    else{
00196     std::cout << "No theta superlayer in station 4!" << std::endl;
00197     return 0;
00198   }
00199 }
00200 
00201 void
00202 DTTrigGeom::setGeom(const DTChamber* stat) {
00203 
00204   _stat=stat;
00205   getGeom();
00206 
00207 }
00208 
00209 void
00210 DTTrigGeom::getGeom() {
00211 
00212   // Geometrical constants of chamber
00213   // Cell width (cm)
00214   _PITCH = 4.2;
00215   // Cell height (cm)
00216   _H = 1.3;
00217   // azimuthal angle of normal to the chamber
00218   _PHICH = _stat->surface().toGlobal(LocalVector(0,0,-1)).phi();
00219 
00220   // superlayer positions and number of cells
00221   DTSuperLayer* sl[3];
00222   DTLayer* l1[3];
00223   DTLayer* l3[3];
00224   int i = 0;
00225   for(i=0; i<3; i++) {
00226     if(station()==4&&i==1) { // No theta SL in MB4
00227       _ZSL[i] = -999;
00228       _NCELL[i] = 0;
00229     } else {
00230       sl[i] = (DTSuperLayer*) _stat->superLayer(DTSuperLayerId(statId(),i+1));
00231       l1[i] = (DTLayer*) sl[i]->layer(DTLayerId(statId(),i+1,1));
00232       l3[i] = (DTLayer*) sl[i]->layer(DTLayerId(statId(),i+1,3));
00233       _ZSL[i] = _stat->surface().toLocal(sl[i]->position()).z(); // - 1.5 * _H;
00234       //LocalPoint posInLayer=l1[i]->layType()->getWire(1)->positionInLayer();
00235       const DTTopology& tp=l1[i]->specificTopology();
00236       float  posX=tp.wirePosition(tp.firstChannel());
00237       LocalPoint posInLayer(posX,0,0);
00238       LocalPoint posInChamber=_stat->surface().toLocal(l1[i]->surface().toGlobal(posInLayer));
00239       _NCELL[i] = l1[i]->specificTopology().channels();
00240     }
00241   }
00242 
00243   // debugging
00244   if(_debug){
00245     std::cout << setiosflags(std::ios::showpoint | std::ios::fixed) << std::setw(4) <<
00246       std::setprecision(1);
00247     std::cout << "Identification: wheel=" << wheel();
00248     std::cout << ", station=" << station();
00249     std::cout << ", sector=" << sector() << std::endl;
00250     GlobalPoint pp = _stat->toGlobal(LocalPoint(0,0,0));
00251     std::cout << "Position: Mag=" << pp.mag() << "cm, Phi=" << pp.phi()*180/3.14159;
00252     std::cout << " deg, Z=" << pp.z() << " cm" << std::endl;
00253     std::cout << "Rotation: ANGLE=" << phiCh()*180/3.14159 << std::endl;
00254     //if(wheel()==2&&sector()==2){ // only 1 sector-wheel
00255       std::cout << "Z of superlayers: phi=" << ZSL(1) << ", ";
00256       std::cout << ZSL(3) << " theta=" << ZSL(2);
00257       std::cout << " (DeltaY = " << distSL() << ")" << std::endl;
00258       std::cout << " ncell: sl 1 " <<  nCell(1) << " sl 2 " <<  nCell(2) <<
00259               " sl 3 " <<  nCell(3) << std::endl;   
00260     //}
00261   }
00262   // end debugging
00263 
00264 }
00265 
00266 float 
00267 DTTrigGeom::ZSL(int sl) const {
00268   if(sl<1||sl>3){
00269     std::cout << "DTTrigGeom::ZSL: wrong SL number: " << sl;
00270     std::cout << -999 << " returned" << std::endl;
00271     return -999;
00272   }
00273   return _ZSL[sl-1];
00274 }
00275 
00276 
00277 void 
00278 DTTrigGeom::dumpGeom() const {
00279   std::cout << "Identification: wheel=" << wheel();
00280   std::cout << ", station=" << station();
00281   std::cout << ", sector=" << sector() << std::endl;
00282   GlobalPoint pp = _stat->toGlobal(LocalPoint(0,0,0));
00283   std::cout << "Position: Mag=" << pp.mag() << "cm, Phi=" << pp.phi()*180/3.14159;
00284   std::cout << " deg, Z=" << pp.z() << " cm" << std::endl;
00285   std::cout << "Rotation: ANGLE=" << phiCh()*180/3.14159 << std::endl;
00286   std::cout << "Z of superlayers: phi=" << ZSL(1) << ", ";
00287   std::cout << ZSL(3) << " theta=" << ZSL(2) << std::endl;
00288   std::cout << "Number of cells: SL1=" << nCell(1) << " SL2=" << nCell(2) <<
00289     " SL3=" << nCell(3) << std::endl;
00290   std::cout << "First wire positions:" << std::endl;
00291   int ii=0;
00292   int jj=0;
00293   for( ii = 1; ii<=3; ii++ ) {
00294     if(station()!=4||ii!=2){
00295       for ( jj =1; jj<=4; jj++ ) {
00296         std::cout << "    SL=" << ii << ", lay=" << jj << ", wire 1 position=";
00297         if ( jj ==4)
00298           std::cout << tubePosInCh( ii, jj, 2) << std::endl;
00299         else
00300           std::cout << tubePosInCh( ii, jj, 1) << std::endl;
00301       }
00302     }
00303   }
00304 
00305   GlobalPoint gp1 = CMSPosition(DTBtiId(statId(),1,1)); 
00306   
00307 
00308   std::cout << "First BTI position:";
00309   std::cout << " SL1:" << localPosition(DTBtiId(statId(),1,1)) << std::endl;
00310   std::cout << " Position: R=" << gp1.perp() << "cm, Phi=" << gp1.phi()*180/3.14159 << " deg, Z=" << gp1.z() << " cm" << std::endl;
00311 
00312   if(station()!=4)
00313   {
00314         GlobalPoint gp2 = CMSPosition(DTBtiId(statId(),2,1)); 
00315         std::cout << " SL2:" << localPosition(DTBtiId(statId(),2,1))<< std::endl;
00316         std::cout << " Position: R=" << gp2.perp() << "cm, Phi=" << gp2.phi()*180/3.14159 << " deg, Z=" << gp2.z() << " cm" << std::endl;
00317   }
00318 
00319   GlobalPoint gp3 = CMSPosition(DTBtiId(statId(),3,1)); 
00320   std::cout << " SL3:" << localPosition(DTBtiId(statId(),3,1)) << std::endl;
00321   std::cout << " Position: R=" << gp3.perp() << "cm, Phi=" << gp3.phi()*180/3.14159 << " deg, Z=" << gp3.z() << " cm" << std::endl;
00322 
00323   std::cout << "First TRACO position:";
00324   std::cout << localPosition(DTTracoId(statId(),1)) << std::endl;
00325   std::cout << "******************************************************" << std::endl;
00326 }
00327 
00328 void 
00329 DTTrigGeom::dumpLUT(short int btic) {
00330 
00331   // chamber id
00332   int wh = wheel();
00333   int st = station();
00334   int se = sector();
00335 
00336   // open txt file 
00337   string name = "Lut_from_CMSSW_geom";
00338  /* name += "_wh_";
00339   if(wh<0)
00340         name += "-";
00341   name += abs(wh) + '0';
00342   name += "_st_";
00343   name += st + '0';
00344   name += "_se_";
00345   if(se<10)
00346         name += se + '0';
00347   else 
00348   {
00349         name += 1 + '0';
00350         name += (se-10) + '0';
00351   }
00352   */ 
00353   name += ".txt";
00354 
00355   ofstream fout;
00356   fout.open(name.c_str(),ofstream::app);
00357 
00358 // *** dump file header
00359 //  fout << "Identification: wheel\t" << wh;
00360 //  fout << "\tstation\t" << st;
00361 //  fout << "\tsector\t" << se;
00362   fout << wh;
00363   fout << "\t" << st;
00364   fout << "\t" << se;
00365 
00366   // SL shift
00367   float xBTI1_3         = localPosition( DTBtiId(DTSuperLayerId(wheel(),station(),sector(),3),1) ).x();
00368   float xBTI1_1         = localPosition( DTBtiId(DTSuperLayerId(wheel(),station(),sector(),1),1) ).x();
00369   float SL_shift        = xBTI1_3 - xBTI1_1;
00370   //  std::cout << " SL shift " << SL_shift << std::endl;
00371 
00372   // traco 1 and 2 global position
00373   LocalPoint traco1     = localPosition(DTTracoId(statId(),1));
00374   LocalPoint traco2     = localPosition(DTTracoId(statId(),2));
00375   GlobalPoint traco_1   = toGlobal(traco1);
00376   GlobalPoint traco_2   = toGlobal(traco2);
00377   // std::cout << " tr1 x " << traco_1.x() << " tr2 x " << traco_2.x() << std::endl;
00378 
00379   float d;
00380   float xcn;
00381   int xcn_sign;
00382   GlobalPoint pp = _stat->toGlobal(LocalPoint(0,0,ZcenterSL()));
00383   // std::cout << "Position: x=" << pp.x() << "cm, y=" << pp.y() << "cm, z=" << pp.z() << std::endl;  
00384     
00385   if(sector()==1 || sector() ==7){  
00386         d = fabs(traco_1.x());
00387         xcn = fabs(traco_1.y());
00388         // 110208 SV comment: this was inserted for a TRACO hardware bug
00389         if (SL_shift > 0) 
00390                 xcn = xcn+SL_shift;
00391         xcn_sign = static_cast<int>(pp.y()/fabs(pp.y()))*static_cast<int>(traco_1.y()/fabs(traco_1.y()));
00392         if(station() == 2 || (station() == 4 && sector() == 1)) 
00393                 xcn_sign = - xcn_sign;
00394         xcn = xcn*xcn_sign;
00395   }
00396   else {
00397         float m1 = (traco_2.y()-traco_1.y())/(traco_2.x()-traco_1.x());
00398         float q1 = traco_1.y()-m1*traco_1.x();
00399         float m = tan(phiCh());
00400         float xn = q1/(m-m1);
00401         float yn = m*xn;
00402   
00403         d = sqrt(xn*xn+yn*yn);
00404         xcn = sqrt( (xn-traco_1.x())*(xn-traco_1.x()) + (yn-traco_1.y())*(yn-traco_1.y()) );
00405         // 110208 SV comment: this was inserted for a TRACO hardware bug
00406         if (SL_shift > 0) 
00407                 xcn = xcn+SL_shift;
00408   
00409         float diff = (pp.x()-traco_1.x())*traco_1.y();
00410         xcn_sign = static_cast<int>(diff/fabs(diff));
00411         xcn = xcn*xcn_sign;
00412   }
00413   // std::cout << " d " << d << " xcn " << xcn << " sign " << xcn_sign << std::endl; 
00414   //fout << "\td\t" << d << "\txcn\t" << xcn << "\t"; 
00415   //fout << "btic\t" << btic << "\t";
00416 
00417 // *** dump TRACO LUT command
00418   fout << "\tA8";
00419   //short int btic = 31;
00420   //cout << "CHECK BTIC " << btic << endl;
00421   short int Low_byte = (btic & 0x00FF);   // output in hex bytes format with zero padding
00422   short int High_byte =( btic>>8 & 0x00FF);
00423   fout << setw(2) << setfill('0') << hex << High_byte << setw(2) << setfill('0') << Low_byte;   
00424     
00425   // convert parameters from IEE32 float to DSP float format
00426   short int DSPmantissa = 0;
00427   short int DSPexp = 0;
00428 
00429   // d parameter conversion and dump
00430   IEEE32toDSP(d, DSPmantissa, DSPexp);
00431   Low_byte = (DSPmantissa & 0x00FF);   // output in hex bytes format with zero padding
00432   High_byte =( DSPmantissa>>8 & 0x00FF);
00433   fout << setw(2) << setfill('0') << hex << High_byte << setw(2) << setfill('0') << Low_byte;   
00434   Low_byte = (DSPexp & 0x00FF);
00435   High_byte =( DSPexp>>8 & 0x00FF);
00436   fout << setw(2) << setfill('0') << High_byte << setw(2) << setfill('0') << Low_byte;  
00437 
00438   // xnc parameter conversion and dump
00439   DSPmantissa = 0;
00440   DSPexp = 0;
00441   IEEE32toDSP(xcn, DSPmantissa, DSPexp);
00442   Low_byte = (DSPmantissa & 0x00FF);   // output in hex bytes format with zero padding
00443   High_byte =( DSPmantissa>>8 & 0x00FF);
00444   fout << setw(2) << setfill('0') << hex << High_byte << setw(2) << setfill('0') << Low_byte;   
00445   Low_byte = (DSPexp & 0x00FF);
00446   High_byte =( DSPexp>>8 & 0x00FF);
00447   fout << setw(2) << setfill('0') << High_byte << setw(2) << setfill('0') << Low_byte;  
00448 
00449   // sign bits 
00450   Low_byte = (xcn_sign & 0x00FF);   // output in hex bytes format with zero padding
00451   High_byte =( xcn_sign>>8 & 0x00FF);
00452   fout << setw(2) << setfill('0') << hex << High_byte << setw(2) << setfill('0') << Low_byte << dec << "\n"; 
00453 
00454   fout.close();
00455 
00456   return;
00457  
00458 }
00459 
00460 void 
00461 DTTrigGeom::IEEE32toDSP(float f, short int & DSPmantissa, short int & DSPexp)
00462 {
00463   long int *pl=0, lm;
00464   bool sign=false;
00465 
00466   DSPmantissa = 0;
00467   DSPexp = 0;
00468 
00469   if( f!=0.0 )
00470   {
00471         memcpy(pl,&f,sizeof(float));
00472         if((*pl & 0x80000000)!=0) 
00473                 sign=true;        
00474         lm = ( 0x800000 | (*pl & 0x7FFFFF)); // [1][23bit mantissa]
00475         lm >>= 9; //reduce to 15bits
00476         lm &= 0x7FFF;
00477         DSPexp = ((*pl>>23)&0xFF)-126;
00478         DSPmantissa = (short)lm;
00479         if(sign) 
00480                 DSPmantissa = - DSPmantissa;  // convert negative value in 2.s complement       
00481 
00482   }
00483   return;
00484 }
00485 
00486 
00487 LocalPoint 
00488 DTTrigGeom::localPosition(const DTBtiId id) const {
00489 /* obsolete!
00490   float x = 0;
00491   float y = 0;
00492   float z = ZSL(id.superlayer());
00493   if(id.superlayer()==2){
00494     // SL 2: Reverse numbering -------V
00495     y = Xwire1BTI1SL(id.superlayer()) - ((float)(id.bti()-1)-0.5)*cellPitch();
00496   } else {
00497     x = Xwire1BTI1SL(id.superlayer()) + ((float)(id.bti()-1)-0.5)*cellPitch();
00498   }
00499 */
00500 
00501 //NEWGEO
00502 /*  int nsl = id.superlayer();
00503   int tube = mapTubeInFEch(nsl,1,id.bti());
00504   LocalPoint p = tubePosInCh(nsl,1,tube);
00505   //traslation because z axes is in middle of SL, x/y axes on left I of first cell
00506   
00507   LocalPoint p1 = tubePosInCh (nsl,1,1);
00508   LocalPoint p2 = tubePosInCh (nsl,2,1); 
00509   cout << "nbti " << id.bti() << " tube " << tube << " localpoint" << p << endl;
00510   cout << "localpoint layer 1" << p1  << " localpoint layer 2" << p2 << endl;
00511   
00512   float xt = 0;
00513   float yt = 0;
00514   float zt = - cellH() * 3./2.;
00515   if(nsl==2)
00516     yt = - cellPitch()/2.; 
00517   else
00518     xt = + cellPitch()/2.; 
00519 
00520   if(posFE(nsl)==0){//FE in positive y
00521       xt = - xt;
00522       yt = - yt;
00523   }
00524   
00525   cout << "localpoint " << p << ' '  << xt << ' ' << yt << endl;
00526 
00527   return LocalPoint(p.x()+xt,p.y()+yt,p.z()+zt);*/
00528         
00529         int nsl = id.superlayer();
00530         const DTSuperLayer* sl   = _stat->superLayer(DTSuperLayerId(statId(),nsl));
00531         const DTLayer* lay       = sl->layer(DTLayerId(statId(),nsl,1));
00532         int tube = id.bti();
00533         float localX             = lay->specificTopology().wirePosition(tube);
00534         float xt = -cellPitch()/2.;
00535         float zt = -cellH() * 3./2.;
00536         //LocalPoint posInLayer1(localX+xt,yt,0); //Correction now y is left I of first cell of layer 1 y=0 and z in the middle of SL,
00537         LocalPoint posInLayer1(localX+xt,0,zt);
00538         LocalPoint posInChamber  = _stat->surface().toLocal(lay->toGlobal(posInLayer1));
00539         //GlobalPoint posInCMS = lay->toGlobal(posInLayer1);
00540 
00541         /* cout <<endl;
00542         cout << "tube " << ntube << " nlay " << nlay << endl;
00543         cout << "posinlayer " << posInLayer1 << "posinchamb " << posInChamber << "posinCMS " << posInCMS << endl;*/
00544         
00545         return posInChamber;
00546 }
00547 
00548 LocalPoint 
00549 DTTrigGeom::localPosition(const DTTracoId id) const {
00550 /* obsolete
00551   float x = Xwire1BTI1SL(1) +
00552     ( ( (float)(id.traco()) - 0.5 ) * DTConfig::NBTITC - 0.5 )*cellPitch();
00553   // half cell shift in SL1 of MB1 (since cmsim116)
00554   if(station()==1) x -= 0.5*cellPitch();
00555   float y = 0;
00556   float z = ZcenterSL();
00557 */
00558   //NEWGEO
00559   // position of first BTI in sl 3 on X
00560   float x = localPosition( DTBtiId(DTSuperLayerId(wheel(),station(),sector(),3),1) ).x();
00561 // 10/7/06 May be not needed anymore in new geometry
00562 //   if(posFE(3)==1)
00563 //     x -= (id.traco()-2)*DTConfig::NBTITC * cellPitch();
00564 //   if(posFE(3)==0)
00565     x += (id.traco()-2)*DTConfig::NBTITC * cellPitch();
00566 
00567   float y = 0;
00568   float z = ZcenterSL();
00569 
00570   return LocalPoint(x,y,z);
00571 }