22 #include "TObjArray.h"
23 #include "TDataMember.h"
24 #include "TBaseClass.h"
25 #include "TDataType.h"
40 TNamed(name ? name :
"Parameter", title)
42 GO4TRACE((12,
"TGo4Parameter ::TGo4Parameter (const char*, const char*)",__LINE__, __FILE__));
54 GO4TRACE((12,
"TGo4Parameter ::PrintParameter()",__LINE__, __FILE__));
56 if(buflen<=0 && buffer!=0)
return 0;
62 TString localbuf = TString::Format(
"Parameter name: %s class %s\n", GetName(), ClassName());
65 std::cout << localbuf;
67 size = localbuf.Length();
68 if(size>buflen) size = buflen;
69 strncpy(buffer, localbuf.Data(), size);
77 TROOT::IncreaseDirLevel();
87 TROOT::DecreaseDirLevel();
94 GO4TRACE((12,
"TGo4Parameter ::~TGo4Parameter ()",__LINE__, __FILE__));
99 if (rhs==0)
return kFALSE;
101 if (rhs->IsA() != IsA()) {
102 std::cout <<
"GO4> !!! ERROR: Wrong parameter class is used in TGo4Parameter::UpdateFrom() method!!!" << std::endl;
103 std::cout <<
"GO4> !!! ERROR: One cannot update " << IsA()->GetName() <<
" class from " << rhs->IsA()->GetName() << std::endl;
104 std::cout <<
"GO4> !!! ERROR: Implement your custom UpdateFrom() method" << std::endl;
123 url.SetOptions(rest_url_opt);
130 const char* optvalue = url.GetValueFromOptions(member->
GetFullName(dummy));
148 std::cout <<
"GO4> !!! Default TGo4Parameter::Clear() method is used." << std::endl;
149 std::cout <<
"GO4> !!! You probably need to overwrite Clear() method for your class" << IsA()->GetName() << std::endl;
170 if (items==0)
return kFALSE;
180 if ((fItems==0) || (cl==0) || (ptr==0))
return;
182 TIter iter(cl->GetListOfDataMembers());
183 Int_t lastmemberid = -1;
184 if (fItems->GetLast()>=0)
188 while ((obj=iter()) != 0) {
189 TDataMember* member =
dynamic_cast<TDataMember*
>(obj);
190 if (member==0)
continue;
191 const char* memtypename = member->GetFullTypeName();
195 if(strcmp(memtypename,
"TClass*")==0)
continue;
198 Int_t arraydim = member->GetArrayDim();
199 if (arraydim>2)
continue;
201 Int_t maxindex1(1), maxindex2(1);
205 maxindex1 = member->GetMaxIndex(0);
208 maxindex1 = member->GetMaxIndex(0);
209 maxindex2 = member->GetMaxIndex(1);
216 if (strcmp(memtypename,
"TString")==0) {
219 if (strcmp(memtypename,
"TGo4Fitter*")==0) {
222 if (strcmp(memtypename,
"TArrayI")==0) {
224 memtypename =
"Int_t";
225 if ((maxindex1>1) || (maxindex2>1))
continue;
226 arri = (TArrayI*) (ptr + cloffset + member->GetOffset());
228 maxindex1 = arri->GetSize();
231 if (strcmp(memtypename,
"TArrayD")==0) {
232 memtypeid = kDouble_t;
233 memtypename =
"Double_t";
234 if ((maxindex1>1) || (maxindex2>1))
continue;
235 arrd = (TArrayD*) (ptr + cloffset + member->GetOffset());
237 maxindex1 = arrd->GetSize();
240 if (!member->IsBasic())
continue;
241 memtypeid = member->GetDataType()->GetType();
260 for(Int_t ix1=0;ix1<maxindex1;ix1++)
261 for(Int_t ix2=0;ix2<maxindex2;ix2++) {
267 info->
SetType(memtypename, memtypeid);
273 char* addr = ptr + cloffset + member->GetOffset() + (ix1*maxindex2 + ix2) * member->GetUnitSize();
274 if (arri) addr = (
char*) (arri->GetArray() + ix1);
275 if (arrd) addr = (
char*) (arrd->GetArray() + ix1);
282 TIter cliter(cl->GetListOfBases());
283 while((obj=cliter()) !=0) {
284 TBaseClass* baseclass =
dynamic_cast<TBaseClass*
>(obj);
285 if (baseclass==0)
continue;
286 TClass* bclass = baseclass->GetClassPointer();
287 if(bclass==0)
continue;
288 if(strcmp(bclass->GetName(),
"TGo4Parameter")==0)
continue;
289 if(strcmp(bclass->GetName(),
"TNamed")==0)
continue;
291 GetMemberValues(fItems, bclass, ptr, cloffset + baseclass->GetDelta());
298 if (info==0)
return -1;
299 if (strcmp(info->GetName(), member->GetName())!=0)
return -1;
300 if (strcmp(info->GetTitle(), member->GetTitle())!=0)
return -1;
308 if ((items==0) || (cl==0) || (ptr==0))
return kFALSE;
310 TIter iter(cl->GetListOfDataMembers());
313 while ((obj=iter()) != 0) {
314 TDataMember* member =
dynamic_cast<TDataMember*
>(obj);
315 if (member==0)
continue;
316 const char* memtypename = member->GetFullTypeName();
320 if(strcmp(memtypename,
"TClass*")==0)
continue;
323 Int_t arraydim = member->GetArrayDim();
324 if (arraydim>2)
continue;
326 Int_t maxindex1(1), maxindex2(1);
330 maxindex1 = member->GetMaxIndex(0);
333 maxindex1 = member->GetMaxIndex(0);
334 maxindex2 = member->GetMaxIndex(1);
341 if (strcmp(memtypename,
"TString")==0) {
344 if (strcmp(memtypename,
"TGo4Fitter*")==0) {
347 if (strcmp(memtypename,
"TArrayI")==0) {
349 memtypename =
"Int_t";
350 if ((maxindex1>1) || (maxindex2>1))
continue;
351 arri = (TArrayI*) (ptr + cloffset + member->GetOffset());
355 if (maxindex1<0)
return kFALSE;
356 if (arri->GetSize()!=maxindex1) arri->Set(maxindex1);
358 if (strcmp(memtypename,
"TArrayD")==0) {
359 memtypeid = kDouble_t;
360 memtypename =
"Double_t";
361 if ((maxindex1>1) || (maxindex2>1))
continue;
362 arrd = (TArrayD*) (ptr + cloffset + member->GetOffset());
366 if (maxindex1<0)
return kFALSE;
367 if (arrd->GetSize()!=maxindex1) arrd->Set(maxindex1);
369 if (!member->IsBasic())
continue;
370 memtypeid = member->GetDataType()->GetType();
373 for(Int_t ix1=0;ix1<maxindex1;ix1++)
374 for(Int_t ix2=0;ix2<maxindex2;ix2++) {
375 if (itemsindx>items->GetLast())
return kFALSE;
378 if (info==0)
return kFALSE;
380 if (strcmp(info->GetName(), member->GetName())!=0)
return kFALSE;
381 if (strcmp(info->GetTitle(), member->GetTitle())!=0)
return kFALSE;
383 if (strcmp(info->
GetTypeName(), memtypename)!=0)
return kFALSE;
384 if (info->
GetTypeId() != memtypeid)
return kFALSE;
388 char* addr = ptr + cloffset + member->GetOffset() + (ix1*maxindex2 + ix2) * member->GetUnitSize();
389 if (arri) addr = (
char*) (arri->GetArray() + ix1);
390 if (arrd) addr = (
char*) (arrd->GetArray() + ix1);
397 TIter cliter(cl->GetListOfBases());
398 while((obj=cliter()) !=0) {
399 TBaseClass* baseclass =
dynamic_cast<TBaseClass*
>(obj);
400 if (baseclass==0)
continue;
401 TClass* bclass = baseclass->GetClassPointer();
402 if(bclass==0)
continue;
403 if(strcmp(bclass->GetName(),
"TGo4Parameter")==0)
continue;
404 if(strcmp(bclass->GetName(),
"TNamed")==0)
continue;
406 if (!
SetMemberValues(items, itemsindx, bclass, ptr, cloffset + baseclass->GetDelta()))
return kFALSE;
415 TString varname = TString::Format(
"param%d", cnt++);
416 Bool_t savemacro = (opt!=0) && (strstr(opt,
"savemacro")!=0);
419 out << Form(
" %s* %s = (%s*) go4->GetParameter(\"%s\",\"%s\");",
420 ClassName(), varname.Data(), ClassName(), GetName(), ClassName()) << std::endl << std::endl;
421 out << Form(
" if (%s==0) {", varname.Data()) << std::endl;
422 out << Form(
" TGo4Log::Error(\"Could not find parameter %s of class %s\");", GetName(), ClassName()) << std::endl;
423 out << Form(
" return;") << std::endl;
424 out << Form(
" }") << std::endl << std::endl;
425 out << Form(
" TGo4Log::Info(\"Set parameter %s as saved at %s\");", GetName(), TDatime().AsString()) << std::endl << std::endl;
427 out << Form(
" %s* %s = new %s;", ClassName(), varname.Data(), ClassName()) << std::endl;
428 out << Form(
" %s->SetName(\"%s\");", varname.Data(), GetName()) << std::endl;
429 out << Form(
" %s->SetTitle(\"%s\");", varname.Data(), GetTitle()) << std::endl;
432 TObjArray *fitems =
new TObjArray();
433 fitems->SetOwner(kTRUE);
447 out << Form(
" %s->%s = \"%s\";", varname.Data(), membername.Data(), info->
GetStrValue()) << std::endl;
450 out << Form(
" // fitter %s->%s ignored", varname.Data(), membername.Data()) << std::endl;
453 out << Form(
" %s->%s.Set(%d);", varname.Data(), membername.Data(), info->
GetIntValue()) << std::endl;
456 out << Form(
" %s->%s = %s;", varname.Data(), membername.Data(), (info->
GetIntValue() ?
"kTRUE" :
"kFALSE")) << std::endl;
459 out << Form(
" %s->%s = %s;", varname.Data(), membername.Data(), info->
GetStrValue()) << std::endl;
Int_t GetIntValue() const
TGo4ParameterStatus * CreateStatus()
void SetType(const char *name, Int_t id)
Int_t FindArrayLength(TObjArray *items, Int_t &itemsindx, TDataMember *member)
const char * GetFullName(TString &buf)
virtual void SavePrimitive(std::ostream &fs, Option_t *opt="")
void SetStrValue(const char *value)
virtual Int_t PrintParameter(Text_t *buffer=0, Int_t buflen=0)
Bool_t UpdateParameterValues(TGo4Parameter *par)
virtual void Clear(Option_t *opt="")
Int_t PrintMember(Text_t *buffer=0, Int_t buflen=0) const
Bool_t CheckArrayIndexes(Int_t ndim, Int_t indx1, Int_t indx2)
virtual void Print(Option_t *dummy="") const
void SetValue(char *addr)
Bool_t UpdateFromUrl(const char *rest_url_opt)
void SetIntValue(Int_t value)
Bool_t SetMemberValues(TObjArray *fItems)
const char * GetStrValue() const
virtual Bool_t UpdateFrom(TGo4Parameter *rhs)
const char * GetTypeName() const
void SetVisible(Bool_t on=kTRUE)
void GetValue(char *addr)
void SetMemberId(Int_t id)
void SetArrayIndexes(Int_t ndim=0, Int_t indx1=-1, Int_t indx2=-1)
Bool_t SetStatus(TGo4ParameterStatus *status)
void GetMemberValues(TObjArray *fItems)
static void Info(const char *text,...)