ROOT courses1 The ROOT System A Data Access & Analysis Framework 4-5-6 February 2003 Ren é Brun/EP Trees.

Slides:



Advertisements
Similar presentations
Must-Know ROOT Class I/O/TGraph/Tntuple/Ttree/…. 1.
Advertisements

ROOT Root Commands and CINT Functions and Fitting (The Tree Viewer)
Chapter 18 - Data sources and datasets 1 Outline How to create a data source How to use a data source How to use Query Builder to build a simple query.
Postgraduate Computing Lectures ROOT 1 What is ROOT? Tool and a Framework for OO Data Analysis As a Tool –Enter commands to display and manipulate data.
Blueprint RTAGs1 Coherent Software Framework a Proposal LCG meeting CERN- 11 June Ren é Brun ftp://root.cern.ch/root/blueprint.ppt.
CHEP ' 2003David Chamont (CMS - LLR)1 Twelve Ways to Build CMS Crossings from Root Files Benefits and deficiencies of Root trees and clones when : - NOT.
Sept 11, 2003ROOT Day1, Suzanne Panacek39 ROOT An object oriented HEP analysis framework. Day 1.
XML I/O in ROOT S. Linev, R. Brun, H.G. Essel CHEP 2004.
Files and Streams. Java I/O File I/O I/O streams provide data input/output solutions to the programs. A stream can represent many different kinds of sources.
V0.05 ROOT 102 ROOT is an object oriented HEP analysis framework.
09-Jun-2005J. Adamczewski1 C++ course 2005 The ROOT framework 2.
21-Apr-2005J. Adamczewski1 DVEE C++ course 2005 The ROOT framework 1: Introduction.
ROOT I/O recent improvements Bottlenecks and Solutions Rene Brun December
Introduction to ROOT May May Rene Brun/CERN.
Compiler Construction
Introduction to ROOT1 Summer Students Lecture 20 July 2005 ftp://root.cern.ch/root/SummerStudents2005.ppt Introduction to ROOT.
File Systems CSCI What is a file? A file is information that is stored on disks or other external media.
Update on the new reconstruction software F. Noferini E. Fermi center INFN CNAF EEE Analysis Meeting - 14/09/20151.
Learning to Use Root for STAR Gene Van Buren (UCLA) for the STAR Collaboration Accessing STAR Data Programming for STAR (Makers) Star => Computing => Tutorials.
ROOT Fons Rademakers CERN. ROOT Tutorial Jammu What's ROOT?
1 Marek BiskupACAT2005PROO F Parallel Interactive and Batch HEP-Data Analysis with PROOF Maarten Ballintijn*, Marek Biskup**, Rene Brun**, Philippe Canal***,
CHEP 2003 March 22-28, 2003 POOL Data Storage, Cache and Conversion Mechanism Motivation Data access Generic model Experience & Conclusions D.Düllmann,
File Management Chapter 12. File Management File management system is considered part of the operating system Input to applications is by means of a file.
10/31/2015PHYS 3446 DØ Data Analysis with ROOT Venkat (for Dr.Yu)
ROOT for Data Analysis1 Intel discussion meeting CERN 5 Oct 2003 Ren é Brun CERN Distributed Data Analysis.
Update on the new reconstruction software F. Noferini E. Fermi center INFN CNAF EEE Analysis Meeting - 15/06/20151.
A Technical Validation Module for the offline Auger-Lecce, 17 September 2009  Design  The SValidStore Module  Example  Scripting  Status.
ROOT and Federated Data Stores What Features We Would Like Fons Rademakers CERN CC-IN2P3, Nov, 2011, Lyon, France.
Introduction to ROOT Practical Part Jan Fiete Grosse-Oetringhaus, CERN PH/ALICE Summer Student Lectures th July.
C++ Programming Basic Learning Prepared By The Smartpath Information systems
1 Chapter 20 – Data sources and datasets Outline How to create a data source How to use a data source How to use Query Builder to build a simple query.
Jul. 27, 2005 BESIII Software Meeting , IHEP 1 Physics Analysis with ROOT July 27, 2005 Yajun Mao School of Physics, Peking University.
17 December 1998Silvia Resconi ATLFast++ into LHC++: a first exercise The aim of the exercise: from generation to analysis using ATLFast++ algorithms into.
STAR Event data storage and management in STAR V. Perevoztchikov Brookhaven National Laboratory,USA.
Persistent Object References in ROOT1 Persistent Object References in ROOT I/O Status & Proposal CMS-ROOT meeting CERN- November 27 Ren é Brun ftp://root.cern.ch/root/refs.ppt.
Argonne Jamboree January 2010 Esteban Fullana AOD example analysis.
CBM Software Meeting 1 CBM Simulation & Analysis Framework Geant3 / Gean4 configuration M. Al-Turany, D. Bertini.
ROOT Progress Report1 ROOT Workshop 2001 FNAL June 13 Ren é Brun CERN
David Adams ATLAS DIAL: Distributed Interactive Analysis of Large datasets David Adams BNL August 5, 2002 BNL OMEGA talk.
Why Do We Need Files? Must store large amounts of data. Information stored must survive the termination of the process using it - that is, be persistent.
STAR Schema Evolution Implementation in ROOT I/O V. Perevoztchikov Brookhaven National Laboratory,USA.
PROOF and ALICE Analysis Facilities Arsen Hayrapetyan Yerevan Physics Institute, CERN.
Paul Scherrer Institut 5232 Villigen PSI ROME / / Matthias Schneebeli ROME Collaboration Meeting in Pisa Presented by Matthias Schneebeli.
ROOT Data bases access1 LCG Data base deployment workshop 11 October Ren é Brun CERN.
TTree::Draw What is it trying to be? Where is it going?
ROOT courses1 The ROOT System A Data Access & Analysis Framework February 2003 Ren é Brun/EP Input/Output.
General Purpose ROOT Utilities Victor Perevoztchikov, BNL.
Statistical feature extraction, calibration and numerical debugging Marian Ivanov.
1 Classes II Chapter 7 2 Introduction Continued study of –classes –data abstraction Prepare for operator overloading in next chapter Work with strings.
9/28/2005Philippe Canal, ROOT Workshop TTree / SQL Philippe Canal (FNAL) 2005 Root Workshop.
RootMaker v1.0.0 Jordan Damgov, Shuichi Kunori. Contents Introduction Root file - structure and objects File size and CPU time Example for root file analysis.
ROOT Workshop M.Frank LHCb/CERN Improvements in the I/O Area (*)  General I/O related improvements  Tree related issues  Plans (*) I present.
S.Linev: Go4 - J.Adamczewski, H.G.Essel, S.Linev ROOT 2005 New development in Go4.
Trees: New Developments1 Trees: New Developments Folders and Tasks ROOT Workshop 2001 June 13 FNAL Ren é Brun CERN
ROOT-CORE Team 1 Philippe Canal Markus Frank I/O Basic I/O, RDBMS interfaces, Trees.
Go4 Workshop J.Adamczewski-Musch, S.Linev Go4 advanced features.
C Programming Day 2. 2 Copyright © 2005, Infosys Technologies Ltd ER/CORP/CRS/LA07/003 Version No. 1.0 Union –mechanism to create user defined data types.
Paul Scherrer Institut 5232 Villigen PSI ROME / / Matthias Schneebeli ROME Root based Object oriented Midas Extension Presented by Matthias.
Joe Foster 1 This talk extends the one I gave in 2006 called Visualizing Data with ROOT. –
PROOF on multi-core machines G. GANIS CERN / PH-SFT for the ROOT team Workshop on Parallelization and MultiCore technologies for LHC, CERN, April 2008.
Installing and Using Evolve Evolve is written in Java and runs on any system with Java 1.6 Download Evolve from Unzip.
ANALYSIS TRAIN ON THE GRID Mihaela Gheata. AOD production train ◦ AOD production will be organized in a ‘train’ of tasks ◦ To maximize efficiency of full.
HYDRA Framework. Setup of software environment Setup of software environment Using the documentation Using the documentation How to compile a program.
Persistent Object References in ROOT1 Persistent Object References in ROOT I/O Status & Proposal LCG meeting CERN- 5 June Ren é Brun ftp://root.cern.ch/root/longrefs.ppt.
ROOT1 Hands-on Sami Kama. S.Kama ROOT1 Hands-On ISTAPP2011 Dogus Univ.07/02/ Download root file from indico.
ROOT Class Day 3 An Object Oriented Data Analysis Framework Day 3
Summer Students Lecture 21 July 2004
Recent Developments in ROOT I/O Support for foreign classes
Persistent Object References in ROOT I/O Status & Proposal
Zooming on ROOT files and Containers
Presentation transcript:

