Revision f32bd5fbcbfbc83252947f75423e81e7de1ab514 authored by Gerardo Ganis on 14 May 2017, 13:24:53 UTC, committed by Danilo Piparo on 15 May 2017, 09:35:32 UTC
1 parent 6fa8528
Raw File
ProofEventProc.h
/// \file
/// \ingroup tutorial_ProofEventProc
///
/// Selector to process trees containing Event structures
///
/// \macro_code
///
/// \author Gerardo Ganis (gerardo.ganis@cern.ch)

#ifndef ProofEventProc_h
#define ProofEventProc_h

#include <TROOT.h>
#include <TChain.h>
#include <TFile.h>
#include <TSelector.h>
#include "Event.h"
#include "ProcFileElements.h"

class TH1F;
class TH2F;

class ProofEventProc : public TSelector {
public :
   TTree          *fChain;   //!pointer to the analyzed TTree or TChain

   // Declaration of leave types
   Event           *event;
   Char_t          fType[20];
   Char_t          *fEventName;
   Int_t           fNtrack;
   Int_t           fNseg;
   Int_t           fNvertex;
   UInt_t          fFlag;
   Double32_t      fTemperature;
   Int_t           fMeasures[10];
   Double32_t      fMatrix[4][4];
   Double32_t      fClosestDistance[21];   //[fNvertex]
   EventHeader     fEvtHdr;
   TClonesArray    *fTracks;
   TRefArray       *fHighPt;
   TRefArray       *fMuons;
   TRef            fLastTrack;
   TRef            fWebHistogram;
   TH1F            *fH;
   TBits           fTriggerBits;
   Bool_t          fIsValid;
   void            InitEvent() { event = 0 ;  fEventName = 0; fTracks = 0;
                                 fHighPt = 0; fMuons = 0; fH = 0; fIsValid = kFALSE; }

   // Read controller
   Bool_t          fFullRead;

   // Abortion test
   Int_t           fTestAbort;   // -1 none, 0 init, 1 file

   // Event ranges
   Long64_t        fEntMin; // Min entry num of the current element
   Long64_t        fEntMax; // Max entry num of the current element
   TList          *fProcElems; // List of ProcFileElements processed so far
   ProcFileElements *fProcElem; // Element currently processed
   void            CheckRanges();

   //Output hist
   TH1F* fPtHist;
   TH1F* fPzHist;
   TH2F* fPxPyHist;

   // List of branches
   TBranch        *b_event_fType;   //!
   TBranch        *b_fEventName;   //!
   TBranch        *b_event_fNtrack;   //!
   TBranch        *b_event_fNseg;   //!
   TBranch        *b_event_fNvertex;   //!
   TBranch        *b_event_fFlag;   //!
   TBranch        *b_event_fTemperature;   //!
   TBranch        *b_event_fMeasures;   //!
   TBranch        *b_event_fMatrix;   //!
   TBranch        *b_fClosestDistance;   //!
   TBranch        *b_event_fEvtHdr;   //!
   TBranch        *b_fTracks;   //!
   TBranch        *b_fHighPt;   //!
   TBranch        *b_fMuons;   //!
   TBranch        *b_event_fLastTrack;   //!
   TBranch        *b_event_fWebHistogram;   //!
   TBranch        *b_fH;   //!
   TBranch        *b_event_fTriggerBits;   //!
   TBranch        *b_event_fIsValid;   //!

   ProofEventProc(TTree *) { InitEvent(); fFullRead = kTRUE; fTestAbort = -1;
                             fPtHist = 0; fPzHist = 0; fPxPyHist = 0;
                             fEntMin = -1; fEntMax = -1; fProcElems = 0; fProcElem = 0;}
   ProofEventProc() { InitEvent(); fFullRead = kTRUE; fTestAbort = -1;
                      fPtHist = 0; fPzHist = 0; fPxPyHist = 0;
                      fEntMin = -1; fEntMax = -1; fProcElems = 0; fProcElem = 0;}
   virtual ~ProofEventProc() {if (fProcElems) { fProcElems->SetOwner(kFALSE);
                                                delete fProcElems;} }
   virtual Int_t   Version() const {return 2;}
   virtual void    Begin(TTree *);
   virtual void    SlaveBegin(TTree *tree);
   virtual void    Init(TTree *tree);
   virtual Bool_t  Notify();
   virtual Bool_t  Process(Long64_t entry);
   virtual void    SetOption(const char *option) { fOption = option; }
   virtual void    SetObject(TObject *obj) { fObject = obj; }
   virtual void    SetInputList(TList *input) {fInput = input;}
   virtual TList  *GetOutputList() const { return fOutput; }
   virtual void    SlaveTerminate();
   virtual void    Terminate();

