-TString* TStatToolkit::FitPlane(TTree *tree, const char* drawCommand, const char* formula, const char* cuts, Double_t & chi2, Int_t &npoints, TVectorD &fitParam, TMatrixD &covMatrix, Float_t frac, Int_t start, Int_t stop){
+TString* TStatToolkit::FitPlane(TTree *tree, const char* drawCommand, const char* formula, const char* cuts, Double_t & chi2, Int_t &npoints, TVectorD &fitParam, TMatrixD &covMatrix, Float_t frac, Int_t start, Int_t stop,Bool_t fix0){
//
// fit an arbitrary function, specified by formula into the data, specified by drawCommand and cuts
// returns chi2, fitParam and covMatrix
// returns TString with fitted formula
//
-
+
TString formulaStr(formula);
TString drawStr(drawCommand);
TString cutStr(cuts);
+ TString ferr("1");
+
+ TString strVal(drawCommand);
+ if (strVal.Contains(":")){
+ TObjArray* valTokens = strVal.Tokenize(":");
+ drawStr = valTokens->At(0)->GetName();
+ ferr = valTokens->At(1)->GetName();
+ }
+
formulaStr.ReplaceAll("++", "~");
TObjArray* formulaTokens = formulaStr.Tokenize("~");
Int_t entries = tree->Draw(drawStr.Data(), cutStr.Data(), "goff", stop-start, start);
if (entries == -1) return new TString("An ERROR has occured during fitting!");
Double_t **values = new Double_t*[dim+1] ;
+ //
+ entries = tree->Draw(ferr.Data(), cutStr.Data(), "goff", stop-start, start);
+ if (entries == -1) return new TString("An ERROR has occured during fitting!");
+ Double_t *errors = new Double_t[entries];
+ memcpy(errors, tree->GetV1(), entries*sizeof(Double_t));
for (Int_t i = 0; i < dim + 1; i++){
Int_t centries = 0;
for (Int_t i = 0; i < entries; i++){
Double_t x[1000];
for (Int_t j=0; j<dim;j++) x[j]=values[j][i];
- fitter->AddPoint(x, values[dim][i], 1);
+ fitter->AddPoint(x, values[dim][i], errors[i]);
}
fitter->Eval();
if (frac>0.5 && frac<1){
fitter->EvalRobust(frac);
+ }else{
+ if (fix0) {
+ fitter->FixParameter(0,0);
+ fitter->Eval();
+ }
}
fitter->GetParameters(fitParam);
fitter->GetCovarianceMatrix(covMatrix);