# Presentation: 670983

## ROOT Progress Report

- ROOT Workshop 2001 FNAL
- June 13
- René Brun
- CERN

- http://root.cern.ch

- CERN School of Computing

## Project History

- Jan 95: Thinking/writing/rewriting/???
- November 95: Public seminar, show Root 0.5
- Spring 96: decision to use CINT
- Jan 97: Root version 1.0
- Jan 98: Root version 2.0
- Mar 99: Root version 2.21/08 (1st Root workshop FNAL)
- Feb 00: Root version 2.23/12 (2nd Root workshop CERN)
- Sep 00: Root version 2.25/03
- Mar 01: Root version 3.00/06
- Jun 01:  Root version 3.01/05 (3rd Root workshop at FNAL)

- In 1994, fundamental divergence of opinions in Application Software group in IT. The PAW/Geant3 team is dismantled.

- Fortran90
- ???

- C++,
- Commercial Software

- C++, Open Source
- ROOT

- CERN School of Computing

- 17 - 30 Sept. 2000

## ROOT: an Evolving System

- The ROOT system has been in continuous development since 1995 surviving major changes, major enhancements and an ever increasing number of users.
- In the same way that Root2001 is far from the original Root1995, we expect that Root2006 will include many contributions reflecting the continuous changes and new ideas in the field of computing.
- This implies a strong cooperation between software developers in the major experiments.
- Root is being developed in very close cooperation with a cloud of software developers in small, medium and large experiments. Computer scientists from non-HEP fields are also contributing.

- CERN School of Computing

- 17 - 30 Sept. 2000

## ROOT team today

- CERN School of Computing

- 17 - 30 Sept. 2000

## Plan of talk

- In this talk, I will review the main developments in version 2.25, 3.00 and 3.01.
- Focusing on the I/O aspects
- CINT will be covered by Masa
- System classes and GUI by Fons
- ROOT GUI on Windows by Fons and Bertrand
- Trees and related things: see my next talk
- Documentation: see Suzanne’s talk

- CERN School of Computing

- 17 - 30 Sept. 2000

## Version 2.25 (1) Sep 00

- In March 2000, move to CVS
- Makefile system
- Modularization of the libraries
- ACLIC
- TLatex, TSpline
- TPrincipal, TMultiDimFit
- TTree::MakeClass, MakeSelector
- see talk on Trees
- TFolder, TTask
- see talk on Folders and tasks
- Float_t --> Double_t in graphics classes + TH1 + TGraph

- CERN School of Computing

- 17 - 30 Sept. 2000

## ACLICby Philippe Canal

- Automatic Compiler Linker Interface to CINT
- .x hsimple.cxx (via CINT)
- .x hsimple.cxx+ (via native compiler/linker)
- second call to .x hsimple.cxx+ will not recompile if hsimple.cxx is not modified since previous call
- .x hsimple.cxx++ (same, force compilation)
- Same behavior on all systems
- We recommend to write always valid C++ with the include files specified. This works for C++ and CINT.

- CERN School of Computing

- 17 - 30 Sept. 2000

## ACLIC example

- Root > .x hsimple.C
- Root > .x hsimple.C+

- Add includes
- normal C++

- CERN School of Computing

- 17 - 30 Sept. 2000

## TLatex formula emulator

- CERN School of Computing

- 17 - 30 Sept. 2000

## TPrincipal by Christian Holm Christensen

- Principal Components Analysis class
- Translation in C++ of LINTRA (cernlib)
- Extensive documentation at URL:
- http://root.cern.ch/root/html/TPrincipal.html
- Tutorial example
- $ROOTSYS/tutorials/principal.C

- CERN School of Computing

- 17 - 30 Sept. 2000

## TMultiDimFit by Christian Holm Christensen

- MultiDimensional Parameterisation and Fit
- Translation in C++ of MUDIFI
- Extensive documentation at URL:
- http://root.cern.ch/root/html/TMultiDimFit.html
- Tutorial example
- $ROOTSYS/tutorials/multidimfit.C

