1 #ifndef __JTOOLS__JSPLINE__
2 #define __JTOOLS__JSPLINE__
23 namespace JPP {
using namespace JTOOLS; }
36 template<
class JOrdinate_t>
122 throw JNoValue(
"JSplineBounds: missing 1st derivative.");
136 throw JNoValue(
"JSplineBounds: missing 1st derivative.");
152 template<
class JOrdinate_t>
154 const JOrdinate_t fpAtXmax)
176 template<
class JElement_t,
template<
class,
class>
class JCollection_t,
class JDistance_t>
178 public JCollection_t<JElement_t, JDistance_t>,
191 typedef typename collection_type::iterator
iterator;
204 const int numberOfElements = this->size();
208 if (numberOfElements > 2) {
217 const double dx = this->
getDistance(i->getX(), j->getX());
233 for (
iterator k = this->begin(),
i =
k++,
j =
k++;
k != this->end(); ++
i, ++
j, ++
k, ++index) {
244 const double h = sig * buffer[index-1] + 2.0;
246 buffer[index] = (sig - 1.0) / h;
251 j->setU((6.0 * j->getU() / this->
getDistance(x1, x3) - sig *
i->getU()) / h);
260 index = numberOfElements - 2;
262 const double dx = this->
getDistance(i->getX(), j->getX());
267 i->setU((i->getU() - 0.5*j->getU()) / (0.5*buffer[index] + 1.0));
278 index = numberOfElements - 2;
280 for ( ; j != this->rend(); ++
i, ++
j, --index) {
281 j->setU(j->getU() + i->getU() * buffer[index]);
286 for (
iterator i = this->begin();
i != this->end(); ++
i) {
314 template<
class JElement_t,
315 template<
class,
class>
class JCollection_t,
324 template<
class JElement_t,
template<
class,
class>
class JCollection_t,
class JDistance_t>
330 public virtual JFunction<typename JElement_t::abscissa_type,
331 typename JResultType<typename JElement_t::ordinate_type>::result_type>
344 typedef typename collection_type::iterator
iterator;
372 if (this->size() > 1
u) {
376 if ((p == this->begin() && this->
getDistance(x, (p++)->getX()) > distance_type::precision) ||
377 (p == this->end() && this->
getDistance((--p)->getX(), x) > distance_type::precision)) {
384 std::ostringstream os;
386 os << __FILE__ <<
':' << __LINE__ <<
" abscissa out of range "
387 <<
STREAM(
"?") << x <<
" <> "
388 <<
STREAM(
"?") << this->begin() ->getX() <<
' '
389 <<
STREAM(
"?") << this->rbegin()->getX();
397 const double dx = this->
getDistance(p->getX(), q->getX());
399 const double b = 1.0 -
a;
401 return (a * p->getY() + b * q->getY()
402 - a*b * ((a + 1.0)*p->getU() + (b + 1.0)*q->getU()) * dx*dx/6);
404 }
else if (this->size() == 1
u && this->
getDistance(x, this->begin()->getX()) <= distance_type::precision) {
406 return this->begin()->getY();
415 std::ostringstream os;
417 os << __FILE__ <<
':' << __LINE__ <<
" not enough data " <<
STREAM(
"?") <<
x;
429 template<
class JElement_t,
template<
class,
class>
class JCollection_t,
class JDistance_t>
435 public virtual JFunction<typename JElement_t::abscissa_type,
436 JResultDerivative<typename JResultType<typename JElement_t::ordinate_type>::result_type> >
449 typedef typename collection_type::iterator
iterator;
479 if (this->size() <= 1
u) {
486 std::ostringstream os;
488 os << __FILE__ <<
':' << __LINE__ <<
" not enough data " <<
STREAM(
"?") <<
x;
497 if ((p == this->begin() && this->
getDistance(x, (p++)->getX()) > distance_type::precision) ||
498 (p == this->end() && this->
getDistance((--p)->getX(), x) > distance_type::precision)) {
505 std::ostringstream os;
507 os << __FILE__ <<
':' << __LINE__ <<
" abscissa out of range "
508 <<
STREAM(
"?") << x <<
" <> "
509 <<
STREAM(
"?") << this->begin() ->getX() <<
' '
510 <<
STREAM(
"?") << this->rbegin()->getX();
518 const double dx = this->
getDistance(p->getX(), q->getX());
520 const double b = 1.0 -
a;
522 result.f = a * p->getY() + b * q->getY()
523 - a*b * ((a + 1.0)*p->getU() + (b + 1.0)*q->getU()) * dx*dx/6;
525 result.fp = (q->getY() - p->getY() + (p->getU()*(1.0 - 3*a*
a) -
526 q->getU()*(1.0 - 3*b*b)) * dx*dx/6) / dx;
547 template<
class JElement_t,
template<
class,
class>
class JCollection_t,
class JDistance_t>
553 public virtual JFunction<typename JElement_t::abscissa_type,
554 JResultPDF<typename JResultType<typename JElement_t::ordinate_type>::result_type> >
567 typedef typename collection_type::iterator
iterator;
594 if (this->size() >= 2
u) {
596 collection_type::compile(bounds);
600 for (
iterator j = this->begin(),
i =
j++;
j != this->end(); ++
i, ++
j) {
609 j->setIntegral(
i->getIntegral() + v -
w);
625 if (this->size() <= 1
u) {
632 std::ostringstream os;
634 os << __FILE__ <<
':' << __LINE__ <<
" not enough data " <<
STREAM(
"?") <<
x;
642 if (p == this->begin() && this->
getDistance(x, (p++)->getX()) > distance_type::precision) {
651 result.V = this->rbegin()->getIntegral();
655 std::ostringstream os;
657 os << __FILE__ <<
':' << __LINE__ <<
" abscissa out of range " <<
STREAM(
"?") << x <<
" < " <<
STREAM(
"?") << this->begin() ->getX();
664 }
else if (p == this->end() && this->
getDistance((--p)->getX(), x) > distance_type::precision) {
672 result.v = this->rbegin()->getIntegral();
673 result.V = this->rbegin()->getIntegral();
677 std::ostringstream os;
679 os << __FILE__ <<
':' << __LINE__ <<
" abscissa out of range " <<
STREAM(
"?") << x <<
" > " <<
STREAM(
"?") << this->rbegin()->getX();
689 const double dx = this->
getDistance(p->getX(), q->getX());
691 const double b = 1.0 -
a;
693 result.f = a * p->getY() + b * q->getY()
694 - a*b * ((a + 1.0)*p->getU() + (b + 1.0)*q->getU()) * dx*dx/6;
696 result.fp = (q->getY() - p->getY() + (p->getU()*(1.0 - 3*a*
a) -
697 q->getU()*(1.0 - 3*b*b)) * dx*dx/6) / dx;
699 result.v = p->getIntegral()
700 + 0.5*dx * (p->getY() - 0.5*p->getU()*dx*dx/6)
701 - 0.5*dx * ((a*a*p->getY() - b*b*q->getY()) +
702 (p->getU() * a*a*(0.5*a*a - 1.0) -
703 q->getU() * b*b*(0.5*b*b - 1.0)) * dx*dx/6);
705 result.V = this->rbegin()->getIntegral();
731 template<
class JElement_t,
732 template<
class,
class>
class JCollection_t,
733 class JResult_t =
typename JElement_t::ordinate_type,
736 public JSplineFunction<JElement_t, JCollection_t, JResult_t, JDistance_t>,
737 public JFunction1D<typename JElement_t::abscissa_type, JResult_t>
773 template<
class JAbscissa_t,
class JOrdinate_t>
776 template<
template<
class,
class,
class>
class JMap_t>
783 template<
class JKey_t,
785 template<
class,
class,
class>
class JMap_t,
789 public JMap_t<JKey_t, JValue_t, JDistance_t>,
856 for (
iterator i = this->begin();
i != this->end(); ++
i) {
875 template<
class JElement_t,
876 template<
class,
class>
class JCollection_t,
879 inline typename JElement_t::ordinate_type
888 if (input.getSize() > 1) {
890 output.
put(input.begin()->getX(),
V);
892 for (const_iterator
j = input.begin(),
i =
j++;
j != input.end(); ++
i, ++
j) {
894 const double dx = input.getDistance(
i->getX(),
j->getX());
895 const ordinate_type
y =
i->getY() +
j->getY();
896 const ordinate_type
z =
i->getU() +
j->getU();
897 const ordinate_type
v = dx * 0.50 *
y;
898 const ordinate_type
w = dx * 0.25 * z*dx*dx/6;
902 output.
put(
j->getX(),
V);
919 template<
class JElement_t,
920 template<
class,
class>
class JCollection_t,
922 inline typename JElement_t::ordinate_type
930 if (input.getSize() > 1) {
932 for (const_iterator
i = input.begin();
i != input.end(); ++
i) {
933 output.
put(
i->getX(),
i->getIntegral());
936 return input.rbegin()->getIntegral();
then fatal No hydrophone data file $HYDROPHONE_TXT fi sort gr k
std::vector< event_type > data_type
Exception for a functional operation.
This include file containes various data structures that can be used as specific return types for the...
static const JZero zero
Function object to assign zero value.
V(JDAQEvent-JTriggerReprocessor)*1.0/(JDAQEvent+1.0e-10)
Definition of zero value for any class.
double getDistance(const JFirst_t &first, const JSecond_t &second)
Get distance between objects.
Exception for missing value.
JArgument< T >::argument_type argument_type
Auxiliary data structure for handling std::ostream.
then usage $script[energy[distance[z of PMT]]] fi case set_variable z
Exception for division by zero.
Exception for accessing a value in a collection that is outside of its range.