CMS 3D CMS Logo

CTPPSRPAlignmentCorrectionsDataESSourceXML.cc
Go to the documentation of this file.
1 /****************************************************************************
2  *
3  * This is a part of CMS-TOTEM PPS offline software.
4  * Authors:
5  * Jan Kaspar (jan.kaspar@gmail.com)
6  * Helena Malbouisson
7  * Clemencia Mora Herrera
8  ****************************************************************************/
9 
18 
20 
22 
23 #include "CondFormats/AlignmentRecord/interface/CTPPSRPAlignmentCorrectionsDataRcd.h" // this used to be RPMeasuredAlignmentRecord.h
26 
27 
28 #include <vector>
29 #include <string>
30 #include <map>
31 #include <set>
32 
33 
38 {
39 public:
42 
43  std::unique_ptr<CTPPSRPAlignmentCorrectionsData> produceMeasured(const CTPPSRPAlignmentCorrectionsDataRcd &);
44  std::unique_ptr<CTPPSRPAlignmentCorrectionsData> produceReal(const RPRealAlignmentRecord &);
45  std::unique_ptr<CTPPSRPAlignmentCorrectionsData> produceMisaligned(const RPMisalignedAlignmentRecord &);
46 
47 
48 protected:
49  unsigned int verbosity;
52 
54 
56  {
58  return src;
59 
60  if (src.luminosityBlock() == 0)
62 
63  return edm::EventID(src.run(), src.luminosityBlock() - 1, src.event());
64  }
65 
67  {
69  {
70  if (src.run() == edm::EventID::maxRunNumber())
71  return src;
72 
73  return edm::EventID(src.run() + 1, 0, src.event());
74  }
75 
76  return edm::EventID(src.run(), src.luminosityBlock() + 1, src.event());
77  }
78 
80  CTPPSRPAlignmentCorrectionsDataSequence Merge(const std::vector<CTPPSRPAlignmentCorrectionsDataSequence>&) const;
81 
83  void PrepareSequence(const std::string &label, CTPPSRPAlignmentCorrectionsDataSequence &seq, const std::vector<std::string> &files) const;
84 
85 };
86 
87 //----------------------------------------------------------------------------------------------------
88 
89 using namespace std;
90 using namespace edm;
91 
92 //----------------------------------------------------------------------------------------------------
93 //----------------------------------------------------------------------------------------------------
94 
96  verbosity(pSet.getUntrackedParameter<unsigned int>("verbosity", 0))
97 {
98  std::vector<std::string> measuredFiles;
99  for (const auto &f: pSet.getParameter< vector<string> >("MeasuredFiles"))
100  measuredFiles.push_back(edm::FileInPath(f).fullPath());
101  PrepareSequence("Measured", acsMeasured, measuredFiles);
102 
103  std::vector<std::string> realFiles;
104  for (const auto &f: pSet.getParameter< vector<string> >("RealFiles"))
105  realFiles.push_back(edm::FileInPath(f).fullPath());
106  PrepareSequence("Real", acsReal, realFiles);
107 
108  std::vector<std::string> misalignedFiles;
109  for (const auto &f: pSet.getParameter< vector<string> >("MisalignedFiles"))
110  misalignedFiles.push_back(edm::FileInPath(f).fullPath());
111  PrepareSequence("Misaligned", acsMisaligned, misalignedFiles);
112 
116 
117  findingRecord<CTPPSRPAlignmentCorrectionsDataRcd>();
118  findingRecord<RPRealAlignmentRecord>();
119  findingRecord<RPMisalignedAlignmentRecord>();
120 }
121 
122 //----------------------------------------------------------------------------------------------------
123 
125 {
126 }
127 
128 //----------------------------------------------------------------------------------------------------
129 
130 CTPPSRPAlignmentCorrectionsDataSequence CTPPSRPAlignmentCorrectionsDataESSourceXML::Merge(const vector<CTPPSRPAlignmentCorrectionsDataSequence>& seqs) const
131 {
132  // find interval boundaries
133  map< edm::EventID, vector< pair<bool, const CTPPSRPAlignmentCorrectionsData*> > > bounds;
134 
135  for (const auto & seq : seqs)
136  {
137  for (const auto &p : seq)
138  {
139  const ValidityInterval &iov = p.first;
140  const CTPPSRPAlignmentCorrectionsData *corr = & p.second;
141 
142  const EventID &event_first = iov.first().eventID();
143  bounds[event_first].emplace_back( pair<bool, const CTPPSRPAlignmentCorrectionsData*>(true, corr) );
144 
145  const EventID &event_after = nextLS(iov.last().eventID());
146  bounds[event_after].emplace_back( pair<bool, const CTPPSRPAlignmentCorrectionsData*>(false, corr) );
147  }
148  }
149 
150  // build correction sums per interval
151  set<const CTPPSRPAlignmentCorrectionsData*> accumulator;
153  for (map< EventID, vector< pair<bool, const CTPPSRPAlignmentCorrectionsData*> > >::const_iterator tit = bounds.begin(); tit != bounds.end(); ++tit)
154  {
155  for (const auto & cit : tit->second)
156  {
157  bool add = cit.first;
158  const CTPPSRPAlignmentCorrectionsData *corr = cit.second;
159 
160  if (add)
161  accumulator.insert(corr);
162  else
163  accumulator.erase(corr);
164  }
165 
166  auto tit_next = tit;
167  tit_next++;
168  if (tit_next == bounds.end())
169  break;
170 
171  const EventID &event_first = tit->first;
172  const EventID &event_last = previousLS(tit_next->first);
173 
174  if (verbosity)
175  {
176  LogVerbatim("CTPPSRPAlignmentCorrectionsDataESSourceXML")
179  << ": alignment blocks " << accumulator.size();
180  }
181 
183  for (auto sit : accumulator)
184  corr_sum.addCorrections(*sit);
185 
186  result.insert(edm::ValidityInterval(edm::IOVSyncValue(event_first), edm::IOVSyncValue(event_last)), corr_sum);
187  }
188 
189  return result;
190 }
191 
192 //----------------------------------------------------------------------------------------------------
193 
195 {
196  if (verbosity)
197  LogVerbatim(">> CTPPSRPAlignmentCorrectionsDataESSourceXML") << "CTPPSRPAlignmentCorrectionsDataESSourceXML::PrepareSequence(" << label << ")";
198 
199  vector<CTPPSRPAlignmentCorrectionsDataSequence> sequences;
200  for (const auto & file : files)
201  sequences.emplace_back(CTPPSRPAlignmentCorrectionsMethods::loadFromXML(file));
202 
203  seq = Merge(sequences);
204 }
205 
206 //----------------------------------------------------------------------------------------------------
207 
208 std::unique_ptr<CTPPSRPAlignmentCorrectionsData> CTPPSRPAlignmentCorrectionsDataESSourceXML::produceMeasured(const CTPPSRPAlignmentCorrectionsDataRcd &iRecord)
209 {
210  return std::make_unique<CTPPSRPAlignmentCorrectionsData>(acMeasured);
211 }
212 
213 //----------------------------------------------------------------------------------------------------
214 
215 std::unique_ptr<CTPPSRPAlignmentCorrectionsData> CTPPSRPAlignmentCorrectionsDataESSourceXML::produceReal(const RPRealAlignmentRecord &iRecord)
216 {
217  return std::make_unique<CTPPSRPAlignmentCorrectionsData>(acReal);
218 }
219 
220 //----------------------------------------------------------------------------------------------------
221 
222 std::unique_ptr<CTPPSRPAlignmentCorrectionsData> CTPPSRPAlignmentCorrectionsDataESSourceXML::produceMisaligned(const RPMisalignedAlignmentRecord &iRecord)
223 {
224  return std::make_unique<CTPPSRPAlignmentCorrectionsData>(acMisaligned);
225 }
226 
227 //----------------------------------------------------------------------------------------------------
228 
230  const IOVSyncValue& iosv, ValidityInterval& valInt)
231 {
232  if (verbosity)
233  {
234  time_t unixTime = iosv.time().unixTime();
235  char timeStr[50];
236  strftime(timeStr, 50, "%F %T", localtime(&unixTime));
237 
238  LogVerbatim("CTPPSRPAlignmentCorrectionsDataESSourceXML")
239  << ">> CTPPSRPAlignmentCorrectionsDataESSourceXML::setIntervalFor(" << key.name() << ")";
240 
241  LogVerbatim("CTPPSRPAlignmentCorrectionsDataESSourceXML")
242  << " event=" << iosv.eventID() << ", UNIX timestamp=" << unixTime << " (" << timeStr << ")";
243  }
244 
245  // // determine what sequence and corrections should be used
247  CTPPSRPAlignmentCorrectionsData *p_corr = nullptr;
248 
249  if (strcmp(key.name(), "CTPPSRPAlignmentCorrectionsDataRcd") == 0)
250  {
251  p_seq = &acsMeasured;
252  p_corr = &acMeasured;
253  }
254 
255  if (strcmp(key.name(), "RPRealAlignmentRecord") == 0)
256  {
257  p_seq = &acsReal;
258  p_corr = &acReal;
259  }
260 
261  if (strcmp(key.name(), "RPMisalignedAlignmentRecord") == 0)
262  {
263  p_seq = &acsMisaligned;
264  p_corr = &acMisaligned;
265  }
266 
267  if (p_corr == nullptr)
268  throw cms::Exception("CTPPSRPAlignmentCorrectionsDataESSourceXML::setIntervalFor") << "Unknown record " << key.name();
269 
270  // // find the corresponding interval
271  bool next_exists = false;
272  const edm::EventID &event_curr = iosv.eventID();
274 
275  for (const auto &it: *p_seq)
276  {
277  const auto &it_event_first = it.first.first().eventID();
278  const auto &it_event_last = it.first.last().eventID();
279 
280  bool it_contained_lo = ( (it_event_first.run() < event_curr.run()) ||
281  ((it_event_first.run() == event_curr.run()) && (it_event_first.luminosityBlock() <= event_curr.luminosityBlock())) );
282 
283  bool it_contained_up = ( (it_event_last.run() > event_curr.run()) ||
284  ((it_event_last.run() == event_curr.run()) && (it_event_last.luminosityBlock() >= event_curr.luminosityBlock())) );
285 
286  if (it_contained_lo && it_contained_up)
287  {
288  valInt = it.first;
289  *p_corr = it.second;
290 
291  if (verbosity)
292  {
293  LogVerbatim("CTPPSRPAlignmentCorrectionsDataESSourceXML")
294  << " setting validity interval ["
297  }
298 
299  return;
300  }
301 
302  bool it_in_future = ( (it_event_first.run() > event_curr.run()) ||
303  ((it_event_first.run() == event_curr.run() && (it_event_first.luminosityBlock() > event_curr.luminosityBlock()))) );
304 
305  if (it_in_future)
306  {
307  next_exists = true;
308  if (event_next_start > it_event_first)
309  event_next_start = it_event_first;
310  }
311  }
312 
313  // no interval found, set empty corrections
315 
316  if (!next_exists)
317  {
318  valInt = ValidityInterval(iosv, iosv.endOfTime());
319  } else {
320  const EventID &event_last = previousLS(event_next_start);
321  valInt = ValidityInterval(iosv, IOVSyncValue(event_last));
322  }
323 
324  if (verbosity)
325  {
326  LogVerbatim("CTPPSRPAlignmentCorrectionsDataESSourceXML")
327  << " setting validity interval ["
329  << ", " << CTPPSRPAlignmentCorrectionsMethods::iovValueToString(valInt.last()) << "] (empty alignment corrections)";
330  }
331 
332 }
333 
RunNumber_t run() const
Definition: EventID.h:39
T getParameter(std::string const &) const
auto setWhatProduced(T *iThis, const es::Label &iLabel={})
Definition: ESProducer.h:124
EventNumber_t event() const
Definition: EventID.h:41
static RunNumber_t maxRunNumber()
Definition: EventID.h:103
const EventID & eventID() const
Definition: IOVSyncValue.h:40
Time sequence of alignment corrections. I/O methods have been factored out to: CondFormats/CTPPSReado...
static const IOVSyncValue & endOfTime()
Definition: IOVSyncValue.cc:82
std::pair< Time_t, Time_t > ValidityInterval
Definition: Time.h:19
LuminosityBlockNumber_t luminosityBlock() const
Definition: EventID.h:40
std::unique_ptr< CTPPSRPAlignmentCorrectionsData > produceMeasured(const CTPPSRPAlignmentCorrectionsDataRcd &)
CTPPSRPAlignmentCorrectionsDataSequence Merge(const std::vector< CTPPSRPAlignmentCorrectionsDataSequence > &) const
merges an array of sequences to one
const IOVSyncValue & last() const
static CTPPSRPAlignmentCorrectionsDataSequence loadFromXML(const std::string &fileName)
loads sequence of alignment corrections from XML file
char const * label
std::unique_ptr< CTPPSRPAlignmentCorrectionsData > produceMisaligned(const RPMisalignedAlignmentRecord &)
static LuminosityBlockNumber_t maxLuminosityBlockNumber()
Definition: EventID.h:107
static std::string iovValueToString(const edm::IOVSyncValue &)
void setIntervalFor(const edm::eventsetup::EventSetupRecordKey &, const edm::IOVSyncValue &, edm::ValidityInterval &) override
unsigned int unixTime() const
Time in seconds since January 1, 1970.
Definition: Timestamp.h:46
double f[11][100]
JetCorrectorParameters corr
Definition: classes.h:5
void addCorrections(const CTPPSRPAlignmentCorrectionsData &, bool sumErrors=true, bool addSh=true, bool addRot=true)
adds (merges) corrections on top of the current values
void insert(const edm::ValidityInterval &iov, const CTPPSRPAlignmentCorrectionsData &data)
void add(std::map< std::string, TH1 * > &h, TH1 *hist)
Container for CTPPS RP alignment corrections. The corrections are stored on two levels - RP and senso...
HLT enums.
const Timestamp & time() const
Definition: IOVSyncValue.h:42
void PrepareSequence(const std::string &label, CTPPSRPAlignmentCorrectionsDataSequence &seq, const std::vector< std::string > &files) const
builds a sequence of corrections from provided sources and runs a few checks
#define DEFINE_FWK_EVENTSETUP_SOURCE(type)
Definition: SourceFactory.h:91
const IOVSyncValue & first() const
std::unique_ptr< CTPPSRPAlignmentCorrectionsData > produceReal(const RPRealAlignmentRecord &)