// one dimensional lookup table
// 25-Apr-2001 Toshi   Change contructor to remove LCDEventSource, 
//                     FetchEvent..
// 07-Jan-1999 Richard creation

#ifndef LCDFASTMC_H
#define LCDFASTMC_H

#include "TObject.h"
#include "TObjArray.h"

#include "LCDEvent.h"
#include "LCDEventSource.h"
#include "LCDRecModule.h"
#include "LCDEventMarker.h"
#include "LCDMCPartPrint.h"
#include "LCDTrackFullSmear.h"
#include "LCDIPSmear.h"
#include "LCDFMCCalRecon.h"
#include "LCDGetParameters.h"

class LCDFastMC : public TObject {
  //class LCDFastMC : public TObject {

public:
  LCDFastMC();
  LCDFastMC(LCDGetParameters* gp,
	    Char_t* smearFileName,
	    LCDEvent* event=0);
  LCDFastMC(Char_t* geometryFileName,
	    Char_t* smearFileName,
	    LCDEvent* event=0);
  ~LCDFastMC();
  
  void  Cleanup(LCDEvent* event=0); // call cleanup for each module
  void  CreateModules(Char_t* fname);
  void  Doit(LCDEvent* event=0); // call doit for each module

  LCDFMCCalRecon*   GetFMCCalRecon(){ return m_calRecon;}
  LCDGetParameters* GetParameters() { return m_gp;      }

  void  SetClusterMerge()   { m_calRecon->SetClusterMerge();   }
  void  SetNoClusterMerge() { m_calRecon->SetNoClusterMerge(); }
  
  void  SetFastMC(LCDGetParameters* gp,
		  Char_t* smearFileName,
		  LCDEvent* event=0);

  void  SetFastMC(Char_t* geometryFileName,
		  Char_t* smearFileName,
		  LCDEvent* event);

  // Set sigma of the IP smearing
  void  SetIPSigmaX(Double_t s_x){ m_ipSmear->SetSigmaX(s_x);}
  void  SetIPSigmaY(Double_t s_y){ m_ipSmear->SetSigmaY(s_y);}
  void  SetIPSigmaZ(Double_t s_z){ m_ipSmear->SetSigmaZ(s_z);}
  
  void  SetLCDGetParameters(LCDGetParameters* gp) { m_gp = gp; }

private:
  LCDEvent          *m_event         ;
  TObjArray         *m_ModuleList    ; // processors which have signed up
  TObjArrayIter     *m_iter          ; // iterate through m_ModuleList
  LCDRecModule      *m_module        ;
  LCDEventMarker    *m_eventMarker   ; // our instance of EventMarker
  LCDMCPartPrint    *m_mcPartPrint   ; // our instance of MCPartPrint
  LCDTrackFullSmear *m_trackFullSmear; // our instance of TrackFullSmear
  LCDFMCCalRecon    *m_calRecon      ; // our instance of CalRecon
  LCDIPSmear        *m_ipSmear       ; // our instance of IPSmear
  LCDGetParameters  *m_gp            ;
  Bool_t             m_mygp          ;
  
  void Init();
  
public:
  ClassDef(LCDFastMC,0)  // Manager class for Fast MC 
    //Don't change ClassVersionID! Must be 0!
};
#endif
