CMS 3D CMS Logo

EcalElectronicsMapping.h

Go to the documentation of this file.
00001 #ifndef ECALELECTRONICSMAPPING_H
00002 #define ECALELECTRONICSMAPPING_H 1
00003 
00004 #include <memory>
00005 #include <iostream>
00006 #include <string>
00007 
00008 #include "DataFormats/EcalDetId/interface/EcalDetIdCollections.h"
00009 #include "DataFormats/EcalDetId/interface/EcalSubdetector.h"
00010 
00011 
00012 #include <boost/multi_index_container.hpp>
00013 #include <boost/multi_index/member.hpp>
00014 #include <boost/multi_index/ordered_index.hpp>
00015 #include <boost/tuple/tuple.hpp>
00016 #include <boost/multi_index/mem_fun.hpp>
00017 #include <boost/multi_index/composite_key.hpp>
00018 
00019 #include "RecoEcal/EgammaCoreTools/interface/EcalEtaPhiRegion.h"
00020 
00021 
00022 #include <vector>
00023 #include <map>
00024 
00025 
00032 class EcalElectronicsMapping {
00033 
00034   
00035  public:
00036   
00037   EcalElectronicsMapping();
00038   
00040   EcalElectronicsId getElectronicsId(const DetId& id) const;
00041   
00043   EcalTriggerElectronicsId getTriggerElectronicsId(const DetId& id) const;
00044 
00046   DetId getDetId(const EcalElectronicsId& id) const;
00047 
00049   EcalTriggerElectronicsId getTriggerElectronicsId(const EcalElectronicsId& id) const;
00050 
00052   DetId getDetId(const EcalTriggerElectronicsId& id) const;
00053 
00055   EcalElectronicsId getElectronicsId(const EcalTriggerElectronicsId& id) const;
00056 
00058   std::vector<DetId> dccConstituents(int dccId) const;
00059 
00061   std::vector<DetId> dccTowerConstituents(int dccId, int tower) const;
00062 
00064   std::vector<DetId> stripConstituents(int dccId, int tower, int strip) const;
00065 
00067   std::vector<DetId> tccConstituents(int tccId) const;
00068 
00070   std::vector<DetId> ttConstituents(int tccId, int tt) const;
00071 
00073   std::vector<DetId> pseudoStripConstituents(int tccId, int tt, int pseudostrip) const;
00074 
00076   void assign(const DetId& cell, const EcalElectronicsId&, const EcalTriggerElectronicsId& tower);
00077 
00079   std::pair<int, int> getDCCandSC(EcalScDetId id) const;
00080 
00082   EcalScDetId getEcalScDetId(int DCCid, int DCC_Channel) const;
00083 
00085   int DCCid(const EBDetId& id) const;
00086 
00088   int TCCid(const EBDetId& id) const;
00089 
00091   int iTT(const EcalTrigTowerDetId& id) const;
00092 
00094   int TCCid(const EcalTrigTowerDetId& id) const;
00095 
00097   int DCCid(const EcalTrigTowerDetId& id) const;
00098 
00100   EcalTrigTowerDetId getTrigTowerDetId(int TCCid, int iTT) const;
00101 
00102   EcalSubdetector subdet(int dccid, int mode) const;
00103   int zside(int dcctcc, int mode) const;
00104 
00105   bool rightTower(int tower) const;
00106 
00107   // methods used for regional unpacking :
00108   std::vector<int> GetListofFEDs(const EcalEtaPhiRegion region) const ;
00109   void GetListofFEDs(const EcalEtaPhiRegion region, std::vector<int> & FEDs) const ;
00110   int GetFED(double eta, double phi) const ;
00111   int DCCBoundary(int FED) const;
00112 
00113   // methods for retrieving the Laser Monitoring readout number
00114 
00115   int getLMNumber(const DetId& id) const;
00116 
00117 
00118  // Geometry of SM in EB :
00119   static const int kCrystalsInPhi = EBDetId::kCrystalsInPhi ; // per SM
00120   static const int kTowersInPhi = EBDetId::kTowersInPhi ;  // per SM
00121 
00122  // Geometry of the Trigger Towers :
00123 
00124   static const int kEBTowersInPhi = EcalTrigTowerDetId::kEBTowersInPhi ; // per SM (in the Barrel)
00125   static const int kEBTowersPerSM = EcalTrigTowerDetId::kEBTowersPerSM ; // per SM (in the Barrel)
00126   static const int kEBTowersInEta = EcalTrigTowerDetId::kEBTowersInEta; // per SM (in the Barrel)
00127   static const int kEETowersInEta = EcalTrigTowerDetId::kEETowersInEta; // Endcap
00128   static const int kEETowersInPhiPerQuadrant = EcalTrigTowerDetId::kEETowersInPhiPerQuadrant; // per Quadrant (EE)
00129                                                                                                                                                     
00130   static const int kEETowersInPhiPerTCC = 4;    // each TCC contains 4 towers in phi
00131   static const int kEETowersInEtaPerInnerTCC = 7;   // each inner TCC contains 7 towers in eta
00132   static const int kEETowersInEtaPerOuterTCC = 4;   // each outer TCC contains 4 towers in eta
00133   static const int iEEEtaMinOuter = 18;         // outer TCC : ieta = 18 -> 21
00134   static const int iEEEtaMinInner = 22;         // inner TCC : ieta = 22 -> 28
00135 
00136 
00137  // DCC values :
00138   static const int MAX_DCCID = EcalElectronicsId::MAX_DCCID ; //To be updated with correct and final number
00139   static const int MIN_DCCID = EcalElectronicsId::MIN_DCCID;
00140   static const int MIN_DCCID_EEM = EcalElectronicsId::MIN_DCCID_EEM ;
00141   static const int MAX_DCCID_EEM = EcalElectronicsId::MAX_DCCID_EEM ;
00142   static const int MIN_DCCID_EBM = EcalElectronicsId::MIN_DCCID_EBM ;
00143   static const int MAX_DCCID_EBM = EcalElectronicsId::MAX_DCCID_EBM ;
00144   static const int MIN_DCCID_EBP = EcalElectronicsId::MIN_DCCID_EBP ;
00145   static const int MAX_DCCID_EBP = EcalElectronicsId::MAX_DCCID_EBP ;
00146   static const int MIN_DCCID_EEP = EcalElectronicsId::MIN_DCCID_EEP ;
00147   static const int MAX_DCCID_EEP = EcalElectronicsId::MAX_DCCID_EEP ;
00148 
00149   static const int DCCID_PHI0_EBM = EcalElectronicsId::DCCID_PHI0_EBM ;   // contains phi = 0 deg.
00150   static const int DCCID_PHI0_EBP = EcalElectronicsId::DCCID_PHI0_EBP ;
00151 
00152  // TCC values :
00153   static const int MAX_TCCID = EcalTriggerElectronicsId::MAX_TCCID ; //To be updated with correct and final number
00154   static const int MIN_TCCID = EcalTriggerElectronicsId::MIN_TCCID ;
00155   static const int MIN_TCCID_EEM = EcalTriggerElectronicsId::MIN_TCCID_EEM ;
00156   static const int MAX_TCCID_EEM = EcalTriggerElectronicsId::MAX_TCCID_EEM ;
00157   static const int MIN_TCCID_EBM = EcalTriggerElectronicsId::MIN_TCCID_EBM ;
00158   static const int MAX_TCCID_EBM = EcalTriggerElectronicsId::MAX_TCCID_EBM ;
00159   static const int MIN_TCCID_EBP = EcalTriggerElectronicsId::MIN_TCCID_EBP ;
00160   static const int MAX_TCCID_EBP = EcalTriggerElectronicsId::MAX_TCCID_EBP ;
00161   static const int MIN_TCCID_EEP = EcalTriggerElectronicsId::MIN_TCCID_EEP ;
00162   static const int MAX_TCCID_EEP = EcalTriggerElectronicsId::MAX_TCCID_EEP ;
00163 
00164   static const int TCCID_PHI0_EBM = EcalTriggerElectronicsId::TCCID_PHI0_EBM ;
00165   static const int TCCID_PHI0_EBP = EcalTriggerElectronicsId::TCCID_PHI0_EBP ;
00166 
00167   static const int TCCID_PHI0_EEM_IN = EcalTriggerElectronicsId::TCCID_PHI0_EEM_IN ;
00168   static const int TCCID_PHI0_EEM_OUT = EcalTriggerElectronicsId::TCCID_PHI0_EEM_OUT ;
00169   static const int TCCID_PHI0_EEP_IN = EcalTriggerElectronicsId::TCCID_PHI0_EEP_IN ;
00170   static const int TCCID_PHI0_EEP_OUT = EcalTriggerElectronicsId::TCCID_PHI0_EEP_OUT ;
00171 
00172   static const int kTCCinPhi = 18;      // Number of TCC "sectors" in phi
00173 
00174  // LaserMonitoring readout numbers :
00175   static const int MIN_LM_EEM = 73;     // corresponds to MIN_DCCID_EEM
00176   static const int MIN_LM_EBM = 1;      // corresponds to MIN_DCCID_EBM
00177   static const int MIN_LM_EBP = 37;     // corresponds to MIN_DCCID_EBP
00178   static const int MIN_LM_EEP = 83;     // corresponds to MIN_DCCID_EEP
00179   static const int MAX_LM =     92;     // Total number of LaserModules
00180 
00181 
00182  private:
00183 
00184   static const int DCCMODE = 0;
00185   static const int TCCMODE = 1;
00186 
00189   //  DetId wrapEEDetId(const DetId& id) const;
00191   //DetId wrapEcalTrigTowerDetId(const DetId& id) const;
00192   //DetId changeEEDetIdQuadrantAndZ(const DetId& fromid, const int& toQuadrant,const int& tozside) const;
00193   //  int changeTowerQuadrant(int phiTower, int fromQuadrant, int toQuadrant) const;
00194 
00195   struct MapItem {
00196     MapItem(const DetId& acell, const EcalElectronicsId& aelid, const EcalTriggerElectronicsId& atrelid) : cell(acell),elid(aelid),trelid(atrelid) { }
00197     DetId cell;
00198     EcalElectronicsId elid;
00199     EcalTriggerElectronicsId trelid;
00200     int dccId() const { return elid.dccId(); }
00201     int towerId() const {return elid.towerId(); }
00202     int stripId() const {return elid.stripId(); }
00203     int tccId() const { return trelid.tccId(); }
00204     int ttId() const { return trelid.ttId(); }
00205     int pseudoStripId() const { return trelid.pseudoStripId(); }
00206   };
00207 
00208 
00209   //hashed indexes to be preferred to ordered (faster for lookup, here we are not interested in ordering...)
00210   typedef boost::multi_index::multi_index_container<
00211     MapItem,
00212     boost::multi_index::indexed_by<
00213     // hashed_unique< member < MapItem,DetId,&MapItem::cell > >,
00214     // hashed_unique< member < MapItem,EcalElectronicsId,&MapItem::elid > >,
00215     // hashed_unique< member < MapItem,EcalTriggerElectronicsId,&MapItem::trelid > >
00216      boost::multi_index::ordered_unique< boost::multi_index::member < MapItem,DetId,&MapItem::cell > >,
00217      boost::multi_index::ordered_unique< boost::multi_index::member < MapItem,EcalElectronicsId,&MapItem::elid > >,
00218      boost::multi_index::ordered_unique< boost::multi_index::member < MapItem,EcalTriggerElectronicsId,&MapItem::trelid > >,
00219      boost::multi_index::ordered_non_unique< boost::multi_index::const_mem_fun < MapItem, int, &MapItem::dccId > >,
00220      boost::multi_index::ordered_non_unique<
00221         boost::multi_index::composite_key<
00222                 MapItem,
00223                 boost::multi_index::const_mem_fun < MapItem, int, &MapItem::dccId > ,
00224                 boost::multi_index::const_mem_fun < MapItem, int, &MapItem::towerId  >  
00225         > >,
00226      boost::multi_index::ordered_non_unique<
00227         boost::multi_index::composite_key<
00228                 MapItem,
00229                 boost::multi_index::const_mem_fun < MapItem, int, &MapItem::dccId > ,
00230                 boost::multi_index::const_mem_fun < MapItem, int, &MapItem::towerId  >,
00231                 boost::multi_index::const_mem_fun < MapItem, int, &MapItem::stripId >
00232         > >,
00233      boost::multi_index::ordered_non_unique< boost::multi_index::const_mem_fun < MapItem, int, &MapItem::tccId > >,
00234      boost::multi_index::ordered_non_unique<
00235         boost::multi_index::composite_key<
00236                 MapItem,
00237                 boost::multi_index::const_mem_fun < MapItem, int, &MapItem::tccId > ,
00238                 boost::multi_index::const_mem_fun < MapItem, int, &MapItem::ttId  >
00239         > >,
00240      boost::multi_index::ordered_non_unique<
00241         boost::multi_index::composite_key<
00242                 MapItem,
00243                 boost::multi_index::const_mem_fun < MapItem, int, &MapItem::tccId > ,
00244                 boost::multi_index::const_mem_fun < MapItem, int, &MapItem::ttId  >,
00245                 boost::multi_index::const_mem_fun < MapItem, int, &MapItem::pseudoStripId >
00246         > >
00247     >
00248     > EcalElectronicsMap;
00249   
00250    typedef EcalElectronicsMap::nth_index<0>::type EcalElectronicsMap_by_DetId;
00251    typedef EcalElectronicsMap::nth_index<1>::type EcalElectronicsMap_by_ElectronicsId;
00252    typedef EcalElectronicsMap::nth_index<2>::type EcalElectronicsMap_by_TriggerElectronicsId;
00253 
00254    typedef EcalElectronicsMap::nth_index<3>::type EcalElectronicsMap_by_DccId;
00255    typedef EcalElectronicsMap::nth_index<4>::type EcalElectronicsMap_by_DccId_and_TowerId;
00256    typedef EcalElectronicsMap::nth_index<5>::type EcalElectronicsMap_by_DccId_TowerId_and_StripId;
00257   
00258    typedef EcalElectronicsMap::nth_index<6>::type EcalElectronicsMap_by_TccId;
00259    typedef EcalElectronicsMap::nth_index<7>::type EcalElectronicsMap_by_TccId_and_TtId;
00260    typedef EcalElectronicsMap::nth_index<8>::type EcalElectronicsMap_by_TccId_TtId_and_PseudostripId;
00261 
00262 
00263   //Needed only in the EE (contains only first quadrant object) 
00264   EcalElectronicsMap m_items;
00265 
00266 
00267   // Maps between DCC and LaserMonitoring readout numbers (take care that EB DCCs and two EE DCCs
00268   // actually correspond to two LMs. The map contain only the first one).
00269   // The maps are filled in the constructor of EcalElectronicsMapping.
00270 
00271   std::map<int, int> LaserMonitoringMap_EB;
00272   std::map<int, int> LaserMonitoringMap_EE;
00273 
00274 };
00275 
00276 #endif

Generated on Tue Jun 9 17:37:25 2009 for CMSSW by  doxygen 1.5.4