64 return fFunc1->EvalPar(xx,
nullptr) *
fFunc2->EvalPar(xx+1,
nullptr);
77 Error(
"InitializeDataMembers",
"function1 %s is not of dimension 1 ",function1->
GetName());
85 Error(
"InitializeDataMembers",
"function2 %s is not of dimension 1 ",function2->
GetName());
91 Fatal(
"InitializeDataMembers",
"Invalid functions - Abort");
160 Info(
"TF1Convolution",
"Using default range [-inf, inf] for TF1Convolution");
173 std::vector < TString > stringarray(2);
174 std::vector < TF1* > funcarray(2);
175 for (
int i=0; i<2; i++)
177 stringarray[i] = ((
TObjString*)((*objarray)[i])) -> GetString();
178 stringarray[i].ReplaceAll(
" ",
"");
181 if (funcarray[i] ==
nullptr) {
183 if (!
f->GetFormula()->IsValid() )
184 Error(
"TF1Convolution",
"Invalid formula : %s",stringarray[i].Data() );
197 Info(
"TF1Convolution",
"Using default range [-inf, inf] for TF1Convolution");
211 (
TString)formula1.ReplaceAll(
" ",
"");
217 fFunction1 = std::make_unique<TF1>(
"f_conv_1", formula1);
219 Error(
"TF1Convolution",
"Invalid formula for : %s",formula1.Data() );
222 fFunction2 = std::make_unique<TF1>(
"f_conv_1", formula2);
224 Error(
"TF1Convolution",
"Invalid formula for : %s",formula2.
Data() );
232 Info(
"TF1Convolution",
"Using default range [-inf, inf] for TF1Convolution");
242 conv.TF1Convolution::Copy(*
this);
251 rhs.TF1Convolution::Copy(*
this);
269 if (fft1 ==
nullptr || fft2 ==
nullptr) {
270 Warning(
"MakeFFTConv",
"Cannot use FFT, probably FFTW package is not available. Switch to numerical convolution");
283 in2[i] =
fFunction2 -> EvalPar( &x2,
nullptr);
284 fft1 -> SetPoint(i, in1[i]);
285 fft2 -> SetPoint(i, in2[i]);
293 Double_t re1, re2, im1, im2, out_re, out_im;
297 fft1 -> GetPointComplex(i,re1,im1);
298 fft2 -> GetPointComplex(i,re2,im2);
299 out_re = re1*re2 - im1*im2;
300 out_im = re1*im2 + re2*im1;
301 fftinverse -> SetPoint(i, out_re, out_im);
303 fftinverse -> Transform();
396 bool equalParams =
true;
399 equalParams &= (
fParams1[i] == params[i]);
414 fFunction2->SetParameter(k, params[i - offset2]);
415 equalParams &= (
fParams2[k - offset2] == params[i - offset2]);
416 fParams2[k - offset2] = params[i - offset2];
429 Double_t params[]={p0,p1,p2,p3,p4,p5,p6,p7};
441 if (percentage<0)
return;
443 fXmin -= percentage * range;
444 fXmax += percentage * range;
456 Warning(
"SetRange",
"Invalid range: %f >= %f",
a,
b);
464 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.");
int Int_t
Signed integer 4 bytes (int).
bool Bool_t
Boolean (0=false, 1=true) (bool).
double Double_t
Double 8 bytes.
static IntegrationOneDim::Type DefaultIntegratorType()
User Class for performing numerical integration of a function in one dimension.
double IntegralUp(const IGenFunction &f, double a)
evaluate the Integral of a function f over the semi-infinite interval (a,+inf)
double Integral(Function &f, double a, double b)
evaluate the Integral of a function f over the defined interval (a,b)
double IntegralLow(const IGenFunction &f, double b)
evaluate the Integral of a function f over the over the semi-infinite interval (-inf,...
TF1Convolution_EvalWrapper(TF1 &f1, TF1 &f2, Double_t t)
Double_t operator()(Double_t x) const
std::vector< Double_t > fParams1
Double_t operator()(const Double_t *x, const Double_t *p) override
Used in TF1 when doing the fit, will be evaluated at each point.
void SetParameters(const Double_t *params) override
Set the vector of parameters p for the convolution function g(x,p) = f1 * f2.
Int_t fCstIndex
Index of the constant parameter f the first function.
void GetRange(Double_t &a, Double_t &b) const
Get the range used for the convolution.
std::vector< TString > fParNames
Parameters' names.
std::unique_ptr< TF1 > fFunction1
First function to be convolved.
Int_t fNofPoints
Number of point for FFT array.
static Double_t SetDefaultExtraRange(Double_t percentage)
Set the default extra range fraction used when doing a FFT convolution.
std::vector< Double_t > fParams2
Double_t fXmin
Minimal bound of the range of the convolution.
void SetExtraRange(Double_t percentage)
Set the fraction of extra range used when doing an convolution.
void Copy(TObject &obj) const override
Copy this to obj.
Double_t EvalNumConv(Double_t t)
Perform numerical convolution.
void Update() override
Update the two component functions of the convolution.
void SetRange(Double_t a, Double_t b) override
Set the actual range used for the convolution.
Bool_t fFlagFFT
Choose FFT or numerical convolution.
TF1Convolution & operator=(const TF1Convolution &rhs)
Operator =.
void MakeFFTConv()
Perform the FFT of the two functions.
static Double_t fgExtraRangeFraction
! Additional default fraction of the range used for FFT convolution
void SetNofPointsFFT(Int_t n)
Set the number of points used for the FFT convolution.
TF1Convolution()
constructor without arguments.
const char * GetParName(Int_t ipar) const
Double_t EvalFFTConv(Double_t t)
Perform FFT convolution.
Double_t fXmax
Maximal bound of the range of the convolution.
std::unique_ptr< TF1 > fFunction2
Second function to be convolved.
Bool_t fFlagGraph
! Tells if the graph is already done or not
void InitializeDataMembers(TF1 *function1, TF1 *function2, Bool_t useFFT)
Internal function to initialize data members.
std::unique_ptr< TGraph > fGraphConv
! Graph of the convolution
void Copy(TObject &f1) const override
Copy this to obj.
static void InitStandardFunctions()
virtual Int_t GetNdim() const
@ kIsSortedX
Graph is sorted in X points.
const char * GetName() const override
Returns name of object.
Collectable string class.
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
virtual TObject * FindObject(const char *name) const
Must be redefined in derived classes.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
virtual void Fatal(const char *method, const char *msgfmt,...) const
Issue fatal error message.
TObject()
TObject constructor.
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
const char * Data() const
TString & ReplaceAll(const TString &s1, const TString &s2)
TObjArray * Tokenize(const TString &delim) const
This function is used to isolate sequential tokens in a TString.
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
TVirtualFFT is an interface class for Fast Fourier Transforms.
static TVirtualFFT * FFT(Int_t ndim, Int_t *n, Option_t *option)
Returns a pointer to the FFT of requested size and type.
virtual Double_t GetPointReal(Int_t ipoint, Bool_t fromInput=kFALSE) const =0
Double_t Infinity()
Returns an infinity as defined by the IEEE standard.