CMS 3D CMS Logo

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