00001 #include "Geometry/CaloTopology/interface/HcalTopology.h" 00002 #include "CondFormats/HcalObjects/interface/HcalCondObjectContainer.h" 00003 #include "DataFormats/HcalDetId/interface/HcalCastorDetId.h" 00004 #include "DataFormats/HcalDetId/interface/HcalCalibDetId.h" 00005 #include "DataFormats/HcalDetId/interface/HcalZDCDetId.h" 00006 #include "DataFormats/HcalDetId/interface/HcalTrigTowerDetId.h" 00007 #include "DataFormats/HcalDetId/interface/HcalDetId.h" 00008 #include "FWCore/MessageLogger/interface/MessageLogger.h" 00009 #include "FWCore/Utilities/interface/Exception.h" 00010 00011 HcalCondObjectContainerBase::HcalCondObjectContainerBase(const HcalTopology* topo) : packedIndexVersion_(0), topo_(topo) { 00012 if (topo_) packedIndexVersion_=topo_->topoVersion(); 00013 } 00014 00015 void HcalCondObjectContainerBase::setTopo(const HcalTopology* topo) const { 00016 if (topo && !topo->denseIdConsistent(packedIndexVersion_)) { 00017 edm::LogError("HCAL") << std::string("Inconsistent dense packing between current topology (") << topo->topoVersion() << ") and calibration object (" << packedIndexVersion_ << ")"; 00018 } 00019 topo_=topo; 00020 } 00021 void HcalCondObjectContainerBase::setTopo(const HcalTopology* topo) { 00022 if (topo && !topo->denseIdConsistent(packedIndexVersion_)) { 00023 edm::LogError("HCAL") << "Inconsistent dense packing between current topology (" << topo->topoVersion() << ") and calibration object (" << packedIndexVersion_ << ")"; 00024 } 00025 topo_=topo; 00026 } 00027 00028 unsigned int HcalCondObjectContainerBase::indexFor(DetId fId) const { 00029 unsigned int retval=0xFFFFFFFFu; 00030 if (!topo_) { 00031 edm::LogError("HCAL") << "Topology pointer not set, HCAL conditions non-functional"; 00032 throw cms::Exception("Topology pointer not set, HCAL conditions non-functional"); 00033 return retval; 00034 } 00035 00036 if (fId.det()==DetId::Hcal) { 00037 switch (HcalSubdetector(fId.subdetId())) { 00038 case(HcalBarrel) : retval=topo_->detId2denseIdHB(fId); break; 00039 case(HcalEndcap) : retval=topo_->detId2denseIdHE(fId); break; 00040 case(HcalOuter) : retval=topo_->detId2denseIdHO(fId); break; 00041 case(HcalForward) : retval=topo_->detId2denseIdHF(fId); break; 00042 case(HcalTriggerTower) : retval=topo_->detId2denseIdHT(fId); break; 00043 case(HcalOther) : if (extractOther(fId)==HcalCalibration) 00044 retval=topo_->detId2denseIdCALIB(fId); 00045 break; 00046 default: break; 00047 } 00048 } else if (fId.det()==DetId::Calo) { 00049 if (fId.subdetId()==HcalCastorDetId::SubdetectorId) { 00050 // the historical packing from HcalGeneric is different from HcalCastorDetId, so we clone the old packing here. 00051 HcalCastorDetId tid(fId); 00052 int zside = tid.zside(); 00053 int sector = tid.sector(); 00054 int module = tid.module(); 00055 static const int CASTORhalf=224; 00056 00057 int index = 14*(sector-1) + (module-1); 00058 if (zside == -1) index += CASTORhalf; 00059 00060 retval=(unsigned int)(index); 00061 } else if (fId.subdetId()==HcalZDCDetId::SubdetectorId) { 00062 HcalZDCDetId direct(fId); 00063 // THIS IS A HORRIBLE HACK because there were _two_ dense indices for ZDC differing in their handling of +/-z 00064 HcalZDCDetId swapZ(direct.section(),direct.zside()<0,direct.channel()); 00065 retval=swapZ.denseIndex(); 00066 } 00067 } 00068 return retval; 00069 } 00070 00071 unsigned int HcalCondObjectContainerBase::sizeFor(DetId fId) const { 00072 unsigned int retval=0; 00073 00074 if (!topo_) { 00075 edm::LogError("HCAL") << "Topology pointer not set, HCAL conditions non-functional"; 00076 throw cms::Exception("Topology pointer not set, HCAL conditions non-functional"); 00077 return retval; 00078 } 00079 00080 if (fId.det()==DetId::Hcal) { 00081 switch (HcalSubdetector(fId.subdetId())) { 00082 case(HcalBarrel) : retval=topo_->getHBSize(); break; 00083 case(HcalEndcap) : retval=topo_->getHESize(); break; 00084 case(HcalOuter) : retval=topo_->getHOSize(); break; 00085 case(HcalForward) : retval=topo_->getHFSize(); break; 00086 case(HcalTriggerTower) : retval=topo_->getHTSize(); break; 00087 case(HcalOther) : if (extractOther(fId)==HcalCalibration) retval=topo_->getCALIBSize(); 00088 break; 00089 default: break; 00090 } 00091 } else if (fId.det()==DetId::Calo) { 00092 if (fId.subdetId()==HcalCastorDetId::SubdetectorId) { 00093 retval=HcalCastorDetId::kSizeForDenseIndexing; 00094 } else if (fId.subdetId()==HcalZDCDetId::SubdetectorId) { 00095 retval=HcalZDCDetId::kSizeForDenseIndexing; 00096 } 00097 } 00098 return retval; 00099 } 00100 00101 std::string HcalCondObjectContainerBase::textForId(const DetId& id) const { 00102 std::ostringstream os; 00103 os << std::hex << "(0x" << id.rawId() << ") " << std::dec; 00104 00105 if (id.det()==DetId::Hcal) { 00106 switch (HcalSubdetector(id.subdetId())) { 00107 case(HcalBarrel) : 00108 case(HcalEndcap) : 00109 case(HcalOuter) : 00110 case(HcalForward) : os << HcalDetId(id); break; 00111 case(HcalTriggerTower) : os << HcalTrigTowerDetId(id); break; 00112 case(HcalOther) : 00113 if (extractOther(id)==HcalCalibration) os << HcalCalibDetId(id); 00114 break; 00115 default: break; 00116 } 00117 } else if (id.det()==DetId::Calo) { 00118 if (id.subdetId()==HcalCastorDetId::SubdetectorId) { 00119 os << HcalCastorDetId(id); 00120 } else if (id.subdetId()==HcalZDCDetId::SubdetectorId) { 00121 os << HcalZDCDetId(id); 00122 } 00123 } 00124 return os.str(); 00125 }