35 #include <TDirectory.h> 36 #include <TObjArray.h> 54 TFile *ftest =
new TFile(
"teststreamer.root",
"recreate");
55 if (!ftest) ftest =
new TFile(
"teststreamer.root",
"new");
64 TObject *po =
new TObject;
65 TObject *po2 =
new TObject;
66 for (Int_t i=0;i<100000;i++) {
69 po2->SetUniqueID(i*100);
78 stream1<<
"i="<<i<<
"ch="<<ch<<
"f="<<f<<
"po="<<po<<
"\n";
84 stream2<<f2<<po2<<
"\n";
106 TFile* file =
new TFile(
"test.root",
"recreate");
112 TObject *po =
new TObject;
113 TObject *po2 =
new TObject;
114 for (Int_t i=0;i<100000;i++) {
117 po2->SetUniqueID(i*100);
127 mistream<<
"TreeIdentifier"<<
"i="<<i<<
"ch="<<ch<<
"f="<<f<<
"po="<<po<<
"\n";
133 mistream<<
"TreeK"<<f<<po<<
"\n";
134 mistream<<
"TreeK"<<f2<<po2<<
"\n";
159 TObject *po =
new TObject;
160 TObject *po2 =
new TObject;
161 for (Int_t i=0;i<100000;i++) {
164 po2->SetUniqueID(i*100);
174 mistream<<
"TreeIdentifier"<<
"i="<<i<<
"ch="<<ch<<
"f="<<f<<
"po="<<po<<
"\n";
180 mistream<<
"TreeK"<<f<<po<<
"\n";
181 mistream<<
"TreeK"<<f2<<po2<<
"\n";
214 if (scale<=0) scale=1;
215 if (scale>1) scale=1;
217 for (Int_t ientry=0; ientry<testEntries; ientry++){
220 for (Int_t j=0; j<200; j++) vecRandom[j]=j+ientry+0.1*gRandom->Rndm();
221 Bool_t isSelected= (gRandom->Rndm()<
scale);
223 TVectorD *pvecSparse = isSelected ? &vecRandom:0;
224 TVectorD *pvecSparse0 = isSelected ? &vecRandom:0;
225 TVectorD *pvecSparse1 = isSelected ? &vecRandom:&vecZerro;
229 pvecSparse=&vecRandom;
231 (*pcstream)<<
"Full"<<
235 (*pcstream)<<
"SparseSkip"<<
237 "vec.="<<pvecSparse<<
239 (*pcstream)<<
"SparseSkip0"<<
241 "vec.="<<pvecSparse0<<
243 (*pcstream)<<
"SparseZerro"<<
245 "vec.="<<pvecSparse1<<
258 TTree * treeFull = (TTree*)f->Get(
"Full");
259 TTree * treeSparseSkip = (TTree*)f->Get(
"SparseSkip");
260 TTree * treeSparseSkip0 = (TTree*)f->Get(
"SparseSkip0");
261 TTree * treeSparseZerro = (TTree*)f->Get(
"SparseZerro");
264 Double_t ratio=(1./
scale)*treeSparseSkip->GetZipBytes()/Double_t(treeFull->GetZipBytes());
265 Double_t ratio0=(1./
scale)*treeSparseSkip0->GetZipBytes()/Double_t(treeFull->GetZipBytes());
266 Double_t ratio1=(1./
scale)*treeSparseZerro->GetZipBytes()/Double_t(treeFull->GetZipBytes());
267 printf(
"#UnitTest:\tTTreeSRedirector::TestSparse(%f)\tRatioSkip\t%f\n",scale,ratio);
268 printf(
"#UnitTest:\tTTreeSRedirector::TestSparse(%f)\tRatioSkip0\t%f\n",scale,ratio0);
269 printf(
"#UnitTest:\tTTreeSRedirector::TestSparse(%f)\tRatioZerro\t%f\n",scale,ratio1);
271 Int_t outlyersSparseSkip=treeSparseSkip->Draw(
"1",
"(vec.fElements-ientry-Iteration$-0.5)>0.5",
"goff");
272 Int_t outlyersSparseSkip0=treeSparseSkip0->Draw(
"1",
"(vec.fElements-ientry-Iteration$-0.5)>0.5",
"goff");
273 printf(
"#UnitTest:\tTTreeSRedirector::TestSparse(%f)\tOutlyersSkip\t%d\n",scale,outlyersSparseSkip!=0);
274 printf(
"#UnitTest:\tTTreeSRedirector::TestSparse(%f)\tOutlyersSkip0\t%d\n",scale,outlyersSparseSkip0!=0);
277 Int_t entries=treeFull->GetEntries();
278 Int_t entries0=treeSparseSkip0->GetEntries();
279 Bool_t isOKStat =(entries==entries0);
280 printf(
"#UnitTest:\tTTreeSRedirector::TestSparse(%f)\tEntries\t%d\n",scale,isOKStat);
284 treeSparseSkip0->SetBranchAddress(
"vec.",&pvecRead);
286 for (Int_t ientry=0; ientry<testEntries; ientry++){
287 if (!pvecRead)
continue;
288 if (pvecRead->GetNrows()==0)
continue;
289 if (TMath::Abs((*pvecRead)[0]-ientry)>0.5) readOK=kFALSE;
291 printf(
"#UnitTest:\tTTreeSRedirector::TestSparse(%f)\tReadOK\t%d\n",scale,readOK);
294 Bool_t isOK=(outlyersSparseSkip0==0)&&isOKStat&&readOK;
295 printf(
"#UnitTest:\tTTreeSRedirector::TestSparse(%f)\tisOk\t%d\n",scale,isOK);
338 TDirectory * backup = gDirectory;
341 if (backup) backup->cd();
364 for (Int_t i=0;i<entries;i++){
366 if (!layout)
continue;
373 TDirectory * backup = gDirectory;
376 snprintf(chname,100,
"Tree%d",
id);
380 if (backup) backup->cd();
390 TDirectory * backup = gDirectory;
394 clayout->SetName(name);
397 if (backup) backup->cd();
414 TDirectory * backup = gDirectory;
418 clayout->SetName(name);
420 if (backup) backup->cd();
431 TDirectory * backup = gDirectory;
435 for (Int_t i=0;i<entries;i++){
438 if (layout->
fTree) layout->
fTree->Write(layout->GetName());
444 if (backup) backup->cd();
486 TNamed(treename,treename),
499 if (!
fTree)
fTree =
new TTree(treename, treename);
537 snprintf(name,1000,
"%s",(
const char*)
fNextName);
546 element->SetName(name);
568 if (pObject) pClass=pObject->IsA();
577 snprintf(name,1000,
"%s",(
const char*)
fNextName);
586 element->SetName(name);
596 if (element->
fClass!=pClass && pClass!=0){
612 Int_t entriesFilled=0;
614 fTree =
new TTree(GetName(),GetName());
616 entriesFilled=
fTree->GetEntries();
618 Int_t entries =
fElements->GetEntriesFast();
621 for (Int_t i=0;i<entries;i++){
626 if (element->GetName()[0]==0){
627 snprintf(bname1,1000,
"B%d",i);
630 snprintf(bname1,1000,
"%s",element->GetName());
633 if (element->
fClass->GetBaseClass(
"TClonesArray")){
635 if (entriesFilled!=0) {
637 for (Int_t ientry=0; ientry<entriesFilled;ientry++) br->Fill();
638 br->SetAddress(&(element->
fPointer));
644 if (entriesFilled!=0) {
646 for (Int_t ientry=0; ientry<entriesFilled;ientry++) br->Fill();
647 br->SetAddress(&(element->
fPointer));
654 snprintf(bname2,1000,
"%s/%c",bname1,element->
GetType());
655 TBranch * br =
fTree->Branch(bname1,element->
fPointer,bname2);
656 if (entriesFilled!=0) {
658 for (Int_t ientry=0; ientry<entriesFilled;ientry++) br->Fill();
673 Int_t entries=
fElements->GetEntriesFast();
675 for (Int_t i=0;i<entries;i++){
679 TBranch * br = (TBranch*)
fBranches->At(i);
713 if (
fTree->GetEntries()>0)
return *
this;
717 for (last=0;;last++){
718 if (name[last]==0)
break;
721 if (last>0&&name[last-1]==
'='){
745 if (tree==NULL)
return;
746 TObjArray *brArray = tree->GetListOfBranches();
747 TObjArray *lArray = tree->GetListOfLeaves();
748 for (Int_t i = 0; i < brArray->GetLast(); i++) {
749 TBranch *br = (TBranch *) brArray->At(i);
750 if (TString(br->GetTitle()).Contains(br->GetName()) == 0) {
751 TString brTitle(br->GetTitle());
752 Int_t pos = brTitle.First(
"/");
753 TString leafName =
"";
754 if (pos < brTitle.Length()) {
756 leafName = TString::Format(
"%s", brTitle.Data()).Data();
757 TLeaf * leaf = (TLeaf*)lArray->FindObject(leafName);
759 leaf->SetName(br->GetName());
760 leaf->SetTitle(br->GetName());
761 br->SetTitle(TString::Format(
"%s/%s",br->GetName(),&(brTitle.Data()[pos+1])).Data());
printf("Chi2/npoints = %f\n", TMath::Sqrt(chi2/npoints))
Int_t CheckIn(Char_t type, void *pointer)
TFile * Open(const char *filename, Long64_t &nevents)
TTreeStream(const char *treename, TTree *externalTree=NULL)
TTreeSRedirector(const char *fname="", const char *option="update")
static void UnitTestSparse(Double_t scale, Int_t testEntries)
TTreeSRedirector * pcstream
TTreeStream & operator<<(Bool_t &b)
void SetPointer(void *pointer)
void SetDirectory(TDirectory *sfile)
virtual ~TTreeSRedirector()
TTreeDataElement(Char_t type)
virtual TTreeStream & operator<<(Int_t id)
static void FixLeafNameBug(TTree *tree)
static Bool_t IsDisabled()
void SetExternalTree(const char *name, TTree *externalTree)
class TVectorT< Double_t > TVectorD
void StoreObject(TObject *object)
static void UnitTest(Int_t testEntries=5000)