diff --git a/CalibTracker/SiStripQuality/interface/SiStripBadAPVandHotStripAlgorithmFromClusterOccupancy.h b/CalibTracker/SiStripQuality/interface/SiStripBadAPVandHotStripAlgorithmFromClusterOccupancy.h index acc8198d08366..6ac0c050d59ad 100644 --- a/CalibTracker/SiStripQuality/interface/SiStripBadAPVandHotStripAlgorithmFromClusterOccupancy.h +++ b/CalibTracker/SiStripQuality/interface/SiStripBadAPVandHotStripAlgorithmFromClusterOccupancy.h @@ -93,6 +93,7 @@ class SiStripBadAPVandHotStripAlgorithmFromClusterOccupancy{ void fillStripDQMHistograms(); long double prob_; + long double ratio_; unsigned short MinNumEntries_; unsigned short MinNumEntriesPerStrip_; long double lowoccupancy_; @@ -193,6 +194,8 @@ class SiStripBadAPVandHotStripAlgorithmFromClusterOccupancy{ int hotStripsPerModule; double singleStripOccupancy; int stripHits; + double medianAPVHits; + double avgAPVHits; double poissonProb; int ishot[128]; @@ -201,6 +204,8 @@ class SiStripBadAPVandHotStripAlgorithmFromClusterOccupancy{ double stripoccupancy[128]; int striphits[128]; double poissonprob[128]; + double medianapvhits[6]; + double avgapvhits[6]; std::stringstream ss; diff --git a/CalibTracker/SiStripQuality/interface/SiStripHotStripAlgorithmFromClusterOccupancy.h b/CalibTracker/SiStripQuality/interface/SiStripHotStripAlgorithmFromClusterOccupancy.h index 1d6386b559558..9f2a0f99e28ac 100644 --- a/CalibTracker/SiStripQuality/interface/SiStripHotStripAlgorithmFromClusterOccupancy.h +++ b/CalibTracker/SiStripQuality/interface/SiStripHotStripAlgorithmFromClusterOccupancy.h @@ -88,6 +88,7 @@ class SiStripHotStripAlgorithmFromClusterOccupancy{ void evaluatePoissonian(std::vector& , long double& meanVal); long double prob_; + long double ratio_; unsigned short MinNumEntries_; unsigned short MinNumEntriesPerStrip_; double Nevents_; @@ -126,6 +127,8 @@ class SiStripHotStripAlgorithmFromClusterOccupancy{ int hotStripsPerModule; double stripOccupancy; int stripHits; + double medianAPVHits; + double avgAPVHits; double poissonProb; int ishot[768]; @@ -134,6 +137,8 @@ class SiStripHotStripAlgorithmFromClusterOccupancy{ double stripoccupancy[768]; int striphits[768]; double poissonprob[768]; + double medianapvhits[6]; + double avgapvhits[6]; std::stringstream ss; diff --git a/CalibTracker/SiStripQuality/src/SiStripBadAPVandHotStripAlgorithmFromClusterOccupancy.cc b/CalibTracker/SiStripQuality/src/SiStripBadAPVandHotStripAlgorithmFromClusterOccupancy.cc index d0f78afebc650..e6c9b81b089a3 100644 --- a/CalibTracker/SiStripQuality/src/SiStripBadAPVandHotStripAlgorithmFromClusterOccupancy.cc +++ b/CalibTracker/SiStripQuality/src/SiStripBadAPVandHotStripAlgorithmFromClusterOccupancy.cc @@ -4,12 +4,14 @@ #include "FWCore/MessageLogger/interface/MessageLogger.h" #include "DataFormats/DetId/interface/DetId.h" #include "DataFormats/TrackerCommon/interface/TrackerTopology.h" +#include "Geometry/Records/interface/IdealGeometryRecord.h" #include "Geometry/TrackerGeometryBuilder/interface/StripGeomDetUnit.h" #include "Geometry/CommonTopologies/interface/StripTopology.h" #include "CalibFormats/SiStripObjects/interface/SiStripQuality.h" SiStripBadAPVandHotStripAlgorithmFromClusterOccupancy::SiStripBadAPVandHotStripAlgorithmFromClusterOccupancy(const edm::ParameterSet& iConfig, const TrackerTopology* theTopo): + ratio_(1.5), lowoccupancy_(0), highoccupancy_(100), absolutelow_(0), @@ -82,6 +84,8 @@ void SiStripBadAPVandHotStripAlgorithmFromClusterOccupancy::extractBadAPVSandStr striptree->Branch("StripOccupancy", &singleStripOccupancy, "StripOccupancy/D"); striptree->Branch("StripHits", &stripHits, "StripHits/I"); striptree->Branch("PoissonProb", &poissonProb, "PoissonProb/D"); + striptree->Branch("MedianAPVHits", &medianAPVHits, "MedianAPVHits/D"); + striptree->Branch("AvgAPVHits", &avgAPVHits, "AvgAPVHits/D"); } HistoMap::iterator it=DM.begin(); @@ -658,6 +662,17 @@ void SiStripBadAPVandHotStripAlgorithmFromClusterOccupancy::iterativeSearch(Apv& long double meanVal=1.*histo.NEntries[apv]/(1.*Nbins-histo.NEmptyBins[apv]); evaluatePoissonian(vPoissonProbs,meanVal); + // Find median occupancy, taking into account only good strips + unsigned int goodstripentries[128]; + int nGoodStrips = 0; + for (size_t i=ibinStart; iGetBinContent(i); + nGoodStrips++; + } + } + double median = TMath::Median(nGoodStrips,goodstripentries); + for (size_t i=ibinStart; iGetBinContent(i); @@ -665,10 +680,11 @@ void SiStripBadAPVandHotStripAlgorithmFromClusterOccupancy::iterativeSearch(Apv& stripoccupancy[i-1] = entries/(double) Nevents_; striphits[i-1] = entries; poissonprob[i-1] = 1-vPoissonProbs[entries]; + medianapvhits[apv] = median; + avgapvhits[apv] = meanVal; } - if (entries<=MinNumEntriesPerStrip_ || entries <= minNevents_) - continue; + if (entries<=MinNumEntriesPerStrip_ || entries <= minNevents_ || entries / median < ratio_) continue; if(diffBranch("StripOccupancy", &stripOccupancy, "StripOccupancy/D"); striptree->Branch("StripHits", &stripHits, "StripHits/I"); striptree->Branch("PoissonProb", &poissonProb, "PoissonProb/D"); - } + striptree->Branch("MedianAPVHits", &medianAPVHits, "MedianAPVHits/D"); + striptree->Branch("AvgAPVHits", &avgAPVHits, "AvgAPVHits/D"); +} HistoMap::iterator it=DM.begin(); @@ -197,6 +201,8 @@ void SiStripHotStripAlgorithmFromClusterOccupancy::extractBadStrips(SiStripQuali stripOccupancy = stripoccupancy[strip]; stripHits = striphits[strip]; poissonProb = poissonprob[strip]; + medianAPVHits = medianapvhits[strip/128]; + avgAPVHits = avgapvhits[strip/128]; hotStripsPerModule = hotstripspermodule; hotStripsPerAPV = hotstripsperapv[strip/128]; @@ -248,6 +254,17 @@ void SiStripHotStripAlgorithmFromClusterOccupancy::iterativeSearch(pHisto& histo long double meanVal=1.*histo._NEntries/(1.*Nbins-histo._NEmptyBins); evaluatePoissonian(vPoissonProbs,meanVal); + // Find median occupancy, taking into account only good strips + unsigned int goodstripentries[128]; + int nGoodStrips = 0; + for (size_t i=ibinStart; iGetBinContent(i); + nGoodStrips++; + } + } + double median = TMath::Median(nGoodStrips,goodstripentries); + for (size_t i=ibinStart; iGetBinContent(i); @@ -255,10 +272,10 @@ void SiStripHotStripAlgorithmFromClusterOccupancy::iterativeSearch(pHisto& histo stripoccupancy[(apv*128)+i-1] = entries/(double) Nevents_; striphits[(apv*128)+i-1] = entries; poissonprob[(apv*128)+i-1] = 1-vPoissonProbs[entries]; + medianapvhits[apv] = median; + avgapvhits[apv] = meanVal; } - - if (entries<=MinNumEntriesPerStrip_ || entries <= minNevents_) - continue; + if (entries<=MinNumEntriesPerStrip_ || entries <= minNevents_ || entries / median < ratio_) continue; if(diff("OccupancyThreshold",0) << " OccupancyHisto" << parameters.getUntrackedParameter("OccupancyHisto") << std::endl; + // Check Number of Events for (; iter!=iterEnd;++iter) { std::string me_name = (*iter)->getName(); @@ -255,10 +256,15 @@ void SiStripQualityHotStripIdentifierRoot::bookHistos(){ gotNentries=true; edm::LogInfo("SiStripQualityHotStripIdentifierRoot")<< "[SiStripQualityHotStripIdentifierRoot::bookHistos] gotNentries flag " << gotNentries << std::endl; - } else { - edm::LogWarning("SiStripQualityHotStripIdentifierRoot") <<" [SiStripQualityHotStripIdentifierRoot::bookHistos] :: Histogram with to check # of evemnts missing" <getName(); + if (strstr(me_name.c_str(),(parameters.getUntrackedParameter("OccupancyHisto")).c_str())==NULL) continue; @@ -280,7 +286,6 @@ void SiStripQualityHotStripIdentifierRoot::bookHistos(){ ClusterPositionHistoMap[detid]=boost::shared_ptr(new TH1F(*(*iter)->getTH1F())); } - if(!gotNentries) edm::LogWarning("MissingNumberOfEvents") <<"Missing histogram to get the number of events"; }