ROOT courses1 The ROOT System A Data Access & Analysis Framework February 2003 Ren é Brun/EP Trees

R.Brun LCG ROOT corses2

R.Brun LCG ROOT corses3 Memory Tree Each Node is a branch in the Tree tr T.Fill() T.GetEntry(6) T Memory

R.Brun LCG ROOT corses4 Tree Creation Example A few lines of code to create a Tree for structures that may be very complex

R.Brun LCG ROOT corses5 8 Branches of T 8 leaves of branch Electrons A double-click to histogram the leaf

R.Brun LCG ROOT corses6 The Tree Viewer & Analyzer A very powerful class supporting complex cuts, event lists, 1-d,2-d, 3-d views parallelism

R.Brun LCG ROOT corses7 Tree Friends tr Public read Public read User Write Entry # 8

R.Brun LCG ROOT corses8 Tree Friends Root > TFile f1(“tree1.root”); Root > tree.AddFriend(“tree2”,“tree2.root”) Root > tree.AddFriend(“tree3”,“tree3.root”); Root > tree.Draw(“x:a”,”k<c”); Root > tree.Draw(“x:tree2.x”,”sqrt(p)<b”); x Processing time independent of the number of friends unlike table joins in RDBMS Collaboration-wide public read Analysis group protected user private

