CLHEP  2.4.7.2
C++ Class Library for High Energy Physics
DoubleParamToArgAdaptor.icc
Go to the documentation of this file.
1 // -*- C++ -*-
2 // $Id: DoubleParamToArgAdaptor.icc,v 1.2 2003/09/06 14:04:13 boudreau Exp $
3 #include "CLHEP/GenericFunctions/DoubleParamToArgAdaptor.hh"
4 #include <assert.h>
5 #include <iostream>
6 
7 namespace Genfun {
8 
9 
10 //FUNCTION_OBJECT_IMP(DoubleParamToArgAdaptor) Do it by hand here:
11 
12 template <class F>
13 FunctionComposition DoubleParamToArgAdaptor<F>::operator()(const AbsFunction & function) const
14 {
15  return AbsFunction::operator() (function);
16 }
17 
18 template <class F>
19 DoubleParamToArgAdaptor<F> *DoubleParamToArgAdaptor<F>::clone () const {
20  return (DoubleParamToArgAdaptor<F> *) _clone();
21 }
22 
23 template <class F>
24 AbsFunction *DoubleParamToArgAdaptor<F>::_clone () const {
25  return new DoubleParamToArgAdaptor<F>(*this);
26 }
27 
28 
29 
30 template<class F>
31 DoubleParamToArgAdaptor<F>::DoubleParamToArgAdaptor(const F &function,
32  DoubleParamToArgAdaptor<F>::ScopedMethodPtr parameterFetchMethod0,
33  DoubleParamToArgAdaptor<F>::ScopedMethodPtr parameterFetchMethod1):
34  _scaleFactor0("Scale 0", 1.0, 0, 10),
35  _scaleFactor1("Scale 1", 1.0, 0, 10),
36  _function(function.clone()),
37  _parameterFetchMethod0(parameterFetchMethod0),
38  _parameterFetchMethod1(parameterFetchMethod1)
39 {
40  _parameterFetchMethod0(*_function).setLowerLimit(-std::numeric_limits<double>::max());
41  _parameterFetchMethod0(*_function).setUpperLimit(+std::numeric_limits<double>::max());
42  _parameterFetchMethod1(*_function).setLowerLimit(-std::numeric_limits<double>::max());
43  _parameterFetchMethod1(*_function).setUpperLimit(+std::numeric_limits<double>::max());
44 }
45 
46 template <class F>
47 DoubleParamToArgAdaptor<F>::~DoubleParamToArgAdaptor() {
48  delete _function;
49 }
50 
51 template <class F>
52 DoubleParamToArgAdaptor<F>::DoubleParamToArgAdaptor(const DoubleParamToArgAdaptor & right):
53  _scaleFactor0(right._scaleFactor0),
54  _scaleFactor1(right._scaleFactor1),
55  _parameterFetchMethod0(right._parameterFetchMethod0),
56  _parameterFetchMethod1(right._parameterFetchMethod1),
57  _function(right._function->clone())
58 {
59  _parameterFetchMethod0(*_function).setLowerLimit(-std::numeric_limits<double>::max());
60  _parameterFetchMethod0(*_function).setUpperLimit(+std::numeric_limits<double>::max());
61  _parameterFetchMethod1(*_function).setLowerLimit(-std::numeric_limits<double>::max());
62  _parameterFetchMethod1(*_function).setUpperLimit(+std::numeric_limits<double>::max());
63 }
64 
65 
66 template <class F>
67 double DoubleParamToArgAdaptor<F>::operator ()(double x) const
68 {
69  std::cerr
70  << "Warning. DoubleParamToArgAdaptor called with scalar argument"
71  << std::endl;
72  assert(0);
73  return 0;
74 }
75 
76 template <class F>
77 Parameter & DoubleParamToArgAdaptor<F>::scaleFactor0() {
78  return _scaleFactor0;
79 }
80 
81 template <class F>
82 const Parameter & DoubleParamToArgAdaptor<F>::scaleFactor0() const {
83  return _scaleFactor0;
84 }
85 
86 template <class F>
87 Parameter & DoubleParamToArgAdaptor<F>::scaleFactor1() {
88  return _scaleFactor1;
89 }
90 
91 template <class F>
92 const Parameter & DoubleParamToArgAdaptor<F>::scaleFactor1() const {
93  return _scaleFactor1;
94 }
95 
96 template <class F>
97 unsigned int DoubleParamToArgAdaptor<F>::dimensionality() const {
98  return _function->dimensionality()+1;
99 }
100 
101 template <class F>
102 double DoubleParamToArgAdaptor<F>::operator() (const Argument & a) const {
103  if (dimensionality()!= a.dimension()) {
104  std::cerr
105  << "Warning: DoubleParamToArgAdaptor function/argument dimension mismatch"
106  << std::endl;
107  assert(0);
108  return 0;
109  }
110  int dMinus = a.dimension()-1;
111  Argument aPrime(dMinus);
112  for (int i=0;i<dMinus;i++) aPrime[i]=a[i];
113  (_parameterFetchMethod0(*_function)).setValue(_scaleFactor0.getValue()*a[dMinus]);
114  (_parameterFetchMethod1(*_function)).setValue(_scaleFactor1.getValue()*a[dMinus]);
115  return (*_function)(a);
116 }
117 
118 } // end of namespace Genfun
119 
Definition: Airy.icc:9