// ESAF : Euso Simulation and Analysis Framework
// $Id: LightToEuso.hh,v 1.2 2005/04/14 12:43:23 moreggia Exp $
// Marco Pallavicini created Mar, 13 2002
// Abstract class for all possible simulation chains up to
// Euso Detector Simulation (excluded)
// Basically, it brings a PhotonsOnPupil at the Euso entrance pupil
// 
#ifndef __LIGHTTOEUSO_HH_
#define __LIGHTTOEUSO_HH_

#include "euso.hh"
#include "EsafConfigurable.hh"
#include "EsafMsgSource.hh"

class EventGenerator;
class LightSource;
class RadiativeTransfer;
class PhotonsOnPupil;
class MCTruth;
class PhysicsData;
class EEvent;
class DetectorGeometry;

class LightToEuso : public EsafConfigurable, public EsafMsgSource {
public:
    // ctor
    LightToEuso( const string& name );

    // dtor
    virtual ~LightToEuso();

    // returns the photons on the pupil
    virtual PhotonsOnPupil *Get(const DetectorGeometry*) = 0;
    
    // configure
    virtual void Configure() = 0;
    
    // get ready for next event
    virtual void Reset();

    // get pointer to MonteCarlo Truth
    virtual MCTruth* GetTruth() = 0;
    
    // get pointer to shower object
    virtual PhysicsData* GetPhysics() = 0;

    // change the input file name when meaningful
    virtual void ReplaceInputFile( const char* ) = 0;

    // get the light to euso name
    inline const string& GetName() const { return fName; }
    
    EsafConfigClass(LightToEuso,LightToEuso)

protected:
    EventGenerator* fGenerator;          // event generator 
    LightSource* fLight;                 // light generator in atmosphere
    RadiativeTransfer* fRadiative;       // radiative transport to euso    
    
    inline EventGenerator* GetGenerator() { return fGenerator; }
    inline RadiativeTransfer* GetRadiative() { return fRadiative; }
    inline LightSource* GetLightSource() { return fLight; }

private:
    string fName;

    ClassDef(LightToEuso,0)
};

#endif  /* __LIGHTTOEUSO_HH_ */