R.Brun LCG ROOT corses9 Chains of Trees A TChain is a collection of Trees. Same semantics for TChains and TTrees root >.x h1chain.C root > chain.Process(“h1analysis.C”) { //creates a TChain to be used by the h1analysis.C class //the symbol H1 must point to a directory where the H1 data sets //have been installed TChain chain("h42"); chain.Add("$H1/dstarmb.root"); chain.Add("$H1/dstarp1a.root"); chain.Add("$H1/dstarp1b.root"); chain.Add("$H1/dstarp2.root"); }

R.Brun LCG ROOT corses10 Ntuples and Trees Ntuples support PAW-like ntuples and functions PAW ntuples/histograms can be imported Trees Extension of Ntuples for Objects Collection of branches (branch has its own buffer) Can input partial Event Can have several Trees in parallel Chains = collections of Trees

R.Brun LCG ROOT corses11 Why Trees ? Any object deriving from TObject can be written to a file with an associated key with object.Write() but not for event objects. However each key has an overhead in the directory structure in memory (about 60 bytes). Object.Write is very convenient for objects like histograms, detector objects, calibrations, but not for event objects.

R.Brun LCG ROOT corses12 Why Trees ? Trees have been designed to support very large collections of objects. The overhead in memory is in general less than 4 bytes per entry. Trees allow direct and random access to any entry (sequential access is the best) Trees have branches and leaves. One can read a subset of all branches. This can speed-up considerably the data analysis processes.

R.Brun LCG ROOT corses13 Adding a Branch Branch name Class name Address of the pointer to the Object (descendant of TObject) Buffer size (default = 32,000) Split level (default = 1) Event *event = new Event(); myTree->Branch(”eBranch","Event",&event,64000,1); Many Branch constructors Only a few shown here

R.Brun LCG ROOT corses14 Splitting a Branch Setting the split level (default = 1) Split level = 0Split level = 1 Example : tree->Branch("EvBr","Event",&ev,64000,0);

R.Brun LCG ROOT corses15 Adding Branches with a List of Variables Branch name Address: the address of the first item of a structure. Leaflist: all variable names and types Order the variables according to their size Example TBranch *b = tree->Branch ("Ev_Branch",&event, "ntrack/I:nseg:nvtex:flag/i:temp/F");

R.Brun LCG ROOT corses16 Why Trees ? PAW ntuples are a special case of Trees. Trees are designed to work with complex event objects. High level functions like TTree::Draw loop on all entries with selection expressions. Trees can be browsed via TBrowser Trees can be analized via TTreeViewer The PROOF system is designed to process chains of Trees in parallel in a GRID environment

R.Brun LCG ROOT corses17 Create a TTree Object A tree is a list of branches. The TTree Constructor: Tree Name (e.g. "myTree") Tree Title TTree *tree = new TTree("T","A ROOT tree");

R.Brun LCG ROOT corses18 ROOT I/O - Split - multifile Object in memory Streamer File1 File2 File3 Object in memory TAGs Tapes

R.Brun LCG ROOT corses19 Serial mode Split mode

R.Brun LCG ROOT corses20 Structure designed to support very large DBs

R.Brun LCG ROOT corses21 The Event class class Event : public TObject { private: char fType[20]; //event type Int_t fNtrack; //Number of tracks Int_t fNseg; //Number of track segments Int_t fNvertex; UInt_t fFlag; Float_t fTemperature; Int_t fMeasures[10]; Float_t fMatrix[4][4]; Float_t *fClosestDistance; //[fNvertex] EventHeader fEvtHdr; TClonesArray *fTracks; //->array with all tracks TRefArray *fHighPt; //array of High Pt tracks only TRefArray *fMuons; //array of Muon tracks only TRef fLastTrack; //reference pointer to last track TH1F *fH; //-> class EventHeader { private: Int_t fEvtNum; Int_t fRun; Int_t fDate; See $ROOTSYS/test/Event.h

R.Brun LCG ROOT corses22 The Track class class Track : public TObject { private: Float_t fPx; //X component of the momentum Float_t fPy; //Y component of the momentum Float_t fPz; //Z component of the momentum Float_t fRandom; //A random track quantity Float_t fMass2; //The mass square of this particle Float_t fBx; //X intercept at the vertex Float_t fBy; //Y intercept at the vertex Float_t fMeanCharge; //Mean charge deposition of all hits Float_t fXfirst; //X coordinate of the first point Float_t fXlast; //X coordinate of the last point Float_t fYfirst; //Y coordinate of the first point Float_t fYlast; //Y coordinate of the last point Float_t fZfirst; //Z coordinate of the first point Float_t fZlast; //Z coordinate of the last point Float_t fCharge; //Charge of this track Float_t fVertex[3]; //Track vertex position Int_t fNpoint; //Number of points for this track Short_t fValid; //Validity criterion

R.Brun LCG ROOT corses23 Event Builder void Event::Build(Int_t ev, Int_ntrack, Float_t ptmin) { Clear(); ……….. for (Int_t t = 0; t < ntrack; t++) AddTrack(random,ptmin); } Track *Event::AddTrack(Float_t random, Float_t ptmin) { // Add a new track to the list of tracks for this event. // To avoid calling the very time consuming operator new for each track, // the standard but not well know C++ operator "new with placement" // is called. If tracks[i] is 0, a new Track object will be created // otherwise the previous Track[i] will be overwritten. TClonesArray &tracks = *fTracks; Track *track = new(tracks[fNtrack++]) Track(random); //Save reference to last Track in the collection of Tracks fLastTrack = track; //Save reference in fHighPt if track is a high Pt track if (track->GetPt() > ptmin) fHighPt->Add(track); //Save reference in fMuons if track is a muon candidate if (track->GetMass2() Add(track); return track; }

R.Brun LCG ROOT corses24 Tree example Event (write) void demoe(int nevents) { //load shared lib with the Event class gSystem->Load("$ROOTSYS/test/libEvent"); //create a new ROOT file TFile f("demoe.root",”new"); //Create a ROOT Tree with one single top level branch int split = 99; //try also split=1 and split=0 int bufsize = 16000; Event *event = new Event; TTree T("T","Event demo tree"); T.Branch("event","Event",&event,bufsize,split); //Build Event in a loop and fill the Tree for (int i=0;i<nevents;i++) { event->Build(i); T.Fill(); } T.Print(); //Print Tree statistics T.Write(); //Write Tree header to the file } All the examples can be executed with CINT or the compiler root >.x demoe.C root >.x demoe.C++

R.Brun LCG ROOT corses25 Tree example Event (read 1) void demoer() { //load shared lib with the Event class gSystem->Load("$ROOTSYS/test/libEvent"); //connect ROOT file TFile *f = new TFile("demoe.root"); //Read Tree header and set top branch address Event *event = 0; TTree *T = (TTree*)f->Get("T"); T->SetBranchAddress("event",&event); //Loop on events and fill an histogram TH1F *h = new TH1F("hntrack","Number of tracks",100,580,620); int nevents = (int)T->GetEntries(); for (int i=0;i<nevents;i++) { T->GetEntry(i); h->Fill(event->GetNtrack()); } h->Draw(); } Rebuild the full event in memory

R.Brun LCG ROOT corses26 Tree example Event (read 2) void demoer2() { //load shared lib with the Event class gSystem->Load("$ROOTSYS/test/libEvent"); //connect ROOT file TFile *f = new TFile("demoe.root"); //Read Tree header and set top branch address Event *event = 0; TTree *T = (TTree*)f->Get("T"); T->SetBranchAddress("event",&event); Tbranch *bntrack = T->GetBranch(“fNtrack”); //Loop on events and fill an histogram TH1F *h = new TH1F("hntrack","Number of tracks",100,580,620); int nevents = (int)T->GetEntries(); for (int i=0;i<nevents;i++) { bntrack->GetEntry(i); h->Fill(event->GetNtrack()); } h->Draw(); } Read only one branch Much faster !

R.Brun LCG ROOT corses27 Tree example Event (read 3) void demoer3() { //load shared lib with the Event class gSystem->Load("$ROOTSYS/test/libEvent"); //connect ROOT file TFile *f = new TFile("demoe.root"); //Read Tree header TTree *T = (TTree*)f->Get("T"); //Histogram number of tracks via the TreePlayer T->Draw(“event->GetNtrack()”); }

R.Brun LCG ROOT corses28 Writing CMS PSimHit in a Tree void demo3() { //create a new ROOT file TFile f("demo3.root","recreate"); //Create a ROOT Tree with one single top level branch int split = 99; //you can try split=1 and split=0 int bufsize = 16000; PSimHit *hit = 0; TTree T("T","CMS demo tree"); T.Branch("hit","PSimHit",&hit,bufsize,split); //Create hits in a loop and fill the Tree TRandom r; for (int i=0;i<50000;i++) { delete hit; Local3DPoint pentry(r.Gaus(0,1), r.Gaus(0,1), r.Gaus(0,10)); Local3DPoint pexit (r.Gaus(0,3), r.Gaus(0,3), r.Gaus(50,20)); float pabs = 100*r.Rndm(); float tof = r.Gaus(1e-6,1e-8); float eloss= r.Landau(1e-3,1e-7); int ptype = i%2; int detId = i%20; int trackId= i%100; hit = new PSimHit(pentry,pexit,pabs,tof,eloss,ptype,detId,trackId); T.Fill(); } T.Print(); //Print Tree statistics T.Write(); //Write Tree header to the file }

R.Brun LCG ROOT corses29 Browsing the PSimHit Tree split = 0 *Tree :T : CMS demo tree * *Entries : : Total = bytes File Size = * * : : Tree compression factor = 2.13 * ****************************************************************************** *Br 0 :hit : * *Entries : : Total Size= bytes File Size = * *Baskets : 295 : Basket Size= bytes Compression= 2.13 * * * 1 branch only

R.Brun LCG ROOT corses30 Browsing the PSimHit Tree split = 1 * ***************************************************************************** *Tree :T : CMS demo tree * *Entries : : Total = bytes File Size = * * : : Tree compression factor = 2.60 * ****************************************************************************** *Branch :hit * *Entries : : BranchElement (see below) * * * *Br 0 :TObject : * *Entries : : Total Size= bytes File Size = * *Baskets : 56 : Basket Size= bytes Compression= 8.77 * * * *Br 1 :theEntryPoint : * *Entries : : Total Size= bytes File Size = * *Baskets : 119 : Basket Size= bytes Compression= 2.27 * * * *Br 2 :theExitPoint : * *Entries : : Total Size= bytes File Size = * *Baskets : 119 : Basket Size= bytes Compression= 2.29 * * * *Br 3 :thePabs : * *Entries : : Total Size= bytes File Size = * *Baskets : 12 : Basket Size= bytes Compression= 1.12 * * * *Br 4 :theTof : * *Entries : : Total Size= bytes File Size = * *Baskets : 12 : Basket Size= bytes Compression= 1.32 * * * *Br 5 :theEnergyLoss : * *Entries : : Total Size= bytes File Size = * *Baskets : 12 : Basket Size= bytes Compression= 1.56 * * * *Br 6 :theParticleType : * *Entries : : Total Size= bytes File Size = 1860 * *Baskets : 12 : Basket Size= bytes Compression= * * * *Br 7 :theDetUnitId : * *Entries : : Total Size= bytes File Size = 2298 * *Baskets : 12 : Basket Size= bytes Compression= * * * *Br 8 :theTrackId : * *Entries : : Total Size= bytes File Size = 4179 * *Baskets : 12 : Basket Size= bytes Compression= * * * 9 branches

R.Brun LCG ROOT corses31 Browsing the PSimHit Tree split = 99 ****************************************************************************** *Tree :T : CMS demo tree * *Entries : : Total = bytes File Size = * * : : Tree compression factor = 1.78 * ****************************************************************************** *Branch :hit * *Entries : : BranchElement (see below) * * * *Br 0 :fUniqueID : * *Entries : : Total Size= bytes File Size = 1272 * *Baskets : 12 : Basket Size= bytes Compression= * * * *Br 1 :fBits : * *Entries : : Total Size= bytes File Size = 1260 * *Baskets : 12 : Basket Size= bytes Compression= * * * *Br 2 :theEntryPoint : * *Entries : : Total Size= 0 bytes File Size = 0 * *Baskets : 0 : Basket Size= bytes Compression= 1.00 * * * *Br 3 :theEntryPoint.theVector.theX : * *Entries : : Total Size= bytes File Size = * *Baskets : 12 : Basket Size= bytes Compression= 1.08 * * * *Br 4 :theEntryPoint.theVector.theY : * *Entries : : Total Size= bytes File Size = * *Baskets : 12 : Basket Size= bytes Compression= 1.08 * * * *Br 5 :theEntryPoint.theVector.theZ : * *Entries : : Total Size= bytes File Size = * *Baskets : 12 : Basket Size= bytes Compression= 1.08 * * * *Br 6 :theExitPoint : * *Entries : : Total Size= 0 bytes File Size = 0 * *Baskets : 0 : Basket Size= bytes Compression= 1.00 * * * *Br 7 :theExitPoint.theVector.theX : * *Entries : : Total Size= bytes File Size = * *Baskets : 12 : Basket Size= bytes Compression= 1.08 * * * *Br 8 :theExitPoint.theVector.theY : * *Entries : : Total Size= bytes File Size = * *Baskets : 12 : Basket Size= bytes Compression= 1.08 * * * *Br 9 :theExitPoint.theVector.theZ : * *Entries : : Total Size= bytes File Size = * *Baskets : 12 : Basket Size= bytes Compression= 1.14 * * * *Br 10 :thePabs : * *Entries : : Total Size= bytes File Size = * *Baskets : 12 : Basket Size= bytes Compression= 1.12 * * * *Br 11 :theTof : * *Entries : : Total Size= bytes File Size = * *Baskets : 12 : Basket Size= bytes Compression= 1.32 * * * *Br 12 :theEnergyLoss : * *Entries : : Total Size= bytes File Size = * *Baskets : 12 : Basket Size= bytes Compression= 1.56 * * * *Br 13 :theParticleType : * *Entries : : Total Size= bytes File Size = 1860 * *Baskets : 12 : Basket Size= bytes Compression= * * * *Br 14 :theDetUnitId : * *Entries : : Total Size= bytes File Size = 2298 * *Baskets : 12 : Basket Size= bytes Compression= * * * *Br 15 :theTrackId : * *Entries : : Total Size= bytes File Size = 4179 * *Baskets : 12 : Basket Size= bytes Compression= * * * 16 branches Double click produces this histogram

R.Brun LCG ROOT corses32 Collections of Hits A more realistic Tree will have A collection of Detectors Each detector one or more collection of hits

R.Brun LCG ROOT corses33 36 branches in Tree T 19 leaves in branch fDele

R.Brun LCG ROOT corses34 8 Branches of T 8 leaves of branch Electrons A double-click to histogram the leaf

R.Brun LCG ROOT corses35 The Tree Viewer & Analyzer A very powerful class supporting complex cuts, event lists, 1-d,2-d, 3-d views parallelism

R.Brun LCG ROOT corses36 Chains Scenario: Perform an analysis using multiple ROOT files. All files are of the same structure and have the same tree. Chains are collections of chains or files Chains can be built automatically by quering the run/file catalog

R.Brun LCG ROOT corses37 The “No Shared Library” case There are many applications for which it does not make sense to read data without the code of the corresponding classes. In true OO, you want to exploit Data Hiding and rely on the functional interface. However, there are also cases where the functional interface is not necessary (PAW ntuples). It is nice to be able to browse any type of file without any code. May be you cannot do much, but it gives some confidence that you can always read your data sets. We have seen a religious debate on this subject. Our conclusion was that we had to support these two modes of operation. Support for the “No Shared Lib case” is non trivial

R.Brun LCG ROOT corses38 read/query Trees without the classes

R.Brun LCG ROOT corses39 TFile::MakeProject Generate the classes header files Compile them make a shared lib link the shared lib

R.Brun LCG ROOT corses40 TFile::MakeProject All necessary header files are included Comments preserved Can do I/O Inspect Browse,etc