CMS 3D CMS Logo

List of all members | Public Types | Public Member Functions | Private Member Functions | Private Attributes | Friends
InterpolatedPulse< MaxLen > Class Template Reference

#include <InterpolatedPulse.h>

Public Types

enum  { maxlen = MaxLen }
 

Public Member Functions

double derivative (const double t) const
 
double getIntegral () const
 
unsigned getLength () const
 
double getPeakValue () const
 
const double * getPulse () const
 
double getPulseWidth () const
 
double getStartTime () const
 
double getStopTime () const
 
double getTimeStep () const
 
 InterpolatedPulse ()
 
template<typename Real >
 InterpolatedPulse (const double tmin, const double tmax, const Real *values, const unsigned len)
 
 InterpolatedPulse (const double tmin, const double tmax, const unsigned len)
 
 InterpolatedPulse (const InterpolatedPulse &r)
 
template<unsigned Len2>
 InterpolatedPulse (const InterpolatedPulse< Len2 > &r)
 
 InterpolatedPulse (const unsigned len)
 
template<unsigned Len2>
bool operator!= (const InterpolatedPulse< Len2 > &r) const
 
double operator() (const double t) const
 
InterpolatedPulseoperator*= (const double scale)
 
template<unsigned Len2>
InterpolatedPulseoperator+= (const InterpolatedPulse< Len2 > &r)
 
InterpolatedPulseoperator= (const InterpolatedPulse &r)
 
template<unsigned Len2>
InterpolatedPulseoperator= (const InterpolatedPulse< Len2 > &r)
 
template<unsigned Len2>
bool operator== (const InterpolatedPulse< Len2 > &r) const
 
double secondDerivative (const double t) const
 
void setIntegral (const double newValue)
 
void setPeakValue (const double newValue)
 
void setPulseWidth (const double newWidth)
 
template<typename Real >
void setShape (const Real *values, const unsigned len)
 
void setStartTime (const double newStartTime)
 
void zeroOut ()
 

Private Member Functions

template<class Archive >
void serialize (Archive &ar, unsigned)
 

Private Attributes

unsigned length_
 
double pulse_ [MaxLen]
 
double tmin_
 
double width_
 

Friends

class boost::serialization::access
 
template<unsigned Len2>
class InterpolatedPulse
 

Detailed Description

template<unsigned MaxLen>
class InterpolatedPulse< MaxLen >

Definition at line 11 of file InterpolatedPulse.h.

Member Enumeration Documentation

◆ anonymous enum

template<unsigned MaxLen>
anonymous enum
Enumerator
maxlen 

Definition at line 17 of file InterpolatedPulse.h.

17 { maxlen = MaxLen };

Constructor & Destructor Documentation

◆ InterpolatedPulse() [1/6]

template<unsigned MaxLen>
InterpolatedPulse< MaxLen >::InterpolatedPulse ( )
inline

Definition at line 20 of file InterpolatedPulse.h.

20 : tmin_(0.0), width_(1.0), length_(2U) { zeroOut(); }

◆ InterpolatedPulse() [2/6]

template<unsigned MaxLen>
InterpolatedPulse< MaxLen >::InterpolatedPulse ( const unsigned  len)
inlineexplicit

Definition at line 24 of file InterpolatedPulse.h.

24  : tmin_(0.0), width_(1.0), length_(len) {
25  if (length_ < 2 || length_ > MaxLen)
26  throw cms::Exception("In InterpolatedPulse constructor: invalid length");
27  zeroOut();
28  }

◆ InterpolatedPulse() [3/6]

template<unsigned MaxLen>
InterpolatedPulse< MaxLen >::InterpolatedPulse ( const double  tmin,
const double  tmax,
const unsigned  len 
)
inline

Definition at line 30 of file InterpolatedPulse.h.

31  : tmin_(tmin), width_(tmax - tmin), length_(len) {
32  if (length_ < 2 || length_ > MaxLen)
33  throw cms::Exception("In InterpolatedPulse constructor: invalid length");
34  if (width_ <= 0.0)
35  throw cms::Exception("In InterpolatedPulse constructor: invalid pulse width");
36  zeroOut();
37  }

◆ InterpolatedPulse() [4/6]

template<unsigned MaxLen>
template<typename Real >
InterpolatedPulse< MaxLen >::InterpolatedPulse ( const double  tmin,
const double  tmax,
const Real *  values,
const unsigned  len 
)
inline

Definition at line 40 of file InterpolatedPulse.h.

