#ifndef HKalMetaMatcher_h
#define HKalMetaMatcher_h
class     TVector3;
#include "TMath.h"
class HCategory;
class HGeomVector;
class HMetaMatchPar;
class HRpcGeomPar;
class HShowerGeometry;
class HEmcGeomPar;
class HTofGeomPar;
#include "hgeomtransform.h"
#include "hmetamatch2.h"
#include "hkalifilt.h"
#include "hkalmetamatch.h"
class HKalMetaMatcher : public TObject {
private:
    static const Int_t nMetaTabs   = META_TAB_SIZE; 
    static const Int_t tofClusterSize = 3;          
    Bool_t           bIsMatched;
    HCategory*       fCatShower;      
    HCategory*       fCatEmcCluster;  
    HCategory*       fCatTof;         
    HCategory*       fCatTofCluster;  
    HCategory*       fCatRpcCluster;  
    HRpcGeomPar*     fRpcGeometry;    
    HShowerGeometry* fShowerGeometry; 
    HEmcGeomPar*     fEmcGeometry;    
    HTofGeomPar*     fTofGeometry;    
    HMetaMatchPar*   fMatchPar;
    HKalMetaMatch    matchesRpc   [nMetaTabs];
    HKalMetaMatch    matchesShower[nMetaTabs];
    HKalMetaMatch    matchesEmc   [nMetaTabs];
    HKalMetaMatch    matchesTof   [nMetaTabs][tofClusterSize];
    HGeomTransform   labSecTrans[6];       
    HGeomTransform   modSecTransRpc[6];    
    HGeomTransform   modSecTransShower[6]; 
    HGeomTransform   modSecTransEmc[6]; 
    HGeomTransform   modSecTransTof[6][8]; 
    TVector3         normVecRpc[6];    
    TVector3         normVecShower[6]; 
    TVector3         normVecEmc[6];    
    TVector3         normVecTof[6][8]; 
    HKalIFilt*       pKalsys;         
protected:
    virtual void    getMetaRecoPos (Float_t &xReco, Float_t &yReco, Float_t &zReco) const;
    virtual Float_t getP           () const;
    virtual Float_t getTrackLength () const;
    virtual Bool_t  traceToMeta    (const TVector3 &metaHit, const TVector3 &metaNorm);
public:
    HKalMetaMatcher();
    virtual ~HKalMetaMatcher() { ; }
    virtual Float_t calcQuality    (Float_t dx, Float_t dy, Float_t s2x, Float_t s2y) const { return TMath::Sqrt(dx*dx/s2x + dy*dy/s2y); }
    virtual void    clearMatches   ();
    virtual void    init           ();
    virtual Bool_t  matchWithMeta  (HMetaMatch2 const* const pMetaMatch, HKalIFilt *const pKalsys);
    virtual void    matchWithRpc   (HMetaMatch2 const* const pMetaMatch);
    virtual void    matchWithShower(HMetaMatch2 const* const pMetaMatch);
    virtual void    matchWithEmc   (HMetaMatch2 const* const pMetaMatch);
    virtual void    matchWithTof   (HMetaMatch2 const* const pMetaMatch);
    virtual void    reinit         ();
    virtual Int_t   getClstrSize   (Int_t sys) const;
    virtual Bool_t  getIsMatched   () const                                { return bIsMatched; }
    virtual const HKalMetaMatch& getMatch(Int_t sys, Int_t tab, Int_t clstr) const;
    virtual Int_t   getNmetaTabs   () const { return nMetaTabs; }
    ClassDef(HKalMetaMatcher, 0)
};
#endif // HKalMetaMatcher_h