Logo ROOT  
Reference Guide
 
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
Loading...
Searching...
No Matches
tree109_friend.C File Reference

Detailed Description

View in nbviewer Open in SWAN
Illustrates how to use Tree friends:

  • create a simple TTree
  • Copy a subset of this TTree to a new TTree
  • Create a Tree Index
  • Make a friend TTree
  • compare two TTrees
  • Draw a variable from the first tree versus a variable in the friend Tree

You can run this tutorial with:

ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.

or, variants like:

root > .L tree109_friend.C+
root > CompareTrees();
root > DrawFriend();
******************************************************************************
*Tree :T : test friend trees *
*Entries : 10000 : Total = 203762 bytes File Size = 94821 *
* : : Tree compression factor = 1.69 *
******************************************************************************
*Br 0 :Run : Run/I *
*Entries : 10000 : Total Size= 40698 bytes File Size = 265 *
*Baskets : 1 : Basket Size= 32000 bytes Compression= 120.75 *
*............................................................................*
*Br 1 :Event : Event/I *
*Entries : 10000 : Total Size= 40712 bytes File Size = 11231 *
*Baskets : 1 : Basket Size= 32000 bytes Compression= 2.85 *
*............................................................................*
*Br 2 :x : x/F *
*Entries : 10000 : Total Size= 40684 bytes File Size = 27116 *
*Baskets : 1 : Basket Size= 32000 bytes Compression= 1.18 *
*............................................................................*
*Br 3 :y : y/F *
*Entries : 10000 : Total Size= 40684 bytes File Size = 27035 *
*Baskets : 1 : Basket Size= 32000 bytes Compression= 1.18 *
*............................................................................*
*Br 4 :z : z/F *
*Entries : 10000 : Total Size= 40684 bytes File Size = 29174 *
*Baskets : 1 : Basket Size= 32000 bytes Compression= 1.10 *
*............................................................................*
******************************************************************************
*Tree :TF : test friend trees *
*Entries : 8460 : Total = 375780 bytes File Size = 128536 *
* : : Tree compression factor = 1.69 *
******************************************************************************
*Br 0 :Run : Run/I *
*Entries : 8460 : Total Size= 34463 bytes File Size = 374 *
*Baskets : 2 : Basket Size= 32000 bytes Compression= 90.84 *
*............................................................................*
*Br 1 :Event : Event/I *
*Entries : 8460 : Total Size= 34475 bytes File Size = 12152 *
*Baskets : 2 : Basket Size= 32000 bytes Compression= 2.80 *
*............................................................................*
*Br 2 :x : x/F *
*Entries : 8460 : Total Size= 34451 bytes File Size = 28849 *
*Baskets : 2 : Basket Size= 32000 bytes Compression= 1.18 *
*............................................................................*
*Br 3 :y : y/F *
*Entries : 8460 : Total Size= 34451 bytes File Size = 28757 *
*Baskets : 2 : Basket Size= 32000 bytes Compression= 1.18 *
*............................................................................*
*Br 4 :z : z/F *
*Entries : 8460 : Total Size= 34451 bytes File Size = 30674 *
*Baskets : 2 : Basket Size= 32000 bytes Compression= 1.11 *
*............................................................................*
nok = 8460, fentries=8460
#include "TTree.h"
#include "TFile.h"
#include "TRandom.h"
#include "TTree.h"
#include "TTree.h"
Int_t Run, Event;
Float_t x, y, z;
{
// create a simple TTree with 5 branches
// Two branches ("Run" and "Event") will be used to index the Tree
auto f = TFile::Open("treeparent.root", "recreate");
auto T = new TTree("T", "test friend trees");
T->Branch("Run", &Run, "Run/I");
T->Branch("Event", &Event, "Event/I");
T->Branch("x", &x, "x/F");
T->Branch("y", &y, "y/F");
T->Branch("z", &z, "z/F");
for (Int_t i=0; i<10000; i++) {
if (i < 5000)
Run = 1;
else
Run = 2;
Event = i;
x = r.Gaus(10, 1);
y = r.Gaus(20, 2);
z = r.Landau(2, 1);
T->Fill();
}
T->Print();
T->Write();
delete f;
}
{
// Open the file created by CreateParentTree
// Copy a subset of the TTree into a new TTree
// (see also tutorials tree110_copy.C, tree111_copy.C and tree112_copy.C)
// Create an index on the new TTree ("Run", "Event")
// Write the new TTree (including its index)
auto f = TFile::Open("treeparent.root");
auto T = f->Get<TTree>("T");
auto ff = TFile::Open("treefriend.root", "recreate");
auto TF = T->CopyTree("z<10");
TF->SetName("TF");
TF->BuildIndex("Run", "Event");
TF->Write();
TF->Print();
delete ff;
}
{
// The two TTrees created above are compared.
// The subset of entries in the small TTree must be identical
// to the entries in the original TTree.
Int_t fRun, fEvent;
auto f = TFile::Open("treeparent.root");
auto T = f->Get<TTree>("T");
auto ff = TFile::Open("treefriend.root");
auto TF = ff->Get<TTree>("TF");
T->SetBranchAddress("Run", &Run);
T->SetBranchAddress("Event", &Event);
T->SetBranchAddress("x", &x);
T->SetBranchAddress("y", &y);
T->SetBranchAddress("z", &z);
TF->SetBranchAddress("Run", &fRun);
TF->SetBranchAddress("Event", &fEvent);
TF->SetBranchAddress("x", &fx);
TF->SetBranchAddress("y", &fy);
TF->SetBranchAddress("z", &fz);
T->AddFriend(TF);
Long64_t nentries = T->GetEntries();
Int_t nok = 0;
for (Long64_t i=0; i<nentries; i++) {
T->GetEntry(i);
if (fRun == Run && fEvent==Event && x==fx && y==fy && z==fz) {
nok++;
} else {
if (TF->GetEntryWithIndex(Run, Event) > 0) {
if (i <100)
printf("i=%lld, Run=%d, Event=%d, x=%g, y=%g, z=%g : fRun=%d, fEvent=%d, fx=%g, fy=%g, fz=%g\n",
i, Run, Event, x, y, z, fRun, fEvent, fx, fy, fz);
}
}
}
printf("nok = %d, fentries=%lld\n", nok, TF->GetEntries());
delete f;
delete ff;
}
void DrawFriend()
{
// Draw a scatter plot of variable x in the parent TTree versus
// the same variable in the subtree.
// This should produce points along a straight line.
auto f = TFile::Open("treeparent.root");
auto T = f->Get<TTree>("T");
T->AddFriend("TF", "treefriend.root");
T->Draw("x:TF.x");
}
{
}
#define f(i)
Definition RSha256.hxx:104
int Int_t
Definition RtypesCore.h:45
float Float_t
Definition RtypesCore.h:57
long long Long64_t
Definition RtypesCore.h:69
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t r
int nentries
static TFile * Open(const char *name, Option_t *option="", const char *ftitle="", Int_t compress=ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault, Int_t netopt=0)
Create / open a file.
Definition TFile.cxx:4131
This is the base class for the ROOT Random number generators.
Definition TRandom.h:27
A TTree represents a columnar dataset.
Definition TTree.h:79
virtual TFriendElement * AddFriend(const char *treename, const char *filename="")
Add a TFriendElement to the list of friends.
Definition TTree.cxx:1326
virtual Int_t SetBranchAddress(const char *bname, void *add, TBranch **ptr=nullptr)
Change branch address, dealing with clone trees properly.
Definition TTree.cxx:8483
Double_t y[n]
Definition legend1.C:17
Double_t x[n]
Definition legend1.C:17
Author
Rene Brun

Definition in file tree109_friend.C.