41  : tmin_(tmin), width_(tmax - tmin) {
42  if (width_ <= 0.0)
43  throw cms::Exception("In InterpolatedPulse constructor: invalid pulse width");
44  setShape(values, len);
45  }

◆ InterpolatedPulse() [5/6]

template<unsigned MaxLen>
InterpolatedPulse< MaxLen >::InterpolatedPulse ( const InterpolatedPulse< MaxLen > &  r)
inline

Definition at line 48 of file InterpolatedPulse.h.

48  : tmin_(r.tmin_), width_(r.width_), length_(r.length_) {
49  double* buf = &pulse_[0];
50  const double* rbuf = &r.pulse_[0];
51  for (unsigned i = 0; i < length_; ++i)
52  *buf++ = *rbuf++;
53  }

◆ InterpolatedPulse() [6/6]

template<unsigned MaxLen>
template<unsigned Len2>
InterpolatedPulse< MaxLen >::InterpolatedPulse ( const InterpolatedPulse< Len2 > &  r)
inline

Definition at line 57 of file InterpolatedPulse.h.

57  : tmin_(r.tmin_), width_(r.width_), length_(r.length_) {
58  if (length_ > MaxLen)
59  throw cms::Exception("In InterpolatedPulse copy constructor: buffer is not long enough");
60  double* buf = &pulse_[0];
61  const double* rbuf = &r.pulse_[0];
62  for (unsigned i = 0; i < length_; ++i)
63  *buf++ = *rbuf++;
64  }

Member Function Documentation

◆ derivative()

template<unsigned MaxLen>
double InterpolatedPulse< MaxLen >::derivative ( const double  t) const
inline

Definition at line 147 of file InterpolatedPulse.h.

147  {
148  const volatile double tmax = tmin_ + width_;
149  if (t < tmin_ || t > tmax)
150  return 0.0;
151  const unsigned lm1 = length_ - 1U;
152  const double step = width_ / lm1;
153  const double nSteps = (t - tmin_) / step;
154  unsigned nbelow = nSteps;
155  unsigned nabove = nbelow + 1;
156  if (nabove > lm1) {
157  nabove = lm1;
158  nbelow = nabove - 1U;
159  }
160  const double delta = nSteps - nbelow;
161  if ((nbelow == 0U && delta <= 0.5) || (nabove == lm1 && delta >= 0.5))
162  return (pulse_[nabove] - pulse_[nbelow]) / step;
163  else if (delta >= 0.5) {
164  const double lower = pulse_[nabove] - pulse_[nbelow];
165  const double upper = pulse_[nabove + 1U] - pulse_[nabove];
166  return (upper * (delta - 0.5) + lower * (1.5 - delta)) / step;
167  } else {
168  const double lower = pulse_[nbelow] - pulse_[nbelow - 1U];
169  const double upper = pulse_[nabove] - pulse_[nbelow];
170  return (lower * (0.5 - delta) + upper * (0.5 + delta)) / step;
171  }
172  }

Referenced by DoublePadeDelay< ODE1, ODE2, DelayTimeModel1, DelayTimeModel2 >::calc().

◆ getIntegral()

template<unsigned MaxLen>
double InterpolatedPulse< MaxLen >::getIntegral ( ) const
inline

Definition at line 242 of file InterpolatedPulse.h.

242  {
243  const double* buf = &pulse_[0];
244  long double sum = buf[0] / 2.0;
245  const unsigned nIntervals = length_ - 1U;
246  for (unsigned i = 1U; i < nIntervals; ++i)
247  sum += buf[i];
248  sum += buf[nIntervals] / 2.0;
249  return sum * width_ / nIntervals;
250  }

Referenced by QIE8Simulator::getInputIntegral(), and InterpolatedPulse< 1500U >::setIntegral().

◆ getLength()

template<unsigned MaxLen>
unsigned InterpolatedPulse< MaxLen >::getLength ( ) const
inline

Definition at line 114 of file InterpolatedPulse.h.

114 { return length_; }

◆ getPeakValue()

template<unsigned MaxLen>
double InterpolatedPulse< MaxLen >::getPeakValue ( ) const
inline

Definition at line 259 of file InterpolatedPulse.h.

259  {
260  const double* buf = &pulse_[0];
261  double peak = buf[0];
262  for (unsigned i = 1U; i < length_; ++i)
263  if (buf[i] > peak)
264  peak = buf[i];
265  return peak;
266  }

