//////////////////////////////////////////////////////////////////////////
//                                                                      //
// ATLFast virtual base class for Makers                                //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include <TChain.h>
#include <TTree.h>
#include <TList.h>
#include <TClonesArray.h>
#include <TBrowser.h>

#include "ATLFMaker.h"
#include "ATLFast.h"

ClassImp(ATLFMaker)

//_____________________________________________________________________________
ATLFMaker::ATLFMaker()
{
   m_BranchName = "";
   m_Save       = 0;
   m_Histograms = 0;
   m_Fruits     = 0;
   m_Clones     = 0;
   m_IsClonable = kTRUE;
}

//_____________________________________________________________________________
ATLFMaker::ATLFMaker(const char *name, const char *title)
       :TNamed(name,title)
{
   m_BranchName = "";
   m_Save       = 0;
   m_Histograms = new TList();
   m_Clones     = 0;
   m_IsClonable = kTRUE;
   
   gATLFast->Makers()->Add(this);
}

//_____________________________________________________________________________
 ATLFMaker::~ATLFMaker()
{
  delete m_Fruits;
  delete m_Clones;
}

//______________________________________________________________________________
 void ATLFMaker::Browse(TBrowser *b)
{
//  Insert Maker objects in the list of objects to be browsed.

  char name[64];
  if( b == 0  || m_Fruits == 0) return;
  TObject *obj;

// If m_Fruits is a ClonesArray, insert all the objects in the list
// of browsable objects
  if (m_Fruits->InheritsFrom("TClonesArray")) {
     TClonesArray *clones = (TClonesArray*)m_Fruits;
     Int_t nobjects = clones->GetEntries();
     for (Int_t i=0;i<nobjects;i++) {
        obj = clones->At(i);
        sprintf(name,"%s_%d",obj->GetName(),i);
        if (strstr(name,"ATLF")) b->Add(obj, &name[4]);
        else                     b->Add(obj, &name[0]);
     }
// m_Fruits points to an object in general. Insert this object in the browser
  } else {
      b->Add( m_Fruits, m_Fruits->GetName());
  }
}

//_____________________________________________________________________________
 void ATLFMaker::Clear(Option_t *option)
{
  if (m_Fruits) m_Fruits->Clear(option);
  delete m_Clones;
  m_Clones = 0;
}

//_____________________________________________________________________________
 void ATLFMaker::Draw(Option_t *)
{
//    Insert products of this maker in graphics pad list

  TObject *obj;

// If m_Fruits is a ClonesArray, insert all the objects in the list
// of objects to be painted
  if (m_Fruits->InheritsFrom("TClonesArray")) {
     TClonesArray *clones = (TClonesArray*)m_Fruits;
     Int_t nobjects = clones->GetEntries();
     for (Int_t i=0;i<nobjects;i++) {
        obj = clones->At(i);
        if (obj) obj->AppendPad();
     }
// m_Fruits points to an object in general. Insert this object in the pad
  } else {
     m_Fruits->AppendPad();
  }
}

//_____________________________________________________________________________
 void ATLFMaker::FillClone()
{
//   Copy original fruits in a separate list (clones)

   if (!m_IsClonable || m_Fruits == 0) return;
   m_Clones = m_Fruits->Clone();
}

//_____________________________________________________________________________
 void ATLFMaker::Init()
{
   //dummy
}

//_____________________________________________________________________________
 void ATLFMaker::Finish()
{

   //dummy
}

//_____________________________________________________________________________
 Int_t ATLFMaker::Make()
{

   Warning("Make","Dummy function called");
   return 0;
}

//_____________________________________________________________________________
 void ATLFMaker::PrintInfo()
{
   printf("*********************************n");
   printf("*                               *n");
   printf("*     %23s   *n",GetName());
   printf("*                               *n");
   printf("*********************************n");

   Dump();
}

//_____________________________________________________________________________
 void ATLFMaker::MakeBranch()
{
//   Adds the list of physics objects to the ATLFast tree as a new branch

   if (m_Save == 0) return;

   TTree *tree = gATLFast->Tree();
   if (tree == 0  || m_Fruits == 0  || m_BranchName.Length() == 0) return;

//  Make a branch tree if a branch name has been set
   Int_t buffersize = 4000;
   if (m_Fruits->InheritsFrom("TClonesArray")) {
      tree->Branch(m_BranchName.Data(), &m_Fruits, buffersize);
   } else {
      tree->Branch(m_BranchName.Data(),m_Fruits->ClassName(), &m_Fruits, buffersize);
   }
}

//_____________________________________________________________________________
 void ATLFMaker::SetChainAddress(TChain *chain)
{
//   Set branch address in a chain of files

   if (chain == 0) return;

   chain->SetBranchAddress(m_BranchName.Data(), &m_Fruits);
}

//______________________________________________________________________________
 void ATLFMaker::Streamer(TBuffer &R__b)
{
   // Stream an object of class ATLFMaker.

   if (R__b.IsReading()) {
      R__b.ReadVersion(); // Version_t R__v = R__b.ReadVersion();
      TNamed::Streamer(R__b);
      R__b >> m_Save;
      R__b >> m_Fruits;
      m_BranchName.Streamer(R__b);
      R__b >> m_Histograms;
          //this is an addition to the standard rootcint version of Streamer
          //branch address for this maker is set automatically
      TTree *tree = gATLFast->Tree();
      if (tree == 0  || m_Fruits == 0  || m_BranchName.Length() == 0) return;
      TBranch *branch = tree->GetBranch(m_BranchName.Data());
      if (branch)  branch->SetAddress(&m_Fruits);
   } else {
      R__b.WriteVersion(ATLFMaker::IsA());
      TNamed::Streamer(R__b);
      R__b << m_Save;
      R__b << m_Fruits;
      m_BranchName.Streamer(R__b);
      R__b << m_Histograms;
   }
}


ROOT 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.