Go to the documentation of this file.00001 #include "../interface/OccupancyClient.h"
00002
00003 #include "FWCore/Framework/interface/ESHandle.h"
00004 #include "Geometry/CaloGeometry/interface/CaloGeometry.h"
00005 #include "Geometry/CaloGeometry/interface/CaloCellGeometry.h"
00006 #include "Geometry/Records/interface/CaloGeometryRecord.h"
00007 #include "DataFormats/EcalDetId/interface/EcalTrigTowerDetId.h"
00008
00009 #include "DQM/EcalBarrelMonitorTasks/interface/OccupancyTask.h"
00010
00011 #include "DQM/EcalCommon/interface/EcalDQMCommonUtils.h"
00012
00013 namespace ecaldqm {
00014
00015 OccupancyClient::OccupancyClient(const edm::ParameterSet& _params, const edm::ParameterSet& _paths) :
00016 DQWorkerClient(_params, _paths, "OccupancyClient"),
00017 geometry_(0),
00018 minHits_(0),
00019 deviationThreshold_(0.)
00020 {
00021 edm::ParameterSet const& taskParams(_params.getUntrackedParameterSet(name_));
00022 minHits_ = taskParams.getUntrackedParameter<int>("minHits");
00023 deviationThreshold_ = taskParams.getUntrackedParameter<double>("deviationThreshold");
00024
00025 edm::ParameterSet const& sources(_params.getUntrackedParameterSet("sources"));
00026 source_(sDigi, "OccupancyTask", OccupancyTask::kDigi, sources);
00027 source_(sRecHitThr, "OccupancyTask", OccupancyTask::kRecHitThr, sources);
00028 source_(sTPDigiThr, "OccupancyTask", OccupancyTask::kTPDigiThr, sources);
00029 }
00030
00031 void
00032 OccupancyClient::beginRun(const edm::Run &, const edm::EventSetup &_es)
00033 {
00034 edm::ESHandle<CaloGeometry> geomHndl;
00035 _es.get<CaloGeometryRecord>().get(geomHndl);
00036 geometry_ = geomHndl.product();
00037 if(!geometry_)
00038 throw cms::Exception("EventSetup") << "CaloGeometry invalid";
00039 }
00040
00041 void
00042 OccupancyClient::bookMEs()
00043 {
00044 DQWorker::bookMEs();
00045
00046 MEs_[kQualitySummary]->resetAll(-1.);
00047 }
00048
00049 void
00050 OccupancyClient::producePlots()
00051 {
00052 using namespace std;
00053
00054 MEs_[kHotDigi]->reset();
00055 MEs_[kHotRecHitThr]->reset();
00056 MEs_[kHotTPDigiThr]->reset();
00057
00058 uint32_t mask(1 << EcalDQMStatusHelper::PEDESTAL_ONLINE_HIGH_GAIN_RMS_ERROR);
00059
00060 vector<double> digiPhiRingMean(28, 0.);
00061 vector<double> rechitPhiRingMean(28, 0.);
00062 vector<int> numCrystals(28, 0);
00063
00064 for(unsigned dccid(1); dccid <= 54; dccid++){
00065 for(unsigned tower(1); tower <= getNSuperCrystals(dccid); tower++){
00066 vector<DetId> ids(getElectronicsMap()->dccTowerConstituents(dccid, tower));
00067
00068 if(ids.size() == 0) continue;
00069
00070 for(vector<DetId>::iterator idItr(ids.begin()); idItr != ids.end(); ++idItr){
00071 float entries(sources_[sDigi]->getBinContent(*idItr));
00072 float rhentries(sources_[sRecHitThr]->getBinContent(*idItr));
00073
00074 int ieta(getTrigTowerMap()->towerOf(*idItr).ietaAbs());
00075 digiPhiRingMean.at(ieta - 1) += entries;
00076 rechitPhiRingMean.at(ieta - 1) += rhentries;
00077
00078 numCrystals.at(ieta - 1) += 1;
00079 }
00080 }
00081 }
00082
00083 for(int ie(0); ie < 28; ie++){
00084 digiPhiRingMean[ie] /= numCrystals[ie];
00085 rechitPhiRingMean[ie] /= numCrystals[ie];
00086 }
00087
00088
00089 for(unsigned dccid(1); dccid <= 54; dccid++){
00090 for(unsigned tower(1); tower <= getNSuperCrystals(dccid); tower++){
00091 vector<DetId> ids(getElectronicsMap()->dccTowerConstituents(dccid, tower));
00092
00093 if(ids.size() == 0) continue;
00094
00095 float quality(1.);
00096 for(vector<DetId>::iterator idItr(ids.begin()); idItr != ids.end(); ++idItr){
00097 float entries(sources_[sDigi]->getBinContent(*idItr));
00098 float rhentries(sources_[sRecHitThr]->getBinContent(*idItr));
00099
00100 int ieta(getTrigTowerMap()->towerOf(*idItr).ietaAbs());
00101
00102 if(entries > minHits_ && entries > digiPhiRingMean.at(ieta - 1) * deviationThreshold_){
00103 MEs_[kHotDigi]->fill(*idItr);
00104 quality = 0.;
00105 }
00106 if(rhentries > minHits_ && rhentries > rechitPhiRingMean.at(ieta - 1) * deviationThreshold_){
00107 MEs_[kHotRecHitThr]->fill(*idItr);
00108 quality = 0.;
00109 }
00110 }
00111 if(dccid <= 9 || dccid >= 46){
00112 vector<EcalScDetId> scs(getElectronicsMap()->getEcalScDetId(dccid, tower));
00113 for(vector<EcalScDetId>::iterator scItr(scs.begin()); scItr != scs.end(); ++scItr)
00114 fillQuality_(kQualitySummary, *scItr, mask, quality);
00115 }
00116 else
00117 fillQuality_(kQualitySummary, ids[0], mask, quality);
00118 }
00119 }
00120
00121 vector<double> tpdigiPhiRingMean(28, 0.);
00122
00123 for(unsigned iTT(0); iTT < EcalTrigTowerDetId::kSizeForDenseIndexing; iTT++){
00124 EcalTrigTowerDetId ttid(EcalTrigTowerDetId::detIdFromDenseIndex(iTT));
00125 float entries(sources_[sTPDigiThr]->getBinContent(ttid));
00126
00127 tpdigiPhiRingMean.at(ttid.ietaAbs() - 1) += entries;
00128 }
00129
00130 for(int ie(0); ie < 28; ie++){
00131 float denom(-1.);
00132 if(ie < 27) denom = 72.;
00133 else denom = 36.;
00134 tpdigiPhiRingMean[ie] /= denom;
00135 }
00136
00137 for(unsigned iTT(0); iTT < EcalTrigTowerDetId::kSizeForDenseIndexing; iTT++){
00138 EcalTrigTowerDetId ttid(EcalTrigTowerDetId::detIdFromDenseIndex(iTT));
00139 float entries(sources_[sTPDigiThr]->getBinContent(ttid));
00140
00141 if(entries > minHits_ && entries > tpdigiPhiRingMean.at(ttid.ietaAbs() - 1) * deviationThreshold_){
00142 MEs_[kHotTPDigiThr]->fill(ttid);
00143 vector<DetId> ids(getTrigTowerMap()->constituentsOf(ttid));
00144 for(vector<DetId>::iterator idItr(ids.begin()); idItr != ids.end(); ++idItr){
00145 if(MEs_[kQualitySummary]->getBinContent(*idItr) > 0.)
00146 fillQuality_(kQualitySummary, *idItr, mask, 0.);
00147 }
00148 }
00149 }
00150
00151 }
00152
00153
00154 void
00155 OccupancyClient::setMEData(std::vector<MEData>& _data)
00156 {
00157 _data[kHotDigi] = MEData("HotDigi", BinService::kChannel, BinService::kCrystal, MonitorElement::DQM_KIND_TH1F);
00158 _data[kHotRecHitThr] = MEData("HotRecHitThr", BinService::kChannel, BinService::kCrystal, MonitorElement::DQM_KIND_TH1F);
00159 _data[kHotTPDigiThr] = MEData("HotTPDigiThr", BinService::kChannel, BinService::kTriggerTower, MonitorElement::DQM_KIND_TH1F);
00160 _data[kQualitySummary] = MEData("QualitySummary", BinService::kEcal2P, BinService::kSuperCrystal, MonitorElement::DQM_KIND_TH2F);
00161 }
00162
00163 DEFINE_ECALDQM_WORKER(OccupancyClient);
00164 }
00165