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
00090 std::pair<int, int> getDCCandSC(EcalScDetId id) const;
00091
00107 std::vector<EcalScDetId> getEcalScDetId(int DCCid, int DCC_Channel,
00108 bool ignoreSingleCrystal = true) const;
00109
00111 int DCCid(const EBDetId& id) const;
00112
00114 int TCCid(const EBDetId& id) const;
00115
00117 int iTT(const EcalTrigTowerDetId& id) const;
00118
00120 int TCCid(const EcalTrigTowerDetId& id) const;
00121
00123 int DCCid(const EcalTrigTowerDetId& id) const;
00124
00126 EcalTrigTowerDetId getTrigTowerDetId(int TCCid, int iTT) const;
00127
00128 EcalSubdetector subdet(int dccid, int mode) const;
00129 int zside(int dcctcc, int mode) const;
00130
00131 bool rightTower(int tower) const;
00132
00133
00134 std::vector<int> GetListofFEDs(const EcalEtaPhiRegion region) const ;
00135 void GetListofFEDs(const EcalEtaPhiRegion region, std::vector<int> & FEDs) const ;
00136 int GetFED(double eta, double phi) const ;
00137 int DCCBoundary(int FED) const;
00138
00139
00140
00141 int getLMNumber(const DetId& id) const;
00142
00143
00144
00145 static const int kCrystalsInPhi = EBDetId::kCrystalsInPhi ;
00146 static const int kTowersInPhi = EBDetId::kTowersInPhi ;
00147
00148
00149
00150 static const int kEBTowersInPhi = EcalTrigTowerDetId::kEBTowersInPhi ;
00151 static const int kEBTowersPerSM = EcalTrigTowerDetId::kEBTowersPerSM ;
00152 static const int kEBTowersInEta = EcalTrigTowerDetId::kEBTowersInEta;
00153 static const int kEETowersInEta = EcalTrigTowerDetId::kEETowersInEta;
00154 static const int kEETowersInPhiPerQuadrant = EcalTrigTowerDetId::kEETowersInPhiPerQuadrant;
00155
00156 static const int kEETowersInPhiPerTCC = 4;
00157 static const int kEETowersInEtaPerInnerTCC = 7;
00158 static const int kEETowersInEtaPerOuterTCC = 4;
00159 static const int iEEEtaMinOuter = 18;
00160 static const int iEEEtaMinInner = 22;
00161
00162
00163
00164 static const int MAX_DCCID = EcalElectronicsId::MAX_DCCID ;
00165 static const int MIN_DCCID = EcalElectronicsId::MIN_DCCID;
00166 static const int MIN_DCCID_EEM = EcalElectronicsId::MIN_DCCID_EEM ;
00167 static const int MAX_DCCID_EEM = EcalElectronicsId::MAX_DCCID_EEM ;
00168 static const int MIN_DCCID_EBM = EcalElectronicsId::MIN_DCCID_EBM ;
00169 static const int MAX_DCCID_EBM = EcalElectronicsId::MAX_DCCID_EBM ;
00170 static const int MIN_DCCID_EBP = EcalElectronicsId::MIN_DCCID_EBP ;
00171 static const int MAX_DCCID_EBP = EcalElectronicsId::MAX_DCCID_EBP ;
00172 static const int MIN_DCCID_EEP = EcalElectronicsId::MIN_DCCID_EEP ;
00173 static const int MAX_DCCID_EEP = EcalElectronicsId::MAX_DCCID_EEP ;
00174
00175 static const int DCCID_PHI0_EBM = EcalElectronicsId::DCCID_PHI0_EBM ;
00176 static const int DCCID_PHI0_EBP = EcalElectronicsId::DCCID_PHI0_EBP ;
00177
00178
00179 static const int MAX_TCCID = EcalTriggerElectronicsId::MAX_TCCID ;
00180 static const int MIN_TCCID = EcalTriggerElectronicsId::MIN_TCCID ;
00181 static const int MIN_TCCID_EEM = EcalTriggerElectronicsId::MIN_TCCID_EEM ;
00182 static const int MAX_TCCID_EEM = EcalTriggerElectronicsId::MAX_TCCID_EEM ;
00183 static const int MIN_TCCID_EBM = EcalTriggerElectronicsId::MIN_TCCID_EBM ;
00184 static const int MAX_TCCID_EBM = EcalTriggerElectronicsId::MAX_TCCID_EBM ;
00185 static const int MIN_TCCID_EBP = EcalTriggerElectronicsId::MIN_TCCID_EBP ;
00186 static const int MAX_TCCID_EBP = EcalTriggerElectronicsId::MAX_TCCID_EBP ;
00187 static const int MIN_TCCID_EEP = EcalTriggerElectronicsId::MIN_TCCID_EEP ;
00188 static const int MAX_TCCID_EEP = EcalTriggerElectronicsId::MAX_TCCID_EEP ;
00189
00190 static const int TCCID_PHI0_EBM = EcalTriggerElectronicsId::TCCID_PHI0_EBM ;
00191 static const int TCCID_PHI0_EBP = EcalTriggerElectronicsId::TCCID_PHI0_EBP ;
00192
00193 static const int TCCID_PHI0_EEM_IN = EcalTriggerElectronicsId::TCCID_PHI0_EEM_IN ;
00194 static const int TCCID_PHI0_EEM_OUT = EcalTriggerElectronicsId::TCCID_PHI0_EEM_OUT ;
00195 static const int TCCID_PHI0_EEP_IN = EcalTriggerElectronicsId::TCCID_PHI0_EEP_IN ;
00196 static const int TCCID_PHI0_EEP_OUT = EcalTriggerElectronicsId::TCCID_PHI0_EEP_OUT ;
00197
00198 static const int kTCCinPhi = 18;
00199
00200
00201 static const int MIN_LM_EEM = 73;
00202 static const int MIN_LM_EBM = 1;
00203 static const int MIN_LM_EBP = 37;
00204 static const int MIN_LM_EEP = 83;
00205 static const int MAX_LM = 92;
00206
00207
00208 private:
00209
00210 static const int DCCMODE = 0;
00211 static const int TCCMODE = 1;
00212
00215
00217
00218
00219
00220
00221 struct MapItem {
00222 MapItem(const DetId& acell, const EcalElectronicsId& aelid, const EcalTriggerElectronicsId& atrelid) : cell(acell),elid(aelid),trelid(atrelid) { }
00223 DetId cell;
00224 EcalElectronicsId elid;
00225 EcalTriggerElectronicsId trelid;
00226 int dccId() const { return elid.dccId(); }
00227 int towerId() const {return elid.towerId(); }
00228 int stripId() const {return elid.stripId(); }
00229 int tccId() const { return trelid.tccId(); }
00230 int ttId() const { return trelid.ttId(); }
00231 int pseudoStripId() const { return trelid.pseudoStripId(); }
00232 };
00233
00234
00235
00236 typedef boost::multi_index::multi_index_container<
00237 MapItem,
00238 boost::multi_index::indexed_by<
00239
00240
00241
00242 boost::multi_index::ordered_unique< boost::multi_index::member < MapItem,DetId,&MapItem::cell > >,
00243 boost::multi_index::ordered_unique< boost::multi_index::member < MapItem,EcalElectronicsId,&MapItem::elid > >,
00244 boost::multi_index::ordered_unique< boost::multi_index::member < MapItem,EcalTriggerElectronicsId,&MapItem::trelid > >,
00245 boost::multi_index::ordered_non_unique< boost::multi_index::const_mem_fun < MapItem, int, &MapItem::dccId > >,
00246 boost::multi_index::ordered_non_unique<
00247 boost::multi_index::composite_key<
00248 MapItem,
00249 boost::multi_index::const_mem_fun < MapItem, int, &MapItem::dccId > ,
00250 boost::multi_index::const_mem_fun < MapItem, int, &MapItem::towerId >
00251 > >,
00252 boost::multi_index::ordered_non_unique<
00253 boost::multi_index::composite_key<
00254 MapItem,
00255 boost::multi_index::const_mem_fun < MapItem, int, &MapItem::dccId > ,
00256 boost::multi_index::const_mem_fun < MapItem, int, &MapItem::towerId >,
00257 boost::multi_index::const_mem_fun < MapItem, int, &MapItem::stripId >
00258 > >,
00259 boost::multi_index::ordered_non_unique< boost::multi_index::const_mem_fun < MapItem, int, &MapItem::tccId > >,
00260 boost::multi_index::ordered_non_unique<
00261 boost::multi_index::composite_key<
00262 MapItem,
00263 boost::multi_index::const_mem_fun < MapItem, int, &MapItem::tccId > ,
00264 boost::multi_index::const_mem_fun < MapItem, int, &MapItem::ttId >
00265 > >,
00266 boost::multi_index::ordered_non_unique<
00267 boost::multi_index::composite_key<
00268 MapItem,
00269 boost::multi_index::const_mem_fun < MapItem, int, &MapItem::tccId > ,
00270 boost::multi_index::const_mem_fun < MapItem, int, &MapItem::ttId >,
00271 boost::multi_index::const_mem_fun < MapItem, int, &MapItem::pseudoStripId >
00272 > >
00273 >
00274 > EcalElectronicsMap;
00275
00276 typedef EcalElectronicsMap::nth_index<0>::type EcalElectronicsMap_by_DetId;
00277 typedef EcalElectronicsMap::nth_index<1>::type EcalElectronicsMap_by_ElectronicsId;
00278 typedef EcalElectronicsMap::nth_index<2>::type EcalElectronicsMap_by_TriggerElectronicsId;
00279
00280 typedef EcalElectronicsMap::nth_index<3>::type EcalElectronicsMap_by_DccId;
00281 typedef EcalElectronicsMap::nth_index<4>::type EcalElectronicsMap_by_DccId_and_TowerId;
00282 typedef EcalElectronicsMap::nth_index<5>::type EcalElectronicsMap_by_DccId_TowerId_and_StripId;
00283
00284 typedef EcalElectronicsMap::nth_index<6>::type EcalElectronicsMap_by_TccId;
00285 typedef EcalElectronicsMap::nth_index<7>::type EcalElectronicsMap_by_TccId_and_TtId;
00286 typedef EcalElectronicsMap::nth_index<8>::type EcalElectronicsMap_by_TccId_TtId_and_PseudostripId;
00287
00288
00289
00290 EcalElectronicsMap m_items;
00291
00292
00293
00294
00295
00296
00297 std::map<int, int> LaserMonitoringMap_EB;
00298 std::map<int, int> LaserMonitoringMap_EE;
00299
00300 };
00301
00302 #endif