//////////////////////////////////////////////////////////////////
//
// JSFModule
//
// Basic unit of data analysis
//
// User Analysis class should be derived from this class.
// Basic member functions for data analysis are,
// Initialize()
// BeginRun(Int_t RunNumber)
// Process(Int_t EventNumber)
// EndRun()
// Terminate()
// User class should override these functions.
//
// fFile is a pointer data member to the file. It is set by JSFSteer
// and can be READ/WRITE/UPDATE. (UPDATE may not work properly yet.)
// Event data is stored in the tree, Event, in the "fFile". Other
// configuration data are stored as an Keyed file in the "fFile".
// Directory and key names are,
// Initialize() --> /conf/init/[modulename]
// BeginRun(nnn) --> /conf/beginNNNNNN/[modulename]
// EndRun(nnn) --> /conf/endNNNNN/[modulename]
// Terminate() --> /conf/term/[modulename]
// Note that key names have been changed since JSF-1-11, to
// simplfy the directory structure.
// The member function, ConfDirectory(), creates and cd to proper
// directory. How to write/read data is depend on the implementaion
// of the class.
// Process is called only when the "fFile" is writable, while other
// functions are called evenif fFile is not writable. If Initialize,
// BeginRun, EndRun, or Terminate is called when fFile is not writable,
// they should prepare data member of the class properly.
//
// Event data is saved in the object pointed by fEventBuf, which is
// the JSFEventBuf object. JSFModule does not create JSFEventBuf.
// User class dereived from JSFModule should define fEventBuf.
//
// The member function, MakeBranch() and SetBranch() is called from
// JSFSteer::Initialize(). MakeBranch() defines the tree branch to
// store event data, while SetBranch() set addresses to read tree data.
// Usually, user read event data by tree->Fill(), which readin all branches
// in the tree. If the branch address is not set properly, the program will
// crash. When reading the root data, JSFSteer read the header and creats
// the objetcs required to get tree data.
//
//$Id: JSFModule.cxx,v 1.7 2001/11/06 05:17:15 miyamoto Exp $
//
//////////////////////////////////////////////////////////////////
//
#include <TSystem.h>
#include <TDirectory.h>
#include <TKey.h>
#include "JSFSteer.h"
#include "JSFModule.h"
ClassImp(JSFModule)
ClassImp(JSFEventBuf)
//_____________________________________________________________________________
JSFModule::JSFModule(const char *name, const char *title, Option_t *opt)
:TNamed(name,title)
{
// Default constructor of JSF module.
// If opt != "", the module is not included in the module list of JSFSteer.
fVersion =104;
fStat = kConstruct;
if( strcmp(opt,"")==0 )gJSF->Modules()->Add(this);
fEventBuf=0;
fHistograms = 0;
fBufferSize=1000;
fSplit=0;
fMakeBranch=kTRUE;
if( strcmp(opt,"") == 0 ) {
if( strcmp(title,"Readin module") == 0 ) fFile = gJSF->GetInput();
else fFile = gJSF->GetOutput() ;
}
}
//____________________________________________________________________________
JSFModule::~JSFModule()
{
// Destrutor of JSF module.
Clear();
TObject *obj=gJSF->Modules()->FindObject(this);
// if( !obj ) gJSF->Modules()->Remove(this);
// if( !fEventBuf ) delete fEventBuf;
if( obj ) gJSF->Modules()->Remove(this);
if( fEventBuf ) delete fEventBuf;
}
//____________________________________________________________________________
void JSFModule::PrintInfo()
{
Warning("PrintInfo","No information available for this module");
}
//____________________________________________________________________________
Bool_t JSFModule::Process(Int_t ev)
{
// Called at each events. This function is not called when
// the default file assigned to the class (fFile) is not writable.
ConfDirectory();
if( !IsWritable() ) return kTRUE;
if( fEventBuf ) {
fEventBuf->SetHeader();
}
return kTRUE ;
}
//____________________________________________________________________________
Bool_t JSFModule::Initialize()
{
//
ConfDirectory();
return kTRUE;
}
//____________________________________________________________________________
void JSFModule::ConfDirectory()
{
// cd to conf directory to access configuration information
// or where event tree is.
// Is there /conf ?
//fFile->cd("conf");
//TList *dlist=gDirectory->GetListOfKeys();
//if ( !dlist->FindObject(GetName()) ){gDirectory->mkdir(GetName());}
//gDirectory->cd(GetName());
// Create run status dependant directory
Char_t name[30];
switch (fStat) {
case kInitialize:
strcpy(name,"/conf/init");
break;
case kBeginRun:
sprintf(name,"/conf/begin%5.5i",fRunNumber);
break;
case kEndRun:
sprintf(name,"/conf/end%5.5i",fRunNumber);
break;
case kTerminate:
strcpy(name,"/conf/term");
break;
case kEventLoop:
strcpy(name,"/");
break;
case kConstruct:
case kDestruct:
default:
Fatal("ConfDirectory","Called with invalid status");
}
// cd to right directory
if( fStat == kEventLoop ) fFile->cd(name);
else {
// TList *dlist=gDirectory->GetListOfKeys();
//if ( dlist->FindObject(name) == NULL) gDirectory->mkdir(name);
// gDirectory->cd(name);
}
}
//____________________________________________________________________________
Bool_t JSFModule::BeginRun(Int_t nrun)
{
// The BeginRun function is called when new run is started.
// Each module
// should output run dependant parameter here by object->Write() statement.
ConfDirectory();
return kTRUE;
}
//____________________________________________________________________________
Bool_t JSFModule::EndRun()
{
// End of run.
ConfDirectory();
return kTRUE;
}
//____________________________________________________________________________
Bool_t JSFModule::Terminate()
{
// End of run.
ConfDirectory();
return kTRUE;
}
//____________________________________________________________________________
Bool_t JSFModule::GetLastRunInfo()
{
return kTRUE;
}
//____________________________________________________________________________
void JSFModule::MakeBranch(TTree *tree)
{
// Make branch of the module
fTree=tree;
if( fEventBuf && fMakeBranch ) {
Int_t split=fSplit;
Int_t bsize=fBufferSize;
Int_t lc=strlen(GetName());
Char_t *name = new Char_t [lc+10];
sprintf(name,"%s-EventBuf",GetName());
fBranch = tree->Branch(name, fEventBuf->ClassName() ,&fEventBuf, bsize, split);
delete name;
}
}
//____________________________________________________________________________
void JSFModule::SetBranch(TTree *tree)
{
// Set Branch address for this module
fTree=tree;
if( fEventBuf ) {
Int_t lc=strlen(GetName());
Char_t *name = new Char_t [lc+10];
sprintf(name,"%s-EventBuf",GetName());
fBranch=tree->GetBranch(name);
fBranch->SetAddress(&fEventBuf);
fEventBuf->fTree=fTree;
delete name;
}
}
//___________________________________________________________________________
JSFEventBuf::JSFEventBuf()
{
fModule=NULL;
fTree=NULL;
}
//___________________________________________________________________________
JSFEventBuf::JSFEventBuf(const char *name, const char *title, JSFModule *module)
:TNamed(name,title)
{
// Default constructor of JSF module.
fModule=module;
}
//___________________________________________________________________________
JSFEventBuf::JSFEventBuf(JSFModule *module, const char *name, const char *title)
:TNamed(name,title)
{
// Default constructor of JSF module.
fModule=module;
}
//___________________________________________________________________________
void JSFEventBuf::SetHeader()
{
// Set header information of event buffer.
fRunNumber=gJSF->GetRunNumber();
fEventNumber=gJSF->GetEventNumber();
TDatime *dtime=new TDatime();
fDate=dtime->GetDate();
fTime=dtime->GetTime();
delete dtime;
}
//__________________________________________________________________________
JSFEventBuf *JSFEventBuf::FindEventBuf(const Char_t *name)
{
// Find a pointer to the EventBuf objects in the same tree as this
// objects.
// Note that each EventBuf objects are saved as Branch of same tree.
TIter nt(gJSF->GetListOfTrees());
TTree *t;
while( (t=(TTree*)nt()) ) {
TIter nb(t->GetListOfBranches());
TBranch *br;
while( (br=(TBranch*)nb()) ) {
JSFEventBuf *obj=gJSF->FindEventBuf(br);
if( obj ){
if( obj->InheritsFrom(name) ) { return obj; }
}
}
}
return NULL;
}
ROOT page - Home page - Class index - Top of the page
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.