   ClassDef(ProofEventProc,0);
};

#endif

#ifdef ProofEventProc_cxx
void ProofEventProc::Init(TTree *tree)
{
   // The Init() function is called when the selector needs to initialize
   // a new tree or chain. Typically here the branch addresses of the tree
   // will be set. It is normaly not necessary to make changes to the
   // generated code, but the routine can be extended by the user if needed.
   // Init() will be called many times when running with PROOF.

   // Set branch addresses
   fEventName=0;
   fTracks=0;
   fHighPt=0;
   fMuons=0;
   fH=0;
   if (tree == 0) return;
   fChain = tree;
   fChain->SetMakeClass(1);

   fChain->SetBranchAddress("fType[20]",fType);
   fChain->SetBranchAddress("fEventName",fEventName);
   fChain->SetBranchAddress("fNtrack",&fNtrack);
   fChain->SetBranchAddress("fNseg",&fNseg);
   fChain->SetBranchAddress("fNvertex",&fNvertex);
   fChain->SetBranchAddress("fFlag",&fFlag);
   fChain->SetBranchAddress("fTemperature",&fTemperature);
   fChain->SetBranchAddress("fMeasures[10]",fMeasures);
   fChain->SetBranchAddress("fMatrix[4][4]",fMatrix);
   fChain->SetBranchAddress("fClosestDistance",fClosestDistance);
   fChain->SetBranchAddress("fEvtHdr",&fEvtHdr);
   fChain->SetBranchAddress("fTracks",&fTracks);
   fChain->SetBranchAddress("fHighPt",&fHighPt);
   fChain->SetBranchAddress("fMuons",&fMuons);
   fChain->SetBranchAddress("fLastTrack",&fLastTrack);
   fChain->SetBranchAddress("fWebHistogram",&fWebHistogram);
   fChain->SetBranchAddress("fH",&fH);
   fChain->SetBranchAddress("fTriggerBits",&fTriggerBits);
   fChain->SetBranchAddress("fIsValid",&fIsValid);
}

Bool_t ProofEventProc::Notify()
{
   // The Notify() function is called when a new file is opened. This
   // can be either for a new TTree in a TChain or when when a new TTree
   // is started when using PROOF. Typically here the branch pointers
   // will be retrieved. It is normaly not necessary to make changes
   // to the generated code, but the routine can be extended by the
   // user if needed.

   TString fn;
   if (fChain) {
      fn = fChain->GetCurrentFile()->GetName();
      Info("Notify", "processing file: %s", fn.Data());
   }

   // Save information about previous element, if any
   if (fProcElem) fProcElem->Add(fEntMin, fEntMax);

   // Reset counters
   fEntMin = -1;
   fEntMax = -1;

   // Point to current element
   if (fProcElems) fProcElem = (ProcFileElements *) fProcElems->FindObject(fn);
   if (!fProcElem) {
      Info("Notify", "assigned new file: create ProcFileElements entry");
      fProcElem = new ProcFileElements(fn.Data());
      if (!fProcElems) fProcElems = new TList;
      if (fProcElems) fProcElems->Add(fProcElem);
   }

   // Get branch pointers
   b_event_fType = fChain->GetBranch("fType[20]");
   b_fEventName = fChain->GetBranch("fEventName");
   b_event_fNtrack = fChain->GetBranch("fNtrack");
   b_event_fNseg = fChain->GetBranch("fNseg");
   b_event_fNvertex = fChain->GetBranch("fNvertex");
   b_event_fFlag = fChain->GetBranch("fFlag");
   b_event_fTemperature = fChain->GetBranch("fTemperature");
   b_event_fMeasures = fChain->GetBranch("fMeasures[10]");
   b_event_fMatrix = fChain->GetBranch("fMatrix[4][4]");
   b_fClosestDistance = fChain->GetBranch("fClosestDistance");
   b_event_fEvtHdr = fChain->GetBranch("fEvtHdr");
   b_fTracks = fChain->GetBranch("fTracks");
   b_fHighPt = fChain->GetBranch("fHighPt");
   b_fMuons = fChain->GetBranch("fMuons");
   b_event_fLastTrack = fChain->GetBranch("fLastTrack");
   b_event_fWebHistogram = fChain->GetBranch("fWebHistogram");
   b_fH = fChain->GetBranch("fH");
   b_event_fTriggerBits = fChain->GetBranch("fTriggerBits");
   b_event_fIsValid = fChain->GetBranch("fIsValid");

   return kTRUE;
}

#endif // #ifdef ProofEventProc_cxx
back to top