00001 #include "RecoLocalCalo/HcalRecAlgos/interface/HcalSeverityLevelComputer.h"
00002 #include "CondFormats/HcalObjects/interface/HcalChannelStatus.h"
00003 #include "RecoLocalCalo/HcalRecAlgos/interface/HcalCaloFlagLabels.h"
00004 #include "DataFormats/HcalDetId/interface/HcalGenericDetId.h"
00005 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00006 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00007
00008
00009 bool HcalSeverityLevelComputer::getChStBit(HcalSeverityDefinition& mydef,
00010 const std::string& mybit)
00011 {
00012 if (mybit == "HcalCellOff") setBit(HcalChannelStatus::HcalCellOff, mydef.chStatusMask);
00013 else if (mybit == "HcalCellMask") setBit(HcalChannelStatus::HcalCellMask, mydef.chStatusMask);
00014 else if (mybit == "HcalCellDead") setBit(HcalChannelStatus::HcalCellDead, mydef.chStatusMask);
00015 else if (mybit == "HcalCellHot") setBit(HcalChannelStatus::HcalCellHot, mydef.chStatusMask);
00016 else if (mybit == "HcalCellStabErr") setBit(HcalChannelStatus::HcalCellStabErr, mydef.chStatusMask);
00017 else if (mybit == "HcalCellTimErr") setBit(HcalChannelStatus::HcalCellTimErr, mydef.chStatusMask);
00018 else if (mybit == "HcalCellTrigMask") setBit(HcalChannelStatus::HcalCellTrigMask, mydef.chStatusMask);
00019 else if (mybit == "HcalCellCaloTowerMask") setBit(HcalChannelStatus::HcalCellCaloTowerMask, mydef.chStatusMask);
00020 else if (mybit == "HcalCellCaloTowerProb") setBit(HcalChannelStatus::HcalCellCaloTowerProb, mydef.chStatusMask);
00021 else
00022 {
00023 edm::LogWarning ("HcalSeverityLevelComputer")
00024 << "HcalSeverityLevelComputer: Error: ChannelStatusFlag >>" << mybit
00025 << "<< unknown. Ignoring.";
00026 return false;
00027 }
00028 return true;
00029 }
00030
00031 bool HcalSeverityLevelComputer::getRecHitFlag(HcalSeverityDefinition& mydef,
00032 const std::string& mybit)
00033 {
00034
00035 if (mybit == "HBHEHpdHitMultiplicity") setBit(HcalCaloFlagLabels::HBHEHpdHitMultiplicity, mydef.HBHEFlagMask);
00036 else if (mybit == "HBHEPulseShape") setBit(HcalCaloFlagLabels::HBHEPulseShape, mydef.HBHEFlagMask);
00037 else if (mybit == "HSCP_R1R2") setBit(HcalCaloFlagLabels::HSCP_R1R2, mydef.HBHEFlagMask);
00038 else if (mybit == "HSCP_FracLeader") setBit(HcalCaloFlagLabels::HSCP_FracLeader, mydef.HBHEFlagMask);
00039 else if (mybit == "HSCP_OuterEnergy") setBit(HcalCaloFlagLabels::HSCP_OuterEnergy, mydef.HBHEFlagMask);
00040 else if (mybit == "HSCP_ExpFit") setBit(HcalCaloFlagLabels::HSCP_ExpFit, mydef.HBHEFlagMask);
00041 else if (mybit == "HBHEFlatNoise") setBit(HcalCaloFlagLabels::HBHEFlatNoise, mydef.HBHEFlagMask);
00042 else if (mybit == "HBHESpikeNoise") setBit(HcalCaloFlagLabels::HBHESpikeNoise, mydef.HBHEFlagMask);
00043 else if (mybit == "HBHETriangleNoise") setBit(HcalCaloFlagLabels::HBHETriangleNoise, mydef.HBHEFlagMask);
00044
00045
00046 else if (mybit=="HBHETimingTrustBits") setBit(HcalCaloFlagLabels::HBHETimingTrustBits, mydef.HBHEFlagMask );
00047 else if (mybit=="HBHETimingShapedCutsBits") setBit(HcalCaloFlagLabels::HBHETimingShapedCutsBits, mydef.HBHEFlagMask);
00048 else if (mybit=="HBHEIsolatedNoise") setBit(HcalCaloFlagLabels::HBHEIsolatedNoise, mydef.HBHEFlagMask );
00049
00050
00051 else if (mybit == "HOBit") setBit(HcalCaloFlagLabels::HOBit, mydef.HOFlagMask);
00052
00053
00054 else if (mybit == "HFLongShort") setBit(HcalCaloFlagLabels::HFLongShort, mydef.HFFlagMask);
00055 else if (mybit == "HFDigiTime") setBit(HcalCaloFlagLabels::HFDigiTime, mydef.HFFlagMask);
00056 else if (mybit == "HFInTimeWindow") setBit(HcalCaloFlagLabels::HFInTimeWindow, mydef.HFFlagMask);
00057 else if (mybit == "HFS8S1Ratio") setBit(HcalCaloFlagLabels::HFS8S1Ratio, mydef.HFFlagMask);
00058 else if (mybit == "HFPET") setBit(HcalCaloFlagLabels::HFPET, mydef.HFFlagMask);
00059
00060
00061 else if (mybit == "ZDCBit") setBit(HcalCaloFlagLabels::ZDCBit, mydef.ZDCFlagMask);
00062
00063
00064 else if (mybit == "CalibrationBit") setBit(HcalCaloFlagLabels::CalibrationBit, mydef.CalibFlagMask);
00065
00066
00067 else if (mybit == "TimingSubtractedBit") setAllRHMasks(HcalCaloFlagLabels::TimingSubtractedBit, mydef);
00068 else if (mybit == "TimingAddedBit") setAllRHMasks(HcalCaloFlagLabels::TimingAddedBit, mydef);
00069 else if (mybit == "TimingErrorBit") setAllRHMasks(HcalCaloFlagLabels::TimingErrorBit, mydef);
00070 else if (mybit == "ADCSaturationBit") setAllRHMasks(HcalCaloFlagLabels::ADCSaturationBit, mydef);
00071 else if (mybit == "UserDefinedBit0") setAllRHMasks(HcalCaloFlagLabels::UserDefinedBit0, mydef);
00072 else if (mybit == "UserDefinedBit1") setAllRHMasks(HcalCaloFlagLabels::UserDefinedBit1, mydef);
00073 else if (mybit == "UserDefinedBit2") setAllRHMasks(HcalCaloFlagLabels::UserDefinedBit2, mydef);
00074
00075 else
00076 {
00077
00078 edm::LogWarning ("HcalSeverityLevelComputer")
00079 << "HcalSeverityLevelComputer: Error: RecHitFlag >>" << mybit
00080 << "<< unknown. Ignoring.";
00081 return false;
00082 }
00083 return true;
00084 }
00085
00086 HcalSeverityLevelComputer::HcalSeverityLevelComputer( const edm::ParameterSet& iConfig)
00087 {
00088
00089 typedef std::vector< edm::ParameterSet > myParameters;
00090 myParameters myLevels = iConfig.getParameter<myParameters>((std::string)"SeverityLevels");
00091
00092
00093 for ( myParameters::iterator itLevels = myLevels.begin(); itLevels != myLevels.end(); ++itLevels)
00094 {
00095
00096 HcalSeverityDefinition mydef;
00097
00098
00099 mydef.sevLevel = itLevels->getParameter<int>("Level");
00100
00101
00102 std::vector<std::string> myRecHitFlags =
00103 itLevels->getParameter<std::vector <std::string> > ("RecHitFlags");
00104
00105
00106 std::vector<std::string> myChStatuses =
00107 itLevels->getParameter<std::vector <std::string> > ("ChannelStatus");
00108
00109
00110
00111 unsigned int bvalid = 0;
00112 unsigned int bnonempty = 0;
00113
00114 for (unsigned k=0; k < myChStatuses.size(); k++)
00115 {
00116 if (myChStatuses[k].empty()) break;
00117 bnonempty++;
00118 bvalid+=getChStBit(mydef, myChStatuses[k]);
00119 }
00120
00121
00122 for (unsigned k=0; k < myRecHitFlags.size(); k++)
00123 {
00124 if (myRecHitFlags[k].empty()) break;
00125 bnonempty++;
00126 bvalid+=getRecHitFlag(mydef, myRecHitFlags[k]);
00127 }
00128
00129
00130
00131
00132
00133 if ((!bvalid) && (bnonempty))
00134 {
00135 edm::LogWarning ("HcalSeverityLevelComputer")
00136 << "Warning: level " << mydef.sevLevel
00137 << " consists of invalid definitions only: "
00138
00139 << " Ignoring definition.";
00140 continue;
00141 }
00142
00143
00144 std::vector<HcalSeverityDefinition>::iterator it = SevDef.begin();
00145
00146 do
00147 {
00148 if (it == SevDef.end()) { SevDef.push_back(mydef); break; }
00149
00150 if (it->sevLevel == mydef.sevLevel)
00151 {
00152 edm::LogWarning ("HcalSeverityLevelComputer")
00153 << "HcalSeverityLevelComputer: Warning: level " << mydef.sevLevel
00154 << " already defined. Ignoring new definition.";
00155 break;
00156 }
00157
00158 if (it->sevLevel < mydef.sevLevel)
00159 if (( (it+1) == SevDef.end()) || ( (it+1)->sevLevel > mydef.sevLevel ))
00160 {
00161 SevDef.insert(it+1, mydef);
00162 break;
00163 }
00164
00165 it++;
00166 }
00167 while(it != SevDef.end());
00168
00169 }
00170
00171 edm::LogInfo("HcalSeverityLevelComputer")
00172 << "HcalSeverityLevelComputer - Summary of Severity Levels:" << std::endl;
00173 for (std::vector<HcalSeverityDefinition>::iterator it = SevDef.begin(); it !=SevDef.end(); it++)
00174 {
00175
00176 edm::LogInfo("HcalSeverityLevelComputer")
00177 << (*it) << std::endl;
00178 }
00179
00180
00181
00182
00183 std::vector<std::string> myRecovered =
00184 iConfig.getParameter<std::vector <std::string> > ("RecoveredRecHitBits");
00185 RecoveredRecHit_ = new HcalSeverityDefinition();
00186 for (unsigned k=0; k < myRecovered.size(); k++)
00187 {
00188 if (myRecovered[k].empty()) break;
00189 getRecHitFlag( (*RecoveredRecHit_), myRecovered[k]);
00190 }
00191
00192
00193
00194
00195 std::vector<std::string> myDrop =
00196 iConfig.getParameter<std::vector <std::string> > ("DropChannelStatusBits");
00197 DropChannel_ = new HcalSeverityDefinition();
00198 for (unsigned k=0; k < myDrop.size(); k++)
00199 {
00200 if (myDrop[k].empty()) break;
00201 getChStBit( (*DropChannel_), myDrop[k]);
00202 }
00203
00204 edm::LogInfo("HcalSeverityLevelComputer")
00205 << "HcalSeverityLevelComputer - Summary for Recovered RecHit bits: \n"
00206 << (*RecoveredRecHit_) << std::endl
00207 << "HcalSeverityLevelComputer - Summary for Drop the Channel bits: \n"
00208 << (*DropChannel_) << std::endl;
00209
00210
00211 }
00212
00213
00214 HcalSeverityLevelComputer::~HcalSeverityLevelComputer() {}
00215
00216
00217 int HcalSeverityLevelComputer::getSeverityLevel(const DetId& myid, const uint32_t& myflag,
00218 const uint32_t& mystatus) const
00219 {
00220 uint32_t myRecHitMask;
00221 HcalGenericDetId myId(myid);
00222 HcalGenericDetId::HcalGenericSubdetector mysubdet = myId.genericSubdet();
00223
00224
00225
00226
00227
00228 for (size_t j=(SevDef.size()); j > 0; j--)
00229 {
00230 size_t i = j - 1;
00231 switch (mysubdet)
00232 {
00233 case HcalGenericDetId::HcalGenBarrel : case HcalGenericDetId::HcalGenEndcap :
00234 myRecHitMask = SevDef[i].HBHEFlagMask; break;
00235 case HcalGenericDetId::HcalGenOuter : myRecHitMask = SevDef[i].HOFlagMask; break;
00236 case HcalGenericDetId::HcalGenForward : myRecHitMask = SevDef[i].HFFlagMask; break;
00237 case HcalGenericDetId::HcalGenZDC : myRecHitMask = SevDef[i].ZDCFlagMask; break;
00238 case HcalGenericDetId::HcalGenCalibration : myRecHitMask = SevDef[i].CalibFlagMask; break;
00239 default: myRecHitMask = 0;
00240 }
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257 if ( ( ( ( !SevDef[i].HBHEFlagMask
00258 && !SevDef[i].HOFlagMask
00259 && !SevDef[i].HFFlagMask
00260 && !SevDef[i].ZDCFlagMask
00261 && !SevDef[i].CalibFlagMask )
00262 || (myRecHitMask & myflag) )
00263 && ( (!SevDef[i].chStatusMask) || (SevDef[i].chStatusMask & mystatus) ) )
00264 || ( (myRecHitMask & myflag) || (SevDef[i].chStatusMask & mystatus) ) )
00265 return SevDef[i].sevLevel;
00266
00267 }
00268
00269 return -100;
00270 }
00271
00272 bool HcalSeverityLevelComputer::recoveredRecHit(const DetId& myid, const uint32_t& myflag) const
00273 {
00274 uint32_t myRecHitMask;
00275 HcalGenericDetId myId(myid);
00276 HcalGenericDetId::HcalGenericSubdetector mysubdet = myId.genericSubdet();
00277
00278 switch (mysubdet)
00279 {
00280 case HcalGenericDetId::HcalGenBarrel : case HcalGenericDetId::HcalGenEndcap :
00281 myRecHitMask = RecoveredRecHit_->HBHEFlagMask; break;
00282 case HcalGenericDetId::HcalGenOuter : myRecHitMask = RecoveredRecHit_->HOFlagMask; break;
00283 case HcalGenericDetId::HcalGenForward : myRecHitMask = RecoveredRecHit_->HFFlagMask; break;
00284 case HcalGenericDetId::HcalGenZDC : myRecHitMask = RecoveredRecHit_->ZDCFlagMask; break;
00285 case HcalGenericDetId::HcalGenCalibration : myRecHitMask = RecoveredRecHit_->CalibFlagMask; break;
00286 default: myRecHitMask = 0;
00287 }
00288
00289 if (myRecHitMask & myflag)
00290 return true;
00291
00292 return false;
00293 }
00294
00295 bool HcalSeverityLevelComputer::dropChannel(const uint32_t& mystatus) const
00296 {
00297 if (DropChannel_->chStatusMask & mystatus)
00298 return true;
00299
00300 return false;
00301 }
00302
00303 void HcalSeverityLevelComputer::setBit(const unsigned bitnumber, uint32_t& where)
00304 {
00305 uint32_t statadd = 0x1<<(bitnumber);
00306 where = where|statadd;
00307 }
00308
00309 void HcalSeverityLevelComputer::setAllRHMasks(const unsigned bitnumber, HcalSeverityDefinition& mydef)
00310 {
00311 setBit(bitnumber, mydef.HBHEFlagMask);
00312 setBit(bitnumber, mydef.HOFlagMask);
00313 setBit(bitnumber, mydef.HFFlagMask);
00314 setBit(bitnumber, mydef.ZDCFlagMask);
00315 setBit(bitnumber, mydef.CalibFlagMask);
00316 }
00317
00318 std::ostream& operator<<(std::ostream& s, const HcalSeverityLevelComputer::HcalSeverityDefinition& def)
00319 {
00320 s << "Hcal Severity Level Definition, Level = " << def.sevLevel << std::endl;
00321 s << std::hex << std::showbase;
00322 s << " channel status mask = " << def.chStatusMask << std::endl;
00323 s << " HBHEFlagMask = " << def.HBHEFlagMask << std::endl;
00324 s << " HOFlagMask = " << def.HOFlagMask << std::endl;
00325 s << " HFFlagMask = " << def.HFFlagMask << std::endl;
00326 s << " ZDCFlagMask = " << def.ZDCFlagMask << std::endl;
00327 s << " CalibFlagMask = " << def.CalibFlagMask << std::dec << std::noshowbase << std::endl;
00328 return s;
00329 }