CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/DQM/SiStripMonitorSummary/plugins/SiStripCorrelateBadStripAndNoise.cc

Go to the documentation of this file.
00001 #include "DQM/SiStripMonitorSummary/plugins/SiStripCorrelateBadStripAndNoise.h"
00002 
00003 #include "DataFormats/SiStripDetId/interface/TIBDetId.h"
00004 #include "DataFormats/SiStripDetId/interface/TOBDetId.h"
00005 #include "DataFormats/SiStripDetId/interface/TECDetId.h"
00006 #include "DataFormats/SiStripDetId/interface/TIDDetId.h"
00007 
00008 
00009 
00010 SiStripCorrelateBadStripAndNoise::SiStripCorrelateBadStripAndNoise(const edm::ParameterSet& iConfig):
00011   cacheID_quality(0xFFFFFFFF),cacheID_noise(0xFFFFFFFF)
00012 {
00013   //now do what ever initialization is needed
00014   if(!edm::Service<SiStripDetInfoFileReader>().isAvailable()){
00015     edm::LogError("TkLayerMap") << 
00016       "\n------------------------------------------"
00017       "\nUnAvailable Service SiStripDetInfoFileReader: please insert in the configuration file an instance like"
00018       "\n\tprocess.SiStripDetInfoFileReader = cms.Service(\"SiStripDetInfoFileReader\")"
00019       "\n------------------------------------------";
00020   }
00021  
00022   fr=edm::Service<SiStripDetInfoFileReader>().operator->();
00023   file = new TFile("correlTest.root","RECREATE");
00024   tkmap = new TrackerMap();
00025 }
00026 
00027 
00028 SiStripCorrelateBadStripAndNoise::~SiStripCorrelateBadStripAndNoise()
00029 {}
00030 
00031 //
00032 
00033 void
00034 SiStripCorrelateBadStripAndNoise::beginRun(const edm::Run& run, const edm::EventSetup& es){
00035 
00036   if(getNoiseCache(es)==cacheID_noise && getQualityCache(es)==cacheID_quality)
00037     return;
00038   cacheID_noise=getNoiseCache(es);
00039   cacheID_quality=getQualityCache(es);
00040   
00041   edm::LogInfo("") << "[SiStripCorrelateBadStripAndNoise::beginRun] cacheID_quality " << cacheID_quality << " cacheID_noise " << cacheID_noise << std::endl; 
00042   
00043   es.get<SiStripQualityRcd>().get(qualityHandle_);
00044   es.get<SiStripNoisesRcd>().get(noiseHandle_);
00045 
00046   DoAnalysis(es);
00047 }
00048 
00049 void 
00050 SiStripCorrelateBadStripAndNoise::DoAnalysis(const edm::EventSetup& es){
00051   //Loop on quality bad stirps
00052   //for each strip, look at the noise 
00053   // evalaute the mean apv noise and the ratio among strip noise and meanApvNoise
00054   // put the value in the histo in terms of ratio Vs percentage of badStrips per APV
00055 
00056   //Fill an histo per subdet and layer (and plus && minus for TEC/TID)
00057   edm::LogInfo("") << "[Doanalysis]";
00058   iterateOnDets();
00059 
00060 }
00061 
00062 void 
00063 SiStripCorrelateBadStripAndNoise::iterateOnDets(){
00064 
00065   SiStripQuality::RegistryIterator rbegin = qualityHandle_->getRegistryVectorBegin();
00066   SiStripQuality::RegistryIterator rend   = qualityHandle_->getRegistryVectorEnd();
00067 
00068  
00069   for (SiStripBadStrip::RegistryIterator rp=rbegin; rp != rend; ++rp) {
00070     const uint32_t detid=rp->detid;
00071     
00072     SiStripQuality::Range sqrange = SiStripQuality::Range( qualityHandle_->getDataVectorBegin()+rp->ibegin , qualityHandle_->getDataVectorBegin()+rp->iend );
00073     iterateOnBadStrips(detid,sqrange);
00074   }  
00075 }
00076 
00077 void 
00078 SiStripCorrelateBadStripAndNoise::iterateOnBadStrips(const uint32_t & detid, SiStripQuality::Range& sqrange){
00079 
00080   float percentage=0;
00081   for(int it=0;it<sqrange.second-sqrange.first;it++){
00082     unsigned int firstStrip=qualityHandle_->decode( *(sqrange.first+it) ).firstStrip;
00083     unsigned int range=qualityHandle_->decode( *(sqrange.first+it) ).range;
00084     
00085     correlateWithNoise(detid,firstStrip,range);
00086 
00087     edm::LogInfo("range")<< range;
00088     percentage+=range;
00089   }
00090   if(percentage!=0)
00091     percentage/=128.*fr->getNumberOfApvsAndStripLength(detid).first;
00092   if(percentage>1)
00093     edm::LogError("SiStripQualityStatistics") <<  "PROBLEM detid " << detid << " value " << percentage<< std::endl;
00094   
00095   //------- Global Statistics on percentage of bad components along the IOVs ------//
00096   if(percentage!=0)
00097     edm::LogInfo("")<< "percentage " << detid << " " << percentage;
00098 }
00099 
00100 void 
00101 SiStripCorrelateBadStripAndNoise::correlateWithNoise(const uint32_t & detid, const uint32_t & firstStrip,  const uint32_t & range){
00102 
00103   std::vector<TH2F *>histos;
00104 
00105   SiStripNoises::Range noiseRange = noiseHandle_->getRange(detid);
00106   edm::LogInfo("Domenico") << "detid " << detid << " first " << firstStrip << " range " << range;
00107   float meanAPVNoise=getMeanNoise(noiseRange,firstStrip/128,128);
00108 
00109   //float meanNoiseHotStrips=getMeanNoise(noiseRange,firstStrip,range);
00110   for (size_t theStrip=firstStrip;theStrip<firstStrip+range;theStrip++){
00111     float meanNoiseHotStrips=getMeanNoise(noiseRange,theStrip,1);
00112   
00113     //Get the histogram for this detid
00114     getHistos(detid,histos);
00115     float yvalue=range<21?1.*range:21;
00116     
00117     for(size_t i=0;i<histos.size();++i)
00118       histos[i]->Fill(meanNoiseHotStrips/meanAPVNoise-1.,yvalue);
00119     
00120     if(meanNoiseHotStrips/meanAPVNoise-1.<-0.3)
00121       tkmap->fillc(detid,0xFF0000);
00122     else
00123       tkmap->fillc(detid,0x0000FF);
00124   }
00125 }
00126 
00127 float  
00128 SiStripCorrelateBadStripAndNoise::getMeanNoise(const SiStripNoises::Range& noiseRange,const uint32_t& firstStrip, const uint32_t& range){
00129   
00130   float mean=0;
00131   for (size_t istrip=firstStrip;istrip<firstStrip+range;istrip++){
00132     mean+=noiseHandle_->getNoise(istrip,noiseRange);
00133   }
00134   return mean/(1.*range);
00135 }
00136 
00137 void
00138 SiStripCorrelateBadStripAndNoise::getHistos(const uint32_t& detid,std::vector<TH2F*>& histos){
00139   
00140   histos.clear();
00141   
00142   int subdet=-999; int component=-999;
00143   SiStripDetId a(detid);
00144   if ( a.subdetId() == 3 ){
00145     subdet=0;
00146     component=TIBDetId(detid).layer();
00147   } else if ( a.subdetId() == 4 ) {
00148     subdet=1;
00149     component=TIDDetId(detid).side()==2?TIDDetId(detid).wheel():TIDDetId(detid).wheel()+3;
00150   } else if ( a.subdetId() == 5 ) {
00151     subdet=2;
00152     component=TOBDetId(detid).layer();
00153   } else if ( a.subdetId() == 6 ) {
00154     subdet=3;
00155     component=TECDetId(detid).side()==2?TECDetId(detid).wheel():TECDetId(detid).wheel()+9;
00156   } 
00157   
00158   int index=100+subdet*100+component;
00159 
00160 
00161   histos.push_back(getHisto(subdet));
00162   histos.push_back(getHisto(index));
00163   
00164 }
00165 
00166 TH2F*
00167 SiStripCorrelateBadStripAndNoise::getHisto(const long unsigned int& index){
00168   if(vTH2.size()<index+1)
00169     vTH2.resize(index+1,0);
00170   
00171   if(vTH2[index]==0){
00172     char name[128];
00173     sprintf(name,"%lu",index);
00174     edm::LogInfo("")<<"[getHisto] creating index " << index << std::endl;
00175     vTH2[index]=new TH2F(name,name,50,-2.,2.,21,0.5,21.5);
00176   }
00177   
00178   return vTH2[index];
00179 }
00180 
00181 void 
00182 SiStripCorrelateBadStripAndNoise::endJob() {
00183   for(size_t i=0;i<vTH2.size();i++)
00184     if(vTH2[i]!=0)
00185       vTH2[i]->Write();
00186 
00187   file->Write();
00188   file->Close();
00189 
00190   tkmap->save(true,0,0,"testTkMap.png");
00191 
00192 }
00193