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
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
00114
00115 int getLMNumber(const DetId& id) const;
00116
00117
00118
00119 static const int kCrystalsInPhi = EBDetId::kCrystalsInPhi ;
00120 static const int kTowersInPhi = EBDetId::kTowersInPhi ;
00121
00122
00123
00124 static const int kEBTowersInPhi = EcalTrigTowerDetId::kEBTowersInPhi ;
00125 static const int kEBTowersPerSM = EcalTrigTowerDetId::kEBTowersPerSM ;
00126 static const int kEBTowersInEta = EcalTrigTowerDetId::kEBTowersInEta;
00127 static const int kEETowersInEta = EcalTrigTowerDetId::kEETowersInEta;
00128 static const int kEETowersInPhiPerQuadrant = EcalTrigTowerDetId::kEETowersInPhiPerQuadrant;
00129
00130 static const int kEETowersInPhiPerTCC = 4;
00131 static const int kEETowersInEtaPerInnerTCC = 7;
00132 static const int kEETowersInEtaPerOuterTCC = 4;
00133 static const int iEEEtaMinOuter = 18;
00134 static const int iEEEtaMinInner = 22;
00135
00136
00137
00138 static const int MAX_DCCID = EcalElectronicsId::MAX_DCCID ;
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 ;
00150 static const int DCCID_PHI0_EBP = EcalElectronicsId::DCCID_PHI0_EBP ;
00151
00152
00153 static const int MAX_TCCID = EcalTriggerElectronicsId::MAX_TCCID ;
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;
00173
00174
00175 static const int MIN_LM_EEM = 73;
00176 static const int MIN_LM_EBM = 1;
00177 static const int MIN_LM_EBP = 37;
00178 static const int MIN_LM_EEP = 83;
00179 static const int MAX_LM = 92;
00180
00181
00182 private:
00183
00184 static const int DCCMODE = 0;
00185 static const int TCCMODE = 1;
00186
00189
00191
00192
00193
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
00210 typedef boost::multi_index::multi_index_container<
00211 MapItem,
00212 boost::multi_index::indexed_by<
00213
00214
00215
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
00264 EcalElectronicsMap m_items;
00265
00266
00267
00268
00269
00270
00271 std::map<int, int> LaserMonitoringMap_EB;
00272 std::map<int, int> LaserMonitoringMap_EE;
00273
00274 };
00275
00276 #endif