00001 #include "TPolynomial.h"
00002
00003 void TPolynomial::MakePolySeries(Double_t x, Int_t type, Int_t Np, Double_t *P) {
00004
00005 P[0] = 1.;
00006 for (Int_t i = 1; i < Np; i++) {
00007 Int_t n = i - 1;
00008 if (!n) {
00009 switch (type) {
00010 case 3: P[n+1] = -x + 1; break;
00011 case 4: P[n+1] = 2*x; break;
00012 case 0:
00013 case 1:
00014 case 2:
00015 default: P[n+1] = x; break;
00016 }
00017 }
00018 else {
00019 switch (type) {
00020 case 1: P[n+1] = 2*x*P[n] - P[n-1]; break;
00021 case 2: P[n+1] =((2.*n+1)*x*P[n] - n*P[n-1])/(n+1); break;
00022 case 3: P[n+1] = (2*n+1-x)*P[n]-n*n*P[n-1]; break;
00023 case 4: P[n+1] = 2*x*P[n]-2*n*P[n-1]; break;
00024 case 0:
00025 default: P[n+1] = P[n]*x; break;
00026 }
00027 }
00028 }
00029 }
00030
00031 Double_t TPolynomial::CalcPoly(Double_t *x, Double_t *par) {
00032
00033 Int_t key = TMath::Nint(par[0]);
00034 Int_t R = key/(100*100);
00035 key -= R*(100*100);
00036 Int_t T = key/100;
00037 key -= T*100;
00038 Int_t n = key;
00039 Double_t X;
00040 Double_t scale = 1;
00041 Int_t i1 = 1;
00042 Int_t i2 = n;
00043 switch (R) {
00044 case 1: X = 2*x[0]; break;
00045 case 2: X = TMath::Log(x[0]); break;
00046 case 3: X = TMath::Exp(x[0]); break;
00047 case 4: X = 2*x[0] - 1; break;
00048 case 6: scale = x[0]*(1-TMath::Abs(x[0])); i1 = 0; i2--;
00049 case 5: X = 2*TMath::Power(x[0],2) - 1; break;
00050 case 8: scale = 2*x[0]*(1-TMath::Abs(2*x[0])); i1 = 0; i2--;
00051 case 7: X = 8*TMath::Power(x[0],2) - 1; break;
00052 default: X = x[0]; break;
00053 }
00054 Int_t np = n+i1;
00055 Double_t *P = new Double_t[np];
00056 TPolynomial::MakePolySeries(X,T,np,P);
00057 Int_t ip = 1;
00058 Double_t val = par[ip]*P[0]; ip++;
00059 for (Int_t i = i1; ip < n; i++, ip++) {
00060 val += scale*par[ip]*P[i];
00061 }
00062 delete [] P;
00063 return val;
00064 }
00065
00066 TF1 *TPolynomial::MakePoly(TString Name, Int_t Npar, Int_t R, Double_t xmin, Double_t xmax) {
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077 Int_t T = 0;
00078 if (Name.BeginsWith("Pol",TString::kIgnoreCase)) T = 0;
00079 if (Name.BeginsWith("Tch",TString::kIgnoreCase)) T = 1;
00080 if (Name.BeginsWith("Leg",TString::kIgnoreCase)) T = 2;
00081 if (Name.BeginsWith("Lag",TString::kIgnoreCase)) T = 3;
00082 if (Name.BeginsWith("Her",TString::kIgnoreCase)) T = 4;
00083 Int_t key = Npar + 1 + 100*(100*R + T);
00084 TF1 *f = new TF1(Form("%s_%i_%i",Name.Data(),R,Npar),TPolynomial::CalcPoly,xmin,xmax,Npar+1);
00085 f->FixParameter(0,key);
00086 for (Int_t i = 1; i <= Npar; i++) f->SetParameter(i,0);
00087 return f;
00088 }
00089
00090 TF1 *TPolynomial::MakePol(const Int_t N, const Char_t *X, TString type, Int_t i0) {
00091 TString Func("");
00092 if (! type.CompareTo("PL",TString::kIgnoreCase)) {
00093 Func = Form("[%i]",N); cout << Func << endl;
00094 for (int n = N-1+i0; n>=i0; n--) {
00095 TString temp;
00096 if (n < N-1) temp = Form("%s*(%s)+[%i]",X,Func.Data(),n);
00097 else temp = Form("%s*%s+[%i]",X,Func.Data(),n);
00098 Func = temp; cout << Func << endl;
00099 }
00100 }
00101 else {
00102 TString T0("1"); Func = Form("[0]");
00103 TString T1("");
00104 TString T2("");
00105 TString xx("");
00106 if (N >= 1) {
00107 if (! type.CompareTo("TCheb",TString::kIgnoreCase)) xx = Form("%s",X);
00108 else xx = Form("(2*%s-1)",X);
00109 T1 = xx;
00110 Func += Form("+[1]*%s",T1.Data()); cout << Func << endl;
00111 for (int n = 2; n<=N; n++) {
00112 T2 = Form("(2*%s*%s-%s)",xx.Data(),T1.Data(),T0.Data());
00113
00114 cout << T0 << "\t" << T1 << "\t" << T2 << endl;
00115 Func += Form("+[%i]*%s",n,T2.Data()); cout << Func << endl;
00116 T0 = T1;
00117 T1 = T2;
00118 }
00119 }
00120 }
00121 TF1 *fun = 0;
00122 if (Func != "") {fun = new TF1(Form("%s%i",type.Data(),N),Func.Data()); cout << "Make " << fun->GetName() << endl;}
00123 return fun;
00124 }
00125
00126 void TPolynomial::GetFunc(TF1 *func) {
00127 if (! func) return;
00128 TString Func(func->GetTitle());
00129 Int_t Npar = func->GetNpar();
00130 for (Int_t p = 0; p < Npar; p++) {
00131 TString par("");
00132 par += func->GetParameter(p);
00133 Func.ReplaceAll(Form("[%i]",p),par.Data());
00134 }
00135 cout << Func << endl;
00136 }