#ifndef HRKTRACKBF2_H
#define HRKTRACKBF2_H
#include "hreconstructor.h"
#include "hgeomtransform.h"
#include "hmdctrkcand.h"
#include "hmdcgetcontainers.h"
#include "htofclustersim.h"
class HCategory;
class HIterator;
class HMetaMatch2;
class HMetaMatchPar;
class HMdcSeg;
class HMdcHit;
class HMdcTrkCand;
class HBaseTrack;
class HSplineTrack;
class HShowerHit;
class HTofHit;
class HTofCluster;
class HRungeKutta;
class HRKTrackB;
class HMdcTrackGFieldPar;
class HMagnetPar;
class HSpecGeomPar;
class HMdcGeomPar;
class HTofGeomPar;
class HRpcGeomPar;
class HShowerGeometry;
class HEmcGeomPar;
class HMdcGetContainers;
class HMdcSizesCells;
class HRpcCluster;
class HEmcCluster;
class HRKTrackBF2 : public HReconstructor 
{
 private:
   Float_t fieldFactor; 
   Short_t mode;        
   HGeomTransform      secTrans[6];     
   HGeomTransform      showerSM[6];     
   HGeomTransform      emcSM[6];        
   HGeomTransform      tofSM[6][8];     
   HGeomTransform      rpcSM[6];        
   HGeomTransform      transMetaSM;     
   
   
    Float_t            sigma2TofX[6];       
    Float_t            sigma2TofY[6];
    Float_t            sTofX[6];
    Float_t            sTofY[6];
    Float_t            quality2TOFCut[6];
    Float_t            sigma2MdcInRpcX[6];
    Float_t            sigma2MdcInRpcY[6];
    Float_t            sigma2MdcInShrX[6];
    Float_t            sigma2MdcInShrY[6];
    Float_t            sigma2MdcInEmcX[6];
    Float_t            sigma2MdcInEmcY[6];
    Float_t            sShowerX[6];
    Float_t            sShowerY[6];
    Float_t            sEmcX[6];
    Float_t            sEmcY[6];
    Float_t            sRpcX[6];
    Float_t            sRpcY[6];
    Float_t            quality2RPCCut[6];
    Float_t            quality2SHOWERCut[6];
    Float_t            quality2EMCCut[6];
   
   
   
   HMdcTrackGFieldPar* field;           
   HMagnetPar*         pMagnet;         
   HSpecGeomPar*       fSpecGeomPar;    
   HMdcGetContainers*  fGetCont;        
   HTofGeomPar*        fTofGeometry;    
   HRpcGeomPar*        fRpcGeometry;    
   HShowerGeometry*    fShowerGeometry; 
   HEmcGeomPar*        fEmcGeometry;    
   HMdcSizesCells*     pMSizesCells;    
   
   HCategory*          fCatMetaMatch;   
   HIterator*          fMetaMatchIter;  
   HMetaMatch2*        pMetaMatch;      
   HMetaMatchPar*      fMatchPar;
   HCategory*          fCatMdcTrkCand;  
   HMdcTrkCand*        pMdcTrkCand;     
   HCategory*          fCatMdcSeg;      
   HCategory*          fCatMdcHit;      
   HCategory*          fSplineTrack;    
   HSplineTrack*       pSplineTrack;    
   HCategory*          fCatKine;        
   HCategory*          fCatShower;      
   HCategory*          fCatEmc;         
   HCategory*          fCatTof;         
   HTofHit  *          pTofHit[3];
   HCategory*          fCatTofCluster;  
   HCategory*          fCatRpcCluster;
   HTofCluster*        pTofCluster;     
   HCategory*          fCatRKTrack;     
   HRungeKutta*        pRungeKutta;     
   HLocation   sectorloc;        
   Int_t  sector;                
   Short_t  system;              
   HMdcSeg* pMdcSeg1;            
   HMdcSeg* pMdcSeg2;            
   Bool_t mdcInstalled[4][6];    
   Float_t multSig[8];           
   Float_t vertex[3];            
   HGeomVector normVecRpc[6];    
   HGeomVector centerRpc[6];     
   HGeomVector normVecShower[6]; 
   HGeomVector normVecEmc[6];    
   HGeomVector normVecTof[6][8]; 
   HGeomVector metaNormVec;      
   HGeomVector pointMeta;        
   Bool_t  success;              
   Short_t qRK;                  
   Float_t pRK;                  
   Float_t momentumGuess;        
   Float_t chiqRK;               
   Float_t trackLength;          
   Float_t tof;                  
   Float_t metaeloss;            
   Float_t beta;                 
   Float_t mass2;                
   Float_t RKxyzMETA[3];         
   Float_t xTof,yTof,zTof;
   Float_t zMod;
   Float_t dXrms2;
   Float_t dYrms2;
   Float_t dX, dY;
   Float_t qualityRpc;
   Float_t qualityShower;
   Float_t qualityEmc;
   Float_t qualityTof;
   
   HShowerHit  *pShowerHit;
   HEmcCluster *pEmcCluster;
   HRpcCluster *pRpc;
   Short_t indRpc;
   Short_t indTof[3];
   Short_t indShower;
   Short_t indEmc;
   Bool_t doMassStuff();
   void matchWithRpc();
   void matchWithShower();
   void matchWithEmc();
   void matchWithTof();
   void calcBeta(Float_t, Int_t , Bool_t option = kTRUE);
   Int_t indexRK;
   
   HRKTrackB* fillData(HMdcSeg*,HMdcSeg*,HSplineTrack*, Int_t &);
   Int_t calcPosDirFromSegment(HMdcSeg* pSeg,Int_t ioseg,Double_t*,Double_t*,Bool_t flag);
   void setMatchingParams(Int_t );
   Float_t getQuality(Float_t, Float_t, Float_t, Float_t);
   
 public:
   HRKTrackBF2();
   HRKTrackBF2(const Text_t name[], Short_t m = 2);
   ~HRKTrackBF2(); 
 
   void clear();
   Bool_t init();
   Bool_t reinit();
   Int_t  execute();
   Bool_t finalize() { return kTRUE; }
   
   ClassDef(HRKTrackBF2,0) 
};
#endif