00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "TGo4FitParsList.h"
00015
00016 #include "Riostream.h"
00017 #include "TClass.h"
00018
00019 #include "TGo4FitParameter.h"
00020
00021 TGo4FitParsList::TGo4FitParsList() : TGo4FitNamed(), fxPars(), fbCanRollbackPars(kFALSE) {
00022
00023 }
00024
00025 TGo4FitParsList::TGo4FitParsList(Bool_t IsParsOwned) : TGo4FitNamed(), fxPars(), fbCanRollbackPars(kFALSE) {
00026 fxPars.SetOwner(IsParsOwned);
00027 }
00028
00029 TGo4FitParsList::TGo4FitParsList(const char* Name, const char* Title, Bool_t IsParsOwned) : TGo4FitNamed(Name,Title), fxPars(), fbCanRollbackPars(kFALSE) {
00030 fxPars.SetOwner(IsParsOwned);
00031 }
00032
00033 TGo4FitParsList::~TGo4FitParsList() {
00034 }
00035
00036 Int_t TGo4FitParsList::GetParIndex(const TGo4FitParameter* par) {
00037 for(Int_t i=0;i<NumPars();i++)
00038 if(GetPar(i)==par) return i;
00039 return -1;
00040 }
00041
00042 Double_t TGo4FitParsList::GetParValue(const char* ParName) {
00043 TGo4FitParameter* par = Find(ParName);
00044 if(par) return par->GetValue();
00045 else return 0.;
00046 }
00047
00048 Bool_t TGo4FitParsList::SetParValue(const char* ParName, Double_t iValue) {
00049 TGo4FitParameter* par = Find(ParName);
00050 if(par) { par->SetValue(iValue); return kTRUE; }
00051 else return kFALSE;
00052 }
00053
00054 void TGo4FitParsList::GetParsValues(Double_t* pars) {
00055 for(Int_t i=0;i<NumPars();i++)
00056 pars[i] = Get(i)->GetValue();
00057 }
00058
00059 void TGo4FitParsList::SetParsValues(Double_t* pars) {
00060 if (pars)
00061 for(Int_t i=0;i<NumPars();i++)
00062 Get(i)->SetValue(pars[i]);
00063 }
00064
00065 Double_t TGo4FitParsList::GetParError(const char* ParName) {
00066 TGo4FitParameter* par = Find(ParName);
00067 if(par) return par->GetError();
00068 else return 0.;
00069 }
00070
00071 Bool_t TGo4FitParsList::SetParError(const char* ParName, Double_t iError) {
00072 TGo4FitParameter* par = Find(ParName);
00073 if(par) { par->SetError(iError); return kTRUE; }
00074 else return kFALSE;
00075 }
00076
00077 Bool_t TGo4FitParsList::SetParFixed(const char* ParName, Bool_t iFixed) {
00078 TGo4FitParameter* par = Find(ParName);
00079 if(par) { par->SetFixed(iFixed); return kTRUE; }
00080 else return kFALSE;
00081 }
00082
00083 Bool_t TGo4FitParsList::GetParFixed(const char* ParName) {
00084 TGo4FitParameter* par = Find(ParName);
00085 if(par) return par->GetFixed();
00086 else return kFALSE;
00087 }
00088
00089 Int_t TGo4FitParsList::NumFixedPars() {
00090 Int_t res = 0;
00091 for (Int_t n=0; n<NumPars(); n++)
00092 if (Get(n)->GetFixed()) res++;
00093 return res;
00094 }
00095
00096 Int_t TGo4FitParsList::NumFreePars() {
00097 return NumPars()-NumFixedPars();
00098 }
00099
00100
00101 Bool_t TGo4FitParsList::SetParRange(const char* ParName, Double_t RangeMin, Double_t RangeMax) {
00102 TGo4FitParameter* par = Find(ParName);
00103 if(par) { par->SetRange(RangeMin,RangeMax); return kTRUE; }
00104 else return kFALSE;
00105 }
00106
00107 Bool_t TGo4FitParsList::GetParRange(const char* ParName, Double_t& RangeMin, Double_t& RangeMax) {
00108 TGo4FitParameter* par = Find(ParName);
00109 if(par) return par->GetRange(RangeMin,RangeMax);
00110 else return kFALSE;
00111 }
00112
00113 Bool_t TGo4FitParsList::SetParEpsilon(const char* ParName, Double_t Epsilon) {
00114 TGo4FitParameter* par = Find(ParName);
00115 if(par) { par->SetEpsilon(Epsilon); return kTRUE; }
00116 else return kFALSE;
00117 }
00118
00119 Bool_t TGo4FitParsList::GetParEpsilon(const char* ParName, Double_t& Epsilon) {
00120 TGo4FitParameter* par = Find(ParName);
00121 if(par) return par->GetEpsilon(Epsilon);
00122 else return kFALSE;
00123 }
00124
00125
00126 void TGo4FitParsList::SetParName(Int_t n, const char* name) {
00127 if(Get(n)) Get(n)->SetName(name);
00128 }
00129
00130 const char* TGo4FitParsList::GetParName(Int_t n) {
00131 if(Get(n)) return Get(n)->GetName();
00132 else return 0;
00133 }
00134
00135 const char* TGo4FitParsList::GetParFullName(Int_t n) {
00136 if(Get(n)) return Get(n)->GetFullName();
00137 else return 0;
00138 }
00139
00140 void TGo4FitParsList::SetParsNames(const char* name0, const char* name1, const char* name2, const char* name3, const char* name4,
00141 const char* name5, const char* name6, const char* name7, const char* name8, const char* name9) {
00142 SetParName(0,name0);
00143 SetParName(1,name1);
00144 SetParName(2,name2);
00145 SetParName(3,name3);
00146 SetParName(4,name4);
00147 SetParName(5,name5);
00148 SetParName(6,name6);
00149 SetParName(7,name7);
00150 SetParName(8,name8);
00151 SetParName(9,name9);
00152 }
00153
00154 void TGo4FitParsList::SetParsValues(Double_t par0, Double_t par1, Double_t par2, Double_t par3, Double_t par4,
00155 Double_t par5, Double_t par6, Double_t par7, Double_t par8, Double_t par9) {
00156 if(Get(0)) Get(0)->SetValue(par0);
00157 if(Get(1)) Get(1)->SetValue(par1);
00158 if(Get(2)) Get(2)->SetValue(par2);
00159 if(Get(3)) Get(3)->SetValue(par3);
00160 if(Get(4)) Get(4)->SetValue(par4);
00161 if(Get(5)) Get(5)->SetValue(par5);
00162 if(Get(6)) Get(6)->SetValue(par6);
00163 if(Get(7)) Get(7)->SetValue(par7);
00164 if(Get(8)) Get(8)->SetValue(par8);
00165 if(Get(9)) Get(9)->SetValue(par9);
00166 }
00167
00168 void TGo4FitParsList::MemorizePars() {
00169 for(Int_t i=0;i<NumPars();i++)
00170 Get(i)->MemorizeValue();
00171 fbCanRollbackPars = kTRUE;
00172 }
00173
00174 void TGo4FitParsList::RememberPars() {
00175 for(Int_t i=0;i<NumPars();i++)
00176 Get(i)->RememberValue();
00177 }
00178
00179 Bool_t TGo4FitParsList::IsAllParsFixed() {
00180 for(Int_t i=0;i<NumPars();i++)
00181 if (!Get(i)->GetFixed()) return kFALSE;
00182 return kTRUE;
00183 }
00184
00185 void TGo4FitParsList::Print(Option_t* option) const {
00186 TGo4FitParsList* lst = (TGo4FitParsList*) this;
00187 if ((lst->NumPars()>0) && fxPars.IsOwner()) {
00188 cout << " List of parameters:" << endl;
00189 for(Int_t n=0;n<lst->NumPars();n++)
00190 lst->GetPar(n)->Print(option);
00191 }
00192 }
00193
00194 void TGo4FitParsList::PrintPars() const {
00195 cout << endl << "*** LIST OF PARAMETERS VALUE ***" << endl;
00196 TGo4FitParsList* l = (TGo4FitParsList*) this;
00197 int oldprec = cout.precision(6);
00198 for(Int_t n=0;n<l->NumPars();n++)
00199 cout << setw(15) << l->GetParFullName(n)
00200 << " " << setw(10) << l->GetPar(n)->GetValue()
00201 << " " << setw(10) << l->GetPar(n)->GetError() << endl;
00202 cout.precision(oldprec);
00203 }
00204
00205 void TGo4FitParsList::SetParsOwner(TGo4FitNamed* iOwner) {
00206 for(Int_t i=0;i<NumPars();i++)
00207 Get(i)->SetOwner(iOwner);
00208 }
00209
00210 TGo4FitParameter* TGo4FitParsList::CreatePar(const char* ParName, const char* Title, Double_t iValue) {
00211 if (Find(ParName)==0) return AddPar(new TGo4FitParameter(ParName,Title,iValue));
00212 else return Find(ParName);
00213 }
00214
00215 TGo4FitParameter* TGo4FitParsList::Find(const char* ParName) {
00216 for(Int_t i=0;i<NumPars();i++)
00217 if (strcmp(Get(i)->GetName(),ParName)==0) return Get(i);
00218
00219 for(Int_t i=0;i<NumPars();i++)
00220 if (strcmp(Get(i)->GetFullName(),ParName)==0) return Get(i);
00221
00222 return 0;
00223 }
00224
00225 TGo4FitParameter* TGo4FitParsList::Find(const char* OwnerFullName, const char* ParName) {
00226 for(Int_t i=0;i<NumPars();i++) {
00227 TGo4FitParameter* par = Get(i);
00228 if (par->GetOwner()==0) continue;
00229 if ( (strcmp(par->GetOwnerFullName(),OwnerFullName)==0) &&
00230 (strcmp(par->GetName(),ParName)==0) ) return par;
00231 }
00232 return 0;
00233 }
00234
00235 TGo4FitParameter* TGo4FitParsList::Find(TGo4FitParameter* par) {
00236 for(Int_t i=0;i<NumPars();i++)
00237 if (Get(i)==par) return par;
00238 return 0;
00239 }
00240
00241 Bool_t TGo4FitParsList::RemoveParByIndex(Int_t indx) {
00242 if((indx>=0) && (indx<NumPars())) return RemovePar(Get(indx));
00243 else return kFALSE;
00244 }
00245
00246 Bool_t TGo4FitParsList::RemovePar(const char* name) {
00247 return RemovePar(FindPar(name));
00248 }
00249
00250 Bool_t TGo4FitParsList::RemovePar(TGo4FitParameter* par) {
00251 if (fxPars.FindObject(par)) {
00252 fbCanRollbackPars = kFALSE;
00253 fxPars.Remove(par);
00254 if (fxPars.IsOwner()) delete par;
00255 return kTRUE;
00256 } else return kFALSE;
00257 }
00258
00259 void TGo4FitParsList::CollectParsTo(TGo4FitParsList & list) {
00260 for(Int_t i=0;i<NumPars();i++) {
00261 TGo4FitParameter* par = Get(i);
00262 if (list.GetParIndex(par)<0) list.AddPar(par);
00263 }
00264 }
00265
00266 void TGo4FitParsList::ClearParsBlocking() {
00267 for(Int_t i=0;i<NumPars();i++)
00268 Get(i)->ClearBlocked();
00269 }
00270
00271 void TGo4FitParsList::ClearPars() {
00272 fxPars.Clear();
00273 fbCanRollbackPars = kFALSE;
00274 }
00275
00276
00277 TGo4FitParameter* TGo4FitParsList::AddPar(TGo4FitParameter* par) {
00278 fxPars.AddLast(par);
00279 if ((par!=0) && fxPars.IsOwner()) par->SetOwner(this);
00280 fbCanRollbackPars = kFALSE;
00281 return par;
00282 }
00283
00284 TGo4FitParameter* TGo4FitParsList::InsertPar(TGo4FitParameter* par, Int_t indx) {
00285 if (indx<0) fxPars.AddLast(par);
00286 else fxPars.AddAt(par,indx);
00287 if ((par!=0) && fxPars.IsOwner()) par->SetOwner(this);
00288 fbCanRollbackPars = kFALSE;
00289 return par;
00290 }
00291
00292 void TGo4FitParsList::Streamer(TBuffer& b) {
00293 if (b.IsReading()) {
00294 TGo4FitParsList::Class()->ReadBuffer(b, this);
00295 Bool_t IsOwner;
00296 b >> IsOwner;
00297 if (IsOwner) {
00298 fxPars.Streamer(b);
00299 SetParsOwner(this);
00300 }
00301 } else {
00302 TGo4FitParsList::Class()->WriteBuffer(b, this);
00303 b << fxPars.IsOwner();
00304 if (fxPars.IsOwner())
00305 fxPars.Streamer(b);
00306 }
00307 }