#ifndef Analyzer_h
#define Analyzer_h

#include <TROOT.h>
#include <TChain.h>
#include <TFile.h>
#include <TSelector.h>

#include "Armory/ClassDet.h"

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

// Fixed size dimensions of array or collections stored in the TTree if any.

   // Declaration of leaf types
   Det sx3;
   Det qqq;
   Det pc ;
   Det misc;

   ULong64_t       evID;
   UInt_t          run;

   // List of branches
   TBranch        *b_eventID;   //!
   TBranch        *b_run;   //!
   TBranch        *b_sx3Multi;   //!
   TBranch        *b_sx3ID;   //!
   TBranch        *b_sx3Ch;   //!
   TBranch        *b_sx3E;   //!
   TBranch        *b_sx3T;   //!
   TBranch        *b_qqqMulti;   //!
   TBranch        *b_qqqID;   //!
   TBranch        *b_qqqCh;   //!
   TBranch        *b_qqqE;   //!
   TBranch        *b_qqqT;   //!
   TBranch        *b_pcMulti;   //!
   TBranch        *b_pcID;   //!
   TBranch        *b_pcCh;   //!
   TBranch        *b_pcE;   //!
   TBranch        *b_pcT;   //!
   TBranch        *b_miscMulti;   //!
   TBranch        *b_miscID;   //!
   TBranch        *b_miscCh;   //!
   TBranch        *b_miscE;   //!
   TBranch        *b_miscT;   //!
   TBranch       *b_miscTf;   //!


   Analyzer(TTree * /*tree*/ =0) : fChain(0) { }
   virtual ~Analyzer() { }
   virtual Int_t   Version() const { return 2; }
   virtual void    Begin(TTree *tree);
   virtual void    SlaveBegin(TTree *tree);
   virtual void    Init(TTree *tree);
   virtual Bool_t  Notify();
   virtual Bool_t  Process(Long64_t entry);
   virtual Int_t   GetEntry(Long64_t entry, Int_t getall = 0) { return fChain ? fChain->GetTree()->GetEntry(entry, getall) : 0; }
   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(Analyzer,0);
};

#endif

#ifdef Analyzer_cxx
void Analyzer::Init(TTree *tree){

   // Set branch addresses and branch pointers
   if (!tree) return;
   fChain = tree;
   fChain->SetMakeClass(1);

   fChain->SetBranchAddress("evID", &evID, &b_eventID);
   fChain->SetBranchAddress("run", &run, &b_run);

   sx3.SetDetDimension(24,12);
   qqq.SetDetDimension(4,32);
   pc.SetDetDimension(2,24);

   fChain->SetBranchAddress("sx3Multi", &sx3.multi, &b_sx3Multi);
   fChain->SetBranchAddress("sx3ID",    &sx3.id, &b_sx3ID);
   fChain->SetBranchAddress("sx3Ch",    &sx3.ch, &b_sx3Ch);
   fChain->SetBranchAddress("sx3E",     &sx3.e, &b_sx3E);
   fChain->SetBranchAddress("sx3T",     &sx3.t, &b_sx3T);
   fChain->SetBranchAddress("qqqMulti", &qqq.multi, &b_qqqMulti);
   fChain->SetBranchAddress("qqqID",    &qqq.id, &b_qqqID);
   fChain->SetBranchAddress("qqqCh",    &qqq.ch, &b_qqqCh);
   fChain->SetBranchAddress("qqqE",     &qqq.e, &b_qqqE);
   fChain->SetBranchAddress("qqqT",     &qqq.t, &b_qqqT);
   fChain->SetBranchAddress("pcMulti",  &pc.multi, &b_pcMulti);
   fChain->SetBranchAddress("pcID",     &pc.id, &b_pcID);
   fChain->SetBranchAddress("pcCh",     &pc.ch, &b_pcCh);
   fChain->SetBranchAddress("pcE",      &pc.e, &b_pcE);
   fChain->SetBranchAddress("pcT",      &pc.t, &b_pcT);
   fChain->SetBranchAddress("miscMulti", &misc.multi, &b_miscMulti);
   fChain->SetBranchAddress("miscID",    &misc.id, &b_miscID);
   fChain->SetBranchAddress("miscCh",    &misc.ch, &b_miscCh);
   fChain->SetBranchAddress("miscE",     &misc.e, &b_miscE);
   fChain->SetBranchAddress("miscT",     &misc.t, &b_miscT);
   // fChain->SetBranchAddress("miscF",     &misc.tf, &b_miscTf);


}

Bool_t Analyzer::Notify(){

   return kTRUE;
}

void Analyzer::SlaveBegin(TTree * /*tree*/){

   TString option = GetOption();

}

void Analyzer::SlaveTerminate(){

}


#endif // #ifdef Analyzer_cxx