44 class TF1Convolution_EvalWrapper
46 std::unique_ptr<TF1> fFunction1;
47 std::unique_ptr<TF1> fFunction2;
51 TF1Convolution_EvalWrapper(std::unique_ptr<TF1> &
f1, std::unique_ptr<TF1> &f2,
Double_t t) : fT0(t)
53 fFunction1 = std::unique_ptr<TF1>((
TF1 *)
f1->
Clone());
54 fFunction2 = std::unique_ptr<TF1>((
TF1 *)f2->
Clone());
62 return fFunction1->
EvalPar(xx,
nullptr) * fFunction2->
EvalPar(xx+1,
nullptr);
72 TF1 * fnew1 = (
TF1*) function1->IsA()->New();
73 function1->
Copy(*fnew1);
77 TF1 * fnew2 = (
TF1*) function2->IsA()->New();
78 function2->
Copy(*fnew2);
82 Fatal(
"InitializeDataMembers",
"Invalid functions - Abort");
149 Info(
"TF1Convolution",
"Using default range [-inf, inf] for TF1Convolution");
162 std::vector < TString > stringarray(2);
163 std::vector < TF1* > funcarray(2);
164 for (
int i=0; i<2; i++)
166 stringarray[i] = ((
TObjString*)((*objarray)[i])) -> GetString();
167 stringarray[i].ReplaceAll(
" ",
"");
170 if (funcarray[i] ==
nullptr) {
173 Error(
"TF1Convolution",
"Invalid formula : %s",stringarray[i].Data() );
185 Info(
"TF1Convolution",
"Using default range [-inf, inf] for TF1Convolution");
207 Error(
"TF1Convolution",
"Invalid formula for : %s",
formula1.Data() );
210 fFunction2 = std::unique_ptr<TF1>(
new TF1(
"f_conv_1", formula2));
212 Error(
"TF1Convolution",
"Invalid formula for : %s",formula2.
Data() );
220 Info(
"TF1Convolution",
"Using default range [-inf, inf] for TF1Convolution");
257 if (fft1 ==
nullptr || fft2 ==
nullptr) {
258 Warning(
"MakeFFTConv",
"Cannot use FFT, probably FFTW package is not available. Switch to numerical convolution");
272 fft1 -> SetPoint(i, in1[i]);
273 fft2 -> SetPoint(i, in2[i]);
281 Double_t re1, re2, im1, im2, out_re, out_im;
285 fft1 -> GetPointComplex(i,re1,im1);
286 fft2 -> GetPointComplex(i,re2,im2);
287 out_re = re1*re2 - im1*im2;
288 out_im = re1*im2 + re2*im1;
289 fftinverse -> SetPoint(i, out_re, out_im);
291 fftinverse -> Transform();
372 bool equalParams =
true;
375 equalParams &= (
fParams1[i] == params[i]);
390 fFunction2->SetParameter(k, params[i - offset2]);
391 equalParams &= (
fParams2[k - offset2] == params[i - offset2]);
392 fParams2[k - offset2] = params[i - offset2];
412 if (percentage<0)
return;
414 fXmin -= percentage * range;
415 fXmax += percentage * range;
424 Warning(
"SetRange",
"Invalid range: %f >= %f",
a,
b);
432 Warning(
"TF1Convolution::SetRange()",
"In FFT mode, range can not be infinite. Infinity has been replaced by range of first function plus a bufferzone to avoid spillover.");
std::unique_ptr< TF1 > fFunction2
Second function to be convolved.
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
virtual TFormula * GetFormula()
static double p3(double t, double a, double b, double c, double d)
virtual void Copy(TObject &f1) const
Copy this F1 to a new F1.
const char * GetParName(Int_t ipar) const
void Update()
Update the two component functions of the convolution.
Collectable string class.
std::unique_ptr< TF1 > fFunction1
First function to be convolved.
TString & ReplaceAll(const TString &s1, const TString &s2)
TF1Convolution()
constructor without arguments
std::vector< Double_t > fParams2
Double_t operator()(const Double_t *x, const Double_t *p)
Used in TF1 when doing the fit, will be evaluated at each point.
TF1Convolution & operator=(const TF1Convolution &rhs)
Operator =.
TRObject operator()(const T1 &t1) const
Int_t fNofPoints
Number of point for FFT array.
Class wrapping convolution of two functions.
static const double x2[5]
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString...
static double p2(double t, double a, double b, double c)
void MakeFFTConv()
Perform the FFT of the two functions.
void InitializeDataMembers(TF1 *function1, TF1 *function2, Bool_t useFFT)
Use copy instead of Clone.
static IntegrationOneDim::Type DefaultIntegratorType()
double IntegralLow(const IGenFunction &f, double b)
evaluate the Integral of a function f over the over the semi-infinite interval (-inf,b)
Double_t fXmax
Maximal bound of the range of the convolution.
double Integral(Function &f, double a, double b)
evaluate the Integral of a function f over the defined interval (a,b)
void SetRange(Double_t a, Double_t b)
double IntegralUp(const IGenFunction &f, double a)
evaluate the Integral of a function f over the semi-infinite interval (a,+inf)
virtual TObject * FindObject(const char *name) const
Must be redefined in derived classes.
virtual Double_t GetPointReal(Int_t ipoint, Bool_t fromInput=kFALSE) const =0
static TVirtualFFT * FFT(Int_t ndim, Int_t *n, Option_t *option)
Returns a pointer to the FFT of requested size and type.
Double_t EvalNumConv(Double_t t)
Perform numerical convolution.
void SetNofPointsFFT(Int_t n)
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
User Class for performing numerical integration of a function in one dimension.
static void InitStandardFunctions()
Create the basic function objects.
Bool_t fFlagGraph
! Tells if the graph is already done or not
std::unique_ptr< TGraph > fGraphConv
! Graph of the convolution
static double p1(double t, double a, double b)
TVirtualFFT is an interface class for Fast Fourier Transforms.
TObjArray * Tokenize(const TString &delim) const
This function is used to isolate sequential tokens in a TString.
graph is sorted in X points
Double_t fXmin
Minimal bound of the range of the convolution.
you should not use this method at all Int_t Int_t Double_t Double_t Double_t e
Double_t EvalFFTConv(Double_t t)
virtual TObject * Clone(const char *newname="") const
Make a clone of an object using the Streamer facility.
Mother of all ROOT objects.
void Copy(TObject &obj) const
Copy this to obj.
A Graph is a graphics object made of two arrays X and Y with npoints each.
you should not use this method at all Int_t Int_t Double_t Double_t Double_t Int_t Double_t Double_t Double_t Double_t b
Int_t fCstIndex
Index of the constant parameter f the first function.
std::vector< TString > fParNames
Parameters' names.
Bool_t fFlagFFT
Choose FFT or numerical convolution.
virtual void Fatal(const char *method, const char *msgfmt,...) const
Issue fatal error message.
virtual Double_t EvalPar(const Double_t *x, const Double_t *params=0)
Evaluate function with given coordinates and parameters.
std::vector< Double_t > fParams1
void GetRange(Double_t &a, Double_t &b) const
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
void SetExtraRange(Double_t percentage)
const char * Data() const
void SetParameters(const Double_t *params)