Referenced by QIE8Simulator::getInputAmplitude(), and InterpolatedPulse< 1500U >::setPeakValue().

◆ getPulse()

template<unsigned MaxLen>
const double* InterpolatedPulse< MaxLen >::getPulse ( ) const
inline

Definition at line 113 of file InterpolatedPulse.h.

113 { return &pulse_[0]; }

◆ getPulseWidth()

template<unsigned MaxLen>
double InterpolatedPulse< MaxLen >::getPulseWidth ( ) const
inline

Definition at line 117 of file InterpolatedPulse.h.

117 { return width_; }

◆ getStartTime()

template<unsigned MaxLen>
double InterpolatedPulse< MaxLen >::getStartTime ( ) const
inline

Definition at line 115 of file InterpolatedPulse.h.

115 { return tmin_; }

Referenced by QIE8Simulator::getInputStartTime().

◆ getStopTime()

template<unsigned MaxLen>
double InterpolatedPulse< MaxLen >::getStopTime ( ) const
inline

Definition at line 116 of file InterpolatedPulse.h.

116 { return tmin_ + width_; }

◆ getTimeStep()

template<unsigned MaxLen>
double InterpolatedPulse< MaxLen >::getTimeStep ( ) const
inline

Definition at line 118 of file InterpolatedPulse.h.

118 { return width_ / (length_ - 1U); }

◆ operator!=()

template<unsigned MaxLen>
template<unsigned Len2>
bool InterpolatedPulse< MaxLen >::operator!= ( const InterpolatedPulse< Len2 > &  r) const
inline

Definition at line 237 of file InterpolatedPulse.h.

237  {
238  return !(*this == r);
239  }

◆ operator()()

template<unsigned MaxLen>
double InterpolatedPulse< MaxLen >::operator() ( const double  t) const
inline

Definition at line 130 of file InterpolatedPulse.h.

130  {
131  const volatile double tmax = tmin_ + width_;
132  if (t < tmin_ || t > tmax)
133  return 0.0;
134  const unsigned lm1 = length_ - 1U;
135  const double step = width_ / lm1;
136  const double nSteps = (t - tmin_) / step;
137  unsigned nbelow = nSteps;
138  unsigned nabove = nbelow + 1;
139  if (nabove > lm1) {
140  nabove = lm1;
141  nbelow = nabove - 1U;
142  }
143  const double delta = nSteps - nbelow;
144  return pulse_[nbelow] * (1.0 - delta) + pulse_[nabove] * delta;
145  }

◆ operator*=()

template<unsigned MaxLen>
InterpolatedPulse& InterpolatedPulse< MaxLen >::operator*= ( const double  scale)
inline

Definition at line 204 of file InterpolatedPulse.h.

204  {
205  if (scale != 1.0) {
206  double* buf = &pulse_[0];
207  for (unsigned i = 0; i < length_; ++i)
208  *buf++ *= scale;
209  }
210  return *this;
211  }

◆ operator+=()

template<unsigned MaxLen>
template<unsigned Len2>
InterpolatedPulse& InterpolatedPulse< MaxLen >::operator+= ( const InterpolatedPulse< Len2 > &  r)
inline

Definition at line 217 of file InterpolatedPulse.h.

217  {
218  const double step = width_ / (length_ - 1U);
219  for (unsigned i = 0; i < length_; ++i)
220  pulse_[i] += r(tmin_ + i * step);
221  return *this;
222  }

◆ operator=() [1/2]

template<unsigned MaxLen>
InterpolatedPulse& InterpolatedPulse< MaxLen >::operator= ( const InterpolatedPulse< MaxLen > &  r)
inline

Definition at line 67 of file InterpolatedPulse.h.

67  {
68  if (this != &r) {
69  tmin_ = r.tmin_;
70  width_ = r.width_;
71  length_ = r.length_;
72  double* buf = &pulse_[0];
73  const double* rbuf = &r.pulse_[0];
74  for (unsigned i = 0; i < length_; ++i)
75  *buf++ = *rbuf++;
76  }
77  return *this;
78  }

◆ operator=() [2/2]

template<unsigned MaxLen>
template<unsigned Len2>
InterpolatedPulse& InterpolatedPulse< MaxLen >::operator= ( const InterpolatedPulse< Len2 > &  r)
inline

Definition at line 82 of file InterpolatedPulse.h.

