CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_1_8_patch12/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         if (SL_shift > 0) 
00389                 xcn = xcn+SL_shift;
00390         xcn_sign = static_cast<int>(pp.y()/fabs(pp.y()))*static_cast<int>(traco_1.y()/fabs(traco_1.y()));
00391         if(station() == 2 || (station() == 4 && sector() == 1)) 
00392                 xcn_sign = - xcn_sign;
00393         xcn = xcn*xcn_sign;
00394   }
00395   else {
00396         float m1 = (traco_2.y()-traco_1.y())/(traco_2.x()-traco_1.x());
00397         float q1 = traco_1.y()-m1*traco_1.x();
00398         float m = tan(phiCh());
00399         float xn = q1/(m-m1);
00400         float yn = m*xn;
00401   
00402         d = sqrt(xn*xn+yn*yn);
00403         xcn = sqrt( (xn-traco_1.x())*(xn-traco_1.x()) + (yn-traco_1.y())*(yn-traco_1.y()) );
00404         if (SL_shift > 0) 
00405                 xcn = xcn+SL_shift;
00406   
00407         float diff = (pp.x()-traco_1.x())*traco_1.y();
00408         xcn_sign = static_cast<int>(diff/fabs(diff));
00409         xcn = xcn*xcn_sign;
00410   }
00411   // std::cout << " d " << d << " xcn " << xcn << " sign " << xcn_sign << std::endl; 
00412   //fout << "\td\t" << d << "\txcn\t" << xcn << "\t"; 
00413   //fout << "btic\t" << btic << "\t";
00414 
00415 // *** dump TRACO LUT command
00416   fout << "\tA8";
00417   //short int btic = 31;
00418   //cout << "CHECK BTIC " << btic << endl;
00419   short int Low_byte = (btic & 0x00FF);   // output in hex bytes format with zero padding
00420   short int High_byte =( btic>>8 & 0x00FF);
00421   fout << setw(2) << setfill('0') << hex << High_byte << setw(2) << setfill('0') << Low_byte;   
00422     
00423   // convert parameters from IEE32 float to DSP float format
00424   short int DSPmantissa = 0;
00425   short int DSPexp = 0;
00426 
00427   // d parameter conversion and dump
00428   IEEE32toDSP(d, DSPmantissa, DSPexp);
00429   Low_byte = (DSPmantissa & 0x00FF);   // output in hex bytes format with zero padding
00430   High_byte =( DSPmantissa>>8 & 0x00FF);
00431   fout << setw(2) << setfill('0') << hex << High_byte << setw(2) << setfill('0') << Low_byte;   
00432   Low_byte = (DSPexp & 0x00FF);
00433   High_byte =( DSPexp>>8 & 0x00FF);
00434   fout << setw(2) << setfill('0') << High_byte << setw(2) << setfill('0') << Low_byte;  
00435 
00436   // xnc parameter conversion and dump
00437   DSPmantissa = 0;
00438   DSPexp = 0;
00439   IEEE32toDSP(xcn, DSPmantissa, DSPexp);
00440   Low_byte = (DSPmantissa & 0x00FF);   // output in hex bytes format with zero padding
00441   High_byte =( DSPmantissa>>8 & 0x00FF);
00442   fout << setw(2) << setfill('0') << hex << High_byte << setw(2) << setfill('0') << Low_byte;   
00443   Low_byte = (DSPexp & 0x00FF);
00444   High_byte =( DSPexp>>8 & 0x00FF);
00445   fout << setw(2) << setfill('0') << High_byte << setw(2) << setfill('0') << Low_byte;  
00446 
00447   // sign bits 
00448   Low_byte = (xcn_sign & 0x00FF);   // output in hex bytes format with zero padding
00449   High_byte =( xcn_sign>>8 & 0x00FF);
00450   fout << setw(2) << setfill('0') << hex << High_byte << setw(2) << setfill('0') << Low_byte << dec << "\n"; 
00451 
00452   fout.close();
00453 
00454   return;
00455  
00456 }
00457 
00458 void 
00459 DTTrigGeom::IEEE32toDSP(float f, short int & DSPmantissa, short int & DSPexp)
00460 {
00461   long int *pl=0, lm;
00462   bool sign=false;
00463 
00464   DSPmantissa = 0;
00465   DSPexp = 0;
00466 
00467   if( f!=0.0 )
00468   {
00469         memcpy(pl,&f,sizeof(float));
00470         if((*pl & 0x80000000)!=0) 
00471                 sign=true;        
00472         lm = ( 0x800000 | (*pl & 0x7FFFFF)); // [1][23bit mantissa]
00473         lm >>= 9; //reduce to 15bits
00474         lm &= 0x7FFF;
00475         DSPexp = ((*pl>>23)&0xFF)-126;
00476         DSPmantissa = (short)lm;
00477         if(sign) 
00478                 DSPmantissa = - DSPmantissa;  // convert negative value in 2.s complement       
00479 
00480   }
00481   return;
00482 }
00483 
00484 
00485 LocalPoint 
00486 DTTrigGeom::localPosition(const DTBtiId id) const {
00487 /* obsolete!
00488   float x = 0;
00489   float y = 0;
00490   float z = ZSL(id.superlayer());
00491   if(id.superlayer()==2){
00492     // SL 2: Reverse numbering -------V
00493     y = Xwire1BTI1SL(id.superlayer()) - ((float)(id.bti()-1)-0.5)*cellPitch();
00494   } else {
00495     x = Xwire1BTI1SL(id.superlayer()) + ((float)(id.bti()-1)-0.5)*cellPitch();
00496   }
00497 */
00498 
00499 //NEWGEO
00500 /*  int nsl = id.superlayer();
00501   int tube = mapTubeInFEch(nsl,1,id.bti());
00502   LocalPoint p = tubePosInCh(nsl,1,tube);
00503   //traslation because z axes is in middle of SL, x/y axes on left I of first cell
00504   
00505   LocalPoint p1 = tubePosInCh (nsl,1,1);
00506   LocalPoint p2 = tubePosInCh (nsl,2,1); 
00507   cout << "nbti " << id.bti() << " tube " << tube << " localpoint" << p << endl;
00508   cout << "localpoint layer 1" << p1  << " localpoint layer 2" << p2 << endl;
00509   
00510   float xt = 0;
00511   float yt = 0;
00512   float zt = - cellH() * 3./2.;
00513   if(nsl==2)
00514     yt = - cellPitch()/2.; 
00515   else
00516     xt = + cellPitch()/2.; 
00517 
00518   if(posFE(nsl)==0){//FE in positive y
00519       xt = - xt;
00520       yt = - yt;
00521   }
00522   
00523   cout << "localpoint " << p << ' '  << xt << ' ' << yt << endl;
00524 
00525   return LocalPoint(p.x()+xt,p.y()+yt,p.z()+zt);*/
00526         
00527         int nsl = id.superlayer();
00528         const DTSuperLayer* sl   = _stat->superLayer(DTSuperLayerId(statId(),nsl));
00529         const DTLayer* lay       = sl->layer(DTLayerId(statId(),nsl,1));
00530         int tube = id.bti();
00531         float localX             = lay->specificTopology().wirePosition(tube);
00532         float xt = -cellPitch()/2.;
00533         float zt = -cellH() * 3./2.;
00534         //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,
00535         LocalPoint posInLayer1(localX+xt,0,zt);
00536         LocalPoint posInChamber  = _stat->surface().toLocal(lay->toGlobal(posInLayer1));
00537         //GlobalPoint posInCMS = lay->toGlobal(posInLayer1);
00538 
00539         /* cout <<endl;
00540         cout << "tube " << ntube << " nlay " << nlay << endl;
00541         cout << "posinlayer " << posInLayer1 << "posinchamb " << posInChamber << "posinCMS " << posInCMS << endl;*/
00542         
00543         return posInChamber;
00544 }
00545 
00546 LocalPoint 
00547 DTTrigGeom::localPosition(const DTTracoId id) const {
00548 /* obsolete
00549   float x = Xwire1BTI1SL(1) +
00550     ( ( (float)(id.traco()) - 0.5 ) * DTConfig::NBTITC - 0.5 )*cellPitch();
00551   // half cell shift in SL1 of MB1 (since cmsim116)
00552   if(station()==1) x -= 0.5*cellPitch();
00553   float y = 0;
00554   float z = ZcenterSL();
00555 */
00556   //NEWGEO
00557   // position of first BTI in sl 3 on X
00558   float x = localPosition( DTBtiId(DTSuperLayerId(wheel(),station(),sector(),3),1) ).x();
00559 // 10/7/06 May be not needed anymore in new geometry
00560 //   if(posFE(3)==1)
00561 //     x -= (id.traco()-2)*DTConfig::NBTITC * cellPitch();
00562 //   if(posFE(3)==0)
00563     x += (id.traco()-2)*DTConfig::NBTITC * cellPitch();
00564 
00565   float y = 0;
00566   float z = ZcenterSL();
00567 
00568   return LocalPoint(x,y,z);
00569 }