====== Read data from text file ======
To read data from a text file into a tree all you need are the following two lines
TTree *myTree = new TTree("mytree","data from ascii file");
Long64_t nlines = myTree->ReadFile(filename,"col1:col2:col3");
=== Dynamic Branche Names ===
If you do not give the structure, the first line of your file must contain the tree definition
bin:hist1:hist2
1 12 13
[...]
To use this tree you then need to get the branch names
TTree *myTree = new TTree("mytree","data from ascii file");
Long64_t nlines = myTree->ReadFile(filename);
TString col0Name = T->GetListOfBranches()->At(0)->GetName();
TString col1Name = T->GetListOfBranches()->At(1)->GetName();
TString col2Name = T->GetListOfBranches()->At(2)->GetName();
Float_t bin,hist1,hist2;
T->SetBranchAddress(col0Name.Data(),&bin);
T->SetBranchAddress(col1Name.Data(),&hist1);
T->SetBranchAddress(col2Name.Data(),&hist2);
=== Dynamic Tree Structure ===
You can extend this idea to plot all histograms in an unknown tree.
The following code reads a tree form a datafile with a arbitrary number of columns
and creates a histogram for each of them.
/** Load Data into Tree **/
TTree *T = new TTree("myT","data from ascii file");
Long64_t nlines = T->ReadFile(filename);
/** Attache memory to tree **/
Int_t nCols = T->GetListOfBranches()->GetEntries();
std::vector entry(nCols, 0);
for (Int_t i=0; i < nCols; i++) {
TString colName = T->GetListOfBranches()->At(i)->GetName();
T->SetBranchAddress(colName.Data(),&(entry[i]));
}
/** Calculate binning **/
Int_t nentries = (Int_t)T->GetEntries();
T->GetEntry(0);
Float_t first = entry[0];
T->GetEntry(1);
Float_t second = entry[0];
Float_t step = second-first;
first = first - step/2;
Float_t last = first+step*(nlines);
/** Create Histograms **/
TH1F *h;
TObjArray histograms;
for (Int_t i = 0; i < nCols; i++) {
TString hName = Form("hist%d",i);
if (i == 1) {
h = new TH1F(hName,histTitle,nlines,first,last);
} else {
h = new TH1F(hName,"",nlines,first,last);
}
histograms.AddLast(h);
}
/** Fill Histograms **/
for (Int_t i=0;iGetEntry(i);
i++;
for (Int_t col = 1; col < nCols; col++) {
h = dynamic_cast(histograms[col]);
h->SetBinContent(i, entry[col]);
}
}