EcalTiming
 All Classes Functions Variables Pages
EcalTimingCalibProducer.h
1 #ifndef ecaltimingcalibproducer_h
2 #define ecaltimingcalibproducer_h
3 /** \class EcalTimingCalibProducer EcalTimingCalibProducer.h EcalTiming/EcalTiming/plugins/EcalTimingCalibProducer.h
4  \brief Plugin that derives the calibration constants
5 
6  This plugin runs over the events, selects the recHits according to the criteria defined in addRecHit
7 
8  \todo Exit condition based on convergence
9 
10 */
11 
12 /**
13  Module description:
14  - digi to calibrated recHit reconstruction
15  - selection of events with reasonable activity: minimum number of recHits
16  - select recHits based on:
17  - recoFlag -> only good recHits (exclude OOT pileup contribution with MultiFit)
18  - minimum energy, ring based threshold
19  - save all the time events (recHits) passing the selection
20  - discard those not within 2 sigma of the stdDev distribution for the single channel (then excluding OOT spurious events)
21  - exclude events with large time error (> 3ns) or null time error (==0 ns)
22  - verify that the distribution is symmetric
23  - check stability vs energy of the single channel within uncertainty
24  - save full dump of time events in TTree for further checks if:
25  - distribution not symmetric
26  - time calibration not stable vs energy
27  - calculate global time for EB, EE
28 
29 
30  */
31 //#define DEBUG
32 #define RAWIDCRY 838904321
33 
34 /// The entire set of events are saved for one channel in EB and one channel in EE in order to debug
35 #define EBCRYex 838861346
36 #define EECRYex 872422180
37 
38 /// For one ring in EB, one in EE+ and one in EE- the entire set of events are saved to debug
39 #define EBRING 1
40 #define EEmRING 20
41 #define EEpRING 20
42 
43 #define SPEEDOFLIGHT 30.0 // (cm/ns)
44 #define HW_UNIT 1.1 //(ns)
45 
46 // system include files
47 #include <memory>
48 #include <iostream>
49 #include <fstream>
50 
51 // Make Histograms the way!!
52 #include "FWCore/ServiceRegistry/interface/Service.h"
53 #include "CommonTools/UtilAlgos/interface/TFileService.h"
54 
55 // user include files
56 #include "FWCore/Framework/interface/Frameworkfwd.h"
57 #include "FWCore/Framework/interface/EDConsumerBase.h"
58 
59 #include "FWCore/Framework/interface/EDProducer.h"
60 #include "FWCore/Framework/interface/Event.h"
61 //#include "FWCore/Framework/interface/Handle.h"
62 #include "FWCore/Framework/interface/MakerMacros.h"
63 #include "FWCore/Utilities/interface/InputTag.h"
64 #include "FWCore/ParameterSet/interface/ParameterSet.h"
65 
66 #include "DataFormats/Common/interface/Handle.h"
67 //#include "FWCore/Framework/interface/LooperFactory.h"
68 //#include "FWCore/Framework/interface/ESProducerLooper.h"
69 #include "FWCore/Framework/interface/EDFilter.h"
70 #include "FWCore/Framework/interface/ESHandle.h"
71 #include "FWCore/Framework/interface/ESProducts.h"
72 #include "FWCore/Framework/interface/Event.h"
73 // input collections
74 #include "DataFormats/EcalRecHit/interface/EcalRecHitCollections.h"
75 //RingTools
76 #include "Calibration/Tools/interface/EcalRingCalibrationTools.h"
77 #include "Geometry/CaloGeometry/interface/CaloGeometry.h"
78 #include "Geometry/CaloGeometry/interface/CaloSubdetectorGeometry.h"
79 #include "Geometry/Records/interface/CaloGeometryRecord.h"
80 #include "Geometry/EcalMapping/interface/EcalElectronicsMapping.h"
81 #include "Geometry/EcalMapping/interface/EcalMappingRcd.h"
82 
83 // record to be produced:
84 #include "CondFormats/DataRecord/interface/EcalTimeCalibConstantsRcd.h"
85 #include "CondFormats/DataRecord/interface/EcalTimeCalibErrorsRcd.h"
86 #include "CondFormats/DataRecord/interface/EcalTimeOffsetConstantRcd.h"
87 #include "CondTools/Ecal/interface/EcalTimeCalibConstantsXMLTranslator.h"
88 #include "CondTools/Ecal/interface/EcalTimeCalibErrorsXMLTranslator.h"
89 #include "CondTools/Ecal/interface/EcalTimeOffsetXMLTranslator.h"
90 #include "CondTools/Ecal/interface/EcalCondHeader.h"
91 
92 #include "CondFormats/EcalObjects/interface/EcalTimeCalibConstants.h"
93 #include "CondFormats/EcalObjects/interface/EcalTimeCalibErrors.h"
94 #include "CondFormats/EcalObjects/interface/EcalTimeOffsetConstant.h"
95 
96 #include "EcalTiming/EcalTiming/interface/EcalTimingEvent.h"
97 #include "EcalTiming/EcalTiming/interface/EcalCrystalTimingCalibration.h"
98 
99 #include "DataFormats/EcalDetId/interface/EBDetId.h"
100 #include "DataFormats/EcalDetId/interface/EEDetId.h"
101 
102 #include "TProfile.h"
103 #include "TGraphErrors.h"
104 #include "TGraph.h"
105 #include "TH1F.h"
106 #include "TH2F.h"
107 #include "TFile.h"
108 #include "TProfile2D.h"
109 
110 #include <fstream>
111 #include <string>
112 #include <vector>
113 #include <iostream>
114 #include <map>
115 #include <vector>
116 #include <algorithm>
117 #include <functional>
118 #include <set>
119 #include <assert.h>
120 #include <time.h>
121 
122 #include <TMath.h>
123 #include <Math/VectorUtil.h>
124 //#include <boost/tokenizer.hpp>
125 
126 #include "EcalTiming/EcalTiming/interface/EcalTimeCalibrationMapFwd.h"
127 
128 class EcalTimingCalibProducer : public edm::EDFilter
129 {
130 
131 private:
132  EcalTimeCalibrationMap _timeCalibMap; ///< calibration map: contains the time shift for each crystal
133  EventTimeMap _eventTimeMap; ///< container of recHits passing selection in the event (reset at each event)
134  EcalHWCalibrationMap _HWCalibrationMap; //!< The keys for this map are EcalElectronicIds with xtalid = stripid = 1
135  ///< calibration map for the CCU's (Hardware Constants).
136 
137  // For finding averages for specific eta ring
138  EcalCrystalTimingCalibration timeEEP; ///< global time calibration of EE+
139  EcalCrystalTimingCalibration timeEEM; ///< global time calibration of EE-
140  EcalCrystalTimingCalibration timeEB; ///< global time calibration of EB
141  EcalCrystalTimingCalibration timeEBRing; ///< global time calibration of one EB ring
142  EcalCrystalTimingCalibration timeEEmRing; ///< global time calibration of one EE- ring
143  EcalCrystalTimingCalibration timeEEpRing; ///< global time calibration of one EE+ ring
144  EcalCrystalTimingCalibration timeEBCRYex; ///< global time calibration of one EB channel
145  EcalCrystalTimingCalibration timeEECRYex; ///< global time calibration of one EE channel
146 
147 public:
148  EcalTimingCalibProducer(const edm::ParameterSet&); // default constructor
149  ~EcalTimingCalibProducer(); // default destructor
150 
151 
152  virtual void beginJob() override;
153  virtual bool filter(edm::Event&, const edm::EventSetup&) override;
154  virtual void endJob() override;
155 private:
156  // ----------member data ---------------------------
157  /** @name Input Parameters
158  * Parameters defined in the config file _cfi,py
159  */
160  ///@{
161 
162  bool _isSplash; ///< flag to activate for splash analysis
163  bool _makeEventPlots; ///< flag for making plots for each event (meant for splashes)
164  edm::EDGetTokenT<EcalTimingCollection> _timingEvents; ///< input collection
165  unsigned int _recHitMin; ///< require at least this many rec hits to count the event
166  double _minRecHitEnergyStep; ///< to check step size to check energy stability
167  double _minRecHitEnergyNStep; ///< number of steps to check energy stability
168  double _energyThresholdOffsetEB; ///< energy to add to the minimum energy thresholc
169  double _energyThresholdOffsetEE; ///< energy to add to the minimum energy thresholc
170  unsigned int _minEntries; ///< require a minimum number of entries in a ring to do averages
171  float _globalOffset; ///< time to subtract from every event
172  bool _storeEvents;
173  bool _produceNewCalib; ///< true if you don't want to use the values in DB and what to extract new absolute calibrations, if false iteration does not work
174  std::string _outputDumpFileName; ///< name of the output file for the calibration constants' dump
175  float _maxSkewnessForDump;
176 /// @}
177 
178  void dumpCalibration(std::string filename);
179  void dumpCorrections(std::string filename);
180 
181 // plotting
182 ///fill histograms with the measured shifts (that will become -corrections for the next step)
183  void FillCalibrationCorrectionHists(EcalTimeCalibrationMap::const_iterator cal_itr);
184  void FillHWCorrectionHists(EcalTimeCalibrationMap::const_iterator cal_itr);
185  void FillEnergyStabilityHists(EcalTimeCalibrationMap::const_iterator cal_itr, std::vector< std::pair<float, EcalCrystalTimingCalibration*> > energyStability);
186  void initHists(TFileDirectory dir);
187  void initEventHists(TFileDirectory dir);
188  void initTree(TFileDirectory dir);
189 
190  EcalTimeCalibConstants _timeCalibConstants; ///< container of calibrations updated iter by iter
191 
192 
193 
194  /**
195  \brief If recHit passes the selection it is added to the list of recHits to be used for calibration
196 
197  The recHit is used (accepted) if:
198  - recHit flag in the list of _recHitFlags defined in the config file
199  - recHit energy in EB > _minRecHitEnergy defined in the config file
200  - recHit energy in EE is x2 the threshold of EB
201  - at each iteration the recHit threshold is raised by _minRecHitEnergyStep
202  If the recHit is used, the time information is added to _eventTimeMap
203  */
204  bool addRecHit(const EcalTimingEvent& recHit, EventTimeMap& eventTimeMap_);
205 
206 
207  /// Adds the recHit to the per Event histograms
208  void plotRecHit(const EcalTimingEvent& recHit);
209  ///
210  /// Returns an EcalTimingEvent with a new time, which has been adjusted
211  /// so that the upstream endcap is 0.
212  ///
213  EcalTimingEvent correctGlobalOffset(const EcalTimingEvent& ev, int splashDir, float bunchCorr);
214 
215  unsigned int getElecID(DetId id)
216  {
217  return (elecMap_->getElectronicsId(id).rawId() >> 6) & 0x3FFF;
218  }
219 
220  std::map<DetId, float> _CrysEnergyMap;
221  float getEnergyThreshold(const DetId detid)
222  {
223  auto itr = _CrysEnergyMap.find(detid);
224  if(itr == _CrysEnergyMap.end())
225  {
226  int iRing = _ringTools.getRingIndexInSubdet(detid);
227  _CrysEnergyMap[detid] = detid.subdetId() == EcalBarrel ? 13 * 0.04 + _energyThresholdOffsetEB :
228  20 * (79.29 - 4.148 * iRing + 0.2442 * iRing * iRing ) / 1000 + _energyThresholdOffsetEE;
229  }
230  return _CrysEnergyMap[detid];
231  }
232 
233  edm::Service<TFileService> fileService_;
234  TFileDirectory histDir_;
235  // Tree
236  TTree *dumpTree;
237  TTree * timingTree;
238  TTree * energyStabilityTree;
239 
240  // Mean Histograms
241 
242  TProfile2D* EneMapEEP_; /// Using TProfile2D so we don't paint empty bins.
243  TProfile2D* EneMapEEM_;
244  TProfile2D* TimeMapEEP_;
245  TProfile2D* TimeMapEEM_;
246 
247  TProfile2D* EneMapEB_;
248  TProfile2D* TimeMapEB_;
249 
250  // Error Histograms
251  TProfile2D* TimeErrorMapEEP_;
252  TProfile2D* TimeErrorMapEEM_;
253 
254  TProfile2D* TimeErrorMapEB_;
255 
256  // Event Based Plots
257  TProfile2D * Event_EneMapEEP_;
258  TProfile2D * Event_EneMapEEM_;
259  TProfile2D * Event_EneMapEB_;
260 
261  TProfile2D* Event_TimeMapEEP_;
262  TProfile2D* Event_TimeMapEEM_;
263  TProfile2D* Event_TimeMapEB_;
264 
265  TProfile2D* Event_TimeMapEEP_OOT;
266  TProfile2D* Event_TimeMapEEM_OOT;
267  TProfile2D* Event_TimeMapEB_OOT;
268 
269  TH1F* RechitEneEB_;
270  TH1F* RechitTimeEB_;
271  TH1F* RechitEneEEM_;
272  TH1F* RechitTimeEEM_;
273  TH1F* RechitEneEEP_;
274  TH1F* RechitTimeEEP_;
275 
276  // HW Histograms
277  TProfile2D* HWTimeMapEEP_;
278  TProfile2D* HWTimeMapEEM_;
279  TProfile2D* HWTimeMapEB_;
280 
281  TH2F* RechitEnergyTimeEB;
282  TH2F* RechitEnergyTimeEEM;
283  TH2F* RechitEnergyTimeEEP;
284 
285  TH2D* OccupancyEB_;
286  TH2D* OccupancyEEM_;
287  TH2D* OccupancyEEP_;
288 
289  EcalRingCalibrationTools _ringTools;
290  const CaloSubdetectorGeometry * endcapGeometry_;
291  const CaloSubdetectorGeometry * barrelGeometry_;
292 
293  const EcalElectronicsMapping * elecMap_;
294 
295  unsigned int _iter;
296 };
297 
298 #endif
void FillCalibrationCorrectionHists(EcalTimeCalibrationMap::const_iterator cal_itr)
fill histograms with the measured shifts (that will become -corrections for the next step) ...
Definition: EcalTimingCalibProducer.cc:400
double _energyThresholdOffsetEB
energy to add to the minimum energy thresholc
Definition: EcalTimingCalibProducer.h:168
EcalCrystalTimingCalibration timeEEpRing
global time calibration of one EE+ ring
Definition: EcalTimingCalibProducer.h:143
EcalCrystalTimingCalibration timeEECRYex
global time calibration of one EE channel
Definition: EcalTimingCalibProducer.h:145
EcalTimeCalibConstants _timeCalibConstants
container of calibrations updated iter by iter
Definition: EcalTimingCalibProducer.h:190
EcalTimeCalibrationMap _timeCalibMap
calibration map: contains the time shift for each crystal
Definition: EcalTimingCalibProducer.h:132
EcalCrystalTimingCalibration timeEEP
global time calibration of EE+
Definition: EcalTimingCalibProducer.h:138
void plotRecHit(const EcalTimingEvent &recHit)
Adds the recHit to the per Event histograms.
Definition: EcalTimingCalibProducer.cc:101
EventTimeMap _eventTimeMap
container of recHits passing selection in the event (reset at each event)
Definition: EcalTimingCalibProducer.h:133
EcalHWCalibrationMap _HWCalibrationMap
calibration map for the CCU&#39;s (Hardware Constants).
Definition: EcalTimingCalibProducer.h:134
double _minRecHitEnergyNStep
number of steps to check energy stability
Definition: EcalTimingCalibProducer.h:167
Plugin that derives the calibration constants.
Definition: EcalTimingCalibProducer.h:128
Definition: EcalTimingEvent.h:16
EcalTimingEvent correctGlobalOffset(const EcalTimingEvent &ev, int splashDir, float bunchCorr)
Definition: EcalTimingCalibProducer.cc:134
EcalCrystalTimingCalibration timeEEmRing
global time calibration of one EE- ring
Definition: EcalTimingCalibProducer.h:142
EcalCrystalTimingCalibration timeEB
global time calibration of EB
Definition: EcalTimingCalibProducer.h:140
EcalCrystalTimingCalibration timeEEM
global time calibration of EE-
Definition: EcalTimingCalibProducer.h:139
unsigned int _minEntries
require a minimum number of entries in a ring to do averages
Definition: EcalTimingCalibProducer.h:170
TProfile2D * EneMapEEM_
Using TProfile2D so we don&#39;t paint empty bins.
Definition: EcalTimingCalibProducer.h:243
bool addRecHit(const EcalTimingEvent &recHit, EventTimeMap &eventTimeMap_)
If recHit passes the selection it is added to the list of recHits to be used for calibration.
Definition: EcalTimingCalibProducer.cc:87
float _globalOffset
time to subtract from every event
Definition: EcalTimingCalibProducer.h:171
double _energyThresholdOffsetEE
energy to add to the minimum energy thresholc
Definition: EcalTimingCalibProducer.h:169
bool _produceNewCalib
true if you don&#39;t want to use the values in DB and what to extract new absolute calibrations, if false iteration does not work
Definition: EcalTimingCalibProducer.h:173
unsigned int _recHitMin
require at least this many rec hits to count the event
Definition: EcalTimingCalibProducer.h:165
double _minRecHitEnergyStep
to check step size to check energy stability
Definition: EcalTimingCalibProducer.h:166
Definition: EcalCrystalTimingCalibration.h:19
edm::EDGetTokenT< EcalTimingCollection > _timingEvents
input collection
Definition: EcalTimingCalibProducer.h:164
EcalCrystalTimingCalibration timeEBCRYex
global time calibration of one EB channel
Definition: EcalTimingCalibProducer.h:144
std::string _outputDumpFileName
name of the output file for the calibration constants&#39; dump
Definition: EcalTimingCalibProducer.h:174
bool _makeEventPlots
flag for making plots for each event (meant for splashes)
Definition: EcalTimingCalibProducer.h:163
EcalCrystalTimingCalibration timeEBRing
global time calibration of one EB ring
Definition: EcalTimingCalibProducer.h:141
bool _isSplash
flag to activate for splash analysis
Definition: EcalTimingCalibProducer.h:162