#include "hparamlist.h"
#include "TClass.h"
#include "TStreamerInfo.h"
#include "RVersion.h"
#include "TBuffer.h"
#if ROOT_VERSION_CODE > ROOT_VERSION(4,4,2)
#include "TBufferFile.h"
#endif
#include <iostream>
#include <iomanip>
using namespace std;
ClassImp(HParamObj)
ClassImp(HParamList)
HParamObj::HParamObj(const Text_t* name) {
SetName(name);
paramValue=0;
arraySize=0;
paramType="UChar_t";
basicType=kFALSE;
bytesPerValue=1;
classVersion=-1;
streamerInfo=0;
streamerInfoSize=0;
}
HParamObj::HParamObj(HParamObj& o) {
SetName(o.GetName());
arraySize=o.getLength();
paramValue=new UChar_t[arraySize];
memcpy(paramValue,o.getParamValue(),arraySize);
paramType=o.getParamType();
if (o.isBasicType()) basicType=kTRUE;
else basicType=kFALSE;
bytesPerValue=o.getBytesPerValue();
classVersion=o.getClassVersion();
streamerInfoSize=o.getStreamerInfoSize();
if (streamerInfoSize>0) {
memcpy(streamerInfo,o.getStreamerInfo(),streamerInfoSize);
}
}
HParamObj::HParamObj(const Text_t* name,Int_t value) {
SetName(name);
setParamType("Int_t");
arraySize=bytesPerValue;
paramValue=new UChar_t[arraySize];
memcpy(paramValue,&value,arraySize);
}
HParamObj::HParamObj(const Text_t* name,UInt_t value) {
SetName(name);
setParamType("UInt_t");
arraySize=bytesPerValue;
paramValue=new UChar_t[arraySize];
memcpy(paramValue,&value,arraySize);
}
HParamObj::HParamObj(const Text_t* name,Float_t value) {
SetName(name);
setParamType("Float_t");
arraySize=bytesPerValue;
paramValue=new UChar_t[arraySize];
memcpy(paramValue,&value,arraySize);
}
HParamObj::HParamObj(const Text_t* name,Double_t value) {
SetName(name);
setParamType("Double_t");
arraySize=bytesPerValue;
paramValue=new UChar_t[arraySize];
memcpy(paramValue,&value,arraySize);
}
HParamObj::HParamObj(const Text_t* name,const Int_t* value,const Int_t nValues) {
SetName(name);
setParamType("Int_t");
arraySize=bytesPerValue*nValues;
paramValue=new UChar_t[arraySize];
memcpy(paramValue,value,arraySize);
}
HParamObj::HParamObj(const Text_t* name,const UInt_t* value,const Int_t nValues) {
SetName(name);
setParamType("UInt_t");
arraySize=bytesPerValue*nValues;
paramValue=new UChar_t[arraySize];
memcpy(paramValue,value,arraySize);
}
HParamObj::HParamObj(const Text_t* name,const Float_t* value,const Int_t nValues) {
SetName(name);
setParamType("Float_t");
arraySize=bytesPerValue*nValues;
paramValue=new UChar_t[arraySize];
memcpy(paramValue,value,arraySize);
}
HParamObj::HParamObj(const Text_t* name,const Double_t* value,const Int_t nValues) {
SetName(name);
setParamType("Double_t");
arraySize=bytesPerValue*nValues;
paramValue=new UChar_t[arraySize];
memcpy(paramValue,value,arraySize);
}
HParamObj::HParamObj(const Text_t* name,const Text_t* value) {
SetName(name);
setParamType("Text_t");
arraySize=strlen(value);
paramValue=new UChar_t[arraySize];
memcpy(paramValue,value,arraySize);
}
HParamObj::HParamObj(const Text_t* name,const Char_t* value,const Int_t nValues) {
SetName(name);
setParamType("Char_t");
arraySize=bytesPerValue*nValues;
paramValue=new UChar_t[arraySize];
memcpy(paramValue,value,arraySize);
}
HParamObj::HParamObj(const Text_t* name,const UChar_t* value,const Int_t nValues) {
SetName(name);
setParamType("UChar_t");
arraySize=bytesPerValue*nValues;
paramValue=new UChar_t[arraySize];
memcpy(paramValue,value,arraySize);
}
HParamObj::~HParamObj() {
if (paramValue) {
delete [] paramValue;
paramValue=0;
}
if (streamerInfo) {
delete [] streamerInfo;
streamerInfo=0;
}
}
void HParamObj::setParamType(const Text_t* t) {
paramType=t;
if (strcmp(t,"Char_t")==0) {
basicType=kTRUE;
bytesPerValue=sizeof(Char_t);
} else if (strcmp(t,"Int_t")==0) {
basicType=kTRUE;
bytesPerValue=sizeof(Int_t);
} else if (strcmp(t,"UInt_t")==0) {
basicType=kTRUE;
bytesPerValue=sizeof(Int_t);
} else if (strcmp(t,"Float_t")==0) {
basicType=kTRUE;
bytesPerValue=sizeof(Float_t);
} else if (strcmp(t,"Double_t")==0) {
basicType=kTRUE;
bytesPerValue=sizeof(Double_t);
} else if (strcmp(t,"Text_t")==0) {
basicType=kTRUE;
bytesPerValue=sizeof(Char_t);
} else if (strcmp(t,"UChar_t")==0) {
basicType=kTRUE;
bytesPerValue=sizeof(UChar_t);
} else {
basicType=kFALSE;
bytesPerValue=1;
}
if (basicType==kTRUE) {
classVersion=-1;
streamerInfoSize=0;
streamerInfo=0;
}
}
UChar_t* HParamObj::setLength(Int_t l) {
if (paramValue) delete [] paramValue;
arraySize=l;
if (l>0) {
paramValue=new UChar_t[arraySize];
} else {
paramValue=0;
}
return paramValue;
}
void HParamObj::setParamValue(UChar_t* value,const Int_t length) {
if (paramValue) delete [] paramValue;
arraySize=length;
paramValue=value;
}
UChar_t* HParamObj::setStreamerInfoSize(Int_t l) {
if (streamerInfo) delete [] streamerInfo;
streamerInfoSize=l;
if (l>0) {
streamerInfo=new UChar_t[streamerInfoSize];
} else {
streamerInfo=0;
}
return streamerInfo;
}
void HParamObj::setStreamerInfo(UChar_t* array,const Int_t length) {
if (streamerInfo) delete [] streamerInfo;
streamerInfoSize=length;
streamerInfo=array;
}
Int_t HParamObj::getNumParams() {
Int_t n=1;
if (basicType) {
n=arraySize/bytesPerValue;
}
return n;
}
void HParamObj::print() {
cout<<GetName()<<": ";
if (classVersion>=0) {
cout<<"\n Class Type: "<<paramType.Data()<<"\n Class Version: "
<<classVersion<<endl;
} else if (strcmp(paramType,"Text_t")==0) {
TString val((Char_t*)paramValue,arraySize);
val.ReplaceAll("\n","\n ");
cout<<paramType<<"\n "<<val.Data()<<endl;
} else {
Int_t nParams=getNumParams();
if (nParams==1) {
cout<<paramType<<" ";
} else {
cout<<paramType<<" array, nValues: "<<nParams<<"\n ";
}
if (strcmp(paramType,"Char_t")==0) {
Char_t* val=(Char_t*)paramValue;
printData(val,nParams);
} else if (strcmp(paramType,"Int_t")==0) {
Int_t* val=(Int_t*)paramValue;
printData(val,nParams);
} else if (strcmp(paramType,"UInt_t")==0) {
UInt_t* val=(UInt_t*)paramValue;
printHexData(val,nParams);
} else if (strcmp(paramType,"Float_t")==0) {
Float_t* val=(Float_t*)paramValue;
printData(val,nParams);
} else if (strcmp(paramType,"Double_t")==0) {
Double_t* val=(Double_t*)paramValue;
printData(val,nParams);
} else {
cout<<"Type: "<<paramType<<" Array length: "<<arraySize<<endl;
}
}
}
template <class type> void HParamObj::printData(type* val, Int_t nParams) {
Int_t i=0, k=0;
while (k<nParams) {
if (i==10) {
cout<<"\n ";
i=0;
}
cout<<val[k]<<" ";
i++;
k++;
if (k>50) {
cout<<"...";
break;
}
}
cout<<endl;
}
void HParamObj::printHexData(UInt_t* val, Int_t nParams) {
Int_t i=0, k=0;
while (k<nParams) {
if (i==10) {
printf("\n ");
i=0;
}
printf("0x%08x ",val[k]);
i++;
k++;
if (k>50) {
printf("...");
break;
}
}
printf("\n");
}
HParamList::HParamList() {
paramList=new TList;
}
HParamList::~HParamList() {
if (paramList) {
paramList->Delete();
delete paramList;
paramList=0;
}
}
void HParamList::add(HParamObj& p) {
paramList->Add(new HParamObj(p));
}
void HParamList::add(const Text_t* name,const Text_t* value) {
paramList->Add(new HParamObj(name,value));
}
void HParamList::add(const Text_t* name,const Int_t value) {
paramList->Add(new HParamObj(name,value));
}
void HParamList::add(const Text_t* name,const UInt_t value) {
paramList->Add(new HParamObj(name,value));
}
void HParamList::add(const Text_t* name,const Float_t value) {
paramList->Add(new HParamObj(name,value));
}
void HParamList::add(const Text_t* name,const Double_t value) {
paramList->Add(new HParamObj(name,value));
}
void HParamList::add(const Text_t* name,TArrayI& value) {
paramList->Add(new HParamObj(name,value.GetArray(),value.GetSize()));
}
void HParamList::add(const Text_t* name,TArrayC& value) {
paramList->Add(new HParamObj(name,value.GetArray(),value.GetSize()));
}
void HParamList::add(const Text_t* name,TArrayF& value) {
paramList->Add(new HParamObj(name,value.GetArray(),value.GetSize()));
}
void HParamList::add(const Text_t* name,TArrayD& value) {
paramList->Add(new HParamObj(name,value.GetArray(),value.GetSize()));
}
void HParamList::add(const Text_t* name,const UChar_t* values,const Int_t nValues) {
paramList->Add(new HParamObj(name,values,nValues));
}
void HParamList::add(const Text_t* name,const Int_t* values,const Int_t nValues) {
paramList->Add(new HParamObj(name,values,nValues));
}
void HParamList::add(const Text_t* name,const UInt_t* values,const Int_t nValues) {
paramList->Add(new HParamObj(name,values,nValues));
}
void HParamList::add(const Text_t* name,const Float_t* values,const Int_t nValues) {
paramList->Add(new HParamObj(name,values,nValues));
}
void HParamList::add(const Text_t* name,const Double_t* values,const Int_t nValues) {
paramList->Add(new HParamObj(name,values,nValues));
}
void HParamList::addObject(const Text_t* name,TObject* obj) {
if (!obj) return;
HParamObj* o=new HParamObj(name);
o->setParamType(obj->IsA()->GetName());
o->setClassVersion(obj->IsA()->GetClassVersion());
TFile* filesave=gFile;
HParamTFile* paramFile=new HParamTFile();
gFile=paramFile;
const Int_t bufsize=10000;
#if ROOT_VERSION_CODE > ROOT_VERSION(4,4,2)
TBufferFile* buffer=new TBufferFile(TBuffer::kWrite,bufsize);
#else
TBuffer* buffer=new TBuffer(TBuffer::kWrite,bufsize);
#endif
buffer->SetParent(paramFile);
buffer->MapObject(obj);
obj->Streamer(*buffer);
Int_t len=buffer->Length();
Char_t* buf=new char[len];
memcpy(buf,buffer->Buffer(),len);
o->setParamValue((UChar_t*)buf,len);
TArrayC* fClassIndex=paramFile->GetClassIndex();
if (fClassIndex&&fClassIndex->fArray[0] != 0) {
TIter next(gROOT->GetListOfStreamerInfo());
TStreamerInfo *info;
TList list;
while ((info=(TStreamerInfo*)next())) {
Int_t uid=info->GetNumber();
if (fClassIndex->fArray[uid]) list.Add(info);
}
if (list.GetSize()>0) {
list.Sort();
fClassIndex->fArray[0]=2;
#if ROOT_VERSION_CODE > ROOT_VERSION(4,4,2)
TBufferFile* infoBuffer=new TBufferFile(TBuffer::kWrite,bufsize);
#else
TBuffer* infoBuffer=new TBuffer(TBuffer::kWrite,bufsize);
#endif
infoBuffer->MapObject(&list);
list.Streamer(*infoBuffer);
Int_t infolen=infoBuffer->Length();
Char_t* infobuf=new char[infolen];
memcpy(infobuf,infoBuffer->Buffer(),infolen);
o->setStreamerInfo((UChar_t*)infobuf,infolen);
delete infoBuffer;
} else {
o->setStreamerInfo(0,0);
}
}
fClassIndex->fArray[0]=0;
delete paramFile;
paramList->Add(o);
delete buffer;
gFile=filesave;
}
void HParamList::print() {
TIter next(paramList);
HParamObj* o;
while ((o=(HParamObj*)next())!=0) o->print();
}
Bool_t HParamList::fill(const Text_t* name,Text_t* value,const Int_t length) {
HParamObj* o=(HParamObj*)paramList->FindObject(name);
if (value==0) return kFALSE;
if (o!=0 && strcmp(o->getParamType(),"Text_t")==0) {
Int_t l=o->getLength();
if (l<length-1) {
memcpy(value,(Char_t*)o->getParamValue(),l);
value[l]='\0';
return kTRUE;
} else {
Error("HParamList::fill(const Text_t*,Text_t*)","char array too small");
}
}
Error("HParamList::fill","Not found: %s",name);
return kFALSE;
}
Bool_t HParamList::fill(const Text_t* name,UChar_t* values,const Int_t nValues) {
if (values==0) return kFALSE;
HParamObj* o=(HParamObj*)paramList->FindObject(name);
if (o!=0 && strcmp(o->getParamType(),"UChar_t")==0) {
Int_t n=o->getLength();
if (n==nValues) {
memcpy(values,o->getParamValue(),n);
return kTRUE;
} else {
Error("HParamList::fill \nDifferent array sizes for parameter %s",name);
return kFALSE;
}
}
Error("HParamList::fill","Not found: %s",name);
return kFALSE;
}
Bool_t HParamList::fill(const Text_t* name,Int_t* values,const Int_t nValues) {
if (values==0) return kFALSE;
HParamObj* o=(HParamObj*)paramList->FindObject(name);
if (o!=0 && strcmp(o->getParamType(),"Int_t")==0) {
Int_t l=o->getLength();
Int_t n=o->getNumParams();
if (n==nValues) {
memcpy(values,o->getParamValue(),l);
return kTRUE;
} else {
Error("HParamList::fill \nDifferent array sizes for parameter %s",name);
return kFALSE;
}
}
Error("HParamList::fill","Not found: %s",name);
return kFALSE;
}
Bool_t HParamList::fill(const Text_t* name,UInt_t* values,const Int_t nValues) {
if (values==0) return kFALSE;
HParamObj* o=(HParamObj*)paramList->FindObject(name);
if (o!=0 && strcmp(o->getParamType(),"UInt_t")==0) {
Int_t l=o->getLength();
Int_t n=o->getNumParams();
if (n==nValues) {
memcpy(values,o->getParamValue(),l);
return kTRUE;
} else {
Error("HParamList::fill \nDifferent array sizes for parameter %s",name);
return kFALSE;
}
}
Error("HParamList::fill","Not found: %s",name);
return kFALSE;
}
Bool_t HParamList::fill(const Text_t* name,Float_t* values,const Int_t nValues) {
if (values==0) return kFALSE;
HParamObj* o=(HParamObj*)paramList->FindObject(name);
if (o!=0 && strcmp(o->getParamType(),"Float_t")==0) {
Int_t l=o->getLength();
Int_t n=o->getNumParams();
if (n==nValues) {
memcpy(values,o->getParamValue(),l);
return kTRUE;
} else {
Error("HParamList::fill \nDifferent array sizes for parameter %s",name);
return kFALSE;
}
}
Error("HParamList::fill","Not found: %s",name);
return kFALSE;
}
Bool_t HParamList::fill(const Text_t* name,Double_t* values,const Int_t nValues) {
if (values==0) return kFALSE;
HParamObj* o=(HParamObj*)paramList->FindObject(name);
if (o!=0 && strcmp(o->getParamType(),"Double_t")==0) {
Int_t l=o->getLength();
Int_t n=o->getNumParams();
if (n==nValues) {
memcpy(values,o->getParamValue(),l);
return kTRUE;
} else {
Error("HParamList::fill \nDifferent array sizes for parameter %s",name);
return kFALSE;
}
}
Error("HParamList::fill","Not found: %s",name);
return kFALSE;
}
Bool_t HParamList::fill(const Text_t* name,TArrayI* value) {
if (value==0) return kFALSE;
HParamObj* o=(HParamObj*)paramList->FindObject(name);
if (o!=0 && strcmp(o->getParamType(),"Int_t")==0) {
Int_t l=o->getLength();
Int_t n=o->getNumParams();
if (value->GetSize()!=n) value->Set(n);
memcpy(value->GetArray(),o->getParamValue(),l);
return kTRUE;
}
Error("HParamList::fill","Not found: %s",name);
return kFALSE;
}
Bool_t HParamList::fill(const Text_t* name,TArrayC* value) {
if (value==0) return kFALSE;
HParamObj* o=(HParamObj*)paramList->FindObject(name);
if (o!=0 && strcmp(o->getParamType(),"Char_t")==0) {
Int_t l=o->getLength();
if (value->GetSize()!=l) value->Set(l);
memcpy(value->GetArray(),o->getParamValue(),l);
return kTRUE;
}
Error("HParamList::fill","Not found: %s",name);
return kFALSE;
}
Bool_t HParamList::fill(const Text_t* name,TArrayF* value) {
if (value==0) return kFALSE;
HParamObj* o=(HParamObj*)paramList->FindObject(name);
if (o!=0 && strcmp(o->getParamType(),"Float_t")==0) {
Int_t l=o->getLength();
Int_t n=o->getNumParams();
if (value->GetSize()!=n) value->Set(n);
memcpy(value->GetArray(),o->getParamValue(),l);
return kTRUE;
}
Error("HParamList::fill","Not found: %s",name);
return kFALSE;
}
Bool_t HParamList::fill(const Text_t* name,TArrayD* value) {
if (value==0) return kFALSE;
HParamObj* o=(HParamObj*)paramList->FindObject(name);
if (o!=0 && strcmp(o->getParamType(),"Double_t")==0) {
Int_t l=o->getLength();
Int_t n=o->getNumParams();
if (value->GetSize()!=n) value->Set(n);
memcpy(value->GetArray(),o->getParamValue(),l);
return kTRUE;
}
Error("HParamList::fill","Not found: %s",name);
return kFALSE;
}
Int_t HParamList::replace(const Text_t* name,UChar_t* values) {
HParamObj* o=(HParamObj*)paramList->FindObject(name);
if (o!=0 && strcmp(o->getParamType(),"UChar_t")==0) {
Int_t l=o->getLength();
if (values) delete values;
values=new UChar_t[l];
memcpy(values,o->getParamValue(),l);
return l;
}
Error("HParamList::fill","Not found: %s",name);
return 0;
}
Int_t HParamList::replace(const Text_t* name,Int_t* values) {
HParamObj* o=(HParamObj*)paramList->FindObject(name);
if (o!=0 && strcmp(o->getParamType(),"Int_t")==0) {
Int_t l=o->getLength();
Int_t n=o->getNumParams();
if (values) delete values;
values=new Int_t[n];
memcpy(values,o->getParamValue(),l);
return n;
}
Error("HParamList::fill","Not found: %s",name);
return 0;
}
Int_t HParamList::replace(const Text_t* name,UInt_t* values) {
HParamObj* o=(HParamObj*)paramList->FindObject(name);
if (o!=0 && strcmp(o->getParamType(),"UInt_t")==0) {
Int_t l=o->getLength();
Int_t n=o->getNumParams();
if (values) delete values;
values=new UInt_t[n];
memcpy(values,o->getParamValue(),l);
return n;
}
Error("HParamList::fill","Not found: %s",name);
return 0;
}
Int_t HParamList::replace(const Text_t* name,Float_t* values) {
HParamObj* o=(HParamObj*)paramList->FindObject(name);
if (o!=0 && strcmp(o->getParamType(),"Float_t")==0) {
Int_t l=o->getLength();
Int_t n=o->getNumParams();
if (values) delete values;
values=new Float_t[n];
memcpy(values,o->getParamValue(),l);
return n;
}
Error("HParamList::fill","Not found: ",name);
return 0;
}
Int_t HParamList::replace(const Text_t* name,Double_t* values) {
HParamObj* o=(HParamObj*)paramList->FindObject(name);
if (o!=0 && strcmp(o->getParamType(),"Double_t")==0) {
Int_t l=o->getLength();
Int_t n=o->getNumParams();
if (values) delete values;
values=new Double_t[n];
memcpy(values,o->getParamValue(),l);
return n;
}
Error("HParamList::fill","Not found: %s",name);
return 0;
}
Bool_t HParamList::fillObject(const Text_t* name,TObject* obj) {
if (!obj) return 0;
HParamObj* o=(HParamObj*)paramList->FindObject(name);
if (o!=0 && strcmp(o->getParamType(),obj->IsA()->GetName())==0) {
if (o->getClassVersion()!=obj->IsA()->GetClassVersion())
Warning("HParamList::fillObject",
"\n Read Class Version = %i does not match actual version = %i",
o->getClassVersion(),obj->IsA()->GetClassVersion());
TFile* filesave=gFile;
gFile=0;
#if ROOT_VERSION_CODE > ROOT_VERSION(4,4,2)
TBufferFile* buf=0;
#else
TBuffer* buf=0;
#endif
Int_t len=o->getStreamerInfoSize();
if (len>0&&o->getStreamerInfo()!=0) {
#if ROOT_VERSION_CODE > ROOT_VERSION(4,4,2)
buf=new TBufferFile(TBuffer::kRead,len);
#else
buf=new TBuffer(TBuffer::kRead,len);
#endif
memcpy(buf->Buffer(),(Char_t*)o->getStreamerInfo(),len);
buf->SetBufferOffset(0);
TList list;
buf->MapObject(&list);
list.Streamer(*buf);
delete buf;
TStreamerInfo *info;
TIter next(&list);
while ((info = (TStreamerInfo*)next())) {
if (info->IsA() != TStreamerInfo::Class()) {
Warning("HParamList::fillObject","not a TStreamerInfo object");
continue;
}
info->BuildCheck();
}
list.Clear();
}
len=o->getLength();
#if ROOT_VERSION_CODE > ROOT_VERSION(4,4,2)
buf=new TBufferFile(TBuffer::kRead,len);
#else
buf=new TBuffer(TBuffer::kRead,len);
#endif
memcpy(buf->Buffer(),(Char_t*)o->getParamValue(),len);
buf->SetBufferOffset(0);
buf->MapObject(obj);
obj->Streamer(*buf);
delete buf;
gFile=filesave;
return len;
}
Error("HParamList::fillObject","Not found: %s",name);
return 0;
}
Last change: Sat May 22 13:06:32 2010
Last generated: 2010-05-22 13:06
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.