82  {
83  if (r.length_ > MaxLen)
84  throw cms::Exception("In InterpolatedPulse::operator=: buffer is not long enough");
85  tmin_ = r.tmin_;
86  width_ = r.width_;
87  length_ = r.length_;
88  double* buf = &pulse_[0];
89  const double* rbuf = &r.pulse_[0];
90  for (unsigned i = 0; i < length_; ++i)
91  *buf++ = *rbuf++;
92  return *this;
93  }

◆ operator==()

template<unsigned MaxLen>
template<unsigned Len2>
bool InterpolatedPulse< MaxLen >::operator== ( const InterpolatedPulse< Len2 > &  r) const
inline

Definition at line 225 of file InterpolatedPulse.h.

225  {
226  if (!(tmin_ == r.tmin_ && width_ == r.width_ && length_ == r.length_))
227  return false;
228  const double* buf = &pulse_[0];
229  const double* rbuf = &r.pulse_[0];
230  for (unsigned i = 0; i < length_; ++i)
231  if (*buf++ != *rbuf++)
232  return false;
233  return true;
234  }

◆ secondDerivative()

template<unsigned MaxLen>
double InterpolatedPulse< MaxLen >::secondDerivative ( const double  t) const
inline

Definition at line 174 of file InterpolatedPulse.h.

174  {
175  const volatile double tmax = tmin_ + width_;
176  if (t < tmin_ || t > tmax || length_ < 3U)
177  return 0.0;
178  const unsigned lm1 = length_ - 1U;
179  const double step = width_ / lm1;
180  const double stepSq = step * step;
181  const double nSteps = (t - tmin_) / step;
182  unsigned nbelow = nSteps;
183  unsigned nabove = nbelow + 1;
184  if (nabove > lm1) {
185  nabove = lm1;
186  nbelow = nabove - 1U;
187  }
188 
189  if (nbelow == 0U) {
190  // The first interval
191  return (pulse_[2] - 2.0 * pulse_[1] + pulse_[0]) / stepSq;
192  } else if (nabove == lm1) {
193  // The last interval
194  return (pulse_[lm1] - 2.0 * pulse_[lm1 - 1U] + pulse_[lm1 - 2U]) / stepSq;
195  } else {
196  // One of the middle intervals
197  const double lower = pulse_[nbelow - 1U] - 2.0 * pulse_[nbelow] + pulse_[nabove];
198  const double upper = pulse_[nbelow] - 2.0 * pulse_[nabove] + pulse_[nabove + 1U];
199  const double delta = nSteps - nbelow;
200  return (lower * (1.0 - delta) + upper * delta) / stepSq;
201  }
202  }

Referenced by DoublePadeDelay< ODE1, ODE2, DelayTimeModel1, DelayTimeModel2 >::calc().

◆ serialize()

template<unsigned MaxLen>
template<class Archive >
void InterpolatedPulse< MaxLen >::serialize ( Archive &  ar,
unsigned   
)
inlineprivate

Definition at line 284 of file InterpolatedPulse.h.

284  {
285  ar& tmin_& width_& length_;
286 
287  // In case we are reading, it may be useful to verify
288  // that the length is reasonable
289  if (length_ > MaxLen)
290  throw cms::Exception("In InterpolatedPulse::serialize: buffer is not long enough");
291 
292  for (unsigned i = 0; i < length_; ++i)
293  ar& pulse_[i];
294  }

◆ setIntegral()

template<unsigned MaxLen>
void InterpolatedPulse< MaxLen >::setIntegral ( const double  newValue)
inline

Definition at line 252 of file InterpolatedPulse.h.

252  {
253  const double integ = this->getIntegral();
254  if (integ == 0.0)
255  throw cms::Exception("In InterpolatedPulse::setIntegral division by zero");
256  *this *= (newValue / integ);
257  }

Referenced by QIE8Simulator::setInputIntegral().

◆ setPeakValue()

template<unsigned MaxLen>
void InterpolatedPulse< MaxLen >::setPeakValue ( const double  newValue)
inline

Definition at line 268 of file InterpolatedPulse.h.

268  {
269  const double peak = this->getPeakValue();
270  if (peak == 0.0)
271  throw cms::Exception("In InterpolatedPulse::setPeakValue: division by zero");
272  *this *= (newValue / peak);
273  }

Referenced by QIE8Simulator::setInputAmplitude().

◆ setPulseWidth()

template<unsigned MaxLen>
void InterpolatedPulse< MaxLen >::setPulseWidth ( const double  newWidth)
inline

