CMS 3D CMS Logo

List of all members | Classes | Public Member Functions | Private Attributes
PhysicsTools::Spline Class Reference

A simple class for cubic splines. More...

#include <Spline.h>

Classes

struct  Segment
 internal class describing a "segment" (between two x points) More...
 

Public Member Functions

float deriv (float x) const
 compute the derivate at x coordinate x More...
 
float eval (float x) const
 compute y coordinate at x coordinate x More...
 
float getArea () const
 total area (integral between 0 and 1) under curve More...
 
float integral (float x) const
 compute integral under curve between 0 and x More...
 
unsigned int numberOfEntries () const
 return the number of entries More...
 
Splineoperator= (const Spline &orig)
 
void set (unsigned int n, const double *vals)
 initialize spline from n y coordinates in array vals More...
 
 Spline ()
 
 Spline (const Spline &orig)
 
 Spline (unsigned int n, const double *vals)
 construct spline from n y coordinates in array vals More...
 
 ~Spline ()
 

Private Attributes

float area
 
unsigned int n
 
Segmentsegments
 

Detailed Description

A simple class for cubic splines.

This class implements cubic splines for n equidistant points in x between 0 and 1. It is constructed from an array of n y coordinates and can compute the interpolated y coordinate for a given x.

Definition at line 25 of file Spline.h.

Constructor & Destructor Documentation

PhysicsTools::Spline::Spline ( )

Definition at line 53 of file Spline.cc.

53  : n(0), segments(nullptr), area(0.0)
54 {}
unsigned int n
Definition: Spline.h:65
Segment * segments
Definition: Spline.h:66
PhysicsTools::Spline::Spline ( const Spline orig)

Definition at line 56 of file Spline.cc.

References n, and segments.

56  : n(orig.n), area(orig.area)
57 {
58  segments = new Segment[n];
59  std::memcpy(segments, orig.segments, sizeof(Segment) * n);
60 }
unsigned int n
Definition: Spline.h:65
Segment * segments
Definition: Spline.h:66
PhysicsTools::Spline::Spline ( unsigned int  n,
const double *  vals 
)

construct spline from n y coordinates in array vals

Definition at line 62 of file Spline.cc.

References create_public_pileup_plots::vals.

62  :
63  n(0), segments(nullptr), area(0.0)
64 { set(n_, vals); }
unsigned int n
Definition: Spline.h:65
Segment * segments
Definition: Spline.h:66
PhysicsTools::Spline::~Spline ( )

Definition at line 116 of file Spline.cc.

References segments.

117 {
118  delete[] segments;
119 }
Segment * segments
Definition: Spline.h:66

Member Function Documentation

float PhysicsTools::Spline::deriv ( float  x) const

compute the derivate at x coordinate x

Definition at line 144 of file Spline.cc.

References PhysicsTools::Spline::Segment::deriv(), createfilelist::int, n, segments, and pileupDistInMC::total.

145 {
146  if (x < 0.0 || x > 1.0)
147  return 0.0;
148  else if (x == 0.0)
149  return segments[0].deriv(0.0);
150  else if (x == 1.0)
151  return segments[n - 1].deriv(1.0);
152 
153  float total;
154  float rest = std::modf(x * n, &total);
155 
156  return segments[(unsigned int)total].deriv(rest);
157 }
unsigned int n
Definition: Spline.h:65
float deriv(float x) const
Definition: Spline.cc:32
float deriv(float x) const
compute the derivate at x coordinate x
Definition: Spline.cc:144
Segment * segments
Definition: Spline.h:66
float PhysicsTools::Spline::eval ( float  x) const

compute y coordinate at x coordinate x

Definition at line 131 of file Spline.cc.

References PhysicsTools::Spline::Segment::eval(), createfilelist::int, n, segments, and pileupDistInMC::total.

132 {
133  if (x <= 0.0)
134  return segments[0].eval(0.0);
135  if (x >= 1.0)
136  return segments[n - 1].eval(1.0);
137 
138  float total;
139  float rest = std::modf(x * n, &total);
140 
141  return segments[(unsigned int)total].eval(rest);
142 }
unsigned int n
Definition: Spline.h:65
float eval(float x) const
compute y coordinate at x coordinate x
Definition: Spline.cc:131
float eval(float x) const
Definition: Spline.cc:21
Segment * segments
Definition: Spline.h:66
float PhysicsTools::Spline::getArea ( ) const
inline

total area (integral between 0 and 1) under curve

