CalCluster.h
 
#ifndef CalCluster_H
#define CalCluster_H

#include <vector>
#include "geometry/Point.h"
#include "geometry/Vector.h"
#include "GaudiKernel/ObjectVector.h"
#include "GaudiKernel/ContainedObject.h"
#include "GaudiKernel/MsgStream.h"
#include "Event/RelTable/RelTable.h"
#include "Event/Recon/CalRecon/CalParams.h"
#include "Event/Recon/CalRecon/CalXtalRecData.h"

#define NUMCALLAYERS 8

static const CLID& CLID_CalClusterCol = InterfaceID("CalClusterCol", 1, 0);

/**
*  @class CalCluster
*
*
*  @brief Defines a CalRecon TDS object which will contain the results of
*         clustering - the association of CalXtalRecData objects. This includes
*         defining a RelTable relating clusters with the CalXtalRecData
*         objects comprising them. 
* 
*         Main changes from old CalCluster.h:
*         1) Remove all "final" energy recon information (leakage, profile fitting, etc.)
*            This will be moved to the higher level object - CalEventEnergy
*         2) Incorporate layer data into a subclass and store in a vector. The idea is 
*            that the vector will always have 8 "empty" elements, presuming that external
*            usage is to loop over Cal "layers".
*         3) Provide individal "set" and "get" routines (get was there, now include set)
*  
*  @author The CalRecon Rewrite Group
*
* $Header: /nfs/slac/g/glast/ground/cvs/Event/Event/Recon/CalRecon/CalCluster.h,v 1.13 2004/09/18 18:16:58 usher Exp $
*/

namespace Event 
{

/**
*   Define a subclass which will hold data by later
*
*/
class CalClusterLayerData
{
public:
    CalClusterLayerData() : m_energy(0.), m_position(0.,0.,0.), m_rmsSpread(0.,0.,0.) {}
    CalClusterLayerData(double energy, Point position, Vector rmsSpread) :
                  m_energy(energy), m_position(position), m_rmsSpread(rmsSpread) {}

    ~CalClusterLayerData() {}

    const double getEnergy()    const {return m_energy;}
    const Point  getPosition()  const {return m_position;}
    const Vector getRmsSpread() const {return m_rmsSpread;}
private:
    double m_energy;         // Energy deposition in crystals in this cluster and layer
    Point  m_position;       // Average position in this layer
    Vector m_rmsSpread;      // Quadratic position spread for this layer
};

typedef std::vector<CalClusterLayerData> CalClusterLayerDataVec;
    
class CalCluster : public CalClusterLayerDataVec, virtual public ContainedObject 
{     
public:
  
    // Define a "null" constructor
    CalCluster(int numCalLayers=NUMCALLAYERS) : CalClusterLayerDataVec(numCalLayers) {iniCluster();}
        
    virtual ~CalCluster() {}

    /**
    *   initializing a subset of CalCluster data members (this is
    *   primarily used by reconRootReaderAlg in translating from
    *   PDS to TDS).
    *  
    *   @param params Calorimeter Parameters for this cluster
    *   @param layerData vector of CalReconLayerData objects
    *   @param rms_long RMS of longitudinal position measurements 
    *   @param rms_trans RMS of transversal position measurements 
    */
    void initialize(const CalParams& params,
                    double rms_long,
                    double rms_trans)
    {
        m_params   = params;
        m_rmslong  = rms_long;
        m_rmstrans = rms_trans;
    }

    /*
     *   Define individual set methods here for all variables
     */
    void setCalParams(const CalParams& params) {m_params       = params;  }
    void setRmsLong(double rmsLong)            {m_rmslong      = rmsLong; }
    void setRmsTrans(double rmsTrans)          {m_rmstrans     = rmsTrans;}

    /*
     * Provide access to the data
     */
    /// Direct access to the CalParams
    const CalParams& getCalParams() const {return m_params;}
    /// get RMS of longitudinal position measurements
    const double getRmsLong()		const {return m_rmslong;} 
    /// get RMS of transverse position measurements
    const double getRmsTrans()	    const {return m_rmstrans;}
    /// get reconstructed position
    Point getPosition()             const {return m_params.getCentroid();}
    /// get reconstructed direction
    Vector getDirection()           const {return m_params.getAxis();}
    /// write some of CalCluster data to the ASCII output file
    /// for debugging purposes
    void writeOut(MsgStream& stream) const;
        
private:

    ///reset CalCluster data
    inline void iniCluster();
        
    //! Cal Parameters
    CalParams m_params;
    //! RMS of longitudinal position measurement
    double m_rmslong;
    //! RMS of transverse position measurement
    double m_rmstrans;
};

inline void CalCluster::iniCluster()
{
    m_params       = CalParams();
    m_rmslong      = 0.;
    m_rmstrans     = 0.;
}

inline void CalCluster::writeOut(MsgStream& stream) const

// Purpose: provide ascii output of some data members for
//          debugging purposes
// Input:
//        stream - Gaudi message stream
{
    stream << "Energy " << m_params.getEnergy();
    stream << " " << getPosition().x() 
           << " " << getPosition().y() 
           << " " << getPosition().z();
    stream << " " << getDirection().x() 
           << " " << getDirection().y() 
           << " " << getDirection().z();
    stream << endreq;
}

//typedef for the Gaudi TDS Container
typedef ObjectVector<CalCluster>      CalClusterCol;
typedef CalClusterCol::iterator       CalClusterColItr;
typedef CalClusterCol::const_iterator CalClusterColConItr;

// Define the relational table taking us back to CalXtalRecData objects
typedef Event::RelTable<Event::CalXtalRecData, Event::CalCluster>               CalClusterHitTab;
typedef Event::Relation<Event::CalXtalRecData, Event::CalCluster>               CalClusterHitRel;
typedef ObjectList< Event::Relation<Event::CalXtalRecData, Event::CalCluster> > CalClusterHitTabList;

}

#endif	

  • No labels