25 #include "TObjArray.h"
26 #include "TObjString.h"
41 fxDatas(), fxModels(), fiFitFunctionType(0), fiMemoryUsage(0),
42 fxUserFitFunction(0), fxDrawObjs(0)
48 fxDatas(), fxModels(), fiFitFunctionType(0), fiMemoryUsage(0), fxUserFitFunction(0), fxDrawObjs(0)
56 fxDatas(), fxModels(), fiFitFunctionType(0), fiMemoryUsage(100), fxUserFitFunction(0), fxDrawObjs(0)
103 return (n>=0) && (n<GetNumData()) ? dynamic_cast<TGo4FitData*> (
fxDatas[n]) : 0;
127 if ((lrange<rrange) || (rrange!=0.)) data->
SetRange(0,lrange,rrange);
143 if ((lrange<rrange) || (rrange!=0.)) data->
SetRange(0,lrange,rrange);
151 if (data!=0) data->
SetGraph(gr, Owned);
158 for (Int_t n=0;n<comp->
NumSlots();n++) {
161 for(Int_t n2=0;n2<
NumSlots();n2++) {
193 return (n>=0) && (n<GetNumModel()) ? dynamic_cast<TGo4FitModel*> (
fxModels[n]) : 0;
223 void TGo4Fitter::AddPolynomX(
const char* DataName,
const char* NamePrefix, Int_t MaxOrder, Int_t GroupIndex, Double_t lrange, Double_t rrange)
225 if (DataName==0)
return;
227 Bool_t flag = kFALSE;
229 Bool_t createmodel = kFALSE;
232 TString Prefix(NamePrefix);
233 if (NumTry>0) Prefix+=NumTry;
235 Bool_t findsame = kFALSE;
237 for(Int_t Order=0; Order<=MaxOrder; Order++) {
238 TString Name(Prefix);
242 if (findsame && !createmodel)
break;
247 if ((lrange<rrange) || (rrange!=0.)) comp->
SetRange(0,lrange,rrange);
253 if (findsame) { NumTry++; createmodel = kFALSE; }
else
254 if (createmodel) flag = kFALSE;
255 else createmodel = kTRUE;
262 if (DataName==0)
return;
264 Bool_t flag = kFALSE;
266 Bool_t createmodel = kFALSE;
269 Bool_t findsame = kFALSE;
271 for (Int_t n=0;n<Coef.GetSize();n++) {
272 TString Name(NamePrefix);
273 if (NumTry>0) Name+=NumTry;
277 if (findsame && !createmodel)
break;
288 if (findsame) { NumTry++; createmodel = kFALSE; }
else
289 if (createmodel) flag = kFALSE;
290 else createmodel = kTRUE;
297 if (DataName==0)
return;
298 TArrayD Orders(NumAxis);
301 Bool_t flag = kFALSE;
303 Bool_t createmodel = kFALSE;
307 TString Prefix(NamePrefix);
308 if (NumTry>0) Prefix+=NumTry;
310 Bool_t findsame = kFALSE;
313 TString Name(Prefix);
314 for(Int_t n=0; n<NumAxis; n++) {
316 Name+=Int_t(Orders[n]);
319 if (findsame && !createmodel)
break;
330 if (Orders[nn]<=MaxOrder)
break;
333 }
while (nn<NumAxis);
338 if (findsame) { NumTry++; createmodel = kFALSE; }
else
339 if (createmodel) flag = kFALSE;
340 else createmodel = kTRUE;
356 if (mod==0)
return 0;
362 newname = NewName ? NewName : mod->GetName();
440 if (model==0)
return;
454 Int_t dbuf = -1, mbuf = -1;
456 case 0: dbuf = 0; mbuf = 0;
break;
457 case 1: dbuf = 1; mbuf = 0;
break;
458 case 2: dbuf = 1; mbuf = 1;
break;
459 default: dbuf = -1; mbuf = -1;
475 std::cout <<
" User fit function not set. Switch to least squares " << std::endl;
491 switch (FitFunctionType) {
493 Double_t zn1 = (value-modelvalue);
496 if (standdev<=0.)
return 0.;
497 Double_t zn2 = (value-modelvalue);
498 return zn2*zn2/standdev; }
500 if (modelvalue<=0.)
return 0.;
501 Double_t zn3 = (value-modelvalue);
502 return zn3*zn3/modelvalue; }
504 Double_t zn4 = (value-modelvalue);
505 return zn4*zn4/((value<1.) ? 1. : value); }
507 if (value<0.)
return 0.;
508 Double_t zn5 = (value+((value<1.) ? 0. : 1.)-modelvalue);
509 return zn5*zn5/(value+1.); }
511 if (modelvalue<=0.)
return 0.;
512 return modelvalue - value*TMath::Log(modelvalue);
517 return (value-modelvalue)*(value-modelvalue);
529 if (selectdata && (dat!=selectdata))
continue;
538 for(Int_t nbin=0;nbin<size;nbin++)
539 fSum +=
PointFitFunction(FitFunctionType, DataAmpl*values[nbin], res[nbin], DataAmpl*DataAmpl*devs[nbin] );
543 if (!iter->
Reset()) {
delete iter;
continue; }
557 Double_t value = DataAmpl * iter->
Value();
560 Double_t modelvalue = 0.;
561 for(Int_t nm=0;nm<=Models.GetLast();nm++) {
568 }
while (iter->
Next());
570 for(Int_t nm=0;nm<=Models.GetLast();nm++)
636 for (Int_t nbin=0;nbin<size;nbin++) result[nbin] = 0.;
708 if (Opt==
"Ampls") {
PrintAmpls();
return; }
else
709 if (Opt==
"Pars") {
PrintPars();
return; }
else
714 std::cout <<
"Fitiing function type: ";
716 case ff_chi_square : std::cout <<
"ff_chi_square" << std::endl;
break;
717 case ff_chi_Pearson : std::cout <<
"ff_chi_Pearson" << std::endl;
break;
718 case ff_chi_Neyman : std::cout <<
"ff_chi_Neyman" << std::endl;
break;
719 case ff_chi_gamma : std::cout <<
"ff_chi_gamma" << std::endl;
break;
720 case ff_ML_Poisson : std::cout <<
"ff_ML_Poisson" << std::endl;
break;
721 case ff_user : std::cout <<
"user defined" << std::endl;
break;
722 default: std::cout <<
"ff_least_squares" << std::endl;
724 std::cout << std::endl <<
" LIST OF DATA OBJECTS" << std::endl;
726 std::cout << std::endl <<
" LIST OF MODEL OBJECTS" << std::endl;
733 if (data==0)
return kFALSE;
736 if (iter==0)
return kFALSE;
739 if (size==0) {
delete iter;
return kFALSE; }
747 TArrayD Ampls(Models.GetLast()+1);
748 for(Int_t n=0;n<=Models.GetLast();n++) {
754 TArrayD bins(size), scales(size);
758 if (iter->
Reset(UseRanges))
do {
759 Double_t value = iter->
Value();
760 for(Int_t n=0;n<=Models.GetLast();n++) {
764 value = TMath::Abs(value);
766 scales[pnt] = iter->
x();
768 }
while (iter->
Next(UseRanges));
772 for(Int_t n=0;n<=Models.GetLast();n++) {
783 for (Int_t pnt=0;pnt<size;pnt++)
784 if ((bins[pnt]>0.) && ((niter==0) || (TMath::Abs(scales[pnt]-first)<second*2.))) {
786 sum11 += bins[pnt]*scales[pnt];
787 sum22 += bins[pnt]*scales[pnt]*scales[pnt];
791 Double_t mid = sum11/sum00;
792 Double_t dev = TMath::Sqrt(sum22/sum00-mid*mid);
795 if ((dev/second>0.8) && (dev/second<1.2)) niter=10;
797 first = mid; second = dev;
809 if (data==0)
return 0.;
812 if ((ModelName!=0) && (model==0))
return 0.;
815 if (iter==0)
return 0.;
820 if (!iter->
Reset(kTRUE)) {
831 double dx = onlycounts ? 1. : iter->
xWidths();
833 sum += ampl*value*dx;
834 }
while (iter->
Next(kTRUE));
847 if (model==0)
return 0.;
854 if (data==0)
return 0;
859 if (model) Models.Add(model);
else {
860 Int_t groupindex = -1;
863 TString modelname(ModelName);
864 if (modelname==
"Background") groupindex = 0;
else
865 if (modelname.Index(
"Group",0,TString::kExact)==0) {
866 modelname.Remove(0,5);
868 groupindex = strtol(modelname.Data(),&err,10);
869 if (err && (*err!=0)) groupindex=-1;
880 if (Models.GetLast()<0)
return 0;
884 if (iter==0)
return 0;
886 if (!iter->
Reset(kFALSE)) {
delete iter;
return 0; }
891 Bool_t UseRanges = kTRUE;
897 ndim = histo->GetDimension();
898 UseRanges = Models.GetLast() >= 0;
905 if (((histo!=0) || (gr!=0)) && IsModel) {
906 TArrayD Ampls(Models.GetLast()+1);
908 for(Int_t n=0;n<=Models.GetLast();n++) {
914 if (iter->
Reset(UseRanges))
do {
916 for(Int_t n=0;n<=Models.GetLast();n++) {
922 case 1: histo->SetBinContent(iter->
Indexes()[0]+1,zn);
break;
923 case 2: histo->SetBinContent(iter->
Indexes()[0]+1,iter->
Indexes()[1]+1,zn);
break;
924 case 3: histo->SetBinContent(iter->
Indexes()[0]+1,iter->
Indexes()[1]+1,iter->
Indexes()[2]+1,zn);
break;
927 (gr->GetX())[iter->
Point()] = iter->
x();
928 (gr->GetY())[iter->
Point()] = zn;
931 }
while (iter->
Next(UseRanges));
933 for(Int_t n=0;n<=Models.GetLast();n++) {
942 for(Int_t n1=0;n1<gr->GetN()-1;n1++)
943 for(Int_t n2=n1+1;n2<gr->GetN();n2++)
944 if ((gr->GetX())[n1]>(gr->GetX())[n2]) {
945 Double_t xx = (gr->GetX())[n1];
946 (gr->GetX())[n1] = (gr->GetX())[n2];
947 (gr->GetX())[n2] = xx;
948 Double_t yy = (gr->GetY())[n1];
949 (gr->GetY())[n1] = (gr->GetY())[n2];
950 (gr->GetY())[n2] = yy;
954 if (histo) res = histo;
else res = gr;
958 if (ModelName) { title =
"Draw of model "; title+=ModelName; }
959 else { title =
"Draw of full model of "; title+=DataName; }
960 else { title =
"Draw of data "; title+=DataName; }
961 res->SetTitle(title.Data());
985 TCanvas *fCanvas = 0;
987 if ((opt.Length()>0) && (opt[0]==
'#')) {
992 CanvasName =
"Canvas";
994 }
while (gROOT->FindObject(CanvasName.Data()));
995 fCanvas =
new TCanvas(CanvasName,TString(
"Draw of fitter ")+GetName()+
" "+opt,3);
999 Bool_t drawdata = kFALSE;
1001 TObjArray selectmodels;
1003 Bool_t drawcomp = kFALSE;
1004 Bool_t drawmodel = kFALSE;
1006 if (opt==
"*") { opt =
""; drawdata = kTRUE; }
1008 while (opt.Length()>0) {
1009 Int_t len = opt.Index(
",",0,TString::kExact);
1011 if (len<0) len = opt.Length();
1014 TString optpart(opt.Data(), len);
1015 while ((optpart.Length()>0) && (optpart[0]==
' ')) optpart.Remove(0,1);
1017 Bool_t find = kFALSE;
1020 if (optpart.Index(
GetDataName(n),0,TString::kExact)==0) {
1026 if (optpart==
"*") drawcomp = kTRUE;
else
1027 if (optpart==
"-") drawmodel = kFALSE;
1032 selectmodels.Add(
new TObjString(optpart));
1034 if (model && (selectdata==0))
1041 if (opt.Length()>0) opt.Remove(0,1);
1044 if ((selectdata==0) && !drawdata)
1052 if (selectdata && (data!=selectdata))
continue;
1055 TObject* obj =
CreateDrawObject(TString(data->GetName())+
"_bins", data->GetName(), kFALSE);
1057 TAttLine* line =
dynamic_cast<TAttLine*
> (obj);
1059 line->SetLineColor(1);
1060 line->SetLineWidth(1);
1066 TObject* mobj =
CreateDrawObject(TString(data->GetName())+
"_fullmodel", data->GetName(), kTRUE);
1068 TAttLine* line =
dynamic_cast<TAttLine*
> (mobj);
1070 line->SetLineColor(4);
1071 line->SetLineWidth(2);
1077 for(Int_t nmodel=0;nmodel<
GetNumModel();nmodel++) {
1079 if ( !model->
IsAssignTo(data->GetName()))
continue;
1081 TObject* cobj =
CreateDrawObject(TString(data->GetName())+
"_"+model->GetName(), data->GetName(), kTRUE, model->GetName());
1083 TAttLine* line =
dynamic_cast<TAttLine*
> (cobj);
1085 line->SetLineColor(6);
1086 line->SetLineWidth(1);
1091 for (Int_t n=0;n<=selectmodels.GetLast();n++) {
1092 TString name = ((TObjString*) (selectmodels[n]))->String();
1094 TObject* cobj =
CreateDrawObject(TString(data->GetName())+
"_" +name, data->GetName(), kTRUE, name.Data());
1096 TAttLine* line =
dynamic_cast<TAttLine*
> (cobj);
1098 line->SetLineColor(6);
1099 line->SetLineWidth(1);
1107 Bool_t allhisto = kTRUE;
1109 if (!(
fxDrawObjs->At(n)->InheritsFrom(TH1::Class()))) allhisto = kFALSE;
1111 THStack* stack =
new THStack(TString(
"Stack")+
"_"+
fxDrawObjs->At(0)->GetName(),
fxDrawObjs->At(0)->GetName());
1115 stack->Draw(
"nostack");
1122 if (fCanvas!=0) fCanvas->Update();
1127 std::cout << std::endl <<
"*** LIST OF AMPLITUDES VALUE ***" << std::endl;
1137 std::cout << std::endl <<
" *** LIST OF LINES PARAMETERS ***" << std::endl;
1144 for (
int naxis=0;naxis<3;naxis++)
1148 std::cout << std::setw(10) <<
"Name" << std::setw(12) <<
"Ampl";
1149 for(Int_t naxis=0;naxis<=MaxAxis;naxis++)
1150 std::cout << std::setw(11) <<
"Pos" << naxis << std::setw(11) <<
"Width" << naxis;
1151 std::cout << std::endl;
1156 std::cout << std::setw(10) << m->GetName() << std::setw(12) << m->
GetAmplValue();
1158 for (
int naxis=0;naxis<=MaxAxis;naxis++) {
1159 Double_t pos, width;
1160 std::cout << std::setw(12);
1162 else std::cout <<
"---";
1163 std::cout << std::setw(12);
1164 if (m->
GetWidth(naxis,width)) std::cout << width;
1165 else std::cout <<
"---";
1167 std::cout << std::endl;
1196 name.Form(
"%s%d", Head, n++);
1201 void TGo4Fitter::Streamer(TBuffer& b)
1203 if (b.IsReading()) {
1204 TGo4Fitter::Class()->ReadBuffer(b,
this);
1210 TGo4Fitter::Class()->WriteBuffer(b,
this);
virtual void DoAction(TGo4FitterAbstract *Fitter)
TH1 * CreateHistogram(const char *HistoName, Bool_t UseRanges=kFALSE, Bool_t SetBins=kFALSE)
virtual void Print(Option_t *option) const
friend class TGo4FitAmplEstimation
TGo4FitDataGraph * AddGraph(const char *DataName, TGraph *gr, Bool_t Owned=kFALSE, Double_t lrange=0., Double_t rrange=0.)
void RebuildAll(Bool_t ForceBuild=kFALSE)
virtual Double_t DoCalculation()
virtual void Clear(Option_t *option="")
void SetMemoryUsage(Int_t iMemoryUsage)
void SetHistogram(TH1 *iHistogram, Bool_t iHistogramOwned=kFALSE)
virtual Int_t DoNDFCalculation()
TGo4FitSlot * GetSlot(Int_t nslot)
TGo4FitComponent * GetComp(Int_t n)
Double_t * GetBinsValues()
void MoveDrawObjectsToROOT()
void SetFitFunctionType(Int_t iFitFunctionType)
virtual void Draw(Option_t *option)
void AddAmplEstimation(Int_t NumIters=1)
void ClearModelAssignmentTo(const char *ModelName, const char *DataName=0)
virtual void CollectAllPars()
const char * GetAmplFullName()
virtual TGo4FitDataIter * MakeIter()
virtual void FinalizeFitterData()
Int_t GetDataBinsSize(TGo4FitData *data)
void EstimateAmplitudes(Int_t NumIters=1)
TGo4FitModel * FindModel(const char *ModelName)
Int_t GetGroupIndex() const
void AddPolynoms(const char *DataName, const char *NamePrefix, Int_t MaxOrder=1, Int_t NumAxis=1, Int_t GroupIndex=0)
void ClearConnectionToSlot()
Double_t * GetDataBinsResult(TGo4FitData *data)
void AssignToData(const char *DataName, Double_t RatioValue=1., Bool_t FixRatio=kFALSE)
Double_t * GetModelBins(const char *DataName) const
Int_t NumModelsAssosiatedTo(const char *DataName)
void AddAction(TGo4FitterAction *Action)
void CheckSlotsBeforeDelete(TGo4FitComponent *comp)
TGraph * CreateGraph(const char *GraphName, Bool_t UseRanges=kFALSE, Bool_t SetBins=kFALSE)
void AddPolynomX(const char *DataName, const char *NamePrefix, Int_t MaxOrder=1, Int_t GroupIndex=0, Double_t lrange=0., Double_t rrange=0.)
virtual Bool_t Initialize(Int_t UseBuffers=-1)
void ClearAssignmentTo(const char *DataName)
Double_t PointFitFunction(Int_t FitFunctionType, Double_t value, Double_t modelvalue, Double_t standdev)
void AssignModelTo(const char *ModelName, const char *DataName, Double_t RatioValue=1., Bool_t FixRatio=kFALSE)
void ClearSlot(TGo4FitSlot *slot, Bool_t NonOwned)
void SetAmplValue(Double_t iAmpl)
const char * AssignmentName(Int_t n)
void SetOwner(TNamed *iOwner)
TGo4FitData * RemoveData(const char *DataName, Bool_t IsDel=kFALSE)
TGo4FitModel * RemoveModel(const char *ModelName, Bool_t IsDel=kFALSE)
TUserFitFunction fxUserFitFunction
Double_t * GetDataBinsDevs(TGo4FitData *data)
virtual Bool_t Reset(Bool_t UseRanges=kTRUE)
virtual Double_t EvaluateAtPoint(TGo4FitData *data, Int_t nbin, Bool_t UseRanges=kTRUE)
void DeleteModelsAssosiatedTo(const char *DataName)
virtual void FillSlotList(TSeqCollection *list)
Double_t CalculatesIntegral(const char *DataName, const char *ModelName=0, Bool_t OnlyCounts=kFALSE)
void PrepareSlotsForWriting()
TGo4FitData * AddData(TGo4FitData *d)
virtual Bool_t GetPosition(Int_t naxis, Double_t &pos)
virtual void Print(Option_t *option) const
Double_t * GetBinsResult()
void ChangeDataNameInAssignments(const char *oldname, const char *newname)
void SetGraph(TGraph *iGraph, Bool_t iGraphOwned=kFALSE)
Bool_t BuffersAllocated() const
TGo4FitSlot * GetConnectedSlot() const
void CheckDuplicatesOnSlot()
TGo4FitModelGauss1 * AddGauss1(const char *DataName, const char *ModelName, Double_t iPosition, Double_t iWidth, Double_t iAmpl=1., Int_t Axis=0)
void ChangeDataNameInAssignments(const char *oldname, const char *newname)
void SetRange(Int_t naxis, Double_t min, Double_t max)
virtual void CollectAllPars()
Int_t CalculateNDF(const char *DataName=0)
TGo4FitDataGraph * SetGraph(const char *DataName, TGraph *gr, Bool_t Owned=kFALSE)
TGo4FitModel * GetModel(Int_t n)
Double_t CalculatesModelIntegral(const char *ModelName, Bool_t OnlyCounts=kFALSE)
void PrintResults() const
Int_t CountPoints(Bool_t UseRanges=kTRUE)
virtual Bool_t Initialize(Int_t UseBuffers=-1)
Int_t GetBinsSize() const
virtual Bool_t Next(Bool_t UseRanges=kTRUE)
virtual Bool_t BeforeEval(Int_t ndim)
void ConnectToDataIfAssigned(TGo4FitData *data)
TString FindNextName(const char *Head, Int_t start, Bool_t isModel=kTRUE)
virtual void FillSlotList(TSeqCollection *lst)
TGo4FitData * GetData(Int_t n)
void SetGroupIndex(Int_t index=-1)
virtual Bool_t GetWidth(Int_t naxis, Double_t &width)
Int_t NumAssigments() const
Int_t GetFitFunctionType()
Double_t * GetModelBinsValues(TGo4FitModel *model, const char *DataName)
Double_t CalculateFitFunction(Double_t *pars=0, Int_t FitFunctionType=-1, const char *DataName=0)
virtual void CollectParsTo(TGo4FitParsList &list)
Bool_t DataBuffersAllocated(TGo4FitData *data)
Bool_t HasIndexes() const
TGo4FitModel * CloneModel(const char *ModelName, const char *NewName=0)
const char * GetDataName(Int_t n)
Bool_t BuffersAllocated() const
Int_t GetNumModel() const
TGo4FitModel * AddModel(TGo4FitModel *m)
const Int_t * Indexes() const
TObject * CreateDrawObject(const char *ObjName, const char *DataName, Bool_t IsModel=kFALSE, const char *ModelName=0)
virtual Bool_t InitFitterData()
void RebuildShape(Bool_t ForceBuild=kFALSE)
Bool_t IsAssignTo(const char *DataName) const
TGo4FitDataHistogram * SetH1(const char *DataName, TH1 *histo, Bool_t Owned=kFALSE)
Bool_t CalculatesMomentums(const char *DataName, Bool_t UseRanges, Bool_t SubstractModels, Double_t &first, Double_t &second)
Double_t * GetDataBinsValues(TGo4FitData *data)
virtual void Clear(Option_t *option=0)
TGo4FitData * FindData(const char *DataName)
Double_t CalculateFCN(Int_t FitFunctionType, TGo4FitData *selectdata=0)
Bool_t AddModelToDataResult(TGo4FitData *data)
Int_t IndexesSize() const
Double_t StandardDeviation() const
Double_t GetRatioValueFor(const char *DataName)
void ProvideLastDrawObjects(TObjArray &lst)
Bool_t ModelBuffersAllocated(TGo4FitModel *model)
void AddStandardActions()
TGo4FitParameter * GetAmplPar()
void ExecuteDependencies(Double_t *pars)
void SetParsValues(Double_t *pars)
TGo4FitDataHistogram * AddH1(const char *DataName, TH1 *histo, Bool_t Owned=kFALSE, Double_t lrange=0., Double_t rrange=0.)