Go to the documentation of this file.00001
00011 #include <iostream>
00012 #include <set>
00013
00014 #include "CondFormats/HcalObjects/interface/HcalDcsMap.h"
00015 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00016
00017 HcalDcsMap::HcalDcsMap() :
00018
00019
00020 sortedById(false),
00021 sortedByDcsId(false){
00022 }
00023
00024 HcalDcsMap::~HcalDcsMap(){
00025 }
00026
00027 namespace hcal_impl {
00028 class LessById {
00029 public:
00030 bool operator () (const HcalDcsMap::Item* a,
00031 const HcalDcsMap::Item* b) {
00032 return a->mId < b->mId;
00033 }
00034 };
00035
00036 class LessByDcsId {
00037 public:
00038 bool operator () (const HcalDcsMap::Item* a,
00039 const HcalDcsMap::Item* b) {
00040 return a->mDcsId < b->mDcsId;
00041 }
00042 };
00043 }
00044
00045 HcalDcsMap::const_iterator HcalDcsMap::beginById(void) const{
00046 const_iterator _iter;
00047 if (!sortedById) sortById();
00048 _iter.fIter = mItemsById.begin();
00049 return _iter;
00050 }
00051
00052 HcalDcsMap::const_iterator HcalDcsMap::beginByDcsId(void) const{
00053 const_iterator _iter;
00054 if (!sortedByDcsId) sortByDcsId();
00055 _iter.fIter = mItemsByDcsId.begin();
00056 return _iter;
00057 }
00058
00059 HcalDcsMap::const_iterator HcalDcsMap::endById(void) const{
00060 const_iterator _iter;
00061 if (!sortedById) sortById();
00062 _iter.fIter = mItemsById.end();
00063 return _iter;
00064 }
00065
00066 HcalDcsMap::const_iterator HcalDcsMap::endByDcsId(void) const{
00067 const_iterator _iter;
00068 if (!sortedByDcsId) sortByDcsId();
00069 _iter.fIter = mItemsByDcsId.end();
00070 return _iter;
00071 }
00072
00073
00074 bool HcalDcsMap::const_iterator::operator!=(const HcalDcsMap::const_iterator & other){
00075 if (fIter != other.fIter) return true;
00076 else return false;
00077 }
00078
00079 HcalDcsMap::const_iterator HcalDcsMap::const_iterator::operator++(){
00080 ++fIter;
00081 return *this;
00082 }
00083
00084 HcalDcsMap::const_iterator HcalDcsMap::const_iterator::operator++(int){
00085 const_iterator i = *this;
00086 ++fIter;
00087 return i;
00088 }
00089
00090 void HcalDcsMap::const_iterator::next(void){
00091 ++fIter;
00092 }
00093
00094 HcalDcsDetId HcalDcsMap::const_iterator::getHcalDcsDetId(void){
00095 return (*fIter)->mDcsId;
00096 }
00097
00098 HcalDetId HcalDcsMap::const_iterator::getHcalDetId(void){
00099 return (*fIter)->mId;
00100 }
00101
00102
00103 const std::vector<const HcalDcsMap::Item *> HcalDcsMap::findById (unsigned long fId) const {
00104 Item target (fId, 0);
00105 std::vector<const HcalDcsMap::Item*>::const_iterator item;
00106 std::vector<const HcalDcsMap::Item *> result;
00107
00108 if (!sortedById) sortById();
00109
00110 hcal_impl::LessById lessById;
00111 item = std::lower_bound (mItemsById.begin(), mItemsById.end(), &target, lessById);
00112 if (item == mItemsById.end() || (*item)->mId != fId){
00113
00114 return result;
00115 }
00116 else{
00117 if(item != mItemsById.end() && !lessById(&target, *item)){
00118 result.push_back( *item );
00119 ++item;
00120 }
00121 }
00122 return result;
00123 }
00124
00125 const std::vector<const HcalDcsMap::Item *> HcalDcsMap::findByDcsId (unsigned long fDcsId) const {
00126 Item target (0, fDcsId);
00127 std::vector<const HcalDcsMap::Item*>::const_iterator item;
00128 std::vector<const HcalDcsMap::Item *> result;
00129
00130 if (!sortedByDcsId) sortByDcsId();
00131
00132 hcal_impl::LessByDcsId lessByDcsId;
00133 item = std::lower_bound (mItemsByDcsId.begin(), mItemsByDcsId.end(), &target, lessByDcsId);
00134 if (item == mItemsByDcsId.end() || (*item)->mDcsId != fDcsId) {
00135
00136 return result;
00137 }
00138 else{
00139 if(item != mItemsByDcsId.end() && !lessByDcsId(&target, *item)){
00140 result.push_back( *item );
00141 ++item;
00142 }
00143 }
00144 return result;
00145 }
00146
00147 const std::vector<HcalDetId> HcalDcsMap::lookup(HcalDcsDetId fId ) const{
00148
00149
00150
00151 HcalDcsDetId fDcsId_notype(fId.subdet(),
00152 fId.ring(),
00153 fId.slice(),
00154 HcalDcsDetId::DCSUNKNOWN,
00155 fId.subchannel());
00156 const std::vector<const Item *> items = findByDcsId (fDcsId_notype.rawId ());
00157 std::vector<HcalDetId> _ids;
00158 for (std::vector<const Item *>::const_iterator item = items.begin();
00159 item != items.end();
00160 ++item){
00161 _ids.push_back( DetId(*item ? (*item)->mId : 0) );
00162 }
00163 return _ids;
00164 }
00165
00166 const std::vector<HcalDcsDetId> HcalDcsMap::lookup(HcalDetId fId, HcalDcsDetId::DcsType type) const {
00167 const std::vector<const Item *> items = findById (fId.rawId ());
00168 std::vector<HcalDcsDetId> _ids;
00169 for (std::vector<const Item *>::const_iterator item = items.begin();
00170 item != items.end();
00171 ++item){
00172 HcalDcsDetId _id(*item ? (*item)->mId : 0);
00173 _ids.push_back( HcalDcsDetId(_id.subdet(),
00174 _id.zside()*_id.ring(),
00175 _id.slice(),
00176 type,
00177 _id.subchannel()
00178 )
00179 );
00180 }
00181 return _ids;
00182 }
00183
00184
00185 std::vector <HcalDcsDetId> HcalDcsMap::allHcalDcsDetId () const {
00186 std::vector <HcalDcsDetId> result;
00187 for (std::vector<Item>::const_iterator item = mItems.begin (); item != mItems.end (); item++)
00188 if (item->mDcsId) result.push_back(HcalDcsDetId(item->mDcsId));
00189 return result;
00190 }
00191
00192
00193 std::vector <HcalGenericDetId> HcalDcsMap::allHcalDetId () const {
00194 std::vector <HcalGenericDetId> result;
00195 std::set <unsigned long> allIds;
00196 for (std::vector<Item>::const_iterator item = mItems.begin (); item != mItems.end (); item++)
00197 if (item->mId) allIds.insert (item->mId);
00198 for (std::set <unsigned long>::const_iterator channel = allIds.begin (); channel != allIds.end (); channel++) {
00199 result.push_back (HcalGenericDetId (*channel));
00200 }
00201 return result;
00202 }
00203
00204
00205 bool HcalDcsMap::mapGeomId2DcsId (HcalDetId fId, HcalDcsDetId fDcsId) {
00206
00207
00208
00209 HcalDcsDetId fDcsId_notype(fDcsId.subdet(),
00210 fDcsId.ring(),
00211 fDcsId.slice(),
00212 HcalDcsDetId::DCSUNKNOWN,
00213 fDcsId.subchannel());
00214 const std::vector<const Item *> items = findByDcsId(fDcsId_notype);
00215 for (std::vector<const Item *>::const_iterator item = items.begin();
00216 item != items.end();
00217 ++item){
00218 if ((*item)->mId == fId){
00219 edm::LogWarning("HCAL") << "HcalDcsMap::mapGeomId2DcsId-> Geom channel " << fId
00220 << " already mapped to DCS channel " << fDcsId_notype;
00221 return false;
00222 }
00223 }
00224 Item _item(fId, fDcsId_notype);
00225 mItems.push_back(_item);
00226 sortedById=false;
00227 sortedByDcsId=false;
00228 return true;
00229 }
00230
00231
00232 void HcalDcsMap::sortById () const {
00233 if (!sortedById) {
00234 mItemsById.clear();
00235 for (std::vector<Item>::const_iterator i=mItems.begin(); i!=mItems.end(); ++i) {
00236 if (i->mDcsId) mItemsById.push_back(&(*i));
00237 }
00238 std::sort (mItemsById.begin(), mItemsById.end(), hcal_impl::LessById ());
00239 sortedById=true;
00240 }
00241 }
00242
00243 void HcalDcsMap::sortByDcsId () const {
00244 if (!sortedByDcsId) {
00245 mItemsByDcsId.clear();
00246 for (std::vector<Item>::const_iterator i=mItems.begin(); i!=mItems.end(); ++i) {
00247 if (i->mDcsId) mItemsByDcsId.push_back(&(*i));
00248 }
00249
00250 std::sort (mItemsByDcsId.begin(), mItemsByDcsId.end(), hcal_impl::LessByDcsId ());
00251 sortedByDcsId=true;
00252 }
00253 }