CMS 3D CMS Logo

SiStripGainsPCLWorker.cc
Go to the documentation of this file.
4 
5 #include <iostream>
6 #include <sstream>
7 
8 //********************************************************************************//
10  NEvent(0),
11  NTrack(0),
12  NClusterStrip(0),
13  NClusterPixel(0),
14  NStripAPVs(0),
15  NPixelDets(0),
16  SRun(1<<31),
17  ERun(0),
18  bareTkGeomPtr_(nullptr)
19 {
20 
21  MinTrackMomentum = iConfig.getUntrackedParameter<double> ("minTrackMomentum" , 3.0);
22  MaxTrackMomentum = iConfig.getUntrackedParameter<double> ("maxTrackMomentum" , 99999.0);
23  MinTrackEta = iConfig.getUntrackedParameter<double> ("minTrackEta" , -5.0);
24  MaxTrackEta = iConfig.getUntrackedParameter<double> ("maxTrackEta" , 5.0);
25  MaxNrStrips = iConfig.getUntrackedParameter<unsigned>("maxNrStrips" , 2);
26  MinTrackHits = iConfig.getUntrackedParameter<unsigned>("MinTrackHits" , 8);
27  MaxTrackChiOverNdf = iConfig.getUntrackedParameter<double> ("MaxTrackChiOverNdf" , 3);
28  MaxTrackingIteration = iConfig.getUntrackedParameter<int> ("MaxTrackingIteration" , 7);
29  AllowSaturation = iConfig.getUntrackedParameter<bool> ("AllowSaturation" , false);
30  FirstSetOfConstants = iConfig.getUntrackedParameter<bool> ("FirstSetOfConstants" , true);
31  Validation = iConfig.getUntrackedParameter<bool> ("Validation" , false);
32  OldGainRemoving = iConfig.getUntrackedParameter<bool> ("OldGainRemoving" , false);
33  useCalibration = iConfig.getUntrackedParameter<bool> ("UseCalibration" , false);
34  doChargeMonitorPerPlane = iConfig.getUntrackedParameter<bool> ("doChargeMonitorPerPlane" , false);
35  m_DQMdir = iConfig.getUntrackedParameter<std::string> ("DQMdir" , "AlCaReco/SiStripGains");
36  m_calibrationMode = iConfig.getUntrackedParameter<std::string> ("calibrationMode" , "StdBunch");
37  VChargeHisto = iConfig.getUntrackedParameter<std::vector<std::string> > ("ChargeHisto");
38 
39  //Set the monitoring element tag and store
40  dqm_tag_.reserve(7);
41  dqm_tag_.clear();
42  dqm_tag_.push_back( "StdBunch" ); // statistic collection from Standard Collision Bunch @ 3.8 T
43  dqm_tag_.push_back( "StdBunch0T" ); // statistic collection from Standard Collision Bunch @ 0 T
44  dqm_tag_.push_back( "AagBunch" ); // statistic collection from First Collision After Abort Gap @ 3.8 T
45  dqm_tag_.push_back( "AagBunch0T" ); // statistic collection from First Collision After Abort Gap @ 0 T
46  dqm_tag_.push_back( "IsoMuon" ); // statistic collection from Isolated Muon @ 3.8 T
47  dqm_tag_.push_back( "IsoMuon0T" ); // statistic collection from Isolated Muon @ 0 T
48  dqm_tag_.push_back( "Harvest" ); // statistic collection: Harvest
49 
50  Charge_Vs_Index.insert( Charge_Vs_Index.begin(), dqm_tag_.size(), nullptr);
51  Charge_Vs_PathlengthTIB.insert( Charge_Vs_PathlengthTIB.begin(), dqm_tag_.size(), nullptr);
52  Charge_Vs_PathlengthTOB.insert( Charge_Vs_PathlengthTOB.begin(), dqm_tag_.size(), nullptr);
53  Charge_Vs_PathlengthTIDP.insert( Charge_Vs_PathlengthTIDP.begin(), dqm_tag_.size(), nullptr);
54  Charge_Vs_PathlengthTIDM.insert( Charge_Vs_PathlengthTIDM.begin(), dqm_tag_.size(), nullptr);
55  Charge_Vs_PathlengthTECP1.insert( Charge_Vs_PathlengthTECP1.begin(), dqm_tag_.size(), nullptr);
56  Charge_Vs_PathlengthTECP2.insert( Charge_Vs_PathlengthTECP2.begin(), dqm_tag_.size(), nullptr);
57  Charge_Vs_PathlengthTECM1.insert( Charge_Vs_PathlengthTECM1.begin(), dqm_tag_.size(), nullptr);
58  Charge_Vs_PathlengthTECM2.insert( Charge_Vs_PathlengthTECM2.begin(), dqm_tag_.size(), nullptr);
59 
60  // configure token for gathering the ntuple variables
61  edm::ParameterSet swhallowgain_pset = iConfig.getUntrackedParameter<edm::ParameterSet>("gain");
62 
63  std::string label = swhallowgain_pset.getUntrackedParameter<std::string>("label");
64  CalibPrefix_ = swhallowgain_pset.getUntrackedParameter<std::string>("prefix");
65  CalibSuffix_ = swhallowgain_pset.getUntrackedParameter<std::string>("suffix");
66 
67  trackindex_token_ = consumes<std::vector<int> >(edm::InputTag(label, CalibPrefix_ + "trackindex" + CalibSuffix_));
68  rawid_token_ = consumes<std::vector<unsigned int> >(edm::InputTag(label, CalibPrefix_ + "rawid" + CalibSuffix_));
69  localdirx_token_ = consumes<std::vector<double> >(edm::InputTag(label, CalibPrefix_ + "localdirx" + CalibSuffix_));
70  localdiry_token_ = consumes<std::vector<double> >(edm::InputTag(label, CalibPrefix_ + "localdiry" + CalibSuffix_));
71  localdirz_token_ = consumes<std::vector<double> >(edm::InputTag(label, CalibPrefix_ + "localdirz" + CalibSuffix_));
72  firststrip_token_ = consumes<std::vector<unsigned short> >(edm::InputTag(label, CalibPrefix_ + "firststrip" + CalibSuffix_));
73  nstrips_token_ = consumes<std::vector<unsigned short> >(edm::InputTag(label, CalibPrefix_ + "nstrips" + CalibSuffix_));
74  saturation_token_ = consumes<std::vector<bool> >(edm::InputTag(label, CalibPrefix_ + "saturation" + CalibSuffix_));
75  overlapping_token_ = consumes<std::vector<bool> >(edm::InputTag(label, CalibPrefix_ + "overlapping" + CalibSuffix_));
76  farfromedge_token_ = consumes<std::vector<bool> >(edm::InputTag(label, CalibPrefix_ + "farfromedge" + CalibSuffix_));
77  charge_token_ = consumes<std::vector<unsigned int> >(edm::InputTag(label, CalibPrefix_ + "charge" + CalibSuffix_));
78  path_token_ = consumes<std::vector<double> >(edm::InputTag(label, CalibPrefix_ + "path" + CalibSuffix_));
79  chargeoverpath_token_ = consumes<std::vector<double> >(edm::InputTag(label, CalibPrefix_ + "chargeoverpath"+ CalibSuffix_));
80  amplitude_token_ = consumes<std::vector<unsigned char> >(edm::InputTag(label, CalibPrefix_ + "amplitude" + CalibSuffix_));
81  gainused_token_ = consumes<std::vector<double> >(edm::InputTag(label, CalibPrefix_ + "gainused" + CalibSuffix_));
82  gainusedTick_token_ = consumes<std::vector<double> >(edm::InputTag(label, CalibPrefix_ + "gainusedTick" + CalibSuffix_));
83 
84  edm::ParameterSet evtinfo_pset = iConfig.getUntrackedParameter<edm::ParameterSet>("evtinfo");
85  label = evtinfo_pset.getUntrackedParameter<std::string>("label");
86  EventPrefix_ = evtinfo_pset.getUntrackedParameter<std::string>("prefix");
87  EventSuffix_ = evtinfo_pset.getUntrackedParameter<std::string>("suffix");
88  TrigTech_token_ = consumes<std::vector<bool> >(edm::InputTag(label, EventPrefix_ + "TrigTech" + EventSuffix_));
89 
90  edm::ParameterSet track_pset = iConfig.getUntrackedParameter<edm::ParameterSet>("tracks");
91  label = track_pset.getUntrackedParameter<std::string>("label");
92  TrackPrefix_ = track_pset.getUntrackedParameter<std::string>("prefix");
93  TrackSuffix_ = track_pset.getUntrackedParameter<std::string>("suffix");
94 
95  trackchi2ndof_token_ = consumes<std::vector<double> >(edm::InputTag(label, TrackPrefix_ + "chi2ndof" + TrackSuffix_));
96  trackp_token_ = consumes<std::vector<float> >(edm::InputTag(label, TrackPrefix_ + "momentum" + TrackSuffix_));
97  trackpt_token_ = consumes<std::vector<float> >(edm::InputTag(label, TrackPrefix_ + "pt" + TrackSuffix_));
98  tracketa_token_ = consumes<std::vector<double> >(edm::InputTag(label, TrackPrefix_ + "eta" + TrackSuffix_));
99  trackphi_token_ = consumes<std::vector<double> >(edm::InputTag(label, TrackPrefix_ + "phi" + TrackSuffix_));
100  trackhitsvalid_token_ = consumes<std::vector<unsigned int> >(edm::InputTag(label, TrackPrefix_ + "hitsvalid" + TrackSuffix_));
101  trackalgo_token_ = consumes<std::vector<int> >(edm::InputTag(label, TrackPrefix_ + "algo" + TrackSuffix_));
102 
103 }
104 
105 //********************************************************************************//
106 void
108 
109  using namespace edm;
110 
111  this->checkBookAPVColls(iSetup); // check whether APV colls are booked and do so if not yet done
112 
113  edm::ESHandle<SiStripGain> gainHandle;
114  iSetup.get<SiStripGainRcd>().get(gainHandle);
115  if(!gainHandle.isValid()){edm::LogError("SiStripGainPCLWorker")<< "gainHandle is not valid\n"; exit(0);}
116 
117  edm::ESHandle<SiStripQuality> SiStripQuality_;
118  iSetup.get<SiStripQualityRcd>().get(SiStripQuality_);
119 
120  for(unsigned int a=0;a<APVsCollOrdered.size();a++){
121 
122  std::shared_ptr<stAPVGain> APV = APVsCollOrdered[a];
123 
124  if(APV->SubDet==PixelSubdetector::PixelBarrel || APV->SubDet==PixelSubdetector::PixelEndcap) continue;
125 
126  APV->isMasked = SiStripQuality_->IsApvBad(APV->DetId,APV->APVId);
127 
128  if(gainHandle->getNumberOfTags()!=2){edm::LogError("SiStripGainPCLWorker")<< "NUMBER OF GAIN TAG IS EXPECTED TO BE 2\n";fflush(stdout);exit(0);};
129  float newPreviousGain = gainHandle->getApvGain(APV->APVId,gainHandle->getRange(APV->DetId, 1),1);
130  if(APV->PreviousGain!=1 and newPreviousGain!=APV->PreviousGain)edm::LogWarning("SiStripGainPCLWorker")<< "WARNING: ParticleGain in the global tag changed\n";
131  APV->PreviousGain = newPreviousGain;
132 
133  float newPreviousGainTick = gainHandle->getApvGain(APV->APVId,gainHandle->getRange(APV->DetId, 0),0);
134  if(APV->PreviousGainTick!=1 and newPreviousGainTick!=APV->PreviousGainTick){
135  edm::LogWarning("SiStripGainPCLWorker")<< "WARNING: TickMarkGain in the global tag changed\n"<< std::endl
136  <<" APV->SubDet: "<< APV->SubDet << " APV->APVId:" << APV->APVId << std::endl
137  <<" APV->PreviousGainTick: "<<APV->PreviousGainTick<<" newPreviousGainTick: "<<newPreviousGainTick<<std::endl;
138  }
139  APV->PreviousGainTick = newPreviousGainTick;
140  }
141 
142 }
143 
144 //********************************************************************************//
145 // ------------ method called for each event ------------
146 void
148 {
149  using namespace edm;
150 
151  // this->checkBookAPVColls(iSetup); // check whether APV colls are booked and do so if not yet done
152 
153  eventnumber = iEvent.id().event();
154  runnumber = iEvent.id().run();
155 
156  auto handle01 = connect(TrigTech , TrigTech_token_ , iEvent);
157  auto handle02 = connect(trackchi2ndof , trackchi2ndof_token_ , iEvent);
158  auto handle03 = connect(trackp , trackp_token_ , iEvent);
159  auto handle04 = connect(trackpt , trackpt_token_ , iEvent);
160  auto handle05 = connect(tracketa , tracketa_token_ , iEvent);
161  auto handle06 = connect(trackphi , trackphi_token_ , iEvent);
162  auto handle07 = connect(trackhitsvalid, trackhitsvalid_token_, iEvent);
163  auto handle08 = connect(trackindex , trackindex_token_ , iEvent);
164  auto handle09 = connect(rawid , rawid_token_ , iEvent);
165  auto handle11 = connect(localdirx , localdirx_token_ , iEvent);
166  auto handle12 = connect(localdiry , localdiry_token_ , iEvent);
167  auto handle13 = connect(localdirz , localdirz_token_ , iEvent);
168  auto handle14 = connect(firststrip , firststrip_token_ , iEvent);
169  auto handle15 = connect(nstrips , nstrips_token_ , iEvent);
170  auto handle16 = connect(saturation , saturation_token_ , iEvent);
171  auto handle17 = connect(overlapping , overlapping_token_ , iEvent);
172  auto handle18 = connect(farfromedge , farfromedge_token_ , iEvent);
173  auto handle19 = connect(charge , charge_token_ , iEvent);
174  auto handle21 = connect(path , path_token_ , iEvent);
175  auto handle22 = connect(chargeoverpath, chargeoverpath_token_, iEvent);
176  auto handle23 = connect(amplitude , amplitude_token_ , iEvent);
177  auto handle24 = connect(gainused , gainused_token_ , iEvent);
178  auto handle25 = connect(gainusedTick , gainusedTick_token_ , iEvent);
179  auto handle26 = connect(trackalgo , trackalgo_token_ , iEvent);
180 
182  iSetup.get<TrackerTopologyRcd>().get( TopoHandle );
183  const TrackerTopology* topo = TopoHandle.product();
184 
185  processEvent(topo);
186 
187 }
188 
189 //********************************************************************************//
191 
192  edm::LogInfo("SiStripGainsPCLWorker") << "Processing run " << runnumber
193  << " and event " << eventnumber
194  << std::endl;
195 
198 
199  NEvent++;
200  NTrack+=(*trackp).size();
201 
202  edm::LogInfo("SiStripGainsPCLWorker")
203  <<"for mode"<< m_calibrationMode
204  <<" Nevent:"<<NEvent
205  <<" NTrack:"<<NTrack
206  <<" NClusterStrip:"<<NClusterStrip
207  <<" NClusterPixel:"<<NClusterPixel
208  <<" NStripAPVs:"<<NStripAPVs
209  <<" NPixelDets:"<<NPixelDets
210  <<std::endl;
211 
212  int elepos = statCollectionFromMode(m_calibrationMode.c_str());
213 
214  unsigned int FirstAmplitude=0;
215  for(unsigned int i=0;i<(*chargeoverpath).size();i++){
216 
217  FirstAmplitude+=(*nstrips)[i];
218  int TI = (*trackindex)[i];
219 
220  if((*tracketa )[TI] < MinTrackEta )continue;
221  if((*tracketa )[TI] > MaxTrackEta )continue;
222  if((*trackp )[TI] < MinTrackMomentum )continue;
223  if((*trackp )[TI] > MaxTrackMomentum )continue;
224  if((*trackhitsvalid)[TI] < MinTrackHits )continue;
225  if((*trackchi2ndof )[TI] > MaxTrackChiOverNdf )continue;
226  if((*trackalgo )[TI] > MaxTrackingIteration )continue;
227 
228  std::shared_ptr<stAPVGain> APV = APVsColl[((*rawid)[i]<<4) | ((*firststrip)[i]/128)]; //works for both strip and pixel thanks to firstStrip encoding for pixel in the calibTree
229 
230  if(APV->SubDet>2 && (*farfromedge)[i] == false )continue;
231  if(APV->SubDet>2 && (*overlapping)[i] == true )continue;
232  if(APV->SubDet>2 && (*saturation )[i] && !AllowSaturation)continue;
233  if(APV->SubDet>2 && (*nstrips )[i] > MaxNrStrips )continue;
234 
235  if(APV->SubDet>2){
236  NClusterStrip++;
237  } else {
238  NClusterPixel++;
239  }
240 
241  int Charge = 0;
242  if(APV->SubDet>2 && (useCalibration || !FirstSetOfConstants)){
243  bool Saturation = false;
244  for(unsigned int s=0;s<(*nstrips)[i];s++){
245  int StripCharge = (*amplitude)[FirstAmplitude-(*nstrips)[i]+s];
246  if(useCalibration && !FirstSetOfConstants){ StripCharge=(int)(StripCharge*(APV->PreviousGain/APV->CalibGain));
247  }else if(useCalibration){ StripCharge=(int)(StripCharge/APV->CalibGain);
248  }else if(!FirstSetOfConstants){ StripCharge=(int)(StripCharge*APV->PreviousGain);}
249  if(StripCharge>1024){
250  StripCharge = 255;
251  Saturation = true;
252  }else if(StripCharge>254){
253  StripCharge = 254;
254  Saturation = true;
255  }
256  Charge += StripCharge;
257  }
258  if(Saturation && !AllowSaturation)continue;
259  }else if(APV->SubDet>2){
260  Charge = (*charge)[i];
261  }else{
262  Charge = (*charge)[i]/265.0; //expected scale factor between pixel and strip charge
263  }
264 
265  double ClusterChargeOverPath = ( (double) Charge )/(*path)[i] ;
266  if(APV->SubDet>2){
267  if(Validation) {ClusterChargeOverPath/=(*gainused)[i];}
268  if(OldGainRemoving){ClusterChargeOverPath*=(*gainused)[i];}
269  }
270 
271  // keep processing of pixel cluster charge until here
272  if(APV->SubDet<=2) continue;
273 
274  // real histogram for calibration
275  (Charge_Vs_Index[elepos])->Fill(APV->Index,ClusterChargeOverPath);
276 
277  LogDebug("SiStripGainsPCLWorker") <<" for mode "<< m_calibrationMode << "\n"
278  <<" i "<< i
279  <<" NClusterStrip "<< NClusterStrip
280  <<" useCalibration "<< useCalibration
281  <<" FirstSetOfConstants "<< FirstSetOfConstants
282  <<" APV->DetId "<< APV->DetId
283  <<" APV->Index "<< APV->Index
284  <<" Charge "<< Charge
285  <<" ClusterChargeOverPath "<< ClusterChargeOverPath
286  <<std::endl;
287 
288  // Fill monitoring histograms
289  int mCharge1 = 0;
290  int mCharge2 = 0;
291  int mCharge3 = 0;
292  int mCharge4 = 0;
293  if(APV->SubDet>2) {
294  for(unsigned int s=0;s<(*nstrips)[i];s++){
295  int StripCharge = (*amplitude)[FirstAmplitude-(*nstrips)[i]+s];
296  if(StripCharge>1024) StripCharge = 255;
297  else if(StripCharge>254) StripCharge = 254;
298  mCharge1 += StripCharge;
299  mCharge2 += StripCharge;
300  mCharge3 += StripCharge;
301  mCharge4 += StripCharge;
302  }
303  // Revome gains for monitoring
304  mCharge2 *= (*gainused)[i]; // remove G2
305  mCharge3 *= (*gainusedTick)[i]; // remove G1
306  mCharge4 *= ( (*gainused)[i] * (*gainusedTick)[i]); // remove G1 and G2
307  }
308  std::vector<APVGain::APVmon>& v1 = Charge_1[elepos];
309  std::vector<MonitorElement*> cmon1 = APVGain::FetchMonitor(v1, (*rawid)[i], topo);
310  for(unsigned int m=0; m<cmon1.size(); m++) cmon1[m]->Fill(( (double) mCharge1 )/(*path)[i]);
311 
312  std::vector<APVGain::APVmon>& v2 = Charge_2[elepos];
313  std::vector<MonitorElement*> cmon2 = APVGain::FetchMonitor(v2, (*rawid)[i], topo);
314  for(unsigned int m=0; m<cmon2.size(); m++) cmon2[m]->Fill(( (double) mCharge2 )/(*path)[i]);
315 
316  std::vector<APVGain::APVmon>& v3 = Charge_3[elepos];
317  std::vector<MonitorElement*> cmon3 = APVGain::FetchMonitor(v3, (*rawid)[i], topo);
318  for(unsigned int m=0; m<cmon3.size(); m++) cmon3[m]->Fill(( (double) mCharge3 )/(*path)[i]);
319 
320  std::vector<APVGain::APVmon>& v4 = Charge_4[elepos];
321  std::vector<MonitorElement*> cmon4 = APVGain::FetchMonitor(v4, (*rawid)[i], topo);
322  for(unsigned int m=0; m<cmon4.size(); m++) cmon4[m]->Fill(( (double) mCharge4 )/(*path)[i]);
323 
324 
325  if(APV->SubDet==StripSubdetector::TIB){
326  (Charge_Vs_PathlengthTIB[elepos])->Fill((*path)[i],Charge); // TIB
327 
328  }else if(APV->SubDet==StripSubdetector::TOB){
329  (Charge_Vs_PathlengthTOB[elepos])->Fill((*path)[i],Charge); // TOB
330 
331  }else if(APV->SubDet==StripSubdetector::TID){
332  if(APV->Eta<0) { (Charge_Vs_PathlengthTIDM[elepos])->Fill((*path)[i],Charge); } // TID minus
333  else if(APV->Eta>0){ (Charge_Vs_PathlengthTIDP[elepos])->Fill((*path)[i],Charge); } // TID plus
334 
335  }else if(APV->SubDet==StripSubdetector::TEC){
336  if(APV->Eta<0){
337  if(APV->Thickness<0.04) { (Charge_Vs_PathlengthTECM1[elepos])->Fill((*path)[i],Charge); } // TEC minus, type 1
338  else if(APV->Thickness>0.04){ (Charge_Vs_PathlengthTECM2[elepos])->Fill((*path)[i],Charge); } // TEC minus, type 2
339  } else if(APV->Eta>0){
340  if(APV->Thickness<0.04) { (Charge_Vs_PathlengthTECP1[elepos])->Fill((*path)[i],Charge); } // TEC plus, type 1
341  else if(APV->Thickness>0.04){ (Charge_Vs_PathlengthTECP2[elepos])->Fill((*path)[i],Charge); } // TEC plus, type 2
342  }
343  }
344 
345  }// END OF ON-CLUSTER LOOP
346 
347  LogDebug("SiStripGainsPCLWorker")<<" for mode"<< m_calibrationMode
348  <<" entries in histogram:"<< (Charge_Vs_Index[elepos])->getTH2S()->GetEntries()
349  <<std::endl;
350 
351 }//END OF processEvent()
352 
353 
354 //********************************************************************************//
355 void
357 {
358 }
359 
360 //********************************************************************************//
361 // ------------ method called once each job just before starting event loop ------------
362 void
364 
366  const TrackerGeometry *newBareTkGeomPtr = &(*tkGeom_);
367  if (newBareTkGeomPtr == bareTkGeomPtr_) return; // already filled APVColls, nothing changed
368 
369  if (!bareTkGeomPtr_) { // pointer not yet set: called the first time => fill the APVColls
370  auto const & Det = newBareTkGeomPtr->dets();
371 
372  edm::LogInfo("SiStripGainsPCLWorker")
373  <<" Resetting APV struct"<<std::endl;
374 
375  unsigned int Index=0;
376 
377  for(unsigned int i=0;i<Det.size();i++){
378 
379  DetId Detid = Det[i]->geographicalId();
380  int SubDet = Detid.subdetId();
381 
382  if( SubDet == StripSubdetector::TIB || SubDet == StripSubdetector::TID ||
383  SubDet == StripSubdetector::TOB || SubDet == StripSubdetector::TEC ){
384 
385  auto DetUnit = dynamic_cast<const StripGeomDetUnit*> (Det[i]);
386  if(!DetUnit)continue;
387 
388  const StripTopology& Topo = DetUnit->specificTopology();
389  unsigned int NAPV = Topo.nstrips()/128;
390 
391  for(unsigned int j=0;j<NAPV;j++){
392  auto APV = std::make_shared<stAPVGain>();
393  APV->Index = Index;
394  APV->Bin = -1;
395  APV->DetId = Detid.rawId();
396  APV->APVId = j;
397  APV->SubDet = SubDet;
398  APV->FitMPV = -1;
399  APV->FitMPVErr = -1;
400  APV->FitWidth = -1;
401  APV->FitWidthErr = -1;
402  APV->FitChi2 = -1;
403  APV->FitNorm = -1;
404  APV->Gain = -1;
405  APV->PreviousGain = 1;
406  APV->PreviousGainTick = 1;
407  APV->x = DetUnit->position().basicVector().x();
408  APV->y = DetUnit->position().basicVector().y();
409  APV->z = DetUnit->position().basicVector().z();
410  APV->Eta = DetUnit->position().basicVector().eta();
411  APV->Phi = DetUnit->position().basicVector().phi();
412  APV->R = DetUnit->position().basicVector().transverse();
413  APV->Thickness = DetUnit->surface().bounds().thickness();
414  APV->NEntries = 0;
415  APV->isMasked = false;
416 
417  APVsCollOrdered.push_back(APV);
418  APVsColl[(APV->DetId<<4) | APV->APVId] = APV;
419  Index++;
420  NStripAPVs++;
421  } // loop on APVs
422  } // if is Strips
423  } // loop on dets
424 
425  for(unsigned int i=0;i<Det.size();i++){ //Make two loop such that the Pixel information is added at the end --> make transition simpler
426  DetId Detid = Det[i]->geographicalId();
427  int SubDet = Detid.subdetId();
429  auto DetUnit = dynamic_cast<const PixelGeomDetUnit*> (Det[i]);
430  if(!DetUnit) continue;
431 
432  const PixelTopology& Topo = DetUnit->specificTopology();
433  unsigned int NROCRow = Topo.nrows()/(80.);
434  unsigned int NROCCol = Topo.ncolumns()/(52.);
435 
436  for(unsigned int j=0;j<NROCRow;j++){
437  for(unsigned int i=0;i<NROCCol;i++){
438 
439  auto APV = std::make_shared<stAPVGain>();
440  APV->Index = Index;
441  APV->Bin = -1;
442  APV->DetId = Detid.rawId();
443  APV->APVId = (j<<3 | i);
444  APV->SubDet = SubDet;
445  APV->FitMPV = -1;
446  APV->FitMPVErr = -1;
447  APV->FitWidth = -1;
448  APV->FitWidthErr = -1;
449  APV->FitChi2 = -1;
450  APV->Gain = -1;
451  APV->PreviousGain = 1;
452  APV->PreviousGainTick = 1;
453  APV->x = DetUnit->position().basicVector().x();
454  APV->y = DetUnit->position().basicVector().y();
455  APV->z = DetUnit->position().basicVector().z();
456  APV->Eta = DetUnit->position().basicVector().eta();
457  APV->Phi = DetUnit->position().basicVector().phi();
458  APV->R = DetUnit->position().basicVector().transverse();
459  APV->Thickness = DetUnit->surface().bounds().thickness();
460  APV->isMasked = false; //SiPixelQuality_->IsModuleBad(Detid.rawId());
461  APV->NEntries = 0;
462 
463  APVsCollOrdered.push_back(APV);
464  APVsColl[(APV->DetId<<4) | APV->APVId] = APV;
465  Index++;
466  NPixelDets++;
467 
468  } // loop on ROC cols
469  } // loop on ROC rows
470  } // if Pixel
471  } // loop on Dets
472  } //if (!bareTkGeomPtr_) ...
473  bareTkGeomPtr_ = newBareTkGeomPtr;
474 }
475 
476 
477 //********************************************************************************//
478 void
480 {
481 }
482 
483 //********************************************************************************//
484 void
487  desc.setUnknown();
488  descriptions.addDefault(desc);
489 }
490 
491 //********************************************************************************//
492 void
494 
495  ibooker.cd();
496  std::string dqm_dir = m_DQMdir;
497  const char* tag = dqm_tag_[statCollectionFromMode(m_calibrationMode.c_str())].c_str();
498 
499  edm::LogInfo("SiStripGainsPCLWorker") << "Setting " << dqm_dir << "in DQM and booking histograms for tag "
500  << tag << std::endl;
501 
502  ibooker.setCurrentFolder(dqm_dir);
503 
504  std::string stag(tag);
505  if(!stag.empty() && stag[0]!='_') stag.insert(0,1,'_');
506 
507  std::string cvi = std::string("Charge_Vs_Index") + stag;
508  std::string cvpTIB = std::string("Charge_Vs_PathlengthTIB") + stag;
509  std::string cvpTOB = std::string("Charge_Vs_PathlengthTOB") + stag;
510  std::string cvpTIDP = std::string("Charge_Vs_PathlengthTIDP") + stag;
511  std::string cvpTIDM = std::string("Charge_Vs_PathlengthTIDM") + stag;
512  std::string cvpTECP1 = std::string("Charge_Vs_PathlengthTECP1") + stag;
513  std::string cvpTECP2 = std::string("Charge_Vs_PathlengthTECP2") + stag;
514  std::string cvpTECM1 = std::string("Charge_Vs_PathlengthTECM1") + stag;
515  std::string cvpTECM2 = std::string("Charge_Vs_PathlengthTECM2") + stag;
516 
517  int elepos = statCollectionFromMode(tag);
518 
519  // The cluster charge is stored by exploiting a non uniform binning in order
520  // reduce the histogram memory size. The bin width is relaxed with a falling
521  // exponential function and the bin boundaries are stored in the binYarray.
522  // The binXarray is used to provide as many bins as the APVs.
523  //
524  // More details about this implementations are here:
525  // https://indico.cern.ch/event/649344/contributions/2672267/attachments/1498323/2332518/OptimizeChHisto.pdf
526 
527  std::vector<float> binXarray;
528  binXarray.reserve( NStripAPVs+1 );
529  for(int a=0;a<=NStripAPVs;a++){
530  binXarray.push_back( (float)a );
531  }
532 
533 
534  std::array<float,688> binYarray;
535  double p0 = 5.445;
536  double p1 = 0.002113;
537  double p2 = 69.01576;
538  double y = 0.;
539  for(int b=0;b<687;b++) {
540  binYarray[b] = y;
541  if(y<=902.) y = y + 2.;
542  else y = ( p0 - log(exp(p0-p1*y) - p2*p1)) / p1;
543  }
544  binYarray[687] = 4000.;
545 
546  Charge_Vs_Index[elepos] = ibooker.book2S(cvi.c_str() , cvi.c_str() , NStripAPVs, &binXarray[0], 687, binYarray.data());
547  Charge_Vs_PathlengthTIB[elepos] = ibooker.book2S(cvpTIB.c_str() , cvpTIB.c_str() , 20 , 0.3 , 1.3 , 250,0,2000);
548  Charge_Vs_PathlengthTOB[elepos] = ibooker.book2S(cvpTOB.c_str() , cvpTOB.c_str() , 20 , 0.3 , 1.3 , 250,0,2000);
549  Charge_Vs_PathlengthTIDP[elepos] = ibooker.book2S(cvpTIDP.c_str() , cvpTIDP.c_str() , 20 , 0.3 , 1.3 , 250,0,2000);
550  Charge_Vs_PathlengthTIDM[elepos] = ibooker.book2S(cvpTIDM.c_str() , cvpTIDM.c_str() , 20 , 0.3 , 1.3 , 250,0,2000);
551  Charge_Vs_PathlengthTECP1[elepos] = ibooker.book2S(cvpTECP1.c_str(), cvpTECP1.c_str(), 20 , 0.3 , 1.3 , 250,0,2000);
552  Charge_Vs_PathlengthTECP2[elepos] = ibooker.book2S(cvpTECP2.c_str(), cvpTECP2.c_str(), 20 , 0.3 , 1.3 , 250,0,2000);
553  Charge_Vs_PathlengthTECM1[elepos] = ibooker.book2S(cvpTECM1.c_str(), cvpTECM1.c_str(), 20 , 0.3 , 1.3 , 250,0,2000);
554  Charge_Vs_PathlengthTECM2[elepos] = ibooker.book2S(cvpTECM2.c_str(), cvpTECM2.c_str(), 20 , 0.3 , 1.3 , 250,0,2000);
555 
556  std::vector<std::pair<std::string,std::string>> hnames = APVGain::monHnames(VChargeHisto,doChargeMonitorPerPlane,"");
557  for (unsigned int i=0;i<hnames.size();i++){
558  std::string htag = (hnames[i]).first + stag;
559  MonitorElement* monitor = ibooker.book1DD( htag.c_str(), (hnames[i]).second.c_str(), 100 , 0. , 1000. );
560  int id = APVGain::subdetectorId((hnames[i]).first);
561  int side = APVGain::subdetectorSide((hnames[i]).first);
562  int plane = APVGain::subdetectorPlane((hnames[i]).first);
563  Charge_1[elepos].push_back( APVGain::APVmon(id,side,plane,monitor) );
564  }
565 
567  for (unsigned int i=0;i<hnames.size();i++){
568  std::string htag = (hnames[i]).first + stag;
569  MonitorElement* monitor = ibooker.book1DD( htag.c_str(), (hnames[i]).second.c_str(), 100 , 0. , 1000. );
570  int id = APVGain::subdetectorId((hnames[i]).first);
571  int side = APVGain::subdetectorSide((hnames[i]).first);
572  int plane = APVGain::subdetectorPlane((hnames[i]).first);
573  Charge_2[elepos].push_back( APVGain::APVmon(id,side,plane,monitor) );
574  }
575 
577  for (unsigned int i=0;i<hnames.size();i++){
578  std::string htag = (hnames[i]).first + stag;
579  MonitorElement* monitor = ibooker.book1DD( htag.c_str(), (hnames[i]).second.c_str(), 100 , 0. , 1000. );
580  int id = APVGain::subdetectorId((hnames[i]).first);
581  int side = APVGain::subdetectorSide((hnames[i]).first);
582  int plane = APVGain::subdetectorPlane((hnames[i]).first);
583  Charge_3[elepos].push_back( APVGain::APVmon(id,side,plane,monitor) );
584  }
585 
587  for (unsigned int i=0;i<hnames.size();i++){
588  std::string htag = (hnames[i]).first + stag;
589  MonitorElement* monitor = ibooker.book1DD( htag.c_str(), (hnames[i]).second.c_str(), 100 , 0. , 1000. );
590  int id = APVGain::subdetectorId((hnames[i]).first);
591  int side = APVGain::subdetectorSide((hnames[i]).first);
592  int plane = APVGain::subdetectorPlane((hnames[i]).first);
593  Charge_4[elepos].push_back( APVGain::APVmon(id,side,plane,monitor) );
594  }
595 }
#define LogDebug(id)
RunNumber_t run() const
Definition: EventID.h:39
std::vector< MonitorElement * > Charge_Vs_PathlengthTOB
const std::vector< double > * chargeoverpath
bool IsApvBad(const uint32_t &detid, const short &apvNb) const
edm::EDGetTokenT< std::vector< double > > gainused_token_
EventNumber_t event() const
Definition: EventID.h:41
T getUntrackedParameter(std::string const &, T const &) const
const std::vector< int > * trackalgo
virtual int nrows() const =0
edm::EDGetTokenT< std::vector< double > > localdirz_token_
edm::EDGetTokenT< std::vector< bool > > saturation_token_
std::vector< MonitorElement * > FetchMonitor(std::vector< APVmon >, uint32_t, const TrackerTopology *topo=nullptr)
std::array< std::vector< APVGain::APVmon >, 7 > Charge_1
edm::EDGetTokenT< std::vector< double > > trackchi2ndof_token_
edm::EDGetTokenT< std::vector< double > > gainusedTick_token_
virtual void checkBookAPVColls(const edm::EventSetup &setup)
size_t getNumberOfTags() const
Definition: SiStripGain.h:91
void cd(void)
Definition: DQMStore.cc:269
edm::EDGetTokenT< std::vector< float > > trackp_token_
SiStripGainsPCLWorker(const edm::ParameterSet &)
const TrackerGeometry * bareTkGeomPtr_
const std::vector< bool > * TrigTech
int subdetectorPlane(uint32_t, const TrackerTopology *)
const std::vector< int > * trackindex
const std::vector< float > * trackpt
const std::vector< unsigned int > * rawid
std::vector< std::shared_ptr< stAPVGain > > APVsCollOrdered
#define nullptr
void analyze(const edm::Event &, const edm::EventSetup &) override
const std::vector< unsigned int > * charge
const std::vector< double > * path
const std::vector< bool > * farfromedge
edm::EDGetTokenT< std::vector< unsigned int > > trackhitsvalid_token_
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
edm::EDGetTokenT< std::vector< unsigned short > > firststrip_token_
edm::EDGetTokenT< std::vector< bool > > farfromedge_token_
edm::EDGetTokenT< std::vector< bool > > overlapping_token_
static float getApvGain(const uint16_t &apv, const SiStripApvGain::Range &range)
Definition: SiStripGain.h:73
const std::vector< double > * gainusedTick
std::vector< std::string > dqm_tag_
uint32_t rawId() const
get the raw id
Definition: DetId.h:43
U second(std::pair< T, U > const &p)
edm::EDGetTokenT< std::vector< unsigned short > > nstrips_token_
const std::vector< double > * tracketa
edm::EDGetTokenT< std::vector< double > > tracketa_token_
const DetContainer & dets() const override
Returm a vector of all GeomDet (including all GeomDetUnits)
int iEvent
Definition: GenABIO.cc:230
const std::vector< double > * localdiry
void addDefault(ParameterSetDescription const &psetDescription)
const std::vector< float > * trackp
const std::vector< bool > * saturation
void Fill(HcalDetId &id, double val, std::vector< TH2F > &depth)
edm::ESHandle< TrackerGeometry > tkGeom_
std::unordered_map< unsigned int, std::shared_ptr< stAPVGain > > APVsColl
MonitorElement * book2S(Args &&...args)
Definition: DQMStore.h:139
const std::vector< double > * localdirz
const std::vector< double > * trackphi
std::vector< MonitorElement * > Charge_Vs_PathlengthTIB
void dqmBeginRun(edm::Run const &, edm::EventSetup const &) override
int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:37
std::array< std::vector< APVGain::APVmon >, 7 > Charge_4
const std::vector< bool > * overlapping
edm::EDGetTokenT< std::vector< int > > trackindex_token_
double p2[4]
Definition: TauolaWrapper.h:90
const std::vector< double > * localdirx
edm::EDGetTokenT< std::vector< double > > localdirx_token_
edm::EDGetTokenT< std::vector< unsigned int > > charge_token_
std::vector< MonitorElement * > Charge_Vs_PathlengthTECP1
edm::EDGetTokenT< std::vector< double > > trackphi_token_
const std::vector< unsigned short > * firststrip
const std::vector< unsigned int > * trackhitsvalid
Definition: DetId.h:18
void setCurrentFolder(const std::string &fullpath)
Definition: DQMStore.cc:277
std::vector< MonitorElement * > Charge_Vs_PathlengthTECM2
edm::EDGetTokenT< std::vector< float > > trackpt_token_
virtual int nstrips() const =0
const T & get() const
Definition: EventSetup.h:55
std::array< std::vector< APVGain::APVmon >, 7 > Charge_2
int subdetectorSide(uint32_t, const TrackerTopology *)
edm::Handle< T > connect(const T *&ptr, edm::EDGetTokenT< T > token, const edm::Event &evt)
double b
Definition: hdecay.h:120
std::vector< std::string > VChargeHisto
edm::EDGetTokenT< std::vector< double > > path_token_
edm::EventID id() const
Definition: EventBase.h:60
HLT enums.
virtual int ncolumns() const =0
double p1[4]
Definition: TauolaWrapper.h:89
std::vector< MonitorElement * > Charge_Vs_PathlengthTECM1
double a
Definition: hdecay.h:121
const std::vector< unsigned char > * amplitude
std::array< std::vector< APVGain::APVmon >, 7 > Charge_3
void processEvent(const TrackerTopology *topo)
int statCollectionFromMode(const char *tag) const
edm::EDGetTokenT< std::vector< double > > chargeoverpath_token_
const std::vector< double > * trackchi2ndof
edm::EDGetTokenT< std::vector< int > > trackalgo_token_
std::vector< MonitorElement * > Charge_Vs_PathlengthTECP2
edm::EDGetTokenT< std::vector< double > > localdiry_token_
std::vector< std::pair< std::string, std::string > > monHnames(std::vector< std::string >, bool, const char *tag)
bool isValid() const
Definition: ESHandle.h:47
std::vector< MonitorElement * > Charge_Vs_PathlengthTIDP
edm::EDGetTokenT< std::vector< unsigned char > > amplitude_token_
const std::vector< unsigned short > * nstrips
MonitorElement * book1DD(Args &&...args)
Definition: DQMStore.h:127
T const * product() const
Definition: ESHandle.h:86
std::vector< MonitorElement * > Charge_Vs_PathlengthTIDM
int subdetectorId(uint32_t)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
Definition: Run.h:43
const std::vector< double > * gainused
edm::EDGetTokenT< std::vector< unsigned int > > rawid_token_
std::vector< MonitorElement * > Charge_Vs_Index
const SiStripApvGain::Range getRange(uint32_t detID) const
Definition: SiStripGain.h:70
edm::EDGetTokenT< std::vector< bool > > TrigTech_token_