CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_5_3_0/src/L1Trigger/DTTriggerServerTheta/src/DTTSTheta.cc

Go to the documentation of this file.
00001 //-------------------------------------------------
00002 //
00003 //   Class: L1MuDTTSTheta.cpp
00004 //
00005 //   Description: Implementation of TS Theta trigger algorithm
00006 //
00007 //
00008 //   Author List:
00009 //   C. Grandi
00010 //   Modifications: 
00011 //   III/2005 : Sara Vanini NEWGEO update
00012 //   I/2007 : Carlo Battilana Config class update
00013 //   mar07 - S. Vanini : parameters from DTConfigManager 
00014 //
00015 //--------------------------------------------------
00016 
00017 //-----------------------
00018 // This Class's Header --
00019 //-----------------------
00020 #include "L1Trigger/DTTriggerServerTheta/interface/DTTSTheta.h"
00021 
00022 //-------------------------------
00023 // Collaborating Class Headers --
00024 //-------------------------------
00025 #include "L1Trigger/DTTriggerServerTheta/interface/DTChambThSegm.h"
00026 #include "L1Trigger/DTBti/interface/DTBtiCard.h"
00027 #include "L1Trigger/DTBti/interface/DTBtiTrigData.h"
00028 
00029 //---------------
00030 // C++ Headers --
00031 //---------------
00032 #include <iostream>
00033 
00034 //----------------
00035 // Constructors --
00036 //----------------
00037 DTTSTheta::DTTSTheta(DTTrigGeom* geom, DTBtiCard* bticard) : 
00038   DTGeomSupplier(geom),  _bticard(bticard) {
00039 
00040   for(int i=0;i<DTConfigTSTheta::NSTEPL-DTConfigTSTheta::NSTEPF+1;i++){
00041     _trig[i].zero();
00042     _Htrig[i].zero();
00043     _ntrig[i] = 0;
00044     _nHtrig[i] = 0;
00045   }
00046 
00047 }
00048 
00049 
00050 //--------------
00051 // Destructor --
00052 //--------------
00053 DTTSTheta::~DTTSTheta(){
00054   //delete _config;
00055 }
00056 
00057 
00058 //--------------
00059 // Operations --
00060 //--------------
00061 
00062 void
00063 DTTSTheta::localClear() {
00064   for(int is=0;is<DTConfigTSTheta::NSTEPL-DTConfigTSTheta::NSTEPF+1;is++){
00065     // clear input bit masks
00066     _trig[is].zero();
00067     _Htrig[is].zero();
00068     _ntrig[is] = 0;
00069     _nHtrig[is] = 0;
00070   }
00071 }
00072 
00073 void
00074 DTTSTheta::setConfig(const DTConfigManager *conf){
00075   
00076         DTChamberId sid = ChamberId();
00077         _config = conf->getDTConfigTSTheta(sid);
00078 
00079 }
00080 
00081 void 
00082 DTTSTheta::loadDTTSTheta() {
00083   localClear();
00084   if(station()==4)return;
00085  
00086   if(config()->debug()){
00087     std::cout << "DTTSTheta::loadDTTSTheta called for wheel=" << wheel() ;
00088     std::cout <<                                ", station=" << station();
00089     std::cout <<                                ", sector="  << sector() << std::endl;
00090   }
00091 
00092   // loop on all BTI triggers
00093   std::vector<DTBtiTrigData>::const_iterator p;
00094   std::vector<DTBtiTrigData>::const_iterator pend=_bticard->end();
00095   for(p=_bticard->begin();p!=pend;p++){
00096     // Look only to BTIs in SL 2
00097     if (p->btiSL() == 2) {
00098       // BTI number
00099       int step = p->step();
00100       add_btiT( step, &(*p) );
00101     }
00102   }
00103 
00104 }
00105 
00106 void 
00107 DTTSTheta::add_btiT(int step, const DTBtiTrigData* btitrig){
00108   int n = btitrig->btiNumber();
00109 
00110 /*
00111 OBSOLETE! in NEWGEO the bti number order is the correct one!
00112   // check where the BTI is, and reverse the order in stat 1 and 2 and 3 (only for some sectors)
00113 
00114   if( (wheel()==0 && (sector()==1 ||  sector()==4 || sector()==5 ||
00115                       sector()==8 || sector()==9 || sector()==12))
00116       || wheel()==-1 
00117       || wheel()==-2)
00118     {n=DTConfigTSTheta::NCELLTH + 1 - n; }
00119   
00120 */
00121 
00122   if( n<1 || n>geom()->nCell(2) ) {
00123     std::cout << "DTTSTheta::add_btiT: BTI out of range: " << n;
00124     std::cout << " trigger not added!" << std::endl;
00125     return;
00126   }
00127   if(step<DTConfigTSTheta::NSTEPF||step>DTConfigTSTheta::NSTEPL){
00128     std::cout << "DTTSTheta::add_btiT: step out of range: " << step;
00129     std::cout << " trigger not added!" << std::endl;
00130     return;
00131   }
00132   _trig[step-DTConfigTSTheta::NSTEPF].set(n-1);
00133   _ntrig[step-DTConfigTSTheta::NSTEPF]++;
00134 
00135   if(btitrig->code()==8){
00136     _Htrig[step-DTConfigTSTheta::NSTEPF].set(n-1);
00137     _nHtrig[step-DTConfigTSTheta::NSTEPF]++;
00138   }
00139 
00140   if(config()->debug()){
00141     std::cout << "BTI Trigger added at step " << step;
00142     std::cout << " to DTTSTheta at position " << n <<  std::endl;
00143   }
00144   return;
00145 }
00146 
00147 void
00148 DTTSTheta::runDTTSTheta() {
00149   // Just make a DTChambThSegm for each step and store it
00150   for(int is=DTConfigTSTheta::NSTEPF;is<DTConfigTSTheta::NSTEPL+1;is++) {
00151     if(_ntrig[is-DTConfigTSTheta::NSTEPF]>0) {
00152       int i=0;
00153       int code[8];
00154       int pos[8];
00155       int qual[8];
00156       for(i=0;i<8;i++) {
00157         //@@ MULT not implemented:
00158         pos[i]=btiMask(is)->byte(i).any();
00159         qual[i]=btiQual(is)->byte(i).any();
00160         code[i]=pos[i]+qual[i];
00161       }
00162 
00163       // SM .OR. response of BTI number 57 in previous group of 8 BTIs 
00164 
00165       if(pos[7] > pos[6])    pos[6]=pos[7];
00166       if(qual[7] > qual[6])   qual[6]=qual[7]; 
00167       if(code[7] > code[6])   code[6]=code[7]; 
00168 
00169       
00170       if(config()->debug()){
00171       std::cout  << " wheel = " << wheel() << " station = " << station() << " sector = " << sector() << std::endl;
00172         std::cout << " pos :  ";
00173         for(i=0;i<8;i++) {
00174           std::cout << pos[i] << " ";
00175         }
00176         std::cout << std::endl;
00177         std::cout << " qual :  ";
00178         for(i=0;i<8;i++) {
00179           std::cout << qual[i] << " ";
00180         }
00181         std::cout << std::endl;
00182         std::cout << " code :  ";
00183         for(i=0;i<8;i++) {
00184           std::cout << code[i] << " ";
00185 
00186         }
00187         std::cout << std::endl;
00188         std::cout << std::endl;
00189       }
00190 
00191       _cache.push_back(DTChambThSegm(ChamberId(),is,pos,qual));
00192     }
00193   }
00194 
00195   // debugging...
00196   if(config()->debug()){
00197     if(_cache.size()>0){
00198       std::cout << "====================================================" << std::endl;
00199       std::cout << "                 Theta segments                     " << std::endl;
00200       std::vector<DTChambThSegm>::const_iterator p;
00201       for(p=_cache.begin();p<_cache.end();p++) {
00202         p->print();
00203       }
00204       std::cout << "====================================================" << std::endl;
00205     }
00206   }
00207   // end debugging
00208   
00209 }
00210 
00211 int 
00212 DTTSTheta::nSegm(int step) {
00213   int n=0;
00214   std::vector<DTChambThSegm>::const_iterator p;
00215   for(p=begin(); p<end(); p++) {
00216     if(p->step()==step)n++;
00217   }
00218   return n;
00219 }
00220 
00221 const DTChambThSegm*
00222 DTTSTheta::segment(int step, unsigned n) {
00223   std::vector<DTChambThSegm>::const_iterator p;
00224   for(p=begin();p<end();p++){
00225     if(p->step()==step&&n==1)
00226       return &(*p);
00227   }
00228   return 0;
00229 }
00230 
00231 int 
00232 DTTSTheta::nTrig(int step) {
00233   if(step<DTConfigTSTheta::NSTEPF||step>DTConfigTSTheta::NSTEPL){
00234     std::cout << "DTTSTheta::nTrig: step out of range " << step;
00235     std::cout << " 0 returned" << std::endl;
00236     return 0;
00237   }
00238   if(size()>0) return _ntrig[step-DTConfigTSTheta::NSTEPF];
00239   return 0;
00240 }
00241 
00242 int 
00243 DTTSTheta::nHTrig(int step) { 
00244   if(step<DTConfigTSTheta::NSTEPF||step>DTConfigTSTheta::NSTEPL){
00245     std::cout << "DTTSTheta::nHTrig: step out of range " << step;
00246     std::cout << " 0 returned" << std::endl;
00247     return 0;
00248   }
00249   if(size()>0) return _nHtrig[step-DTConfigTSTheta::NSTEPF]; 
00250   return 0;
00251 }
00252 
00253 BitArray<DTConfigTSTheta::NCELLTH>*
00254 DTTSTheta::btiMask(int step) const {
00255   if(step<DTConfigTSTheta::NSTEPF||step>DTConfigTSTheta::NSTEPL){
00256     std::cout << "DTTSTheta::btiMask: step out of range " << step;
00257     std::cout << " empty pointer returned" << std::endl;
00258     return 0;
00259   }
00260   return (BitArray<DTConfigTSTheta::NCELLTH>*)&_trig[step-DTConfigTSTheta::NSTEPF]; 
00261 }
00262 
00263 BitArray<DTConfigTSTheta::NCELLTH>*
00264 DTTSTheta::btiQual(int step) const {
00265   if(step<DTConfigTSTheta::NSTEPF||step>DTConfigTSTheta::NSTEPL){
00266     std::cout << "DTTSTheta::btiQual: step out of range " << step;
00267     std::cout << " empty pointer returned" << std::endl;
00268     return 0;
00269   }
00270   return (BitArray<DTConfigTSTheta::NCELLTH>*)&_Htrig[step-DTConfigTSTheta::NSTEPF]; 
00271 }
00272 
00273 LocalPoint 
00274 DTTSTheta::localPosition(const DTTrigData* tr) const {
00275   //const DTChambThSegm* trig = dynamic_cast<const DTChambThSegm*>(tr);
00276   //@@ Not implemented yet
00277   return LocalPoint(0,0,0);
00278 }
00279 
00280 LocalVector 
00281 DTTSTheta::localDirection(const DTTrigData* tr) const  {
00282   //const DTChambThSegm* trig = dynamic_cast<const DTChambThSegm*>(tr);
00283   //@@ Not implemented yet
00284   return LocalVector(0,0,0);
00285 }
00286 
00287 void
00288 DTTSTheta::print(const DTTrigData* trig) const {
00289   trig->print();
00290   //@@ coordinate printing not implemented yet
00291   //@@ rermove this method as soon as the local coordinates are meaningful
00292   
00293 }