Definition at line 123 of file InterpolatedPulse.h.

123  {
124  if (newWidth <= 0.0)
125  throw cms::Exception("In InterpolatedPulse::setPulseWidth: invalid pulse width");
126  width_ = newWidth;
127  }

◆ setShape()

template<unsigned MaxLen>
template<typename Real >
void InterpolatedPulse< MaxLen >::setShape ( const Real *  values,
const unsigned  len 
)
inline

Definition at line 96 of file InterpolatedPulse.h.

96  {
97  if (len < 2 || len > MaxLen)
98  throw cms::Exception("In InterpolatedPulse::setShape: invalid length");
99  assert(values);
100  length_ = len;
101  double* buf = &pulse_[0];
102  for (unsigned i = 0; i < len; ++i)
103  *buf++ = *values++;
104  }

Referenced by InterpolatedPulse< 1500U >::InterpolatedPulse(), and QIE8Simulator::setInputShape().

◆ setStartTime()

template<unsigned MaxLen>
void InterpolatedPulse< MaxLen >::setStartTime ( const double  newStartTime)
inline

Definition at line 121 of file InterpolatedPulse.h.

121 { tmin_ = newStartTime; }

Referenced by QIE8Simulator::setInputStartTime().

◆ zeroOut()

template<unsigned MaxLen>
void InterpolatedPulse< MaxLen >::zeroOut ( )
inline

Definition at line 107 of file InterpolatedPulse.h.

107  {
108  for (unsigned i = 0; i < length_; ++i)
109  pulse_[i] = 0.0;
110  }

Referenced by InterpolatedPulse< 1500U >::InterpolatedPulse().

Friends And Related Function Documentation

◆ boost::serialization::access

template<unsigned MaxLen>
friend class boost::serialization::access
friend

Definition at line 281 of file InterpolatedPulse.h.

◆ InterpolatedPulse

template<unsigned MaxLen>
template<unsigned Len2>
friend class InterpolatedPulse
friend

Definition at line 13 of file InterpolatedPulse.h.

Member Data Documentation

◆ length_

template<unsigned MaxLen>
unsigned InterpolatedPulse< MaxLen >::length_
private

◆ pulse_

template<unsigned MaxLen>
double InterpolatedPulse< MaxLen >::pulse_[MaxLen]
private

◆ tmin_

template<unsigned MaxLen>
double InterpolatedPulse< MaxLen >::tmin_
private

◆ width_

template<unsigned MaxLen>
double InterpolatedPulse< MaxLen >::width_
private
InterpolatedPulse::setShape
void setShape(const Real *values, const unsigned len)
Definition: InterpolatedPulse.h:96
InterpolatedPulse::getIntegral
double getIntegral() const
Definition: InterpolatedPulse.h:242
mps_fire.i
i
Definition: mps_fire.py:355
InterpolatedPulse::zeroOut
void zeroOut()
Definition: InterpolatedPulse.h:107
step
step
Definition: StallMonitor.cc:94
muonTiming_cfi.tmin
tmin
Definition: muonTiming_cfi.py:24
InterpolatedPulse::maxlen
Definition: InterpolatedPulse.h:17
cms::cuda::assert
assert(be >=bs)
InterpolatedPulse::tmin_
double tmin_
Definition: InterpolatedPulse.h:277
InterpolatedPulse::width_
double width_
Definition: InterpolatedPulse.h:278
tmax
static const double tmax[3]
Definition: CastorTimeSlew.cc:7
InterpolatedPulse::pulse_
double pulse_[MaxLen]
Definition: InterpolatedPulse.h:276
contentValuesCheck.values
values
Definition: contentValuesCheck.py:38
InterpolatedPulse::length_
unsigned length_
Definition: InterpolatedPulse.h:279
OrderedSet.t
t
Definition: OrderedSet.py:90
mitigatedMETSequence_cff.U
U
Definition: mitigatedMETSequence_cff.py:36
Scenarios_cff.scale
scale
Definition: Scenarios_cff.py:2186
dumpMFGeometry_cfg.delta
delta
Definition: dumpMFGeometry_cfg.py:25
visDQMUpload.buf
buf
Definition: visDQMUpload.py:154
alignCSCRings.r
r
Definition: alignCSCRings.py:93
Exception
Definition: hltDiff.cc:246
pileupCalc.upper
upper
Definition: pileupCalc.py:214
InterpolatedPulse::getPeakValue
double getPeakValue() const
Definition: InterpolatedPulse.h:259