- CERN School of Computing

- 17 - 30 Sept. 2000

## New Histogram type TH1Kby Victor Perevoztchikov

**TH1K class supports ****the nearest K Neighbors method****,  widely used in cluster analysis. **
**This method is especially useful for small statistics.**
**     ****In this method :  DensityOfProbability ~ 1/DistanceToNearestKthNeighbor**
**     ****TH1K::TH1K(name,title,nbins,xlow,xup,K=0)**
**     ****differs from TH1F only by "K"**
**     ****K - is the order of K Neighbors method, usually >=3**
**     ****K = 0, means default, where K is selected by TH1K in such a way**
**            ****that DistanceToNearestKthNeighbor > BinWidth and K >=3**

- A TH1F and TH1K
- with 400 bins
- and 200 entries

- CERN School of Computing

- 17 - 30 Sept. 2000

## Version 3.00

- Constness in many classes (TObject)
- TStreamerInfo
- rootcint supports more complex C++
- TFile::ShowStreamerInfo
- TFile::MakeProject
- Long_t portable format
- Parallel Sockets
- Many improvements in GUI
- new TTreeViewer
- new classes TBits TMultiGraph TXTRu, TH1K
- Font size in pixels (precision 3)
- new test suite bench
- many new tutorials

- CERN School of Computing

- 17 - 30 Sept. 2000

## ROOT classes are const aware

- We had to do it. Helps in making your functions const
- Has generated some backward incompatibility
- Warning: compilers are poor in reporting potential conflicts when redefining functions in derived classes

- Example
- TObject

- CERN School of Computing

- 17 - 30 Sept. 2000

## New class TBits

- CERN School of Computing

- 17 - 30 Sept. 2000

## New class TMultiGraph

- CERN School of Computing

- 17 - 30 Sept. 2000

## New geometry class TXTRUby Robert Hatcher

- The 15 GEANTshapes
- seen in the X3D viewer

- A TXTRU example in OpenInventor
- XTRU is a poly-extrusion with fixed outline
- shape in x-y, a sequence of z-extents
- and two end faces perpendicular to the z axis

- CERN School of Computing

- 17 - 30 Sept. 2000

## The Tree Viewer & Analyzer

- A very powerful class
- supporting
- complex cuts,
- event lists,
- 1-d,2-d, 3-d views
- parallelism

- CERN School of Computing

- 17 - 30 Sept. 2000

## Version 3.01

- New class TBranchElement
- new branch style by default
- split/no-split mode symmetric
- Most restrictions in split mode removed
- TClonesArray accept more complex classes
- Tree Friends
- Many improvements in TTreeFormula
- (thanks Philippe Canal)
- Trees can be generated from Folders
- Can read/query Trees without the classes
- Open Inventor Interface

- See talk
- on Trees

- See talk
- on Folders

- CERN School of Computing

- 17 - 30 Sept. 2000

## ROOT + OpenInventor

- CMS with Geant3
- converted
- via g2root
- to ROOT TNodes

- CERN School of Computing

- 17 - 30 Sept. 2000

## ROOT and the WEB

- An Apache Web-server plug-in module is being developed  by Valeriy OnuChin.
- Provides interactive access to ROOT files, CINT macros and all the graphics. Web pages generated on the fly.
- Interesting alternative to PHP using C++ as an embedded scripting system with full access to user classes dynamically
- See talk by Valeriy Friday morning

- CERN School of Computing

- 17 - 30 Sept. 2000

## Evolution of ROOT I/O

- Hand-written Streamers
- Streamers generated via rootcint
- Support for Class Versions
- Support for ByteCount
- Several attempts to introduce automatic class evolution
- Persistent class Dictionary written to files
- rootcint modified to generate automatic Streamers
- can generate code for “DataObjects” classes in a file
- Support for STL and more complex C++ cases
- Trees take advantage of the new scheme
- Can read files without the classes

- 3.00

- 3.01

