Page History
Abstract
We discuss a PSTuple package, which is intended for creation, accumulation and storage of histograms and tuples in psana PSHist
- a histogramming package for PSANA project.
Objectives
In psana project PSANA framework we need in package which allows to accumulate data in form of histograms and tuples and save them in file for further analysis. Though it might be based on well-known underlying packages like ROOT, HBOOK, ROOT, or HippoTuple, we prefer to use an uniform interface with abstract base class, substituting the direct interaction with underlying methods. This intermediate abstract layer provides a flexibility in implementation of new things, for example multithreding in analysis, which algorithm is not yet defined.
Interface
An example of the program interface for this histogram-tuple-management package can be presented as follows. First, the underlying (derived) package needs to be choisen and instantiated. For example for ROOT
...
Code Block |
---|
hMan->write(); delete hMan; |
Structure and content of the package
Package PSTuple PSHist contains the base abstract class and methods, which have to be re-implemented in derived classes for HBOOK, ROOT, HippoTuple, etc., i.e. in packages HBookTuplelike HBookHist, RootTupleRootHist, HippoTuple, etc.
Histogramming in BABAR
HippoHist, etc.
QUESTIONS
- What kind of interface is preferable for tuple parameters: (1) name-based, (2) pointer-based, (3) index-based?
- Do we really have to care about different types of data for histograms and tuple parameters (int, float, double)?
- Arrays in tuples?
- What should be the right mapping between PSHist and Root classes?
Code Block HManager <-> TFile H1 <-> TH1D Tuple <-> TTree or TBranch Parameter <-> TBranch or TBranch-item
APPENDIX
Histogramming in Root
Code Block |
---|
// Base Class Headers --
#include "root/TROOT.h"
#include "root/TFile.h"
#include "root/TH1D.h"
#include "root/TTree.h"
#include "root/TBranch.h"
#include "root/TRandom.h"
|
Histograms
Code Block |
---|
// Initialization
if(!TROOT::Initialized()) {static TROOT root( "RootManager", "RootManager ROOT God" );}
// Open output file
TFile* pfile = new TFile("file.root", "RECREATE", "Created for you by RootManager" );
// Create histograms
TH1D *pHis1 = new TH1D("pHis1","My comment to TH1D", 100, 0.5, 100+0.5);
TH2D *pHis2 = new TH2D("pHis2","My comment to TH1D", 100, 0.5, 100+0.5,
200, 0.5, 200+0.5);
// Fill histograms in each event
pHis1 -> Fill( value, [weight] );
pHis2 -> Fill( x, y, [weight] );
// Write histograms in file in the very end
pHis1 -> Write();
pHis2 -> Write();
//Close file
pfile -> Close();
|
NTuple
Assuming that file is already open,
Code Block |
---|
// Define some structures for TTree
typedef struct {float x,y,z;} POINT;
static POINT point;
float new_v;
// Create TTree
TTree* ptree = new TTree("ptree", "My comment to TTree");
// Create branches
TBranch *pbranch = ptree->Branch("new_v", &new_v, "new_v/F");
ptree->Branch("point",&point,"x:y:z");
// Fill data structures for each event
new_v = gRandom->Gaus(0, 1);
point.x = gRandom->Gaus(1, 1);
point.y = gRandom->Gaus(2, 1);
point.z = gRandom->Gaus(3, 1);
// Add an event record to the tree
ptree->Fill();
// Write the tree to the file
ptree -> Write();
|
Histogramming in BABAR
Histograms
All histograms in Workbook examples are based on plane Root...
NTuple
Code Block |
---|
#include "HepTuple/Histogram.h"
#include "HepTuple/TupleManager.h"
HepTupleManager* manager = gblEnv->getGen()->ntupleManager();
HepTuple *_ntuple = manager->ntuple("file-name.root");
_ntuple->column("run", eventID->run(), -99, "Event" );
_ntuple->column("event", eventCounter, -99, "Event" );
_ntuple->dumpData(); // for each event
|
Histogramming in CLEO
Histograms
Declare Histogram in your .h file
...
Code Block |
---|
module sel RootHistogramModule root file root_suez_style_example_data31.root root init |
NTuple
Declare Ntuple in your Processor’s .h file
...