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 
EcalCondObjectContainer::getMap
const self & getMap() const
Definition: EcalCondObjectContainer.h:80
EcalTimeDependentCorrections::Values
Definition: EcalTimeDependentCorrections.h:16
EBDetId::hashedIndex
int hashedIndex() const
get a compact index for arrays
Definition: EBDetId.h:82
EcalCondObjectContainer::end
const_iterator end() const
Definition: EcalCondObjectContainer.h:76
EcalLaserAPDPNRatios::EcalLaserAPDPNpair::p1
float p1
Definition: EcalLaserAPDPNRatios.h:18
EcalTimeDependentCorrections::Times::t2
edm::Timestamp t2
Definition: EcalTimeDependentCorrections.h:27
MessageLogger.h
dqmMemoryStats.float
float
Definition: dqmMemoryStats.py:127
groupFilesInBlocks.tt
int tt
Definition: groupFilesInBlocks.py:144
f
double f[11][100]
Definition: MuScleFitUtils.cc:78
zMuMuMuonUserData.alpha
alpha
zGenParticlesMatch = cms.InputTag(""),
Definition: zMuMuMuonUserData.py:9
EBDetId
Definition: EBDetId.h:17
EcalLaserDbService::getAPDPNRatios
const EcalLaserAPDPNRatios * getAPDPNRatios() const
Definition: EcalLaserDbService.cc:22
DetId::det
constexpr Detector det() const
get the detector field from this detid
Definition: DetId.h:46
EcalLaserAlpha
float EcalLaserAlpha
Definition: EcalLaserAlphas.h:10
typelookup.h
MEEBGeom::lmr
static int lmr(EBGlobalCoord ieta, EBGlobalCoord iphi)
Definition: MEEBGeom.cc:110
MEEBGeom.h
EcalLaserDbService::mAlphas_
const EcalLaserAlphas * mAlphas_
Definition: EcalLaserDbService.h:40
edm::second
U second(std::pair< T, U > const &p)
Definition: ParameterSet.cc:215
EcalLaserDbService::mLinearCorrections_
const EcalLinearCorrections * mLinearCorrections_
Definition: EcalLaserDbService.h:43
EcalTimeDependentCorrections::EcalTimeMap
std::vector< Times > EcalTimeMap
Definition: EcalTimeDependentCorrections.h:34
edm::Timestamp::value
TimeValue_t value() const
Definition: Timestamp.h:45
EcalCondObjectContainer< float >
EcalBarrel
Definition: EcalSubdetector.h:10
EcalTimeDependentCorrections::Values::p3
float p3
Definition: EcalTimeDependentCorrections.h:20
EcalTimeDependentCorrections::Values::p1
float p1
Definition: EcalTimeDependentCorrections.h:18
DetId
Definition: DetId.h:17
cond::timestamp
Definition: Time.h:19
EcalTimeDependentCorrections::getValueMap
const EcalValueMap & getValueMap() const
Definition: EcalTimeDependentCorrections.h:40
EcalLaserAPDPNRatios::getLaserMap
const EcalLaserAPDPNRatiosMap & getLaserMap() const
Definition: EcalLaserAPDPNRatios.h:40
EcalTimeDependentCorrections::Times::t3
edm::Timestamp t3
Definition: EcalTimeDependentCorrections.h:28
EcalLaserDbService
Definition: EcalLaserDbService.h:24
EcalLaserDbService.h
EcalCondObjectContainer::find
const_iterator find(uint32_t rawId) const
Definition: EcalCondObjectContainer.h:53
OrderedSet.t
t
Definition: OrderedSet.py:90
DetId::subdetId
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum)
Definition: DetId.h:48
EEDetId
Definition: EEDetId.h:14
EcalLaserAPDPNref
float EcalLaserAPDPNref
Definition: EcalLaserAPDPNRatiosRef.h:11
EcalEndcap
Definition: EcalSubdetector.h:10
EcalLaserDbService::EcalLaserDbService
EcalLaserDbService()
Definition: EcalLaserDbService.cc:15
cond
Definition: plugin.cc:23
PixelPluginsPhase0_cfi.isBarrel
isBarrel
Definition: PixelPluginsPhase0_cfi.py:17
EcalLaserAPDPNRatios::EcalLaserAPDPNpair
Definition: EcalLaserAPDPNRatios.h:16
edm::LogError
Definition: MessageLogger.h:183
EcalTimeDependentCorrections::Values::p2
float p2
Definition: EcalTimeDependentCorrections.h:19
EcalLaserAPDPNRatios::getTimeMap
const EcalLaserTimeStampMap & getTimeMap() const
Definition: EcalLaserAPDPNRatios.h:43
EEDetId::hashedIndex
int hashedIndex() const
Definition: EEDetId.h:183
EcalTimeDependentCorrections::getTimeMap
const EcalTimeMap & getTimeMap() const
Definition: EcalTimeDependentCorrections.h:43
EcalLaserDbService::mAPDPNRatiosRef_
const EcalLaserAPDPNRatiosRef * mAPDPNRatiosRef_
Definition: EcalLaserDbService.h:41
EcalLaserDbService::getLinearCorrections
const EcalLinearCorrections * getLinearCorrections() const
Definition: EcalLaserDbService.cc:24
MEEEGeom.h
EcalLaserDbService::channelsWithInvalidCorrection_
ErrorMapT channelsWithInvalidCorrection_
Definition: EcalLaserDbService.h:46
DetId::Ecal
Definition: DetId.h:27
EcalLaserAPDPNRatios::EcalLaserTimeStampMap
std::vector< EcalLaserTimeStamp > EcalLaserTimeStampMap
Definition: EcalLaserAPDPNRatios.h:34
TYPELOOKUP_DATA_REG
#define TYPELOOKUP_DATA_REG(_dataclass_)
Definition: typelookup.h:102
MEEEGeom::lmr
static int lmr(SuperCrysCoord iX, SuperCrysCoord iY, int iz)
Definition: MEEEGeom.cc:254
EcalLaserDbService::getLaserCorrection
float getLaserCorrection(DetId const &xid, edm::Timestamp const &iTime) const
Definition: EcalLaserDbService.cc:26
std
Definition: JetResolutionObject.h:76
DetId::rawId
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
EcalTimeDependentCorrections::Times::t1
edm::Timestamp t1
Definition: EcalTimeDependentCorrections.h:26
EcalTimeDependentCorrections::Times
Definition: EcalTimeDependentCorrections.h:24
EcalLaserDbService::getAPDPNRatiosRef
const EcalLaserAPDPNRatiosRef * getAPDPNRatiosRef() const
Definition: EcalLaserDbService.cc:20
EcalLaserDbService::mAPDPNRatios_
const EcalLaserAPDPNRatios * mAPDPNRatios_
Definition: EcalLaserDbService.h:42
funct::pow
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:30
EcalCondObjectContainer< EcalLaserAPDPNpair >::const_iterator
std::vector< Item >::const_iterator const_iterator
Definition: EcalCondObjectContainer.h:19
EcalLaserAPDPNRatios
Definition: EcalLaserAPDPNRatios.h:14
EcalLaserDbService::getAlphas
const EcalLaserAlphas * getAlphas() const
Definition: EcalLaserDbService.cc:18
MEEEGeom::SuperCrysCoord
int SuperCrysCoord
Definition: MEEEGeom.h:20
EcalLaserAPDPNRatios::EcalLaserTimeStamp
Definition: EcalLaserAPDPNRatios.h:24
EcalLaserAPDPNRatios::EcalLaserAPDPNpair::p2
float p2
Definition: EcalLaserAPDPNRatios.h:19
edm::TimeValue_t
unsigned long long TimeValue_t
Definition: Timestamp.h:28
EcalTimeDependentCorrections
Definition: EcalTimeDependentCorrections.h:14
EcalLaserAPDPNRatios::EcalLaserAPDPNpair::p3
float p3
Definition: EcalLaserAPDPNRatios.h:20
edm::Timestamp
Definition: Timestamp.h:30