- CERN School of Computing

- 17 - 30 Sept. 2000

## ROOT Data Base Model

- Put Event write-once data in an object store
- via object.Write()   or Trees in split/no-split modes
- Use a RDBMS for :
- Run/Event catalogs
- Geometry, calibrations
- eg with ROOT<->Oracle interface
- http://www.phenix.bnl.gov/WWW/publish/onuchin/rooObjy/
- Use ROOT split/no-split mode for phys analysis
- Use PROOF for large-scale distributed physics analysis
- Integration with the GRID model

- Combining
- 2 technologies

- ROOT

- Oracle

- CERN School of Computing

- 17 - 30 Sept. 2000

## ROOT + RDBMS Model

- histograms

- Calibrations

- Geometries

- Run/File
- Catalog

- Trees

- Event Store

- ROOT
- files

- Oracle
- MySQL

- CERN School of Computing

- 17 - 30 Sept. 2000

## Old Streamers in 0.90/08

- class TAxis : public TNamed,
- public TAttAxis {
- private:
-   Int_t        fNbins;
-   Axis_t       fXmin;
-   Axis_t       fXmax;
-   TArrayF      fXbins;
-   Char_t      *fXlabels;

- void TAxis::Streamer(TBuffer &b)
- {
-    if (b.IsReading()) {
-       Version_t v = b.ReadVersion();
-       TNamed::Streamer(b);
-       TAttAxis::Streamer(b);
-       b >> fNbins;
-       b >> fXmin;
-       b >> fXmax;
-       fXbins.Streamer(b);
-    } else {
-       b.WriteVersion(TAxis::IsA());
-       TNamed::Streamer(b);
-       TAttAxis::Streamer(b);
-       b << fNbins;
-       b << fXmin;
-       b << fXmax;
-       fXbins.Streamer(b);
-    }
- }

- rootcint

- CERN School of Computing

- 17 - 30 Sept. 2000

## Old Streamers in 2.25

- class TAxis : public TNamed,
- public TAttAxis {
- private:
-    Int_t        fNbins;
-    Axis_t       fXmin;
-    Axis_t       fXmax;
-    TArrayF      fXbins;
-    Char_t      *fXlabels;
-    Int_t        fFirst;
-    Int_t        fLast;
-    TString      fTimeFormat;
-    Bool_t       fTimeDisplay;
-    TObject     *fParent;

**void TAxis::Streamer****(TBuffer &R__b) {**
**   ****UInt_t R__s, R__c;**
**   ****if (R__b.IsReading()) {**
**      ****Version_t R__v = R__b.ReadVersion(&R__s, &R__c);**
**      ****TNamed::Streamer(R__b);**
**      ****TAttAxis::Streamer(R__b);**
**      ****R__b >> fNbins;**
**      ****R__b >> fXmin;**
**      ****R__b >> fXmax;**
**      ****fXbins.Streamer(R__b);**
**      ****if (R__v > 2) {**
**         ****R__b >> fFirst;**
**         ****R__b >> fLast;**
**      ****}**
**      ****if (R__v > 3) {**
**         ****R__b >> fTimeDisplay;**
**         ****fTimeFormat.Streamer(R__b);**
**      ****} else {**
**         ****SetTimeFormat();**
**      ****}**
**      ****R__b.CheckByteCount(R__s, R__c, TAxis::IsA());**
**   ****} else {**
**      ****R__c = R__b.WriteVersion(TAxis::IsA(), kTRUE);**
**      ****TNamed::Streamer(R__b);**
**      ****TAttAxis::Streamer(R__b);**
**      ****R__b << fNbins;**
**      ****R__b << fXmin;**
**      ****R__b << fXmax;**
**      ****fXbins.Streamer(R__b);**
**      ****R__b << fFirst;**
**      ****R__b << fLast;**
**      ****R__b << fTimeDisplay;**
**      ****fTimeFormat.Streamer(R__b);**
**      ****R__b.SetByteCount(R__c, kTRUE);**
**   ****}**
**}**

- rootcint

- CERN School of Computing

- 17 - 30 Sept. 2000

## New Streamers in 3.00

- class TAxis : public TNamed,
- public TAttAxis {
- private:
-    Int_t        fNbins;
-    Axis_t       fXmin;
-    Axis_t       fXmax;
-    TArrayF      fXbins;
-    Char_t      *fXlabels;     //!
-    Int_t        fFirst;
-    Int_t        fLast;
-    TString      fTimeFormat;
-    Bool_t       fTimeDisplay;
-    TObject     *fParent;      //!

**void TAxis::Streamer****(TBuffer &R__b)**
**{**
**   ****// Stream an object of class TAxis.**
**   ****if (R__b.IsReading()) {**
**      ****UInt_t R__s, R__c;**
**      ****Version_t R__v = R__b.ReadVersion(&R__s, &R__c);**
**      ****if (R__v > 5) {**
**         **_**TAxis::Class()->ReadBuffer(R__b, this, R__v, R__s, R__c);**_
**         ****return;**
**      ****}**
**      ****//====process old versions before automatic schema evolution**
**      ****....**
**      ****//====end of old versions**
**      **
**   ****} else {**
**      **_**TAxis::Class()->WriteBuffer(R__b,this);**_
**   ****}**
**}**

- rootcint

- CERN School of Computing

- 17 - 30 Sept. 2000

## Support for more complex C++

-  enum {kSize=10};
-    char           fType[20];     //array of 20 chars
-    Int_t          fNtrack;       //number of tracks
-    Int_t          fNvertex;      //number of vertices
-    Int_t          fX[kSize];     //an array where dimension is an enum
-    UInt_t         fFlag;         //bit pattern event flag
-    Float_t        fMatrix[4][4]; //a two-dim array
-    Float_t       *fDistance;     //[fNvertex] array of floats of length fNvertex
-    Double_t       fTemperature;  //event temperature
-    TString       *fTstringp;     //[fNvertex] array of TString
-    TString        fNames[12];    //array of TString
-    TAxis          fXaxis;        //example of class derived from TObject
-    TAxis          fYaxis[3];     //array of objects
-    TAxis         *fVaxis[3];     //pointer to an array of TAxis
-    TAxis         *fPaxis;        //[fNvertex] array of TAxis of length fNvertex
-    TAxis        **fQaxis;        //[fNvertex] array of pointers to TAxis objects
-    TDatime        fDatime;       //date and time
-    EventHeader    fEvtHdr;       //example of class not derived from TObject
-    TObjArray      fObjArray;     //An object array of TObject*
-    TClonesArray  *fTracks;       //-> array of tracks
-    TH1F          *fH;            //-> pointer to an histogram
-    TArrayF        fArrayF;       //an array of floats
-    TArrayI       *fArrayI;       //a pointer to an array of integers
- ....................(see next)

- CERN School of Computing

- 17 - 30 Sept. 2000

## Support for STL

-    vector<int>            fVectorint;       //STL vector on ints
-    vector<short>          fVectorshort;     //STL vector of shorts
-    vector<double>         fVectorD[4];      //array of STL vectors of doubles
-    vector<TLine>          fVectorTLine;     //|| STL vector of TLine objects
-    vector<TObject>       *fVectorTobject;   //|| pointer to an STL vector
-    vector<TNamed>        *fVectorTnamed[6]; //|| array of pointers to STL vectors
-    deque<TAttLine>        fDeque;           //STL deque
-    list<const TObject*>   fVectorTobjectp;  //STL list of pointers to objects
-    list<string>          *fListString;      //STL list of strings
-    list<string *>         fListStringp;     //STL list of pointers to strings
-    map<TNamed*,int>       fMapTNamedp;      //STL map
-    map<TString,TList*>    fMapList;         //STL map
-    map<TAxis*,int>       *fMapTAxisp;       //pointer to STL map
-    set<TAxis*>            fSetTAxis;        //STL set
-    set<TAxis*>           *fSetTAxisp;       //pointer to STL set
-    multimap<TNamed*,int>  fMultiMapTNamedp; //STL multimap
-    multiset<TAxis*>      *fMultiSetTAxisp;  //pointer to STL multiset
-    string                 fString;          //C++ standard string
-    string                *fStringp;         //pointer to standard C++ string
-    UShortVector           fUshort;          //class with an STL vector as base class

- CERN School of Computing

- 17 - 30 Sept. 2000

## Complex STL use not supported

- vector<vector<TAxis *> >  fVectAxis;    //!STL vector of vectors of TAxis*
- map<string,vector<int> >  fMapString;   //!STL map of string/vector
- deque<pair<float,float> > fDequePair;   //!STL deque of pair

- Use a custom Streamer
- for these complex cases

- CERN School of Computing

- 17 - 30 Sept. 2000

## Self-describing files

- Dictionary for persistent classes written to the file when closing the file.
- ROOT files can be read by foreign readers (see presentation on JavaRoot (Tony slides)
- Support for Backward and Forward compatibility
- Files created in 2003 must be readable in 2015
- Classes (data objects) for all objects in a file can be regenerated via TFile::MakeProject

- Root >TFile f(“demo.root”);
- Root > f.MakeProject(“dir”,”*”,”new++”);

- CERN School of Computing

- 17 - 30 Sept. 2000

## StreamerInfo

- The description of
- all classes
- in a file
- is written
- in one single record
- when the file is closed

- CERN School of Computing

- 17 - 30 Sept. 2000

## Showing classes in a fileTFile::ShowStreamerInfo

- Root > **f.ShowStreamerInfo()**

- CERN School of Computing

- 17 - 30 Sept. 2000

## Automatic Schema Evolution

- CERN School of Computing

- 17 - 30 Sept. 2000

## Auto Schema Evolution (2)

- CERN School of Computing

- 17 - 30 Sept. 2000

## Missing Classes

- The system
- warns you
- when opening
- a file
- and the class library
- is missing

- CERN School of Computing

- 17 - 30 Sept. 2000

## read/query Trees without the classes

- CERN School of Computing

- 17 - 30 Sept. 2000

## read/query Trees without the classes

- CERN School of Computing

- 17 - 30 Sept. 2000

## TFile::MakeProject

- Generate the classes
- header files
- Compile them
- make a shared lib
- link the shared lib

- CERN School of Computing

- 17 - 30 Sept. 2000

## TFile::MakeProject

- All necessary
- header files
- are included

- Comments
- preserved

- Can do I/O
- Inspect
- Browse,etc

- CERN School of Computing

- 17 - 30 Sept. 2000

## The Test suite “bench”(example on fcdfsgi2 with KAI compiler)

- Test performance of STL vector of objects, vectors of pointers  and same with a TClonesArray of TObjHit deriving from THit

- Better compression
- with TClonesArray

- Better write
- with TClonesArray

- Much better read
- with TClonesArray

- CERN School of Computing

- 17 - 30 Sept. 2000

## Test suite “bench”

- CERN School of Computing

- 17 - 30 Sept. 2000

## Makefiles

- 3 major OS (Unix, Windows, Mac OS/X)
- 10 different compilers
- gcc with many flavors on nearly all platforms,
- Solaris:CC4,5, HPUX:CC:aCC, SGI:CC, AIX:xlC
- Alpha:CXX6, Windows:VC++6
- KAI on SGI, Linux, Solaris
- 37 Makefiles

- CERN School of Computing

- 17 - 30 Sept. 2000

## Download source, Binaries

- 20 binary
- tar balls
- + source

- CERN School of Computing

- 17 - 30 Sept. 2000

## ROOT Downloads

- 114,000 binaries
- download
- 650,000 clicks
- per month
- 19,000 docs
- in 6 months
- 2200 reg users
- in roottalk

- CERN School of Computing

- 17 - 30 Sept. 2000