Definition at line 49 of file Spline.h.

References area.

49 { return area; }
float PhysicsTools::Spline::integral ( float  x) const

compute integral under curve between 0 and x

Definition at line 159 of file Spline.cc.

References area, MillePedeFileConverter_cfg::e, createfilelist::int, n, segments, and pileupDistInMC::total.

160 {
161  if (x <= 0.0)
162  return 0.0;
163  if (x >= 1.0)
164  return 1.0;
165 
166  if (area < 1.0e-9)
167  return 0.0;
168 
169  float total;
170  float rest = std::modf(x * n, &total);
171 
172  return segments[(unsigned int)total].integral(rest) / area;
173 }
unsigned int n
Definition: Spline.h:65
float integral(float x) const
compute integral under curve between 0 and x
Definition: Spline.cc:159
Segment * segments
Definition: Spline.h:66
unsigned int PhysicsTools::Spline::numberOfEntries ( ) const
inline

return the number of entries

Definition at line 52 of file Spline.h.

52 { return n + 1; }
unsigned int n
Definition: Spline.h:65
Spline & PhysicsTools::Spline::operator= ( const Spline orig)

Definition at line 121 of file Spline.cc.

References area, n, and segments.

122 {
123  delete[] segments;
124  n = orig.n;
125  segments = new Segment[n];
126  std::memcpy(segments, orig.segments, sizeof(Segment) * n);
127  area = orig.area;
128  return *this;
129 }
unsigned int n
Definition: Spline.h:65
Segment * segments
Definition: Spline.h:66
void PhysicsTools::Spline::set ( unsigned int  n,
const double *  vals 
)

initialize spline from n y coordinates in array vals

Definition at line 66 of file Spline.cc.

References PhysicsTools::Spline::Segment::area, area, PhysicsTools::Spline::Segment::coeffs, mps_fire::i, PhysicsTools::Spline::Segment::integral(), n, and segments.

67 {
68  n = n_ - 1;
69  area = 0.0;
70 
71  delete[] segments;
72  segments = new Segment[n];
73 
74  if (n == 1) {
75  Segment *seg = &segments[0];
76  seg->coeffs[0] = vals[0];
77  seg->coeffs[1] = vals[1] - vals[0];
78  seg->coeffs[2] = 0.0;
79  seg->coeffs[3] = 0.0;
80  seg->area = 0.0;
81  area = seg->integral(1.0);
82  return;
83  }
84 
85  float m0, m1;
86  Segment *seg = &segments[0];
87  m0 = 0.0, m1 = 0.5 * (vals[2] - vals[0]);
88  seg->coeffs[0] = vals[0];
89  seg->coeffs[1] = -2.0 * vals[0] + 2.0 * vals[1] - m1;
90  seg->coeffs[2] = vals[0] - vals[1] + m1;
91  seg->coeffs[3] = 0.0;
92  seg->area = 0.0;
93  area = seg->integral(1.0);
94  m0 = m1;
95  seg++, vals++;
96 
97  for(unsigned int i = 1; i < n - 1; i++, seg++, vals++) {
98  m1 = 0.5 * (vals[2] - vals[0]);
99  seg->coeffs[0] = vals[0];
100  seg->coeffs[1] = m0;
101  seg->coeffs[2] = -3.0 * vals[0] - 2.0 * m0 + 3.0 * vals[1] - m1;
102  seg->coeffs[3] = 2.0 * vals[0] + m0 - 2.0 * vals[1] + m1;
103  seg->area = area;
104  area = seg->integral(1.0);
105  m0 = m1;
106  }
107 
108  seg->coeffs[0] = vals[0];
109  seg->coeffs[1] = m0;
110  seg->coeffs[2] = - vals[0] - m0 + vals[1];
111  seg->coeffs[3] = 0.0;
112  seg->area = area;
113  area = seg->integral(1.0);
114 }
unsigned int n
Definition: Spline.h:65
Segment * segments
Definition: Spline.h:66

Member Data Documentation

float PhysicsTools::Spline::area
private

Definition at line 67 of file Spline.h.

Referenced by getArea(), integral(), operator=(), and set().

unsigned int PhysicsTools::Spline::n
private

Definition at line 65 of file Spline.h.

Referenced by deriv(), eval(), integral(), operator=(), set(), and Spline().

Segment* PhysicsTools::Spline::segments
private

Definition at line 66 of file Spline.h.

Referenced by deriv(), eval(), integral(), operator=(), set(), Spline(), and ~Spline().