00001 #include "CalibTracker/SiStripQuality/interface/SiStripBadAPVAlgorithmFromClusterOccupancy.h"
00002
00003
00004 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00005 #include "DataFormats/DetId/interface/DetId.h"
00006 #include "DataFormats/TrackerCommon/interface/TrackerTopology.h"
00007 #include "Geometry/Records/interface/IdealGeometryRecord.h"
00008 #include "Geometry/TrackerGeometryBuilder/interface/StripGeomDetUnit.h"
00009 #include "Geometry/CommonTopologies/interface/StripTopology.h"
00010 #include "CalibFormats/SiStripObjects/interface/SiStripQuality.h"
00011
00012
00013 SiStripBadAPVAlgorithmFromClusterOccupancy::SiStripBadAPVAlgorithmFromClusterOccupancy(const edm::ParameterSet& iConfig, const TrackerTopology* theTopo):
00014 lowoccupancy_(0),
00015 highoccupancy_(100),
00016 absolutelow_(0),
00017 numberiterations_(2),
00018 Nevents_(0),
00019 occupancy_(0),
00020 OutFileName_("Occupancy.root"),
00021 UseInputDB_(iConfig.getUntrackedParameter<bool>("UseInputDB",false)),
00022 tTopo(theTopo)
00023 {
00024 minNevents_=Nevents_*occupancy_;
00025 }
00026
00027 SiStripBadAPVAlgorithmFromClusterOccupancy::~SiStripBadAPVAlgorithmFromClusterOccupancy(){
00028 LogTrace("SiStripBadAPVAlgorithmFromClusterOccupancy")<<"[SiStripBadAPVAlgorithmFromClusterOccupancy::~SiStripBadAPVAlgorithmFromClusterOccupancy] "<<std::endl;
00029 }
00030
00031 void SiStripBadAPVAlgorithmFromClusterOccupancy::extractBadAPVs(SiStripQuality* siStripQuality,HistoMap& DM, edm::ESHandle<SiStripQuality>& inSiStripQuality){
00032
00033 LogTrace("SiStripBadAPVAlgorithmFromClusterOccupancy")<<"[SiStripBadAPVAlgorithmFromClusterOccupancy::extractBadAPVs] "<<std::endl;
00034
00035 if (WriteOutputFile_==true){
00036 f = new TFile(OutFileName_.c_str(),"RECREATE");
00037 f->cd();
00038
00039 apvtree = new TTree("moduleOccupancy","tree");
00040
00041 apvtree->Branch("DetRawId", &detrawid, "DetRawId/I");
00042 apvtree->Branch("SubDetId", &subdetid, "SubDetId/I");
00043 apvtree->Branch("Layer_Ring", &layer_ring, "Layer_Ring/I");
00044 apvtree->Branch("Disc", &disc, "Disc/I");
00045 apvtree->Branch("IsBack", &isback, "IsBack/I");
00046 apvtree->Branch("IsExternalString", &isexternalstring, "IsExternalString/I");
00047 apvtree->Branch("IsZMinusSide", &iszminusside, "IsZMinusSide/I");
00048 apvtree->Branch("RodStringPetal", &rodstringpetal, "RodStringPetal/I");
00049 apvtree->Branch("IsStereo", &isstereo, "IsStereo/I");
00050 apvtree->Branch("ModuleNumber", &module_number, "ModuleNumber/I");
00051 apvtree->Branch("NumberOfStrips", &number_strips, "NumberOfStrips/I");
00052 apvtree->Branch("APVGlobalPositionX", &global_position_x, "APVGlobalPositionX/F");
00053 apvtree->Branch("APVGlobalPositionY", &global_position_y, "APVGlobalPositionY/F");
00054 apvtree->Branch("APVGlobalPositionZ", &global_position_z, "APVGlobalPositionZ/F");
00055 apvtree->Branch("APVNumber", &apv_number, "APVNumber/I");
00056 apvtree->Branch("APVAbsoluteOccupancy", &apvAbsoluteOccupancy, "apvAbsoluteOccupancy/D");
00057 apvtree->Branch("APVMedianOccupancy", &apvMedianOccupancy, "apvMedianOccupancy/D");
00058 }
00059
00060 HistoMap::iterator it=DM.begin();
00061 HistoMap::iterator itEnd=DM.end();
00062 std::vector<unsigned int> badStripList;
00063 uint32_t detid;
00064 for (;it!=itEnd;++it){
00065
00066 Apv APV;
00067
00068 for (int apv=0; apv<6; apv++)
00069 {
00070 APV.apvMedian[apv] = 0;
00071 APV.apvabsoluteOccupancy[apv] = 0;
00072
00073 for (int strip=0; strip<128; strip++)
00074 {
00075 stripOccupancy[apv][strip] = 0;
00076 stripWeight[apv][strip] = 0;
00077 }
00078 }
00079
00080 pHisto phisto;
00081 phisto._th1f = it->second.get();
00082 phisto._NEntries = (int)phisto._th1f->GetEntries();
00083 phisto._NBins = phisto._th1f->GetNbinsX();
00084
00085 number_strips = (int)phisto._NBins;
00086 number_apvs = number_strips/128;
00087 APV.numberApvs = number_apvs;
00088
00089 for (int apv=0; apv<number_apvs; apv++)
00090 {
00091 for (int strip=0; strip<128; strip++)
00092 {
00093 stripOccupancy[apv][strip] = phisto._th1f->GetBinContent((apv*128)+strip+1);
00094 stripWeight[apv][strip] = 1;
00095 APV.apvabsoluteOccupancy[apv] += phisto._th1f->GetBinContent((apv*128)+strip+1);
00096 }
00097 }
00098
00099 for (int apv=0; apv<number_apvs; apv++)
00100 {
00101 APV.apvMedian[apv] = TMath::Median(128,stripOccupancy[apv],stripWeight[apv]);
00102 }
00103
00104 detid=it->first;
00105 DetId detectorId=DetId(detid);
00106
00107 if (edm::isDebugEnabled())
00108 LogTrace("SiStripBadAPV") << "Analyzing detid " << detid<< std::endl;
00109
00110 detrawid = detid;
00111 APV.detrawId = detrawid;
00112 subdetid = detectorId.subdetId();
00113 if (SiStripDetId(detrawid).stereo() !=0 ) isstereo = 1;
00114 else isstereo = 0;
00115 switch (detectorId.subdetId())
00116 {
00117 case StripSubdetector::TIB :
00118 layer_ring = tTopo->tibLayer(detrawid);
00119 disc = -1;
00120 isback = -1;
00121 if (tTopo->tibIsExternalString(detrawid)) isexternalstring = 1;
00122 else isexternalstring = 0;
00123 if (tTopo->tibIsZMinusSide(detrawid)) iszminusside = 1;
00124 else iszminusside = 0;
00125 rodstringpetal = tTopo->tibString(detrawid);
00126 module_number = tTopo->tibModule(detrawid);
00127 APV.modulePosition = module_number;
00128
00129 if (layer_ring == 1) medianValues_TIB_Layer1.push_back(APV);
00130 else if (layer_ring == 2) medianValues_TIB_Layer2.push_back(APV);
00131 else if (layer_ring == 3) medianValues_TIB_Layer3.push_back(APV);
00132 else if (layer_ring == 4) medianValues_TIB_Layer4.push_back(APV);
00133 break;
00134
00135 case StripSubdetector::TID :
00136 layer_ring = tTopo->tidRing(detrawid);
00137 disc = tTopo->tidWheel(detrawid);
00138 if (tTopo->tidIsBackRing(detrawid)) isback = 1;
00139 else isback = 0;
00140 if (tTopo->tidIsZMinusSide(detrawid)) iszminusside = 1;
00141 else iszminusside = 0;
00142 isexternalstring = -1;
00143 rodstringpetal = -1;
00144 module_number = tTopo->tidModule(detrawid);
00145 APV.modulePosition = layer_ring;
00146
00147 if (iszminusside==0)
00148 {
00149 if (disc==1) medianValues_TIDPlus_Disc1.push_back(APV);
00150 else if (disc==2) medianValues_TIDPlus_Disc2.push_back(APV);
00151 else if (disc==3) medianValues_TIDPlus_Disc3.push_back(APV);
00152 }
00153 else if (iszminusside==1)
00154 {
00155 if (disc==1) medianValues_TIDMinus_Disc1.push_back(APV);
00156 else if (disc==2) medianValues_TIDMinus_Disc2.push_back(APV);
00157 else if (disc==3) medianValues_TIDMinus_Disc3.push_back(APV);
00158 }
00159 break;
00160
00161 case StripSubdetector::TOB :
00162 layer_ring = tTopo->tobLayer(detrawid);
00163 disc = -1;
00164 isback = -1;
00165 if (tTopo->tobIsZMinusSide(detrawid)) iszminusside = 1;
00166 else iszminusside = 0;
00167 isexternalstring = -1;
00168 rodstringpetal = tTopo->tobRod(detrawid);
00169 module_number = tTopo->tobModule(detrawid);
00170 APV.modulePosition = module_number;
00171
00172 if (layer_ring == 1) medianValues_TOB_Layer1.push_back(APV);
00173 else if (layer_ring == 2) medianValues_TOB_Layer2.push_back(APV);
00174 else if (layer_ring == 3) medianValues_TOB_Layer3.push_back(APV);
00175 else if (layer_ring == 4) medianValues_TOB_Layer4.push_back(APV);
00176 else if (layer_ring == 5) medianValues_TOB_Layer5.push_back(APV);
00177 else if (layer_ring == 6) medianValues_TOB_Layer6.push_back(APV);
00178 break;
00179
00180 case StripSubdetector::TEC :
00181 layer_ring = tTopo->tecRing(detrawid);
00182 disc = tTopo->tecWheel(detrawid);
00183 if (tTopo->tecIsBackPetal(detrawid)) isback = 1;
00184 else isback = 0;
00185 if (tTopo->tecIsZMinusSide(detrawid)) iszminusside = 1;
00186 else iszminusside = 0;
00187 isexternalstring = -1;
00188 rodstringpetal = tTopo->tecPetalNumber(detrawid);
00189 module_number = tTopo->tecModule(detrawid);
00190 APV.modulePosition = layer_ring;
00191
00192 if (iszminusside==0)
00193 {
00194 if (disc==1) medianValues_TECPlus_Disc1.push_back(APV);
00195 else if (disc==2) medianValues_TECPlus_Disc2.push_back(APV);
00196 else if (disc==3) medianValues_TECPlus_Disc3.push_back(APV);
00197 else if (disc==4) medianValues_TECPlus_Disc4.push_back(APV);
00198 else if (disc==5) medianValues_TECPlus_Disc5.push_back(APV);
00199 else if (disc==6) medianValues_TECPlus_Disc6.push_back(APV);
00200 else if (disc==7) medianValues_TECPlus_Disc7.push_back(APV);
00201 else if (disc==8) medianValues_TECPlus_Disc8.push_back(APV);
00202 else if (disc==9) medianValues_TECPlus_Disc9.push_back(APV);
00203 }
00204 else if (iszminusside==1)
00205 {
00206 if (disc==1) medianValues_TECMinus_Disc1.push_back(APV);
00207 else if (disc==2) medianValues_TECMinus_Disc2.push_back(APV);
00208 else if (disc==3) medianValues_TECMinus_Disc3.push_back(APV);
00209 else if (disc==4) medianValues_TECMinus_Disc4.push_back(APV);
00210 else if (disc==5) medianValues_TECMinus_Disc5.push_back(APV);
00211 else if (disc==6) medianValues_TECMinus_Disc6.push_back(APV);
00212 else if (disc==7) medianValues_TECMinus_Disc7.push_back(APV);
00213 else if (disc==8) medianValues_TECMinus_Disc8.push_back(APV);
00214 else if (disc==9) medianValues_TECMinus_Disc9.push_back(APV);
00215 }
00216 break;
00217
00218 default :
00219 std::cout << "### Detector does not belong to TIB, TID, TOB or TEC !? ###" << std::endl;
00220 std::cout << "### DetRawId: " << detrawid << " ###" << std::endl;
00221 }
00222
00223 const StripGeomDetUnit* theStripDet = dynamic_cast<const StripGeomDetUnit*>( (TkGeom->idToDet(detectorId)) );
00224 const StripTopology* theStripTopol = dynamic_cast<const StripTopology*>( &(theStripDet->specificTopology()) );
00225
00226 for (int apv=0; apv<number_apvs; apv++)
00227 {
00228 apv_number = apv+1;
00229 apvMedianOccupancy = APV.apvMedian[apv];
00230 apvAbsoluteOccupancy = APV.apvabsoluteOccupancy[apv];
00231
00232 LocalPoint pos_strip_local = theStripTopol->localPosition((apv*128));
00233 GlobalPoint pos_strip_global = (TkGeom->idToDet(detectorId))->surface().toGlobal(pos_strip_local);
00234
00235 global_position_x = pos_strip_global.x();
00236 global_position_y = pos_strip_global.y();
00237 global_position_z = pos_strip_global.z();
00238
00239 if (WriteOutputFile_==true) apvtree->Fill();
00240 }
00241
00242 }
00243
00244
00245 CalculateMeanAndRMS(medianValues_TIB_Layer1,MeanAndRms_TIB_Layer1,numberiterations_);
00246 CalculateMeanAndRMS(medianValues_TIB_Layer2,MeanAndRms_TIB_Layer2,numberiterations_);
00247 CalculateMeanAndRMS(medianValues_TIB_Layer3,MeanAndRms_TIB_Layer3,numberiterations_);
00248 CalculateMeanAndRMS(medianValues_TIB_Layer4,MeanAndRms_TIB_Layer4,numberiterations_);
00249
00250 CalculateMeanAndRMS(medianValues_TOB_Layer1,MeanAndRms_TOB_Layer1,numberiterations_);
00251 CalculateMeanAndRMS(medianValues_TOB_Layer2,MeanAndRms_TOB_Layer2,numberiterations_);
00252 CalculateMeanAndRMS(medianValues_TOB_Layer3,MeanAndRms_TOB_Layer3,numberiterations_);
00253 CalculateMeanAndRMS(medianValues_TOB_Layer4,MeanAndRms_TOB_Layer4,numberiterations_);
00254 CalculateMeanAndRMS(medianValues_TOB_Layer5,MeanAndRms_TOB_Layer5,numberiterations_);
00255 CalculateMeanAndRMS(medianValues_TOB_Layer6,MeanAndRms_TOB_Layer6,numberiterations_);
00256
00257 CalculateMeanAndRMS(medianValues_TIDPlus_Disc1,MeanAndRms_TIDPlus_Disc1,numberiterations_);
00258 CalculateMeanAndRMS(medianValues_TIDPlus_Disc2,MeanAndRms_TIDPlus_Disc2,numberiterations_);
00259 CalculateMeanAndRMS(medianValues_TIDPlus_Disc3,MeanAndRms_TIDPlus_Disc3,numberiterations_);
00260 CalculateMeanAndRMS(medianValues_TIDMinus_Disc1,MeanAndRms_TIDMinus_Disc1,numberiterations_);
00261 CalculateMeanAndRMS(medianValues_TIDMinus_Disc2,MeanAndRms_TIDMinus_Disc2,numberiterations_);
00262 CalculateMeanAndRMS(medianValues_TIDMinus_Disc3,MeanAndRms_TIDMinus_Disc3,numberiterations_);
00263
00264 CalculateMeanAndRMS(medianValues_TECPlus_Disc1,MeanAndRms_TECPlus_Disc1,numberiterations_);
00265 CalculateMeanAndRMS(medianValues_TECPlus_Disc2,MeanAndRms_TECPlus_Disc2,numberiterations_);
00266 CalculateMeanAndRMS(medianValues_TECPlus_Disc3,MeanAndRms_TECPlus_Disc3,numberiterations_);
00267 CalculateMeanAndRMS(medianValues_TECPlus_Disc4,MeanAndRms_TECPlus_Disc4,numberiterations_);
00268 CalculateMeanAndRMS(medianValues_TECPlus_Disc5,MeanAndRms_TECPlus_Disc5,numberiterations_);
00269 CalculateMeanAndRMS(medianValues_TECPlus_Disc6,MeanAndRms_TECPlus_Disc6,numberiterations_);
00270 CalculateMeanAndRMS(medianValues_TECPlus_Disc7,MeanAndRms_TECPlus_Disc7,numberiterations_);
00271 CalculateMeanAndRMS(medianValues_TECPlus_Disc8,MeanAndRms_TECPlus_Disc8,numberiterations_);
00272 CalculateMeanAndRMS(medianValues_TECPlus_Disc9,MeanAndRms_TECPlus_Disc9,numberiterations_);
00273
00274 CalculateMeanAndRMS(medianValues_TECMinus_Disc1,MeanAndRms_TECMinus_Disc1,numberiterations_);
00275 CalculateMeanAndRMS(medianValues_TECMinus_Disc2,MeanAndRms_TECMinus_Disc2,numberiterations_);
00276 CalculateMeanAndRMS(medianValues_TECMinus_Disc3,MeanAndRms_TECMinus_Disc3,numberiterations_);
00277 CalculateMeanAndRMS(medianValues_TECMinus_Disc4,MeanAndRms_TECMinus_Disc4,numberiterations_);
00278 CalculateMeanAndRMS(medianValues_TECMinus_Disc5,MeanAndRms_TECMinus_Disc5,numberiterations_);
00279 CalculateMeanAndRMS(medianValues_TECMinus_Disc6,MeanAndRms_TECMinus_Disc6,numberiterations_);
00280 CalculateMeanAndRMS(medianValues_TECMinus_Disc7,MeanAndRms_TECMinus_Disc7,numberiterations_);
00281 CalculateMeanAndRMS(medianValues_TECMinus_Disc8,MeanAndRms_TECMinus_Disc8,numberiterations_);
00282 CalculateMeanAndRMS(medianValues_TECMinus_Disc9,MeanAndRms_TECMinus_Disc9,numberiterations_);
00283
00284 pQuality=siStripQuality;
00285 badStripList.clear();
00286
00287
00288 AnalyzeOccupancy(siStripQuality,medianValues_TIB_Layer1,MeanAndRms_TIB_Layer1,badStripList,inSiStripQuality);
00289 AnalyzeOccupancy(siStripQuality,medianValues_TIB_Layer2,MeanAndRms_TIB_Layer2,badStripList,inSiStripQuality);
00290 AnalyzeOccupancy(siStripQuality,medianValues_TIB_Layer3,MeanAndRms_TIB_Layer3,badStripList,inSiStripQuality);
00291 AnalyzeOccupancy(siStripQuality,medianValues_TIB_Layer4,MeanAndRms_TIB_Layer4,badStripList,inSiStripQuality);
00292
00293 AnalyzeOccupancy(siStripQuality,medianValues_TOB_Layer1,MeanAndRms_TOB_Layer1,badStripList,inSiStripQuality);
00294 AnalyzeOccupancy(siStripQuality,medianValues_TOB_Layer2,MeanAndRms_TOB_Layer2,badStripList,inSiStripQuality);
00295 AnalyzeOccupancy(siStripQuality,medianValues_TOB_Layer3,MeanAndRms_TOB_Layer3,badStripList,inSiStripQuality);
00296 AnalyzeOccupancy(siStripQuality,medianValues_TOB_Layer4,MeanAndRms_TOB_Layer4,badStripList,inSiStripQuality);
00297 AnalyzeOccupancy(siStripQuality,medianValues_TOB_Layer5,MeanAndRms_TOB_Layer5,badStripList,inSiStripQuality);
00298 AnalyzeOccupancy(siStripQuality,medianValues_TOB_Layer6,MeanAndRms_TOB_Layer6,badStripList,inSiStripQuality);
00299
00300 AnalyzeOccupancy(siStripQuality,medianValues_TIDPlus_Disc1,MeanAndRms_TIDPlus_Disc1,badStripList,inSiStripQuality);
00301 AnalyzeOccupancy(siStripQuality,medianValues_TIDPlus_Disc2,MeanAndRms_TIDPlus_Disc2,badStripList,inSiStripQuality);
00302 AnalyzeOccupancy(siStripQuality,medianValues_TIDPlus_Disc3,MeanAndRms_TIDPlus_Disc3,badStripList,inSiStripQuality);
00303 AnalyzeOccupancy(siStripQuality,medianValues_TIDMinus_Disc1,MeanAndRms_TIDMinus_Disc1,badStripList,inSiStripQuality);
00304 AnalyzeOccupancy(siStripQuality,medianValues_TIDMinus_Disc2,MeanAndRms_TIDMinus_Disc2,badStripList,inSiStripQuality);
00305 AnalyzeOccupancy(siStripQuality,medianValues_TIDMinus_Disc3,MeanAndRms_TIDMinus_Disc3,badStripList,inSiStripQuality);
00306
00307 AnalyzeOccupancy(siStripQuality,medianValues_TECPlus_Disc1,MeanAndRms_TECPlus_Disc1,badStripList,inSiStripQuality);
00308 AnalyzeOccupancy(siStripQuality,medianValues_TECPlus_Disc2,MeanAndRms_TECPlus_Disc2,badStripList,inSiStripQuality);
00309 AnalyzeOccupancy(siStripQuality,medianValues_TECPlus_Disc3,MeanAndRms_TECPlus_Disc3,badStripList,inSiStripQuality);
00310 AnalyzeOccupancy(siStripQuality,medianValues_TECPlus_Disc4,MeanAndRms_TECPlus_Disc4,badStripList,inSiStripQuality);
00311 AnalyzeOccupancy(siStripQuality,medianValues_TECPlus_Disc5,MeanAndRms_TECPlus_Disc5,badStripList,inSiStripQuality);
00312 AnalyzeOccupancy(siStripQuality,medianValues_TECPlus_Disc6,MeanAndRms_TECPlus_Disc6,badStripList,inSiStripQuality);
00313 AnalyzeOccupancy(siStripQuality,medianValues_TECPlus_Disc7,MeanAndRms_TECPlus_Disc7,badStripList,inSiStripQuality);
00314 AnalyzeOccupancy(siStripQuality,medianValues_TECPlus_Disc8,MeanAndRms_TECPlus_Disc8,badStripList,inSiStripQuality);
00315 AnalyzeOccupancy(siStripQuality,medianValues_TECPlus_Disc9,MeanAndRms_TECPlus_Disc9,badStripList,inSiStripQuality);
00316
00317 AnalyzeOccupancy(siStripQuality,medianValues_TECMinus_Disc1,MeanAndRms_TECMinus_Disc1,badStripList,inSiStripQuality);
00318 AnalyzeOccupancy(siStripQuality,medianValues_TECMinus_Disc2,MeanAndRms_TECMinus_Disc2,badStripList,inSiStripQuality);
00319 AnalyzeOccupancy(siStripQuality,medianValues_TECMinus_Disc3,MeanAndRms_TECMinus_Disc3,badStripList,inSiStripQuality);
00320 AnalyzeOccupancy(siStripQuality,medianValues_TECMinus_Disc4,MeanAndRms_TECMinus_Disc4,badStripList,inSiStripQuality);
00321 AnalyzeOccupancy(siStripQuality,medianValues_TECMinus_Disc5,MeanAndRms_TECMinus_Disc5,badStripList,inSiStripQuality);
00322 AnalyzeOccupancy(siStripQuality,medianValues_TECMinus_Disc6,MeanAndRms_TECMinus_Disc6,badStripList,inSiStripQuality);
00323 AnalyzeOccupancy(siStripQuality,medianValues_TECMinus_Disc7,MeanAndRms_TECMinus_Disc7,badStripList,inSiStripQuality);
00324 AnalyzeOccupancy(siStripQuality,medianValues_TECMinus_Disc8,MeanAndRms_TECMinus_Disc8,badStripList,inSiStripQuality);
00325 AnalyzeOccupancy(siStripQuality,medianValues_TECMinus_Disc9,MeanAndRms_TECMinus_Disc9,badStripList,inSiStripQuality);
00326
00327 siStripQuality->fillBadComponents();
00328
00329 if (WriteOutputFile_==true){
00330 f->cd();
00331 apvtree->Write();
00332 f->Close();
00333 }
00334
00335 LogTrace("SiStripBadAPV") << ss.str() << std::endl;
00336 }
00337
00338
00339 void SiStripBadAPVAlgorithmFromClusterOccupancy::CalculateMeanAndRMS(std::vector<Apv> a, std::pair<double,double>* MeanRMS, int number_iterations)
00340 {
00341 Double_t tot[7], tot2[7];
00342 Double_t n[7];
00343
00344 Double_t Mean[7] = {0};
00345 Double_t Rms[7] = {1000,1000,1000,1000,1000,1000,1000};
00346
00347 int Moduleposition;
00348
00349 for (int i=0; i<number_iterations; i++)
00350 {
00351 for (int j=0; j<7; j++)
00352 {
00353 n[j] = 0;
00354 tot[j] = 0;
00355 tot2[j] = 0;
00356 }
00357
00358 for (uint32_t it=0; it<a.size(); it++)
00359 {
00360 Moduleposition = (a[it].modulePosition)-1;
00361
00362 for (int apv=0; apv<a[it].numberApvs; apv++)
00363 {
00364 if (i>0)
00365 {
00366 if (a[it].apvMedian[apv]<(Mean[Moduleposition]-3*Rms[Moduleposition]) || (a[it].apvMedian[apv]>(Mean[Moduleposition]+5*Rms[Moduleposition])))
00367 {
00368 continue;
00369 }
00370 }
00371 tot[Moduleposition] += a[it].apvMedian[apv];
00372 tot2[Moduleposition] += (a[it].apvMedian[apv])*(a[it].apvMedian[apv]);
00373 n[Moduleposition]++;
00374 }
00375 }
00376
00377 for (int j=0; j<7; j++)
00378 {
00379 if (n[j]!=0)
00380 {
00381 Mean[j] = tot[j]/n[j];
00382 Rms[j] = TMath::Sqrt(TMath::Abs(tot2[j]/n[j] -Mean[j]*Mean[j]));
00383 }
00384 }
00385 }
00386
00387 for (int j=0; j<7; j++)
00388 {
00389 MeanRMS[j] = std::make_pair(Mean[j],Rms[j]);
00390 }
00391
00392 }
00393
00394 void SiStripBadAPVAlgorithmFromClusterOccupancy::AnalyzeOccupancy(SiStripQuality* quality, std::vector<Apv>& medianValues, std::pair<double,double>* MeanAndRms, std::vector<unsigned int>& BadStripList, edm::ESHandle<SiStripQuality>& InSiStripQuality)
00395 {
00396 int Moduleposition;
00397 uint32_t Detid;
00398
00399 for (uint32_t it=0; it<medianValues.size(); it++)
00400 {
00401 Moduleposition = (medianValues[it].modulePosition)-1;
00402 Detid = medianValues[it].detrawId;
00403
00404 for (int apv=0; apv<medianValues[it].numberApvs; apv++)
00405 {
00406 if(UseInputDB_)
00407 {
00408 if(InSiStripQuality->IsApvBad(Detid,apv) )
00409 {
00410 continue;
00411 }
00412 }
00413 if (medianValues[it].apvMedian[apv] > minNevents_)
00414 {
00415 if ((medianValues[it].apvMedian[apv]>(MeanAndRms[Moduleposition].first+highoccupancy_*MeanAndRms[Moduleposition].second)) && (medianValues[it].apvMedian[apv]>absolutelow_))
00416 BadStripList.push_back(pQuality->encode((apv*128),128,0));
00417 }
00418 else if (medianValues[it].apvMedian[apv]<(MeanAndRms[Moduleposition].first-lowoccupancy_*MeanAndRms[Moduleposition].second) && (MeanAndRms[Moduleposition].first>2 || medianValues[it].apvabsoluteOccupancy[apv]==0))
00419 {
00420 BadStripList.push_back(pQuality->encode((apv*128),128,0));
00421 std::cout << "Dead APV! DetId: " << medianValues[it].detrawId << ", APV number: " << apv+1 << ", APVMedian: " << medianValues[it].apvMedian[apv] << ", Mean: " << MeanAndRms[Moduleposition].first << ", RMS: " << MeanAndRms[Moduleposition].second << ", LowThreshold: " << lowoccupancy_ << ", Mean-Low*RMS: " << (MeanAndRms[Moduleposition].first-lowoccupancy_*MeanAndRms[Moduleposition].second) << std::endl;
00422 }
00423 }
00424 if (BadStripList.begin()!=BadStripList.end())
00425 {
00426 quality->compact(Detid,BadStripList);
00427 SiStripQuality::Range range(BadStripList.begin(),BadStripList.end());
00428 quality->put(Detid,range);
00429 }
00430 BadStripList.clear();
00431 }
00432 }
00433
00434 void SiStripBadAPVAlgorithmFromClusterOccupancy::setMinNumOfEvents()
00435 {
00436 minNevents_=occupancy_*Nevents_;
00437 }