CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
SiStripHotStripAlgorithmFromClusterOccupancy.cc
Go to the documentation of this file.
2 
3 
4 
5 
7  prob_(1.E-7),
8  MinNumEntries_(0),
9  MinNumEntriesPerStrip_(0),
10  Nevents_(0),
11  occupancy_(0),
12  OutFileName_("Occupancy.root"),
13  UseInputDB_(iConfig.getUntrackedParameter<bool>("UseInputDB",false))
14  {
16  }
17 
18 
20  LogTrace("SiStripHotStripAlgorithmFromClusterOccupancy")<<"[SiStripHotStripAlgorithmFromClusterOccupancy::~SiStripHotStripAlgorithmFromClusterOccupancy] "<<std::endl;
21 }
22 
24 
25  LogTrace("SiStripHotStripAlgorithmFromClusterOccupancy")<<"[SiStripHotStripAlgorithmFromClusterOccupancy::extractBadStrips] "<<std::endl;
26 
27 
28 
29  if (WriteOutputFile_==true){
30  f = new TFile(OutFileName_.c_str(),"RECREATE");
31  f->cd();
32 
33  striptree = new TTree("stripOccupancy","tree");
34 
35  striptree->Branch("DetRawId", &detrawid, "DetRawId/I");
36  striptree->Branch("SubDetId", &subdetid, "SubDetId/I");
37  striptree->Branch("Layer_Ring", &layer_ring, "Layer_Ring/I");
38  striptree->Branch("Disc", &disc, "Disc/I");
39  striptree->Branch("IsBack", &isback, "IsBack/I");
40  striptree->Branch("IsExternalString", &isexternalstring, "IsExternalString/I");
41  striptree->Branch("IsZMinusSide", &iszminusside, "IsZMinusSide/I");
42  striptree->Branch("RodStringPetal", &rodstringpetal, "RodStringPetal/I");
43  striptree->Branch("IsStereo", &isstereo, "IsStereo/I");
44  striptree->Branch("ModulePosition", &module_position, "ModulePosition/I");
45  striptree->Branch("NumberOfStrips", &number_strips, "NumberOfStrips/I");
46  striptree->Branch("StripNumber", &strip_number, "StripNumber/I");
47  striptree->Branch("APVChannel", &apv_channel, "APVChannel/I");
48  striptree->Branch("StripGlobalPositionX", &global_position_x, "StripGlobalPositionX/F");
49  striptree->Branch("StripGlobalPositionY", &global_position_y, "StripGlobalPositionY/F");
50  striptree->Branch("StripGlobalPositionZ", &global_position_z, "StripGlobalPositionZ/F");
51  striptree->Branch("IsHot", &isHot, "IsHot/I");
52  striptree->Branch("HotStripsPerAPV", &hotStripsPerAPV, "HotStripsPerAPV/I");
53  striptree->Branch("HotStripsPerModule", &hotStripsPerModule,"HotStripsPerModule/I");
54  striptree->Branch("StripOccupancy", &stripOccupancy, "StripOccupancy/D");
55  striptree->Branch("StripHits", &stripHits, "StripHits/I");
56  striptree->Branch("PoissonProb", &poissonProb, "PoissonProb/D");
57  }
58 
59 
60  HistoMap::iterator it=DM.begin();
61  HistoMap::iterator itEnd=DM.end();
62  std::vector<unsigned int> badStripList;
63  uint32_t detid;
64  for (;it!=itEnd;++it){
65  pHisto phisto;
66  detid=it->first;
67 
68  DetId detectorId=DetId(detid);
69  phisto._SubdetId=detectorId.subdetId();
70 
71  if (edm::isDebugEnabled())
72  LogTrace("SiStripHotStrip") << "Analyzing detid " << detid<< std::endl;
73 
74  int numberAPVs = (int)(it->second.get())->GetNbinsX()/128;
75 
76  // Set the values for the tree:
77 
78  detrawid = detid;
79  subdetid = detectorId.subdetId();
80  number_strips = (int)(it->second.get())->GetNbinsX();
81  if (SiStripDetId(detrawid).stereo() !=0 ) isstereo = 1; // It's a stereo module
82  else isstereo = 0; // It's an rphi module
83  switch (detectorId.subdetId())
84  {
87  disc = -1;
88  isback = -1;
89  if (TIBDetId(detrawid).isExternalString()) isexternalstring = 1;
90  else isexternalstring = 0;
91  if (TIBDetId(detrawid).isZMinusSide()) iszminusside = 1;
92  else iszminusside = 0;
95  break;
96 
100  if (TIDDetId(detrawid).isBackRing()) isback = 1;
101  else isback = 0;
102  if (TIDDetId(detrawid).isZMinusSide()) iszminusside = 1;
103  else iszminusside = 0;
104  isexternalstring = -1;
105  rodstringpetal = -1;
107  break;
108 
109  case StripSubdetector::TOB :
111  disc = -1;
112  isback = -1;
113  if (TOBDetId(detrawid).isZMinusSide()) iszminusside = 1;
114  else iszminusside = 0;
115  isexternalstring = -1;
118  break;
119 
120  case StripSubdetector::TEC :
123  if (TECDetId(detrawid).isBackPetal()) isback = 1;
124  else isback = 0;
125  if (TECDetId(detrawid).isZMinusSide()) iszminusside = 1;
126  else iszminusside = 0;
127  isexternalstring = -1;
130  break;
131 
132  default :
133  std::cout << "### Detector does not belong to TIB, TID, TOB or TEC !? ###" << std::endl;
134  std::cout << "### DetRawId: " << detrawid << " ###" << std::endl;
135  }
136 
137  // End: Set the values for the tree.
138 
139 
140  pQuality=OutSiStripQuality;
141  badStripList.clear();
142 
143  for (int i=0; i<768; i++){
144  ishot[i] = 0;
145  stripoccupancy[i] = 0;
146  striphits[i] = 0;
147  poissonprob[i] = 0;
148  hotstripsperapv[i/128] = 0;
149  }
150 
151  hotstripspermodule = 0;
152 
153  for (int apv=0; apv<numberAPVs; apv++){
154  if(UseInputDB_){
155  if(InSiStripQuality->IsApvBad(detid,apv) ){
156  if(edm::isDebugEnabled())
157  LogTrace("SiStripHotStrip")<<"(Module and Apv number) "<<detid<<" , "<<apv<<" excluded by input ESetup."<<std::endl;
158  continue;//if the apv is already flagged as bad, continue.
159  }
160  else{
161  if(edm::isDebugEnabled())
162  LogTrace("SiStripHotStrip")<<"(Module and Apv number) "<<detid<<" , "<<apv<<" good by input ESetup."<<std::endl;
163  }
164  }
165 
166  phisto._th1f = new TH1F("tmp","tmp",128,0.5,128.5);
167  int NumberEntriesPerAPV=0;
168 
169  for (int strip=0; strip<128; strip++){
170  phisto._th1f->SetBinContent(strip+1,(it->second.get())->GetBinContent((apv*128)+strip+1));
171  NumberEntriesPerAPV += (int)(it->second.get())->GetBinContent((apv*128)+strip+1);
172  }
173 
174  phisto._th1f->SetEntries(NumberEntriesPerAPV);
175  phisto._NEntries=(int)phisto._th1f->GetEntries();
176 
177  LogTrace("SiStripHotStrip") << "Number of clusters in APV " << apv << ": " << NumberEntriesPerAPV << std::endl;
178 
179  iterativeSearch(phisto,badStripList,apv);
180 
181  delete phisto._th1f;
182  }
183 
184  const StripGeomDetUnit* theStripDet = dynamic_cast<const StripGeomDetUnit*>( (TkGeom->idToDet(detectorId)) );
185  const StripTopology* theStripTopol = dynamic_cast<const StripTopology*>( &(theStripDet->specificTopology()) );
186 
187  for (int strip=0; strip<number_strips; strip++)
188  {
189  strip_number = strip+1;
190  apv_channel = (strip%128)+1;
191  isHot = ishot[strip];
195 
198 
199  LocalPoint pos_strip_local = theStripTopol->localPosition(strip);
200  GlobalPoint pos_strip_global = (TkGeom->idToDet(detectorId))->surface().toGlobal(pos_strip_local);
201 
202  global_position_x = pos_strip_global.x();
203  global_position_y = pos_strip_global.y();
204  global_position_z = pos_strip_global.z();
205 
206  if (WriteOutputFile_==true) striptree->Fill();
207  }
208 
209  if (badStripList.begin()==badStripList.end())
210  continue;
211 
212  OutSiStripQuality->compact(detid,badStripList);
213 
214  SiStripQuality::Range range(badStripList.begin(),badStripList.end());
215  if ( ! OutSiStripQuality->put(detid,range) )
216  edm::LogError("SiStripHotStrip")<<"[SiStripHotStripAlgorithmFromClusterOccupancy::extractBadStrips] detid already exists"<<std::endl;
217  }
218  OutSiStripQuality->fillBadComponents();
219 
220  if (WriteOutputFile_==true){
221  f->cd();
222  striptree->Write();
223  f->Close();
224  }
225 
226  LogTrace("SiStripHotStrip") << ss.str() << std::endl;
227 }
228 
229 
230 void SiStripHotStripAlgorithmFromClusterOccupancy::iterativeSearch(pHisto& histo,std::vector<unsigned int>& vect, int apv){
231  if (!histo._NEntries || histo._NEntries <=MinNumEntries_ || histo._NEntries <= minNevents_)
232  return;
233 
234  size_t startingSize=vect.size();
235  long double diff=1.-prob_;
236 
237  int Nbins = histo._th1f->GetNbinsX();
238  int ibinStart = 1;
239  int ibinStop = Nbins+1;
240  int MaxEntry = (int)histo._th1f->GetMaximum();
241 
242  std::vector<long double> vPoissonProbs(MaxEntry+1,0);
243  long double meanVal=1.*histo._NEntries/(1.*Nbins-histo._NEmptyBins);
244  evaluatePoissonian(vPoissonProbs,meanVal);
245 
246  for (Int_t i=ibinStart; i<ibinStop; ++i){
247  unsigned int entries= (unsigned int)histo._th1f->GetBinContent(i);
248 
249  if (ishot[(apv*128)+i-1]==0){
250  stripoccupancy[(apv*128)+i-1] = entries/(double) Nevents_;
251  striphits[(apv*128)+i-1] = entries;
252  poissonprob[(apv*128)+i-1] = 1-vPoissonProbs[entries];
253  }
254 
255  if (entries<=MinNumEntriesPerStrip_ || entries <= minNevents_)
256  continue;
257 
258  if(diff<vPoissonProbs[entries]){
259  ishot[(apv*128)+i-1] = 1;
261  hotstripsperapv[apv]++;
262  histo._th1f->SetBinContent(i,0.);
263  histo._NEntries-=entries;
264  histo._NEmptyBins++;
265  if (edm::isDebugEnabled())
266  LogTrace("SiStripHotStrip")<< " rejecting strip " << (apv*128)+i-1 << " value " << entries << " diff " << diff << " prob " << vPoissonProbs[entries]<< std::endl;
267  vect.push_back(pQuality->encode((apv*128)+i-1,1,0));
268  }
269 
270  }
271  if (edm::isDebugEnabled())
272  LogTrace("SiStripHotStrip") << " [SiStripHotStripAlgorithmFromClusterOccupancy::iterativeSearch] Nbins="<< Nbins << " MaxEntry="<<MaxEntry << " meanVal=" << meanVal << " NEmptyBins="<<histo._NEmptyBins<< " NEntries=" << histo._NEntries << " thEntries " << histo._th1f->GetEntries()<< " startingSize " << startingSize << " vector.size " << vect.size() << std::endl;
273 
274  if (vect.size()!=startingSize)
275  iterativeSearch(histo,vect,apv);
276 }
277 
278 void SiStripHotStripAlgorithmFromClusterOccupancy::evaluatePoissonian(std::vector<long double>& vPoissonProbs, long double& meanVal){
279  for(size_t i=0;i<vPoissonProbs.size();++i){
280  vPoissonProbs[i]= (i==0)?TMath::Poisson(i,meanVal):vPoissonProbs[i-1]+TMath::Poisson(i,meanVal);
281  }
282 }
283 
285  Nevents_=Nevents;
287  if (edm::isDebugEnabled())
288  LogTrace("SiStripHotStrip")<<" [SiStripHotStripAlgorithmFromClusterOccupancy::setNumberOfEvents] minNumber of Events per strip used to consider a strip bad" << minNevents_ << " for occupancy " << occupancy_ << std::endl;
289 }
unsigned int rodNumber() const
Definition: TOBDetId.h:77
bool isDebugEnabled()
int i
Definition: DBlmapReader.cc:9
unsigned int petalNumber() const
Definition: TECDetId.h:94
unsigned int stringNumber() const
Definition: TIBDetId.h:87
void extractBadStrips(SiStripQuality *, HistoMap &, edm::ESHandle< SiStripQuality > &)
unsigned int layer() const
layer id
Definition: TOBDetId.h:39
void strip(std::string &input, const std::string &blanks=" \n\t")
Definition: stringTools.cc:16
uint32_t stereo() const
Definition: SiStripDetId.h:162
T y() const
Definition: PV3DBase.h:62
void evaluatePoissonian(std::vector< long double > &, long double &meanVal)
virtual const StripTopology & specificTopology() const
Returns a reference to the strip proxy topology.
static const char occupancy_[]
T z() const
Definition: PV3DBase.h:63
unsigned int moduleNumber() const
Definition: TIBDetId.h:91
void compact(unsigned int &, std::vector< unsigned int > &)
unsigned int ring() const
ring id
Definition: TIDDetId.h:55
void fillBadComponents()
int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:39
virtual const GeomDet * idToDet(DetId) const
#define LogTrace(id)
unsigned int moduleNumber() const
Definition: TECDetId.h:102
Detector identifier class for the strip tracker.
Definition: SiStripDetId.h:17
Definition: DetId.h:20
void iterativeSearch(pHisto &, std::vector< unsigned int > &, int)
unsigned int wheel() const
wheel id
Definition: TECDetId.h:52
unsigned int layer() const
layer id
Definition: TIBDetId.h:41
std::pair< ContainerIterator, ContainerIterator > Range
unsigned int ring() const
ring id
Definition: TECDetId.h:71
virtual LocalPoint localPosition(float strip) const =0
tuple cout
Definition: gather_cfg.py:121
bool put(const uint32_t &detID, const InputVector &vect)
T x() const
Definition: PV3DBase.h:61
unsigned int moduleNumber() const
Definition: TIDDetId.h:101
unsigned int encode(const unsigned short &first, const unsigned short &NconsecutiveBadStrips, const unsigned short &flag=0)
unsigned int moduleNumber() const
Definition: TOBDetId.h:81
unsigned int wheel() const
wheel id
Definition: TIDDetId.h:50