00001 #include "CondFormats/HcalObjects/interface/HcalCovarianceMatrices.h" 00002 00003 00004 HcalCovarianceMatrices::HcalCovarianceMatrices() 00005 { 00006 } 00007 00008 HcalCovarianceMatrices::~HcalCovarianceMatrices() 00009 { 00010 } 00011 00012 void 00013 HcalCovarianceMatrices::initContainer(int container, bool h2mode_) 00014 { 00015 HcalCovarianceMatrix emptyHcalCovarianceMatrix; 00016 00017 switch (container) 00018 { 00019 case HcalGenericDetId::HcalGenBarrel: 00020 for (int i=0; i<(2*HcalGenericDetId::HBhalf); i++) HBcontainer.push_back(emptyHcalCovarianceMatrix); break; 00021 case HcalGenericDetId::HcalGenEndcap: 00022 if (!h2mode_) for (int i=0; i<(2*HcalGenericDetId::HEhalf); i++) HEcontainer.push_back(emptyHcalCovarianceMatrix); 00023 else for (int i=0; i<(2*HcalGenericDetId::HEhalfh2mode); i++) HEcontainer.push_back(emptyHcalCovarianceMatrix); 00024 break; 00025 case HcalGenericDetId::HcalGenOuter: 00026 for (int i=0; i<(2*HcalGenericDetId::HOhalf); i++) HOcontainer.push_back(emptyHcalCovarianceMatrix); break; 00027 case HcalGenericDetId::HcalGenForward: 00028 for (int i=0; i<(2*HcalGenericDetId::HFhalf); i++) HFcontainer.push_back(emptyHcalCovarianceMatrix); break; 00029 default: break; 00030 } 00031 } 00032 00033 00034 const HcalCovarianceMatrix* 00035 HcalCovarianceMatrices::getValues(DetId fId) const 00036 { 00037 HcalGenericDetId myId(fId); 00038 bool h2mode_ = (HEcontainer.size()==(2*HcalGenericDetId::HEhalfh2mode)); 00039 00040 int index = myId.hashedId(h2mode_); 00041 // std::cout << "::::: getting values at index " << index << ", DetId " << myId << std::endl; 00042 unsigned int index1 = abs(index); // b/c I'm fed up with compiler warnings about comparison betw. signed and unsigned int 00043 00044 const HcalCovarianceMatrix* cell = NULL; 00045 if (index >= 0) 00046 switch (myId.genericSubdet() ) { 00047 case HcalGenericDetId::HcalGenBarrel: 00048 if (index1 < HBcontainer.size()) 00049 cell = &(HBcontainer.at(index1) ); 00050 break; 00051 case HcalGenericDetId::HcalGenEndcap: 00052 if (index1 < HEcontainer.size()) 00053 cell = &(HEcontainer.at(index1) ); 00054 break; 00055 case HcalGenericDetId::HcalGenOuter: 00056 if (index1 < HOcontainer.size()) 00057 cell = &(HOcontainer.at(index1) ); 00058 break; 00059 case HcalGenericDetId::HcalGenForward: 00060 if (index1 < HFcontainer.size()) 00061 cell = &(HFcontainer.at(index1) ); 00062 break; 00063 default: break; 00064 } 00065 00066 // HcalCovarianceMatrix emptyHcalCovarianceMatrix; 00067 // if (cell->rawId() == emptyHcalCovarianceMatrix.rawId() ) 00068 if ((!cell) || (cell->rawId() != fId ) ) 00069 throw cms::Exception ("Conditions not found") 00070 << "Unavailable Conditions of type " << myname() << " for cell " << myId; 00071 return cell; 00072 } 00073 00074 const bool 00075 HcalCovarianceMatrices::exists(DetId fId) const 00076 { 00077 HcalGenericDetId myId(fId); 00078 bool h2mode_ = (HEcontainer.size()==(2*HcalGenericDetId::HEhalfh2mode)); 00079 00080 int index = myId.hashedId(h2mode_); 00081 if (index < 0) return false; 00082 unsigned int index1 = abs(index); // b/c I'm fed up with compiler warnings about comparison betw. signed and unsigned int 00083 const HcalCovarianceMatrix* cell = NULL; 00084 switch (myId.genericSubdet() ) { 00085 case HcalGenericDetId::HcalGenBarrel: 00086 if (index1 < HBcontainer.size()) cell = &(HBcontainer.at(index1) ); 00087 break; 00088 case HcalGenericDetId::HcalGenEndcap: 00089 if (index1 < HEcontainer.size()) cell = &(HEcontainer.at(index1) ); 00090 break; 00091 case HcalGenericDetId::HcalGenOuter: 00092 if (index1 < HOcontainer.size()) cell = &(HOcontainer.at(index1) ); 00093 break; 00094 case HcalGenericDetId::HcalGenForward: 00095 if (index1 < HFcontainer.size()) cell = &(HFcontainer.at(index1) ); 00096 break; 00097 default: return false; break; 00098 } 00099 00100 // HcalCovarianceMatrix emptyHcalCovarianceMatrix; 00101 if (cell) 00102 // if (cell->rawId() != emptyHcalCovarianceMatrix.rawId() ) 00103 if (cell->rawId() == fId ) 00104 return true; 00105 00106 return false; 00107 } 00108 00109 bool 00110 HcalCovarianceMatrices::addValues(const HcalCovarianceMatrix& myHcalCovarianceMatrix, bool h2mode_) 00111 { 00112 unsigned long myRawId = myHcalCovarianceMatrix.rawId(); 00113 HcalGenericDetId myId(myRawId); 00114 int index = myId.hashedId(h2mode_); 00115 bool success = false; 00116 if (index < 0) success = false; 00117 unsigned int index1 = abs(index); // b/c I'm fed up with compiler warnings about comparison betw. signed and unsigned int 00118 00119 switch (myId.genericSubdet() ) { 00120 case HcalGenericDetId::HcalGenBarrel: 00121 if (!HBcontainer.size() ) initContainer(myId.genericSubdet() ); 00122 if (index1 < HBcontainer.size()) 00123 { 00124 HBcontainer.at(index1) = myHcalCovarianceMatrix; 00125 success = true; 00126 } 00127 break; 00128 case HcalGenericDetId::HcalGenEndcap: 00129 if (!HEcontainer.size() ) initContainer(myId.genericSubdet(), h2mode_ ); 00130 if (index1 < HEcontainer.size()) 00131 { 00132 HEcontainer.at(index1) = myHcalCovarianceMatrix; 00133 success = true; 00134 } 00135 break; 00136 case HcalGenericDetId::HcalGenOuter: 00137 if (!HOcontainer.size() ) initContainer(myId.genericSubdet() ); 00138 if (index1 < HOcontainer.size()) 00139 { 00140 HOcontainer.at(index1) = myHcalCovarianceMatrix; 00141 success = true; 00142 } 00143 break; 00144 case HcalGenericDetId::HcalGenForward: 00145 if (!HFcontainer.size() ) initContainer(myId.genericSubdet() ); 00146 if (index1 < HFcontainer.size()) 00147 { 00148 HFcontainer.at(index1) = myHcalCovarianceMatrix; 00149 success = true; 00150 } 00151 break; 00152 default: break; 00153 } 00154 00155 if (!success) 00156 throw cms::Exception ("Filling of conditions failed") 00157 << " no valid filling possible for Conditions of type " << myname() << " for DetId " << myId; 00158 return success; 00159 } 00160 00161 std::vector<DetId> 00162 HcalCovarianceMatrices::getAllChannels() const 00163 { 00164 std::vector<DetId> channels; 00165 HcalCovarianceMatrix emptyHcalCovarianceMatrix; 00166 for (unsigned int i=0; i<HBcontainer.size(); i++) 00167 { 00168 if (emptyHcalCovarianceMatrix.rawId() != HBcontainer.at(i).rawId() ) 00169 channels.push_back( DetId(HBcontainer.at(i).rawId()) ); 00170 } 00171 for (unsigned int i=0; i<HEcontainer.size(); i++) 00172 { 00173 if (emptyHcalCovarianceMatrix.rawId() != HEcontainer.at(i).rawId() ) 00174 channels.push_back( DetId(HEcontainer.at(i).rawId()) ); 00175 } 00176 for (unsigned int i=0; i<HOcontainer.size(); i++) 00177 { 00178 if (emptyHcalCovarianceMatrix.rawId() != HOcontainer.at(i).rawId() ) 00179 channels.push_back( DetId(HOcontainer.at(i).rawId()) ); 00180 } 00181 for (unsigned int i=0; i<HFcontainer.size(); i++) 00182 { 00183 if (emptyHcalCovarianceMatrix.rawId() != HFcontainer.at(i).rawId() ) 00184 channels.push_back( DetId(HFcontainer.at(i).rawId()) ); 00185 } 00186 return channels; 00187 }