// $Id: EventProcessor.h,v 1.4 2010/03/11 22:18:44 jeremy Exp $

#ifndef EventProcessor_h
#define EventProcessor_h 1

// stl
#include <string>

// lcio
#include "EVENT/LCEvent.h"

// Avoid circular reference with EventProcessor class.
class JobManager;

using EVENT::LCEvent;

/**
 * This is an API for event processing classes.  Sub-classes must implement
 * the processEvent() method.  Job information can be retrieved by using the 
 * pointer to the JobManager.
 */
class EventProcessor
{
public:

    /**
     * ctor which requires a name argument.
     */
    EventProcessor(std::string name)
        : m_name(name)
    {;}

    /**
     * Standard dtor.
     */
    virtual ~EventProcessor()
    {;}

    /**
     * Set the pointer to the processor's JobManager.
     */
    inline void setJobManager(JobManager* manager)
    {
        m_manager = manager;
    }

    /**
     * Get the pointer to the processor's JobManager.
     */
    inline JobManager* getJobManager() const
    {
        return m_manager;
    }
    
    /**
     * Get the name of the processor.
     */
    inline const std::string& getName() const
    {
        return m_name;
    }

    /**
     * Process a single LCIO event.  This is a pure virtual method that must be 
     * implemented by sub-classes.  Processors that call Pandora algorithms may 
     * ignore the LCEvent and retrieve objects directly from the Pandora instance.
     */
    virtual void processEvent(EVENT::LCEvent*) = 0;

private:
    JobManager* m_manager;
    std::string m_name;
};

#endif