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