GSI Object Oriented Online Offline (Go4)  GO4-6.3.0
TGo4FitParsList.cxx
Go to the documentation of this file.
1 // $Id$
2 //-----------------------------------------------------------------------
3 // The GSI Online Offline Object Oriented (Go4) Project
4 // Experiment Data Processing at EE department, GSI
5 //-----------------------------------------------------------------------
6 // Copyright (C) 2000- GSI Helmholtzzentrum fuer Schwerionenforschung GmbH
7 // Planckstr. 1, 64291 Darmstadt, Germany
8 // Contact: http://go4.gsi.de
9 //-----------------------------------------------------------------------
10 // This software can be used under the license agreements as stated
11 // in Go4License.txt file which is part of the distribution.
12 //-----------------------------------------------------------------------
13 
14 #include "TGo4FitParsList.h"
15 
16 #include <iostream>
17 
18 #include "TBuffer.h"
19 #include "TClass.h"
20 #include "TStyle.h"
21 #include "TString.h"
22 
23 #include "TGo4FitParameter.h"
24 
25 TGo4FitParsList::TGo4FitParsList() : TGo4FitNamed(), fxPars(), fbCanRollbackPars(kFALSE) {}
26 
28 {
29  fxPars.SetOwner(IsParsOwned);
30 }
31 
32 TGo4FitParsList::TGo4FitParsList(const char *Name, const char *Title, Bool_t IsParsOwned)
33  : TGo4FitNamed(Name, Title), fxPars(), fbCanRollbackPars(kFALSE)
34 {
35  fxPars.SetOwner(IsParsOwned);
36 }
37 
39 
41 {
42  for (Int_t i = 0; i < NumPars(); i++)
43  if (GetPar(i) == par)
44  return i;
45  return -1;
46 }
47 
48 Double_t TGo4FitParsList::GetParValue(const char *ParName)
49 {
50  auto par = Find(ParName);
51  return par ? par->GetValue() : 0.;
52 }
53 
54 Bool_t TGo4FitParsList::SetParValue(const char *ParName, Double_t iValue)
55 {
56  auto par = Find(ParName);
57  if (par) {
58  par->SetValue(iValue);
59  return kTRUE;
60  }
61  return kFALSE;
62 }
63 
64 void TGo4FitParsList::GetParsValues(Double_t *pars)
65 {
66  for (Int_t i = 0; i < NumPars(); i++)
67  pars[i] = Get(i)->GetValue();
68 }
69 
70 void TGo4FitParsList::SetParsValues(Double_t *pars)
71 {
72  if (pars)
73  for (Int_t i = 0; i < NumPars(); i++)
74  Get(i)->SetValue(pars[i]);
75 }
76 
77 Double_t TGo4FitParsList::GetParError(const char *ParName)
78 {
79  TGo4FitParameter *par = Find(ParName);
80  return par ? par->GetError() : 0.;
81 }
82 
83 Bool_t TGo4FitParsList::SetParError(const char *ParName, Double_t iError)
84 {
85  auto par = Find(ParName);
86  if (par) {
87  par->SetError(iError);
88  return kTRUE;
89  }
90  return kFALSE;
91 }
92 
93 Bool_t TGo4FitParsList::SetParFixed(const char *ParName, Bool_t iFixed)
94 {
95  auto par = Find(ParName);
96  if (par) {
97  par->SetFixed(iFixed);
98  return kTRUE;
99  }
100  return kFALSE;
101 }
102 
103 Bool_t TGo4FitParsList::GetParFixed(const char *ParName)
104 {
105  auto par = Find(ParName);
106  return par ? par->GetFixed() : kFALSE;
107 }
108 
110 {
111  Int_t res = 0;
112  for (Int_t n = 0; n < NumPars(); n++)
113  if (Get(n)->GetFixed())
114  res++;
115  return res;
116 }
117 
119 {
120  return NumPars() - NumFixedPars();
121 }
122 
123 Bool_t TGo4FitParsList::SetParRange(const char *ParName, Double_t RangeMin, Double_t RangeMax)
124 {
125  auto par = Find(ParName);
126  if (par) {
127  par->SetRange(RangeMin, RangeMax);
128  return kTRUE;
129  }
130  return kFALSE;
131 }
132 
133 Bool_t TGo4FitParsList::GetParRange(const char *ParName, Double_t &RangeMin, Double_t &RangeMax)
134 {
135  auto par = Find(ParName);
136  return par ? par->GetRange(RangeMin, RangeMax) : kFALSE;
137 }
138 
139 Bool_t TGo4FitParsList::SetParEpsilon(const char *ParName, Double_t Epsilon)
140 {
141  TGo4FitParameter *par = Find(ParName);
142  if (par) {
143  par->SetEpsilon(Epsilon);
144  return kTRUE;
145  }
146  return kFALSE;
147 }
148 
149 Bool_t TGo4FitParsList::GetParEpsilon(const char *ParName, Double_t &Epsilon)
150 {
151  TGo4FitParameter *par = Find(ParName);
152  return par ? par->GetEpsilon(Epsilon) : kFALSE;
153 }
154 
155 void TGo4FitParsList::SetParName(Int_t n, const char *name)
156 {
157  if (Get(n))
158  Get(n)->SetName(name);
159 }
160 
161 const char *TGo4FitParsList::GetParName(Int_t n)
162 {
163  if (Get(n))
164  return Get(n)->GetName();
165  return nullptr;
166 }
167 
169 {
170  if (Get(n))
171  return Get(n)->GetFullName();
172  return nullptr;
173 }
174 
175 void TGo4FitParsList::SetParsNames(const char *name0, const char *name1, const char *name2, const char *name3,
176  const char *name4, const char *name5, const char *name6, const char *name7,
177  const char *name8, const char *name9)
178 {
179  SetParName(0, name0);
180  SetParName(1, name1);
181  SetParName(2, name2);
182  SetParName(3, name3);
183  SetParName(4, name4);
184  SetParName(5, name5);
185  SetParName(6, name6);
186  SetParName(7, name7);
187  SetParName(8, name8);
188  SetParName(9, name9);
189 }
190 
191 void TGo4FitParsList::SetParsValues(Double_t par0, Double_t par1, Double_t par2, Double_t par3, Double_t par4,
192  Double_t par5, Double_t par6, Double_t par7, Double_t par8, Double_t par9)
193 {
194  if (Get(0))
195  Get(0)->SetValue(par0);
196  if (Get(1))
197  Get(1)->SetValue(par1);
198  if (Get(2))
199  Get(2)->SetValue(par2);
200  if (Get(3))
201  Get(3)->SetValue(par3);
202  if (Get(4))
203  Get(4)->SetValue(par4);
204  if (Get(5))
205  Get(5)->SetValue(par5);
206  if (Get(6))
207  Get(6)->SetValue(par6);
208  if (Get(7))
209  Get(7)->SetValue(par7);
210  if (Get(8))
211  Get(8)->SetValue(par8);
212  if (Get(9))
213  Get(9)->SetValue(par9);
214 }
215 
217 {
218  for (Int_t i = 0; i < NumPars(); i++)
219  Get(i)->MemorizeValue();
220  fbCanRollbackPars = kTRUE;
221 }
222 
224 {
225  for (Int_t i = 0; i < NumPars(); i++)
226  Get(i)->RememberValue();
227 }
228 
230 {
231  for (Int_t i = 0; i < NumPars(); i++)
232  if (!Get(i)->GetFixed())
233  return kFALSE;
234  return kTRUE;
235 }
236 
237 void TGo4FitParsList::Print(Option_t *option) const
238 {
239  TGo4FitParsList *lst = (TGo4FitParsList *)this;
240  if ((lst->NumPars() > 0) && fxPars.IsOwner()) {
241  std::cout << " List of parameters:" << std::endl;
242  for (Int_t n = 0; n < lst->NumPars(); n++)
243  lst->GetPar(n)->Print(option);
244  }
245 }
246 
248 {
249  std::cout << std::endl << "*** LIST OF PARAMETERS VALUE ***" << std::endl;
250 
251  TGo4FitParsList *l = (TGo4FitParsList *)this;
252 
253  int maxparlen = 14;
254  for (Int_t np = 0; np < l->NumPars(); np++) {
255  int len = strlen(l->GetParFullName(np));
256  if (len > maxparlen)
257  maxparlen = len;
258  }
259 
260  TString tt =
261  TString::Format("%s%ds %s%s %s%s", "%", maxparlen, "%", gStyle->GetStatFormat(), "%", gStyle->GetStatFormat());
262 
263  for (Int_t n = 0; n < l->NumPars(); n++)
264  std::cout << TString::Format(tt.Data(), l->GetParFullName(n), l->GetPar(n)->GetValue(), l->GetPar(n)->GetError())
265  << std::endl;
266 }
267 
269 {
270  for (Int_t i = 0; i < NumPars(); i++)
271  Get(i)->SetOwner(iOwner);
272 }
273 
274 TGo4FitParameter *TGo4FitParsList::CreatePar(const char *ParName, const char *Title, Double_t iValue)
275 {
276  auto par = Find(ParName);
277  return par ? par : AddPar(new TGo4FitParameter(ParName, Title, iValue));
278 }
279 
281 {
282  for (Int_t i = 0; i < NumPars(); i++)
283  if (strcmp(Get(i)->GetName(), ParName) == 0)
284  return Get(i);
285 
286  for (Int_t i = 0; i < NumPars(); i++)
287  if (strcmp(Get(i)->GetFullName(), ParName) == 0)
288  return Get(i);
289 
290  return nullptr;
291 }
292 
293 TGo4FitParameter *TGo4FitParsList::Find(const char *OwnerFullName, const char *ParName)
294 {
295  for (Int_t i = 0; i < NumPars(); i++) {
296  TGo4FitParameter *par = Get(i);
297  if (!par->GetOwner())
298  continue;
299  if ((strcmp(par->GetOwnerFullName(), OwnerFullName) == 0) && (strcmp(par->GetName(), ParName) == 0))
300  return par;
301  }
302  return nullptr;
303 }
304 
306 {
307  for (Int_t i = 0; i < NumPars(); i++)
308  if (Get(i) == par)
309  return par;
310  return nullptr;
311 }
312 
314 {
315  if ((indx >= 0) && (indx < NumPars()))
316  return RemovePar(Get(indx));
317  return kFALSE;
318 }
319 
320 Bool_t TGo4FitParsList::RemovePar(const char *name)
321 {
322  return RemovePar(FindPar(name));
323 }
324 
326 {
327  if (fxPars.FindObject(par)) {
328  fbCanRollbackPars = kFALSE;
329  fxPars.Remove(par);
330  if (fxPars.IsOwner())
331  delete par;
332  return kTRUE;
333  }
334  return kFALSE;
335 }
336 
338 {
339  for (Int_t i = 0; i < NumPars(); i++) {
340  TGo4FitParameter *par = Get(i);
341  if (list.GetParIndex(par) < 0)
342  list.AddPar(par);
343  }
344 }
345 
347 {
348  for (Int_t i = 0; i < NumPars(); i++)
349  Get(i)->ClearBlocked();
350 }
351 
353 {
354  fxPars.Clear();
355  fbCanRollbackPars = kFALSE;
356 }
357 
359 {
360  fxPars.AddLast(par);
361  if (par && fxPars.IsOwner())
362  par->SetOwner(this);
363  fbCanRollbackPars = kFALSE;
364  return par;
365 }
366 
368 {
369  if (indx < 0)
370  fxPars.AddLast(par);
371  else
372  fxPars.AddAt(par, indx);
373  if (par && fxPars.IsOwner())
374  par->SetOwner(this);
375  fbCanRollbackPars = kFALSE;
376  return par;
377 }
378 
379 void TGo4FitParsList::Streamer(TBuffer &b)
380 {
381  if (b.IsReading()) {
382  TGo4FitParsList::Class()->ReadBuffer(b, this);
383  Bool_t IsOwner;
384  b >> IsOwner;
385  if (IsOwner) {
386  fxPars.Streamer(b);
387  SetParsOwner(this);
388  }
389  } else {
390  TGo4FitParsList::Class()->WriteBuffer(b, this);
391  b << fxPars.IsOwner();
392  if (fxPars.IsOwner())
393  fxPars.Streamer(b);
394  }
395 }
Bool_t SetParValue(const char *ParName, Double_t iValue)
void SetParsNames(const char *name0="Par0", const char *name1="Par1", const char *name2="Par2", const char *name3="Par3", const char *name4="Par4", const char *name5="Par5", const char *name6="Par6", const char *name7="Par7", const char *name8="Par8", const char *name9="Par9")
Double_t GetValue() const
void PrintPars() const
TGo4FitParameter * InsertPar(TGo4FitParameter *par, Int_t indx)
virtual Bool_t SetParFixed(const char *ParName, Bool_t iFixed=kTRUE)
void SetParName(Int_t n, const char *name)
Double_t GetParError(const char *ParName)
Bool_t GetEpsilon(Double_t &eps) const
TGo4FitParameter * CreatePar(const char *ParName, const char *Title, Double_t iValue=0)
virtual Bool_t GetParEpsilon(const char *ParName, Double_t &Epsilon)
TGo4FitParameter * GetPar(Int_t n)
virtual void MemorizePars()
int l
Definition: f_mbs_status.c:31
const char * GetFullName()
void SetParsOwner(TGo4FitNamed *iOwner)
void SetOwner(TNamed *iOwner)
Definition: TGo4FitNamed.h:58
TOrdCollection fxPars
virtual Bool_t SetParRange(const char *ParName, Double_t RangeMin, Double_t RangeMax)
Double_t GetError() const
virtual Int_t NumPars()
Bool_t SetParError(const char *ParName, Double_t iError)
virtual Bool_t SetParEpsilon(const char *ParName, Double_t Epsilon)
void Print(Option_t *option="") const override
Bool_t RemovePar(const char *name)
const char * GetParFullName(Int_t n)
TGo4FitParameter * FindPar(const char *ParName)
Bool_t GetFixed() const
virtual Bool_t GetParRange(const char *ParName, Double_t &RangeMin, Double_t &RangeMax)
TGo4FitParameter * Find(const char *ParName)
TNamed * GetOwner()
Definition: TGo4FitNamed.h:63
Bool_t RemoveParByIndex(Int_t indx)
Int_t GetParIndex(const TGo4FitParameter *par)
virtual Bool_t GetParFixed(const char *ParName)
void SetValue(Double_t iValue)
virtual void RememberPars()
virtual ~TGo4FitParsList()
const char * GetOwnerFullName()
void SetEpsilon(Double_t iEpsilon)
virtual TGo4FitParameter * Get(Int_t n)
void Print(Option_t *option="") const override
void GetParsValues(Double_t *pars)
virtual void CollectParsTo(TGo4FitParsList &list)
TGo4FitParameter * AddPar(TGo4FitParameter *par)
Double_t GetParValue(const char *ParName)
const char * GetParName(Int_t n)
void SetParsValues(Double_t *pars)