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
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
00052
00053
00054
00055
00056
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
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
00110 for (size_t theStrip=firstStrip;theStrip<firstStrip+range;theStrip++){
00111 float meanNoiseHotStrips=getMeanNoise(noiseRange,theStrip,1);
00112
00113
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