CMS 3D CMS Logo

TotemRPIncludeAlignments.cc
Go to the documentation of this file.
1 /****************************************************************************
2 *
3 * This is a part of TOTEM offline software.
4 * Authors:
5 * Jan Kaspar (jan.kaspar@gmail.com)
6 *
7 ****************************************************************************/
8 
16 
21 
22 #include <vector>
23 #include <string>
24 #include <map>
25 #include <set>
26 
27 
35 {
36  public:
38  virtual ~TotemRPIncludeAlignments();
39 
40  std::unique_ptr<RPAlignmentCorrectionsData> produceMeasured(const RPMeasuredAlignmentRecord &);
41  std::unique_ptr<RPAlignmentCorrectionsData> produceReal(const RPRealAlignmentRecord &);
42  std::unique_ptr<RPAlignmentCorrectionsData> produceMisaligned(const RPMisalignedAlignmentRecord &);
43 
44  protected:
45  unsigned int verbosity;
48 
50 
52  RPAlignmentCorrectionsDataSequence Merge(const std::vector<RPAlignmentCorrectionsDataSequence>) const;
53 
55  void PrepareSequence(const std::string &label, RPAlignmentCorrectionsDataSequence &seq, const std::vector<std::string> &files) const;
56 };
57 
58 //----------------------------------------------------------------------------------------------------
59 
60 using namespace std;
61 using namespace edm;
62 
63 //----------------------------------------------------------------------------------------------------
64 //----------------------------------------------------------------------------------------------------
65 
67  verbosity(pSet.getUntrackedParameter<unsigned int>("verbosity", 1))
68 {
69  PrepareSequence("Measured", acsMeasured, pSet.getParameter< vector<string> >("MeasuredFiles"));
70  PrepareSequence("Real", acsReal, pSet.getParameter< vector<string> >("RealFiles"));
71  PrepareSequence("Misaligned", acsMisaligned, pSet.getParameter< vector<string> >("MisalignedFiles"));
72 
76 
77  findingRecord<RPMeasuredAlignmentRecord>();
78  findingRecord<RPRealAlignmentRecord>();
79  findingRecord<RPMisalignedAlignmentRecord>();
80 }
81 
82 //----------------------------------------------------------------------------------------------------
83 
85 {
86 }
87 
88 //----------------------------------------------------------------------------------------------------
89 
90 RPAlignmentCorrectionsDataSequence TotemRPIncludeAlignments::Merge(const vector<RPAlignmentCorrectionsDataSequence> files) const
91 {
92  // find interval boundaries
93  map< TimeValue_t, vector< pair<bool, const RPAlignmentCorrectionsData*> > > bounds;
94 
95  for (vector<RPAlignmentCorrectionsDataSequence>::const_iterator fit = files.begin(); fit != files.end(); ++fit)
96  {
97  for (RPAlignmentCorrectionsDataSequence::const_iterator iit = fit->begin(); iit != fit->end(); ++iit)
98  {
99  const TimeValidityInterval &tvi = iit->first;
100  const RPAlignmentCorrectionsData *corr = & iit->second;
101 
102  bounds[tvi.first].push_back( pair<bool, const RPAlignmentCorrectionsData*>(true, corr) );
103 
104  TimeValue_t delta = (tvi.last != TimeValidityInterval::EndOfTime()) ? (1ULL << 32) : 0; // input resolution is 1s
105  bounds[tvi.last + delta].push_back( pair<bool, const RPAlignmentCorrectionsData*>(false, corr) );
106  }
107  }
108 
109  // build correction sums per interval
110  set<const RPAlignmentCorrectionsData*> accumulator;
112  // bool gap_found = false;
113  for (map< TimeValue_t, vector< pair<bool, const RPAlignmentCorrectionsData*> > >::const_iterator tit = bounds.begin(); tit != bounds.end(); ++tit)
114  {
115  for (vector< pair<bool, const RPAlignmentCorrectionsData*> >::const_iterator cit = tit->second.begin(); cit != tit->second.end(); ++cit)
116  {
117  bool add = cit->first;
118  const RPAlignmentCorrectionsData *corr = cit->second;
119 
120  if (add)
121  accumulator.insert(corr);
122  else
123  accumulator.erase(corr);
124  }
125 
126  map< TimeValue_t, vector< pair<bool, const RPAlignmentCorrectionsData*> > >::const_iterator tit_next = tit;
127  tit_next++;
128  if (tit_next == bounds.end())
129  break;
130 
131  TimeValue_t delta = (tit_next->first != TimeValidityInterval::EndOfTime()) ? 1 : 0; // minimal step
132  TimeValidityInterval tvi(tit->first, tit_next->first - delta);
133 
134  if (verbosity)
135  {
136  printf("\tfirst=%10s, last=%10s: alignment blocks=%li\n",
139  accumulator.size()
140  );
141  }
142 
143  for (set<const RPAlignmentCorrectionsData*>::iterator sit = accumulator.begin(); sit != accumulator.end(); ++sit)
144  result[tvi].AddCorrections(*(*sit));
145  }
146 
147  return result;
148 }
149 
150 //----------------------------------------------------------------------------------------------------
151 
152 void TotemRPIncludeAlignments::PrepareSequence(const string &label, RPAlignmentCorrectionsDataSequence &seq, const vector<string> &files) const
153 {
154  if (verbosity)
155  printf(">> TotemRPIncludeAlignments::PrepareSequence(%s)\n", label.c_str());
156 
157  vector<RPAlignmentCorrectionsDataSequence> sequences;
158  for (unsigned int i = 0; i < files.size(); i++)
159  sequences.push_back(RPAlignmentCorrectionsDataSequence(files[i]));
160 
161  seq = Merge(sequences);
162 }
163 
164 //----------------------------------------------------------------------------------------------------
165 
166 std::unique_ptr<RPAlignmentCorrectionsData> TotemRPIncludeAlignments::produceMeasured(const RPMeasuredAlignmentRecord &iRecord)
167 {
168  return std::make_unique<RPAlignmentCorrectionsData>(acMeasured);
169 }
170 
171 //----------------------------------------------------------------------------------------------------
172 
173 std::unique_ptr<RPAlignmentCorrectionsData> TotemRPIncludeAlignments::produceReal(const RPRealAlignmentRecord &iRecord)
174 {
175  return std::make_unique<RPAlignmentCorrectionsData>(acReal);
176 }
177 
178 //----------------------------------------------------------------------------------------------------
179 
180 std::unique_ptr<RPAlignmentCorrectionsData> TotemRPIncludeAlignments::produceMisaligned(const RPMisalignedAlignmentRecord &iRecord)
181 {
182  return std::make_unique<RPAlignmentCorrectionsData>(acMisaligned);
183 }
184 
185 //----------------------------------------------------------------------------------------------------
186 
188  const IOVSyncValue& iosv, ValidityInterval& valInt)
189 {
190  if (verbosity)
191  {
192  LogVerbatim("TotemRPIncludeAlignments")
193  << ">> TotemRPIncludeAlignments::setIntervalFor(" << key.name() << ")";
194 
195  time_t unixTime = iosv.time().unixTime();
196  char timeStr[50];
197  strftime(timeStr, 50, "%F %T", localtime(&unixTime));
198 
199  LogVerbatim("TotemRPIncludeAlignments")
200  << " run=" << iosv.eventID().run() << ", event=" << iosv.eventID().event() << ", UNIX timestamp=" << unixTime << " (" << timeStr << ")";
201  }
202 
203  // determine what sequence and corrections should be used
206 
207  if (strcmp(key.name(), "RPMeasuredAlignmentRecord") == 0)
208  {
209  seq = &acsMeasured;
210  corr = &acMeasured;
211  }
212 
213  if (strcmp(key.name(), "RPRealAlignmentRecord") == 0)
214  {
215  seq = &acsReal;
216  corr = &acReal;
217  }
218 
219  if (strcmp(key.name(), "RPMisalignedAlignmentRecord") == 0)
220  {
221  seq = &acsMisaligned;
222  corr = &acMisaligned;
223  }
224 
225  if (seq == NULL)
226  throw cms::Exception("TotemRPIncludeAlignments::setIntervalFor") << "Unknown record " << key.name();
227 
228  // find the corresponding time interval
229  bool next_exists = false;
230  TimeValue_t t = iosv.time().value(), next_start = TimeValidityInterval::EndOfTime();
231 
232  for (RPAlignmentCorrectionsDataSequence::iterator it = seq->begin(); it != seq->end(); ++it)
233  {
234  if (it->first.first <= t && it->first.last >= t)
235  {
236  valInt = ValidityInterval(IOVSyncValue(Timestamp(it->first.first)), IOVSyncValue(Timestamp(it->first.last)));
237  *corr = it->second;
238 
239  if (verbosity)
240  {
241  LogVerbatim("TotemRPIncludeAlignments")
242  << " setting validity interval [" << TimeValidityInterval::ValueToUNIXString(valInt.first().time().value())
243  << ", " << TimeValidityInterval::ValueToUNIXString(valInt.last().time().value()) << "]";
244  }
245 
246  return;
247  }
248 
249  if (t <= it->first.first)
250  {
251  next_exists = true;
252  next_start = min(next_start, it->first.first);
253  }
254  }
255 
256  // no interval found, set empty corrections
257  *corr = RPAlignmentCorrectionsData();
258 
259  if (!next_exists)
260  valInt = ValidityInterval(iosv, iosv.endOfTime());
261  else
262  valInt = ValidityInterval(iosv, IOVSyncValue(Timestamp(next_start - 1)));
263 
264  if (verbosity)
265  {
266  LogVerbatim("TotemRPIncludeAlignments")
267  << " setting validity interval [" << TimeValidityInterval::ValueToUNIXString(valInt.first().time().value())
268  << ", " << TimeValidityInterval::ValueToUNIXString(valInt.last().time().value()) << "]";
269  }
270 }
271 
RunNumber_t run() const
Definition: EventID.h:39
dbl * delta
Definition: mlp_gen.cc:36
TotemRPIncludeAlignments(const edm::ParameterSet &p)
T getParameter(std::string const &) const
EventNumber_t event() const
Definition: EventID.h:41
Time sequence of alignment corrections.
RPAlignmentCorrectionsDataSequence Merge(const std::vector< RPAlignmentCorrectionsDataSequence >) const
merges an array of sequences to one
const EventID & eventID() const
Definition: IOVSyncValue.h:42
Validity interval in timestamps.
std::unique_ptr< RPAlignmentCorrectionsData > produceMisaligned(const RPMisalignedAlignmentRecord &)
RPAlignmentCorrectionsData acMisaligned
static const IOVSyncValue & endOfTime()
Definition: IOVSyncValue.cc:97
A class adding (mis)alignments to geometry (both real and misaligned).
std::pair< Time_t, Time_t > ValidityInterval
Definition: Time.h:19
void add(const std::vector< const T * > &source, std::vector< const T * > &dest)
#define NULL
Definition: scimark2.h:8
RPAlignmentCorrectionsDataSequence acsReal
std::unique_ptr< RPAlignmentCorrectionsData > produceReal(const RPRealAlignmentRecord &)
void setWhatProduced(T *iThis, const es::Label &iLabel=es::Label())
Definition: ESProducer.h:115
RPAlignmentCorrectionsDataSequence acsMeasured
const IOVSyncValue & last() const
RPAlignmentCorrectionsData acReal
void PrepareSequence(const std::string &label, RPAlignmentCorrectionsDataSequence &seq, const std::vector< std::string > &files) const
builds a sequence of corrections from provided sources and runs a few checks
RPAlignmentCorrectionsData acMeasured
static std::string ValueToUNIXString(const edm::TimeValue_t &v)
unsigned int unixTime() const
Time in seconds since January 1, 1970.
Definition: Timestamp.h:46
T min(T a, T b)
Definition: MathUtil.h:58
RPAlignmentCorrectionsDataSequence acsMisaligned
unsigned long long TimeValue_t
Definition: Timestamp.h:28
JetCorrectorParameters corr
Definition: classes.h:5
edm::TimeValue_t first
the boundaries (included) of the interval expressed as UNIX timestamps
#define DEFINE_FWK_EVENTSETUP_SOURCE(type)
Definition: SourceFactory.h:92
Container for RP alignment corrections. The corrections are stored on two levels - RP and sensor...
HLT enums.
std::unique_ptr< RPAlignmentCorrectionsData > produceMeasured(const RPMeasuredAlignmentRecord &)
const Timestamp & time() const
Definition: IOVSyncValue.h:44
const IOVSyncValue & first() const
static const edm::TimeValue_t EndOfTime()
virtual void setIntervalFor(const edm::eventsetup::EventSetupRecordKey &, const edm::IOVSyncValue &, edm::ValidityInterval &)
TimeValue_t value() const
Definition: Timestamp.h:56