CMS 3D CMS Logo

EcalLaserDbService.cc
Go to the documentation of this file.
1 #include <iostream>
2 
4 
6 
9 // #include "CalibCalorimetry/EcalLaserAnalyzer/interface/ME.h"
10 
12 
13 using namespace std;
14 
16  : mAlphas_(nullptr), mAPDPNRatiosRef_(nullptr), mAPDPNRatios_(nullptr), mLinearCorrections_(nullptr) {}
17 
19 
21 
23 
25 
26 float EcalLaserDbService::getLaserCorrection(DetId const& xid, edm::Timestamp const& iTime) const {
27  float correctionFactor = 1.0;
28 
31  const EcalLaserAPDPNRatiosRefMap& laserRefMap = mAPDPNRatiosRef_->getMap();
32  const EcalLaserAlphaMap& laserAlphaMap = mAlphas_->getMap();
35 
38  EcalLaserAPDPNref apdpnref;
42 
43  if (xid.det() == DetId::Ecal) {
44  } else {
45  edm::LogError("EcalLaserDbService") << " DetId is NOT in ECAL" << endl;
46  return correctionFactor;
47  }
48 
49  int iLM;
50  int xind;
51  bool isBarrel = true;
52  if (xid.subdetId() == EcalBarrel) {
53  EBDetId ebid(xid.rawId());
54  xind = ebid.hashedIndex();
55  iLM = MEEBGeom::lmr(ebid.ieta(), ebid.iphi());
56  } else if (xid.subdetId() == EcalEndcap) {
57  isBarrel = false;
58  EEDetId eeid(xid.rawId());
59  xind = eeid.hashedIndex();
60  // SuperCrystal coordinates
61  MEEEGeom::SuperCrysCoord iX = (eeid.ix() - 1) / 5 + 1;
62  MEEEGeom::SuperCrysCoord iY = (eeid.iy() - 1) / 5 + 1;
63  iLM = MEEEGeom::lmr(iX, iY, eeid.zside());
64  } else {
65  edm::LogError("EcalLaserDbService") << " DetId is NOT in ECAL Barrel or Endcap" << endl;
66  return correctionFactor;
67  }
68  // std::cout << " LM num ====> " << iLM << endl;
69 
70  // get alpha, apd/pn ref, apd/pn pairs and timestamps for interpolation
71 
72 #ifdef VERIFY_LASER
74  if (itratio != laserRatiosMap.end()) {
75  apdpnpair = (*itratio);
76  } else {
77  edm::LogError("EcalLaserDbService") << "error with laserRatiosMap!" << endl;
78  return correctionFactor;
79  }
80 
81  if (iLM - 1 < (int)laserTimeMap.size()) {
82  timestamp = laserTimeMap[iLM - 1];
83  } else {
84  edm::LogError("EcalLaserDbService") << "error with laserTimeMap!" << endl;
85  return correctionFactor;
86  }
87 
89  if (itlin != linearValueMap.end()) {
90  linValues = (*itlin);
91  } else {
92  edm::LogError("EcalLaserDbService") << "error with linearValueMap!" << endl;
93  return correctionFactor;
94  }
95 
96  if (iLM - 1 < (int)linearTimeMap.size()) {
97  linTimes = linearTimeMap[iLM - 1];
98  } else {
99  edm::LogError("EcalLaserDbService") << "error with laserTimeMap!" << endl;
100  return correctionFactor;
101  }
102 
103  EcalLaserAPDPNRatiosRefMap::const_iterator itref = laserRefMap.find(xid);
104  if (itref != laserRefMap.end()) {
105  apdpnref = (*itref);
106  } else {
107  edm::LogError("EcalLaserDbService") << "error with laserRefMap!" << endl;
108  return correctionFactor;
109  }
110 
111  EcalLaserAlphaMap::const_iterator italpha = laserAlphaMap.find(xid);
112  if (italpha != laserAlphaMap.end()) {
113  alpha = (*italpha);
114  } else {
115  edm::LogError("EcalLaserDbService") << "error with laserAlphaMap!" << endl;
116  return correctionFactor;
117  }
118 
119 #else
120 
121  // waiting for templated lambdas
122  auto getCond = [=](EcalFloatCondObjectContainer const& cond) -> float {
123  return isBarrel ? cond.barrel(xind) : cond.endcap(xind);
124  };
125 
126  auto getPair =
128  return isBarrel ? cond.barrel(xind) : cond.endcap(xind);
129  };
130 
132  return isBarrel ? cond.barrel(xind) : cond.endcap(xind);
133  };
134 
135  apdpnpair = getPair(laserRatiosMap);
136  linValues = getLinear(linearValueMap);
137  apdpnref = getCond(laserRefMap);
138  alpha = getCond(laserAlphaMap);
139 
140  if (iLM - 1 < (int)laserTimeMap.size()) {
141  timestamp = laserTimeMap[iLM - 1];
142  } else {
143  edm::LogError("EcalLaserDbService") << "error with laserTimeMap!" << endl;
144  return correctionFactor;
145  }
146 
147  if (iLM - 1 < (int)linearTimeMap.size()) {
148  linTimes = linearTimeMap[iLM - 1];
149  } else {
150  edm::LogError("EcalLaserDbService") << "error with laserTimeMap!" << endl;
151  return correctionFactor;
152  }
153 
154 #endif
155 
156  // should implement some default in case of error...
157 
158  // should do some quality checks first
159  // ...
160 
161  // we will need to treat time differently...
162  // is time in DB same format as in MC? probably not...
163 
164  // interpolation
165 
166  edm::TimeValue_t t = iTime.value();
167  long long t_i = 0, t_f = 0;
168  float p_i = 0, p_f = 0;
169  long long lt_i = 0, lt_f = 0;
170  float lp_i = 0, lp_f = 0;
171 
172  if (t >= timestamp.t1.value() && t < timestamp.t2.value()) {
173  t_i = timestamp.t1.value();
174  t_f = timestamp.t2.value();
175  p_i = apdpnpair.p1;
176  p_f = apdpnpair.p2;
177  } else if (t >= timestamp.t2.value() && t <= timestamp.t3.value()) {
178  t_i = timestamp.t2.value();
179  t_f = timestamp.t3.value();
180  p_i = apdpnpair.p2;
181  p_f = apdpnpair.p3;
182  } else if (t < timestamp.t1.value()) {
183  t_i = timestamp.t1.value();
184  t_f = timestamp.t2.value();
185  p_i = apdpnpair.p1;
186  p_f = apdpnpair.p2;
187 
188  } else if (t > timestamp.t3.value()) {
189  t_i = timestamp.t2.value();
190  t_f = timestamp.t3.value();
191  p_i = apdpnpair.p2;
192  p_f = apdpnpair.p3;
193  }
194 
195  if (t >= linTimes.t1.value() && t < linTimes.t2.value()) {
196  lt_i = linTimes.t1.value();
197  lt_f = linTimes.t2.value();
198  lp_i = linValues.p1;
199  lp_f = linValues.p2;
200  } else if (t >= linTimes.t2.value() && t <= linTimes.t3.value()) {
201  lt_i = linTimes.t2.value();
202  lt_f = linTimes.t3.value();
203  lp_i = linValues.p2;
204  lp_f = linValues.p3;
205  } else if (t < linTimes.t1.value()) {
206  lt_i = linTimes.t1.value();
207  lt_f = linTimes.t2.value();
208  lp_i = linValues.p1;
209  lp_f = linValues.p2;
210 
211  } else if (t > linTimes.t3.value()) {
212  lt_i = linTimes.t2.value();
213  lt_f = linTimes.t3.value();
214  lp_i = linValues.p2;
215  lp_f = linValues.p3;
216  }
217 
218  if (apdpnref != 0 && (t_i - t_f) != 0 && (lt_i - lt_f) != 0) {
219  long long tt = t; // never subtract two unsigned!
220  float interpolatedLaserResponse = p_i / apdpnref + float(tt - t_i) * (p_f - p_i) / (apdpnref * float(t_f - t_i));
221  float interpolatedLinearResponse =
222  lp_i / apdpnref + float(tt - lt_i) * (lp_f - lp_i) / (apdpnref * float(lt_f - lt_i)); // FIXED BY FC
223 
224  if (interpolatedLinearResponse > 2.f || interpolatedLinearResponse < 0.1f)
225  interpolatedLinearResponse = 1.f;
226  if (interpolatedLaserResponse <= 0.) {
227  // print message only if it is the first time we see < 0
228  // on this detid
229  if (channelsWithInvalidCorrection_.insert(xid.rawId()).second) {
230  edm::LogError("EcalLaserDbService") << "Interpolated Laser correction <0 for detid " << xid.rawId();
231  }
232 
233  return correctionFactor;
234 
235  } else {
236  float interpolatedTransparencyResponse = interpolatedLaserResponse / interpolatedLinearResponse;
237 
238  correctionFactor = 1.f / (std::pow(interpolatedTransparencyResponse, alpha) * interpolatedLinearResponse);
239  }
240 
241  } else {
242  edm::LogError("EcalLaserDbService") << "apdpnref (" << apdpnref << ") "
243  << "or t_i-t_f (" << (t_i - t_f) << " is zero!";
244  return correctionFactor;
245  }
246 
247  return correctionFactor;
248 }
249 
const EcalTimeMap & getTimeMap() const
float EcalLaserAlpha
int hashedIndex() const
get a compact index for arrays
Definition: EBDetId.h:82
const EcalLaserAPDPNRatios * getAPDPNRatios() const
const self & getMap() const
ErrorMapT channelsWithInvalidCorrection_
#define nullptr
float getLaserCorrection(DetId const &xid, edm::Timestamp const &iTime) const
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
static int lmr(EBGlobalCoord ieta, EBGlobalCoord iphi)
Definition: MEEBGeom.cc:110
float EcalLaserAPDPNref
U second(std::pair< T, U > const &p)
const EcalLinearCorrections * mLinearCorrections_
const EcalLaserAPDPNRatiosMap & getLaserMap() const
const EcalLaserAPDPNRatiosRef * mAPDPNRatiosRef_
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:48
const EcalValueMap & getValueMap() const
double f[11][100]
unsigned long long TimeValue_t
Definition: Timestamp.h:28
int SuperCrysCoord
Definition: MEEEGeom.h:20
#define TYPELOOKUP_DATA_REG(_dataclass_)
Definition: typelookup.h:102
Definition: DetId.h:17
int hashedIndex() const
Definition: EEDetId.h:183
const EcalLaserAlphas * getAlphas() const
const EcalLaserTimeStampMap & getTimeMap() const
std::vector< EcalLaserTimeStamp > EcalLaserTimeStampMap
const EcalLaserAPDPNRatios * mAPDPNRatios_
std::vector< Item >::const_iterator const_iterator
const EcalLaserAlphas * mAlphas_
const EcalLaserAPDPNRatiosRef * getAPDPNRatiosRef() const
Definition: plugin.cc:23
const EcalLinearCorrections * getLinearCorrections() const
const_iterator find(uint32_t rawId) const
const_iterator end() const
alpha
zGenParticlesMatch = cms.InputTag(""),
TimeValue_t value() const
Definition: Timestamp.h:45
static int lmr(SuperCrysCoord iX, SuperCrysCoord iY, int iz)
Definition: MEEEGeom.cc:254
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:30
constexpr Detector det() const
get the detector field from this detid
Definition: DetId.h:46