CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_5/src/CalibTracker/SiStripQuality/src/SiStripBadAPVAlgorithmFromClusterOccupancy.cc

Go to the documentation of this file.
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); // Remember: Bin=0 is underflow bin!
00094             stripWeight[apv][strip]        = 1;
00095             APV.apvabsoluteOccupancy[apv] += phisto._th1f->GetBinContent((apv*128)+strip+1); // Remember: Bin=0 is underflow bin!
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; // It's a stereo module
00114     else                                      isstereo = 0; // It's an rphi module
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   } // end loop on modules
00243 
00244   // Calculate Mean and RMS for each Layer
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   // Analyze the APV Occupancy for hot APVs
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;//if the apv is already flagged as bad, 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 }