Hi Christian, TTree::MakeCode does not support currently the case of one branch with more than one leaf. Use TTree::MakeClass instead. To generate the code via MakeClass, do: idTree.MakeClass(); This will generate idTree.h and idTree.C. Modify idTree.C as shown below and do: .L idTree.C idTree t t.Loop(); void idTree::Loop() { // In a Root session, you can do: // Root > .L idTree.C // Root > idTree t // Root > t.GetEntry(12); // Fill t data members with entry number 12 // Root > t.Show(); // Show values of entry 12 // Root > t.Show(16); // Read and show values of entry 16 // Root > t.Loop(); // Loop on all entries // // This is the loop skeleton // To read only selected branches, Insert statements like: // METHOD1: // fTree->SetBranchStatus("*",0); // disable all branches // fTree->SetBranchStatus("branchname",1); // activate branchname // METHOD2: replace line // fTree->GetEntry(i); // read all branches //by b_branchname->GetEntry(i); //read only this branch if (fTree == 0) return; Int_t nentries = Int_t(fTree->GetEntries()); Int_t nbytes = 0, nb = 0; for (Int_t jentry=0; jentry<nentries;jentry++) { Int_t ientry = LoadTree(jentry); //in case of a TChain, ientry is the entry number in the current file nb = fTree->GetEntry(jentry); nbytes += nb; if(jentry<100) { printf("idx,x,y,z= %8i,%8i,%8i,%8i\n",idBranch_idx,idBranch_x,idBranch_y,idBranch_z); } } printf("nentries= %8i, nbytes= %8i \n",nentries,nbytes); } Concerning your second question. You can have two or more Trees in the same loop. In the example above, you can add a second tree (say t2) and in the loop, do: t2->GetEntry(jentry); //if the loop index is the same, or t2->GetEntry(idx); //to read entry idx where idx is a variable of the 1st tree You can connect the second Tree t2 in the function Loop, or better modify the class idTree to add a member pointing to the second tree and connect it in the class constructor or Init function. Rene Brun cstrato@EUnet.at wrote: > > Dear ROOTers: > > Recently, I have downloaded version 2.24/04 of ROOT, this really > excellent framework, > to my PowerBook G3/Wallstreet running LinuxPPC. Everything did work > immediately. > > Since I am new to ROOT I am trying some code and have already some > questions: > > 1, I have stored an ascii-table (5 columns: num, idx, x, y, z) in one > TBranch > of a TTree. Now I would like to extract "x:y:z" for each idx. > > First I tried it interactively: > root [0] .x TestTree.C > root [3] idTree->Draw(">>myList","idx==2") > root [4] idTree->SetEventList(myList) > root [8] a=idTree->GetV1() > (Float_t*)0x30027010 > root [12] for(int i=0;i<40;i++) cout<<a[i]<<"," > root [13] cout<<endl > > In this way I can extract "x,y,z" using GetV1(), GetV2(), GetV3(). > > However, when I used TTree->MakeCode("Code4idTree.cc"), and use > printf() in the > loop of the automatically generated code, I get strange values instead > of my table. > > Can someone help me and tell me what I did wrong? > Below I enclose the files: > a, TestTree.C: this file stores the data in the tree > b, Code4idTree.cc: the automatically generated file with modified loop > only > c, Code4idTree1.cc: the automatically generated but modified file > > 2, I have a second ascii-table (4 columns: x, y, data1, data2), which I > have currently > stored in a Ttuple as: data1[x][y] and data2[x][y] > I would like to extract data1, data2 from this table for each idx of the > first table. > What is the best way to do this? > Should I store data1, data2 differently? > > Thank you very much in advance for your help > Christian > (Christian Stratowa, Vienna, Austria) > > APPENDICES > a, TestTree.C: this file stores the data in the tree > { > // example of macro to read data from ascii file mytest.txt > // and create a root file with a tree. > gROOT->Reset(); > #include <iostream.h> > > ifstream in; > in.open("mytest.txt", ios::in); > > Int_t num, idx, x, y, z; > typedef struct { > Int_t idx, x, y, z; > } INDEX; > // static INDEX id; > INDEX id; > > TFile *f = new TFile("TestTree.root","RECREATE"); > TTree *idTree = new TTree("idTree","data from file mytest.txt"); > TBranch *idBranch = idTree->Branch("idBranch",&id,"idx/I:x:y:z"); > > // read header line > Int_t nlines = 0; > if(nlines == 0) { > char header[81]; > in.getline(header,80); > nlines++; > } > > while (1) { > in >> num >> idx >> x >> y >> z; > if (!in.good()) break; > id.idx = idx; > id.x = x; > id.y = y; > id.z = z; > if (nlines < 5) printf("idx=%8i,z=%8i,x=%8i,y=%8i\n",idx,z,x,y); > idTree->Fill(); > nlines++; > } > printf(" found %d lines\n",nlines); > > in.close(); > > f->Write(); > } > > b, Code4idTree.cc: the automatically generated file with modified loop > only > { > ////////////////////////////////////////////////////////// > // This file has been automatically generated > // (Sun Jun 4 17:23:33 2000 by ROOT version2.24/04) > // from TTree idTree/data from file mytest.txt > // found on file: TestTree.root > ////////////////////////////////////////////////////////// > > //Reset ROOT and connect tree file > // gROOT->Reset(); > TFile *f = > (TFile*)gROOT->GetListOfFiles()->FindObject("TestTree.root"); > if (!f) { > f = new TFile("TestTree.root"); > } > TTree *idTree = (TTree*)gDirectory->Get("idTree"); > > //Declaration of leaves types > Int_t idBranch_idx; > Int_t idBranch_x; > Int_t idBranch_y; > Int_t idBranch_z; > > //Set branch addresses > idTree->SetBranchAddress("idBranch",&idBranch_idx); > idTree->SetBranchAddress("idBranch",&idBranch_x); > idTree->SetBranchAddress("idBranch",&idBranch_y); > idTree->SetBranchAddress("idBranch",&idBranch_z); > > // This is the loop skeleton > // To read only selected branches, Insert statements like: > // idTree->SetBranchStatus("*",0); // disable all branches > // TTreePlayer->SetBranchStatus("branchname",1); // activate branchname > > Int_t nentries = idTree->GetEntries(); > > Int_t nbytes = 0; > for (Int_t i=0; i<nentries;i++) { > nbytes += idTree->GetEntry(i); > if(i<100) { > printf("idx,x,y,z= > %8i,%8i,%8i,%8i\n",idBranch_idx,idBranch_x,idBranch_y,idBranch_z); > // printf("idx,x,y,z= \n"); > } > } > printf("nentries= %8i, nbytes= %8i \n",nentries,nbytes); > } > > c, Code4idTree1.cc: the automatically generated but modified file > { > ////////////////////////////////////////////////////////// > // This file has been automatically generated > // (Sun Jun 4 17:23:33 2000 by ROOT version2.24/04) > // from TTree idTree/data from file mytest.txt > // found on file: TestTree.root > ////////////////////////////////////////////////////////// > > //Reset ROOT and connect tree file > // gROOT->Reset(); > TFile *f = > (TFile*)gROOT->GetListOfFiles()->FindObject("TestTree.root"); > if (!f) { > f = new TFile("TestTree.root"); > } > TTree *idTree = (TTree*)gDirectory->Get("idTree"); > // TBranch *idBranch = idTree->GetBranch("idBranch"); > > //Declaration of leaves types > typedef struct { > Int_t idx, x, y, z; > } INDEX; > INDEX id; > > //Set branch addresses > idTree->SetBranchAddress("idBranch",&id.idx); > idTree->SetBranchAddress("idBranch",&id.x); > idTree->SetBranchAddress("idBranch",&id.y); > idTree->SetBranchAddress("idBranch",&id.z); > > // This is the loop skeleton > // To read only selected branches, Insert statements like: > // idTree->SetBranchStatus("*",0); // disable all branches > // TTreePlayer->SetBranchStatus("branchname",1); // activate branchname > > Int_t nentries = idTree->GetEntries(); > > Int_t nbytes = 0; > for (Int_t i=0; i<nentries;i++) { > nbytes += idTree->GetEntry(i); > // nbytes += idBranch->GetEntry(i); > if(i<100) { > printf("idx,x,y,z= %8i,%8i,%8i,%8i\n",id.idx,id.x,id.y,id.z); > } > } > printf("nentries= %8i, nbytes= %8i \n",nentries,nbytes); > }
This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:27 MET