CMS 3D CMS Logo

DTBtiCard.cc

Go to the documentation of this file.
00001 //-------------------------------------------------
00002 //
00003 //   Class: DTBtiCard
00004 //
00005 //   Description: Contains active DTBtiChips
00006 //
00007 //
00008 //   Author List:
00009 //   C. Grandi
00010 //   Modifications: 
00011 //   S. Vanini
00012 //   22/VI/04 SV: last trigger code update - digi offset subtracted from digi time
00013 //   III/05 SV  : NEWGEO : trigger in new geometry ! 
00014 //   05/II/07 SV : new DTConfig update 
00015 //   30/III/07 SV : config with DTConfigManager every single chip
00016 //----------------------------------------------------------------
00017 
00018 //-----------------------
00019 // This Class's Header --
00020 //-----------------------
00021 #include "L1Trigger/DTBti/interface/DTBtiCard.h"
00022 
00023 //-------------------------------
00024 // Collaborating Class Headers --
00025 //-------------------------------
00026 #include "DataFormats/GeometryVector/interface/LocalPoint.h"
00027 #include "DataFormats/GeometryVector/interface/LocalVector.h"
00028 #include "L1Trigger/DTBti/interface/DTBtiChip.h"
00029 #include "L1Trigger/DTBti/interface/DTBtiTrig.h"
00030 
00031 #include "FWCore/Framework/interface/Event.h"
00032 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00033 #include "DataFormats/Common/interface/Handle.h"
00034 
00035 #include "CalibMuon/DTDigiSync/interface/DTTTrigBaseSync.h"
00036 #include "Geometry/DTGeometry/interface/DTGeometry.h"
00037 #include "Geometry/Records/interface/MuonGeometryRecord.h"
00038 #include "Geometry/DTGeometry/interface/DTLayer.h"
00039 #include "Geometry/DTGeometry/interface/DTChamber.h"
00040 
00041 #include "DataFormats/MuonDetId/interface/DTChamberId.h"
00042 #include "DataFormats/MuonDetId/interface/DTLayerId.h"
00043 #include "DataFormats/MuonDetId/interface/DTSuperLayerId.h"
00044 #include "DataFormats/MuonDetId/interface/DTWireId.h"
00045 #include "DataFormats/DTDigi/interface/DTDigiCollection.h"
00046 
00047 //---------------
00048 // C++ Headers --
00049 //---------------
00050 #include <iostream>
00051 #include <cmath>
00052 #include <utility>  
00053 #include <vector>
00054 
00055 using namespace edm;                            
00056 
00057 //----------------
00058 // Constructors --
00059 //----------------
00060 
00061 DTBtiCard::DTBtiCard(DTTrigGeom *geom, DTTTrigBaseSync *sync) : 
00062   DTGeomSupplier(geom), _digi_sync(sync) {
00063 
00064         //_configBti = new DTConfigBti(bti_pset);
00065         //_configBti->print();
00066 
00067         //DTChamberId sid = ChamberId();
00068         //_conf_bti_map = conf_manager->getDTConfigBtiMap(sid); 
00069         //_debug = conf_manager->getDTTPGDebug();
00070 
00071         //_finedelay   = conf_manager->getDTConfigTrigUnit(sid)->MCSetupTime();
00072         //_MCdelay     = conf_manager->getDTConfigTrigUnit(sid)->MCDigiOffset();
00073 
00074 }
00075 
00076 //--------------
00077 // Destructor --
00078 //--------------
00079 
00080 DTBtiCard::~DTBtiCard(){
00081 
00082   localClear();
00083   //delete _conf_Bti;
00084   
00085 }
00086 
00087 //--------------
00088 // Operations --
00089 //--------------
00090 
00091 void
00092 DTBtiCard::clearCache(){
00093 
00094   BTICache::clearCache();
00095   localClear();
00096   
00097 }
00098 
00099 void
00100 DTBtiCard::setConfig(const DTConfigManager *conf){
00101   
00102         DTChamberId sid = ChamberId();
00103         _conf_bti_map = conf->getDTConfigBtiMap(sid);   
00104         _debug = conf->getDTTPGDebug();
00105         _finedelay   = conf->getDTConfigTrigUnit(sid)->MCSetupTime();
00106 
00107 }
00108 
00109 
00110 void
00111 DTBtiCard::localClear(){
00112 // Clear the maps
00113   for(int i=0; i<3; i++){
00114     for(BTI_iter p=_btimap[i].begin();p!=_btimap[i].end();p++){
00115       delete (*p).second;
00116     }
00117     _btimap[i].clear();
00118   }
00119 
00120   //clear digis
00121   std::vector<DTDigi*>::const_iterator p;
00122   for(p=_digis.begin();p<_digis.end();p++)
00123     delete (*p);
00124   _digis.clear();
00125 }
00126 
00127 // void 
00128 // //DTBtiCard::loadBTI() {
00129 // DTBtiCard::loadBTI(const DTDigiCollection dtDigis) {
00130 
00131 //   localClear();
00132  
00133 //    int ndigis = stat()->ndigis();
00134 
00135 
00136 // // /*
00137 // //   //SV version for tb2003 data
00138 // //   // loop over chambers, superlayers and layers
00139 // //   DTBXSetUp* setup = Singleton<DTBXSetUp>::instance();
00140 // //   DTDetectorMap* detMap = setup->chamberMap();
00141 // //   std::vector<DTChamber*> chambers = detMap->chambers();
00142 // //   DTDetectorMap::ChamIter stat;
00143 // //   for ( stat = chambers.begin(); stat != chambers.end(); stat++ ) {
00144 // // */
00145 
00146 // //   // Get DTDigi's from DTChamber  (stat is DTChamber*) 
00147 // //   // Loop over all Digis and make a local copy
00148 // //   // Store a pointer to them in the relevant DTBtiChip's
00149 
00150 //   if(ndigis){
00151 
00152 //     if(debug()){
00153 //       std::cout << "====================================================" << std::endl;
00154 //       std::cout <<  ndigis << " DIGIS in  wheel " << wheel() << 
00155 //               " station " << station() <<
00156 //               " sector "  << sector() << std::endl; 
00157 //     }
00158 
00159 
00160 //     std::vector<DTDigi> digi_container = stat()->digis();
00161 //     std::vector<DTDigi>::const_iterator       digi_iter;
00162 
00163 //     for(digi_iter=digi_container.begin(); digi_iter<digi_container.end(); digi_iter++){
00164 
00165 //     /*Testbeam 2004 specific code
00166 //     //digi.time in ns; digi.countsTDC in tdcunits
00167 //     //float tdrift = (*digi_iter).time()-1.0*DTDigiParameters::offset;
00168 //     //TB2004 version: no offset subtraction because digi are already t0 off!!!!
00169 //     //tdrift must be float, otherwise DTDigi constructor assumes tdcunits!
00170 //     //add chamber specific delay
00171 //     int tdctime = (*digi_iter).countsTDC();
00172 //     int mcdelay = (stat()->id().station()==1) ? config()->SetupTimeMB1() : config()->SetupTimeMB
00173 // 3();
00174 //     tdctime += mcdelay;
00175 //     */
00176 //       float tdrift = (*digi_iter).time()-1.0*DTDigiParameters::offset;
00177 //       DTWireId idwire( wheel(), station(), sector(), (*digi_iter).slayer(), 
00178 //                         (*digi_iter).layer(), (*digi_iter).wire() );
00179 
00180 
00181 // /*
00182 //   //NEWGEO TEST: sw testpulse for testing new geometry in wire 1 of each sl
00183 //   for(int l=0;l<12;l++){
00184 //     int sl = int(l/4.) + 1;
00185 //     if(station()!=4 || sl!=2){
00186 //     int lay = int(fmod(l,4.)) + 1;
00187 //     int wire = 2*sector();
00188 //     if(geom()->posFE(sl)==0 || station()==1 || sl==2)
00189 //       wire += lay==4? 1:2;
00190 //     else if(geom()->posFE(sl)==1) 
00191 //       wire += lay==3? 3:2;
00192 
00193 //     //int wire = 1;
00194 //     //tmax=400ns, straight tracks in middle : 200ns (float for ns, int for tdc_counts)
00195 //     //float tdrift = 187.5;
00196 //     float tdrift = 200.0;
00197 //     DTWireId idwire( wheel(), station(), sector(), sl, lay, wire);
00198 // */
00199 
00200 //       DTDigi* pdigi = new DTDigi(idwire,tdrift);
00201 //       _digis.push_back(const_cast<DTDigi*>(pdigi));
00202 
00203 //       if(debug())
00204 //         pdigi->print();
00205 
00206 //       int sln = pdigi->slayer();
00207 //       int layn = pdigi->layer();
00208 //       int tube = pdigi->wire();
00209 
00210 //       // map in FE channel number:
00211 //       int nch = geom()->mapTubeInFEch(sln,layn,tube);
00212 
00213 //       // assign ch numbers to btis: depends on layer staggering!
00214 //       int nbti = nch + geom()->layerFEStaggering(sln,layn);
00215 
00216 //       if(debug()){
00217 //         std::cout << "FE ch " << nch;
00218 //         std::cout << " of bti " << nbti;
00219 //         std::cout << " staggering " <<  geom()->layerFEStaggering(sln,layn);
00220 //         std::cout << " now nbti is " << nch;
00221 //         std::cout << " SL phi offset " << geom()->phiSLOffset() << std::endl; 
00222 //       }  
00223 
00224 //       switch(layn) {
00225 //       case 1:
00226 //         if(activeGetBTI(sln, nbti  )) activeGetBTI(sln, nbti  )->add_digi(4, pdigi);
00227 //         if(activeGetBTI(sln, nbti-1)) activeGetBTI(sln, nbti-1)->add_digi(8, pdigi);
00228 //       break;
00229 //       case 2:
00230 //         if(activeGetBTI(sln, nbti  )) activeGetBTI(sln, nbti  )->add_digi(2, pdigi);
00231 //         if(activeGetBTI(sln, nbti-1)) activeGetBTI(sln, nbti-1)->add_digi(6, pdigi);
00232 //       break;
00233 //       case 3:
00234 //         if(activeGetBTI(sln, nbti  )) activeGetBTI(sln, nbti  )->add_digi(3, pdigi);
00235 //         if(activeGetBTI(sln, nbti-1)) activeGetBTI(sln, nbti-1)->add_digi(7, pdigi);
00236 //       break;
00237 //       case 4:
00238 //         if(activeGetBTI(sln, nbti  )) activeGetBTI(sln, nbti  )->add_digi(1, pdigi);
00239 //         if(activeGetBTI(sln, nbti-1)) activeGetBTI(sln, nbti-1)->add_digi(5, pdigi);
00240 //         if(activeGetBTI(sln, nbti-2)) activeGetBTI(sln, nbti-2)->add_digi(9, pdigi);
00241 //       break;
00242 //       }
00243 //     }//end loop on digi
00244 
00245 //     if(debug())
00246 //       std::cout << "====================================================" << std::endl;
00247 
00248 //   }//end if(ndigis)
00249 // }
00250 
00251 void 
00252 DTBtiCard::loadBTI(const DTDigiCollection dtDigis) {
00253   
00254   localClear();
00255 
00256   if(debug()){
00257     std::cout << "DTBtiCard::loadBTI called for wheel=" << wheel() ;
00258     std::cout <<                                ", station=" << station();
00259     std::cout <<                                ", sector="  << sector() << std::endl;
00260   }
00261   
00262   DTDigiCollection::DigiRangeIterator detUnitIt;
00263   for (detUnitIt=dtDigis.begin();
00264        detUnitIt!=dtDigis.end();
00265        ++detUnitIt){
00266     
00267     const DTLayerId& id = (*detUnitIt).first;
00268     const DTDigiCollection::Range& range = (*detUnitIt).second;
00269     
00270     // DTLayerId print-out
00271     if(debug()){
00272       std::cout<<"--------------"<<std::endl;
00273       std::cout<<"id: "<<id;
00274     }
00275     
00276     // Loop over the digis of this DetUnit
00277     for (DTDigiCollection::const_iterator digiIt = range.first;
00278          digiIt!=range.second;
00279          ++digiIt){
00280 
00281       int tube = (*digiIt).wire();
00282       const DTWireId tubeid(id,tube);
00283       float tdrift = (*digiIt).time() - _digi_sync->offset(tubeid);
00284       if (debug()){
00285         std::cout << "digi time: " << (*digiIt).time();
00286         std::cout << " sync offset: " << _digi_sync->offset(tubeid) << std::endl;
00287       }
00288 
00289       if(tdrift<500 && tdrift>-500){
00290         if(debug()) 
00291                 (*digiIt).print();
00292 
00293         // get bti number for access to the configuration for this bti chip : SV
00294         // FIX: for the moment take first bti configuration!!!!! ok fixed
00295         DTSuperLayerId slnum = id.superlayerId();
00296         //DTChamberId dtcham =id.chamberId();
00297         int sln = slnum.superlayer();
00298         int layn = id.layer();
00299         //int tube = (*digiIt).wire();
00300 
00301         // map in FE channel number: SL theta tubes are numbered inversely w.r.t. hardware setup in new geometry 19/06/06
00302         // assign ch numbers to btis: in new geometry does not depend on layer staggering anymore! Same staggering anywhere.
00303         //int nch = geom()->mapTubeInFEch(sln,layn,tube);
00304         //      int nbti = nch + geom()->layerFEStaggering(sln,layn);
00305         
00306         int nch = geom()->mapTubeInFEch(sln,layn,tube);
00307         int nbti = nch ; 
00308 
00309         if(debug()){
00310           std::cout << "FE ch " << nch;
00311           std::cout << " of bti " << nbti;
00312 //        std::cout << " staggering " <<  geom()->layerFEStaggering(sln,layn);
00313           std::cout << " now nbti is " << nch <<  std::endl;
00314 //        std::cout << " SL phi offset " << geom()->phiSLOffset() << std::endl; 
00315         }
00316         
00317         // FIXED get configuration for the nbti chip Identifier, and from it MCdelay + finedelay
00318         //DTChamberId sid = geom()->statId();
00319         //DTBtiId _id = DTBtiId(sid, sln, nbti);
00320  
00321         tdrift = tdrift + _finedelay; 
00322 //      float tdrift = (*digiIt).time() - _MCdelay + _finedelay; 
00323 //      std::cout<<"tdrift "<< tdrift << " (*digiIt).wire() " << (*digiIt).wire() << std::endl;
00324 
00325         DTDigi* pdigi = new DTDigi((*digiIt).wire(),tdrift);
00326         _digis.push_back(const_cast<DTDigi*>(pdigi) );
00327         
00328         
00329         switch(layn) {
00330         case 1:
00331           if(activeGetBTI(sln, nbti  )) activeGetBTI(sln, nbti  )->add_digi(4, pdigi);
00332           if(activeGetBTI(sln, nbti-1)) activeGetBTI(sln, nbti-1)->add_digi(8, pdigi);
00333           break;
00334         case 2:
00335           if(activeGetBTI(sln, nbti  )) activeGetBTI(sln, nbti  )->add_digi(2, pdigi);
00336           if(activeGetBTI(sln, nbti-1)) activeGetBTI(sln, nbti-1)->add_digi(6, pdigi);
00337           break;
00338         case 3:
00339           if(activeGetBTI(sln, nbti  )) activeGetBTI(sln, nbti  )->add_digi(3, pdigi);
00340           if(activeGetBTI(sln, nbti-1)) activeGetBTI(sln, nbti-1)->add_digi(7, pdigi);
00341           break;
00342         case 4:
00343           if(activeGetBTI(sln, nbti  )) activeGetBTI(sln, nbti  )->add_digi(1, pdigi);
00344           if(activeGetBTI(sln, nbti-1)) activeGetBTI(sln, nbti-1)->add_digi(5, pdigi);
00345           if(activeGetBTI(sln, nbti-2)) activeGetBTI(sln, nbti-2)->add_digi(9, pdigi);
00346           break;
00347         }
00348       }//end loop on digi
00349       //    }//end loop on lay
00350       //  }//end loop on sl
00351     }
00352   }
00353 }
00354     
00355 void 
00356 DTBtiCard::runBTI() {
00357 
00358   int nbtisig = _btimap[0].size()+_btimap[1].size()+_btimap[2].size();
00359 
00360   if(debug()){
00361     std::cout << "DTBtiCard::runBTI called for wheel=" << wheel() ;
00362     std::cout <<                               ", station=" << station();
00363     std::cout <<                               ", sector="  << sector();
00364     std::cout << ", " << nbtisig
00365          << " BTIs with signal" << std::endl;
00366   }
00367 
00368   if( nbtisig){
00369 
00370     if(debug()){
00371       std::cout << "====================================================" << std::endl;
00372       std::cout << "              BTI triggers                          " << std::endl; 
00373     }
00374 
00375 
00376     // run DTBtiChip algorithm on all non-empty BTI
00377     for(int sl=1;sl<=3;sl++){
00378       if(_btimap[sl-1].size()>0){
00379         BTI_iter pbti;
00380         for(pbti=_btimap[sl-1].begin(); pbti!=_btimap[sl-1].end(); pbti++) {
00381             DTBtiChip* bti = (*pbti).second; 
00382           if(bti->number()<200)
00383             bti->run();
00384           for(int step=DTConfig::NSTEPF; step<=DTConfig::NSTEPL; step++){
00385             if(bti->nTrig(step)>0) {
00386               _cache.push_back( bti->triggerData(step,1) );
00387               //localPosition(&(bti->triggerData(step,1))); 
00388               //localDirection(&(bti->triggerData(step,1))); 
00389              }
00390             }
00391         }
00392       }
00393     }
00394 
00395     if(debug())
00396       std::cout << "====================================================" << std::endl;
00397   }//end if(nbtisig)
00398 }
00399 
00400 DTBtiChip* 
00401 DTBtiCard::activeGetBTI(int sl, int n){
00402 
00403   DTBtiChip* bti=0;
00404   //check if BTi is out of range before all
00405   if( n<1 || n>geom()->nCell(sl) ){
00406     if(debug()){
00407       std::cout << "DTBtiCard::activeGetBTI :";
00408       std::cout << " invalid bti number: " << n;
00409       std::cout << " not in range [1," << geom()->nCell(sl) << "]";
00410       std::cout << " dummy BTI returned!" << std::endl;
00411     }
00412     sl = 1;
00413     n = 999;
00414     return bti;
00415   }
00416 
00417   // get configuration for this chip Identifier
00418   DTChamberId sid = geom()->statId();
00419   DTBtiId _id = DTBtiId(sid, sl, n); 
00420 
00421   //debug this chip
00422   int _debug_bti = config_bti(_id)->debug();
00423 
00424   if(_debug_bti==3){
00425     std::cout << "DTBtiCard::activeGetBTI :";
00426     std::cout << " bti number: " << n << std::endl;
00427   }
00428 
00429   if( sl<1 || sl>3){
00430     if(_debug_bti>1){
00431       std::cout << "DTBtiCard::activeGetBTI :";
00432       std::cout << " invalid superlayer number: " << sl;
00433       std::cout << " dummy BTI returned!" << std::endl;
00434     }
00435     sl = 1;
00436     n = 999;
00437     return bti; 
00438   }
00439 
00440   BTI_iter pbti = _btimap[sl-1].find(n);
00441   if( pbti!=_btimap[sl-1].end() ) {
00442     bti = (*pbti).second;
00443   } else {
00444     bti = new DTBtiChip(geom(),sl,n, config_bti(_id));
00445     _btimap[sl-1][n]=bti;
00446   }
00447   return bti;
00448 }
00449 
00450 DTBtiChip*
00451 DTBtiCard::getBTI(int sl, int n) const {
00452   if(sl<1||sl>3||n==999){
00453     std::cout << "DTBtiCard::getBTI :";
00454     std::cout << " invalid superlayer number: " << sl;
00455     std::cout << " 0 returned!" << std::endl;
00456     return 0;
00457   }
00458   BTI_const_iter pbti = _btimap[sl-1].find(n);
00459   if( pbti==_btimap[sl-1].end() ){ 
00460     return 0;
00461   }
00462   return (*pbti).second;
00463 }
00464 
00465 std::vector<DTBtiChip*> 
00466 DTBtiCard::btiList(int sl) {
00467 
00468   std::vector<DTBtiChip*> blist;
00469 
00470   if(size()<1)return blist;
00471 
00472   if(sl<1||sl>3){
00473     std::cout << "DTBtiCard::btiList :";
00474     std::cout << " invalid superlayer number: " << sl;
00475     std::cout << " empty list returned" << std::endl;
00476     return blist;
00477   }
00478 
00479   for(BTI_const_iter p=_btimap[sl-1].begin();p!=_btimap[sl-1].end();p++){
00480     blist.push_back((*p).second);
00481   }
00482   return blist;
00483 
00484 }
00485 
00486 DTBtiTrig*
00487 DTBtiCard::storeTrigger(DTBtiTrigData td) {
00488   DTBtiId btiid = td.parentId();
00489   if(!(btiid.wheel()==wheel() &&
00490        btiid.sector()==sector() &&
00491        btiid.station()==station()) ) return 0;
00492   std::cout << "DTBtiCard::trigger: trigger not belonging to this card! ";
00493   std::cout << "card=(" << wheel() << "," << station() << "," << sector() << ") ";
00494   std::cout << "trig=(" << btiid.wheel() << "," << btiid.station() << "," 
00495        << btiid.sector() << ")";
00496   // get the appropriate BTI
00497   DTBtiChip* bti = activeGetBTI(btiid.superlayer(), btiid.bti());
00498   // create a new trigger in the BTI
00499   DTBtiTrig* trig = new DTBtiTrig(bti,td);
00500   // add the trigger to the BTI
00501   bti->addTrig(td.step(),trig);
00502   // return the trigger
00503   return trig;
00504 }
00505 
00506 /*
00507 LocalPoint 
00508 DTBtiCard::localPosition(const DTTrigData* tr) const {
00509 //OBSOLETE!!!!!
00510   //@@ patch for Sun 4.2 compiler
00511   DTBtiTrigData* trig = dynamic_cast<DTBtiTrigData*>(const_cast<DTTrigData*>(tr));
00512   //  const DTBtiTrigData* trig = dynamic_cast<const DTBtiTrigData*>(tr);
00513   if(!trig) {
00514     std::cout << "DTBtiCard::localPosition called with wrong argument!" << std::endl;
00515     return LocalPoint(0,0,0);
00516   }
00517   float x = geom()->localPosition(trig->parentId()).x();
00518   float y = geom()->localPosition(trig->parentId()).y();
00519   float z = geom()->localPosition(trig->parentId()).z();
00520   
00521   //FE position
00522   int FE = geom()->posFE(trig->parentId().superlayer());
00523 
00524   //trigger position in the BTI frame
00525   float xt = 0;
00526   float yt = 0;
00527   float xtrig = (float)trig->X() * geom()->cellPitch() / (config()->ST());
00528   if(trig->btiSL()==2) 
00529     yt = - xtrig;
00530   else
00531     xt = + xtrig;
00532 
00533   if(FE==1){//FE in negative y
00534       xt = - xt;
00535       yt = - yt;
00536   }
00537 
00538   std::cout << "DTBtiCard::localPosition of BTI in ("<<x<<","<<y<<","<<z<<")"<<std::endl;
00539   std::cout << " called for trig "; 
00540   trig->print(); 
00541   std::cout << "in Local Point ("<<x+xt<<","<<y+yt<<","<<z<<")"<<std::endl;
00542 
00543   return LocalPoint(x+xt,y+yt,z);
00544 }
00545 */
00546 
00547 LocalPoint 
00548 DTBtiCard::localPosition(const DTTrigData* tr) const {
00549 //NEWGEO!!!
00550  DTBtiTrigData* trig = dynamic_cast<DTBtiTrigData*>(const_cast<DTTrigData*>(tr));
00551  if(!trig) {
00552     std::cout << "DTBtiCard::localPosition called with wrong argument!" << std::endl;
00553     return LocalPoint(0,0,0);
00554   }
00555 
00556   //BTI position in chamber frame
00557   float x = geom()->localPosition(trig->parentId()).x();
00558   float y = geom()->localPosition(trig->parentId()).y();
00559   float z = geom()->localPosition(trig->parentId()).z();
00560   
00561   //FE position
00562   int FE = geom()->posFE(trig->parentId().superlayer());
00563 
00564   //trigger position in the BTI frame
00565   float xt = 0;
00566   float yt = 0;
00567 
00568   DTBtiId _btiid = trig->parentId();
00569   float xtrig = (float)trig->X() * geom()->cellPitch() / (config_bti(_btiid)->ST());
00570   if(trig->btiSL()==2) 
00571     yt = - xtrig;
00572   else
00573     xt = + xtrig;
00574 
00575 //   17/07/06 Should be obsolete in CMSSW
00576 //   if(FE==1){//FE in negative y
00577 //       xt = - xt;
00578 //       yt = - yt;
00579 //   }
00580 
00581 
00582 
00583   if(debug()){
00584     std::cout << "DTBtiCard::localPosition of BTI in ("<<x<<","<<y<<","<<z<<")"<<std::endl;
00585     std::cout << " called for trig "; 
00586     trig->print(); 
00587     std::cout << "in Local Point ("<<x+xt<<","<<y+yt<<","<<z<<")"<<std::endl;
00588   }
00589 
00590   return LocalPoint(x+xt,y+yt,z);
00591 }
00592 
00593 
00594 LocalVector
00595 DTBtiCard::localDirection(const DTTrigData* tr) const {
00596 //NEWGEO
00597  DTBtiTrigData* trig = dynamic_cast<DTBtiTrigData*>(const_cast<DTTrigData*>(tr));
00598  //this method is only for check purpose
00599   if(!trig) {
00600     std::cout << "DTBtiCard::localDirection called with wrong argument!" << std::endl;
00601     return LocalVector(0,0,0);
00602   }
00603 
00604   //FE position
00605   //int FE = geom()->posFE(trig->parentId().superlayer());
00606 
00607   // psi in BTI frame
00608   DTBtiId _btiid = trig->parentId();
00609   float psi = atan((float)(trig->K() - config_bti(_btiid)->ST())*geom()->cellPitch()
00610                    /(2*geom()->cellH() * config_bti(_btiid)->ST()));
00611   // (xd,yd,zd) in chamber frame
00612   float xd=0;
00613   float yd=0;
00614   float zd=-cos(psi);
00615   if(trig->btiSL()==2) 
00616     yd = sin(psi);
00617   else
00618     xd = -sin(psi);
00619 
00620 // 17/07/06 Ths should be obsolete in CMSSW
00621 //   if(FE==1){//FE in negative y
00622 //       xd = - xd;
00623 //       yd = - yd;
00624 //  }
00625 
00626   if(debug()){
00627     //BTI position in chamber frame
00628     float xb = geom()->localPosition(trig->parentId()).x();
00629     float yb = geom()->localPosition(trig->parentId()).y();
00630     float zb = geom()->localPosition(trig->parentId()).z();
00631   
00632     std::cout << "DTBtiCard::localDirection of BTI in ("<<xb<<","<<yb<<","<<zb<<")"<<std::endl;
00633     std::cout << " called for trig "; 
00634     trig->print(); 
00635     std::cout << "in Local Direction ("<<xd<<","<<yd<<","<<zd<<")"<<std::endl;
00636   }
00637 
00638   return LocalVector(xd,yd,zd);
00639 }
00640 
00641 /*
00642 
00643 LocalVector
00644 DTBtiCard::localDirection(const DTTrigData* tr) const {
00645 //OBSOLETE!!!!
00646   //@@ patch for Sun 4.2 compiler
00647   const DTBtiTrigData* trig = dynamic_cast<const DTBtiTrigData*>(const_cast<DTTrigData*>(tr));
00648   //  const DTBtiTrigData* trig = dynamic_cast<const DTBtiTrigData*>(tr);
00649   if(!trig) {
00650     std::cout << "DTBtiCard::localDirection called with wrong argument!" << std::endl;
00651     return LocalVector(0,0,0);
00652   }
00653   float x1,r,x,y,z;
00654   x1 = -(float)trig->K() * geom()->cellPitch() /
00655                       (float)(config()->ST());
00656   z = - 2 * geom()->cellH();
00657   r = sqrt(x1*x1+z*z);
00658   if(trig->btiSL()!=2) {
00659     x = x1/r;
00660     y = 0;
00661   } else {
00662     x = 0;
00663     y = x1/r;
00664   }
00665   z /= r;
00666   return LocalVector(x,y,z);
00667 }
00668 */
00669 
00670 DTConfigBti* 
00671 DTBtiCard::config_bti(DTBtiId& btiid) const 
00672 {
00673   //loop on map to find bti
00674   ConfBtiMap::const_iterator biter = _conf_bti_map.find(btiid);
00675   if (biter == _conf_bti_map.end()){
00676     std::cout << "DTBtiCard::config_bti : BTI (" << btiid.wheel()
00677               << "," << btiid.sector()
00678               << "," << btiid.station()
00679               << "," << btiid.superlayer()
00680               << "," << btiid.bti()
00681               << ") not found, return 0" << std::endl;
00682     return 0;
00683   }
00684 
00685   return const_cast<DTConfigBti*>(&(*biter).second);
00686 
00687 }

Generated on Tue Jun 9 17:39:59 2009 for CMSSW by  doxygen 1.5.4