//----------------------------------------------------------------------- // File and Version Information: // PacEmcCluster // Class for PacEmcCluster for fast simulation, a stripped down version // from Babar's EmcCluster. // // Author List: // Chih-hsiang Cheng Caltech (initial version 2008/06/13) // //----------------------------------------------------------------------- #ifndef PACEMCCLUSTER_HH #define PACEMCCLUSTER_HH #include using std::vector; #include "AbsCalo/AbsRecoCalo.hh" #include "AbsCalo/AbsCaloTypes.hh" #include "AbsEnv/TwoCoordIndex.hh" #include "PacEmc/PacEmcDigi.hh" class PacEmcClusterEnergySums; // class EmcClusterMoments; // class EmcXClMoments; // class EmcClusterLogPos; // class EmcClusterLiloPos; // class EmcClusterDistances; class GTrack; class TrkLineTraj; // --------------------- // -- Class Interface -- // --------------------- class PacEmcCluster : public AbsRecoCalo { public: // Typedefs, consts, and enums enum CentroidMethod { gravity, logarithmic, neighbour, lilo }; typedef std::vector< PacEmcDigi* >::iterator PacEmcDigiiterator; // Constructor PacEmcCluster(); // Desctructor virtual ~PacEmcCluster(); virtual const std::vector< PacEmcDigi* > *pacEmcDigis() const; virtual const std::vector< GTrack > *gtracks() const; // Total Energy of Cluster virtual double energy() const; virtual double rawEnergy() const; // GTrack that contributes the most energy virtual const GTrack *gtk() const { return 0; }; // Theta centroid of cluster virtual double theta() const; // Phi centroid of cluster virtual double phi() const; // Theta centroid of cluster in index units virtual double thetaIndex() const; virtual int thetaIndexInt() const; // Phi centroid of cluster in index units virtual double phiIndex() const; virtual int phiIndexInt() const; // Theta centroid of cluster using crystal index number virtual double thetaFromIndex() const; // Phi centroid of cluster using crystal index number virtual double phiFromIndex() const; // Angle of major axis wrt phi virtual double major_axis() const; // Digi with largest energy in cluster const PacEmcDigi* maxima() const; // Digi with next to cluster centroid //const PacEmcDigi centrum() const; // Direction to ctr clus virtual HepPoint position( const HepPoint &from=HepPoint(0,0,0), const PdtEntry* particle=0 ) const; // Direction to ctr clus virtual HepPoint rawPosition( const HepPoint &from=HepPoint(0,0,0), const PdtEntry* particle=0 ) const; // Error Matrix for Cluster virtual BbrError errorMatrix( const HepPoint &from=HepPoint(0,0,0), const PdtEntry* particle=0 ) const; // Invariant mass of cluster virtual double mass() const; // Where is cluster? virtual HepPoint where() const; // x co-ordinate of clus virtual double x() const; // y co-ordinate of clus virtual double y() const; // z co-ordinate of clus virtual double z() const; // Distance from centre of cluster to a point virtual double distanceToCentre( const HepPoint& aPoint ) const; virtual double distanceToCentre( const PacEmcDigi* aDigi ) const; virtual int numberOfDigis() const; // dnb03/06/03 nbumps is a 'local' parameter virtual unsigned nBumps() const; void invalidateCache(); // Modifiers virtual void addDigi( PacEmcDigi* d ); void addCluster( PacEmcCluster* c); virtual void sortDigis(); virtual void setNBumps( unsigned nbumps); const PacEmcCluster* clone(); virtual const PacEmcClusterEnergySums& esums() const; // virtual const EmcClusterMoments& moments() const; // virtual const EmcClusterDistances& distances() const; // virtual const EmcXClMoments& Xmoments() const; // virtual const EmcClusterLogPos& logPositions() const; // virtual const EmcClusterLiloPos& liloPositions() const; // represent the cluster as a line in space TrkLineTraj clusterTraj() const; protected: // Helper functions virtual void clear(); // make cluster empty private: // Members std::vector< PacEmcDigi* > *_pacEmcDigis; unsigned _nbumps; std::vector< GTrack > *_gtracks; // Cachable data mutable bool _energyValid; mutable double _energy; mutable bool _whereValid; mutable HepPoint* _where; mutable PacEmcClusterEnergySums* _theClusEnergySums; // mutable EmcClusterMoments* _theClusMoments; // mutable EmcXClMoments* _theClusXClMoments; // mutable EmcClusterLogPos* _theClusLogPos; // mutable EmcClusterLiloPos* _theClusLiloPos; // mutable EmcClusterDistances* _theClusDistances; // Disallow copy, op= PacEmcCluster(const PacEmcCluster &); PacEmcCluster & operator=(const PacEmcCluster &); //------------------ // Static Members -- //------------------ public: static HepPoint gravWhere( const PacEmcCluster* me ) ; }; #endif