#ifndef HMDCSEGSIM_H
#define HMDCSEGSIM_H
#include "hmdcseg.h"
class HMdcSegSim : public HMdcSeg {
  protected:
    Short_t nTracks;        
    Int_t   listTracks[5];  
    UChar_t nTimes[5];      
    
    UChar_t nDigiTimes[5];  
    UChar_t trackStatus[5]; 
    Char_t  nNotFakeTracks; 
    Char_t  ioSMatchStatus; 
    
    Int_t   status;         
  public:
    HMdcSegSim(void) {clear();}
    ~HMdcSegSim(void) {}
    void  clear(void);
    void  clearSimInfo(void);
    void  setStatus(Int_t f) { status=f; }
    void  setNTracks(Int_t nTr, const Int_t* listTr, const UChar_t* nTm,const UChar_t* nDi=0);
    void  addTrack(Int_t track, UChar_t nTm,UChar_t nDi=0);
    Int_t calcNTracks(void);
    void  setTrackInf(const Int_t *lst,const Short_t *nTms,const UChar_t *nDTms,const UChar_t *tSt);
    inline void  setNTracks(Int_t nTr,Char_t nNF,Char_t ioS);
    void  setNDigiTimes(Int_t n,UChar_t nt)         {if(indOk(n)) nDigiTimes[n] = nt;}
    void  setTrackStatus(Int_t n,UChar_t status)    {if(indOk(n)) trackStatus[n] = status;}
    
    inline Int_t   getStatus(void) const            {return status;}
    inline Int_t   getNTracks(void) const           {return nTracks;}
    inline Char_t  getNNotFakeTracks(void) const    {return nNotFakeTracks;}
    inline Int_t   getTrack(Int_t n) const;
    inline UChar_t getNTimes(Int_t n) const;
    inline UChar_t getNDigiTimes(Int_t n) const;
    UChar_t        getTrackStatus(Int_t n) const;
    Int_t          getNumNoiseWires(void) const;
    void           sortTrListByContr(void);
    Int_t          getGoodTrack(Int_t i1,HMdcSegSim* outerSeg,Int_t nWiresCut=5) const;
    Int_t          getNextGoodTrack(Int_t& i1,HMdcSegSim* outerSeg,Int_t nWiresCut=5) const;
    
    Bool_t  isGntTrackOk(Int_t i) const             {return  testBit(i,254);}
    Bool_t  isFakeContribution(Int_t i) const       {return !testBit(i,2);}
    Bool_t  isClFnLevelTooHigh(Int_t i) const       {return !testBit(i,4);}
    Bool_t  is1or2HitsNotRec(Int_t i) const         {return !testBit(i,8);}
    Bool_t  isSegNotRec(Int_t i) const              {return !testBit(i,16);}
    Bool_t  isTrackNotRec(Int_t i) const            {return !testBit(i,32);}
    Bool_t  isNoMeta(Int_t i) const                 {return !testBit(i,64);}
    Bool_t  isGEANTBug(Int_t i) const               {return !testBit(i,128);}
    Int_t   findTrack(Int_t geantNum,Int_t nDigTimes=0) const;
    Int_t   getTrackIndex(Int_t tr) const;
    Bool_t  resetFakeContributionFlag(void);
    Bool_t  setFakeContributionFlag(void);
    void print(void);
    
private:
  Bool_t  indOk(Int_t i) const             {return i>=0 && i<nTracks;}
  UChar_t trackBits(Int_t i) const         {return indOk(i) ? trackStatus[i]:0;}
  Bool_t  testBit(Int_t i,UChar_t b) const {return (trackBits(i)&b) == b;}
  void    exchangeTrPos(Int_t t1,Int_t t2);
  ClassDef(HMdcSegSim,1) 
};
inline Int_t HMdcSegSim::getTrack(Int_t n) const {
  return indOk(n) ? listTracks[n] : -1;
}
inline UChar_t HMdcSegSim::getNTimes(Int_t n) const {
  return indOk(n) ? nTimes[n] : 0;
}
 
inline UChar_t HMdcSegSim::getNDigiTimes(Int_t n) const  {
  return indOk(n) ? nDigiTimes[n] : 0;
}
inline void HMdcSegSim::setNTracks(Int_t nTr,Char_t nNF,Char_t ioS) {
  nTracks        = nTr;
  nNotFakeTracks = nNF; 
  ioSMatchStatus = ioS;
}
#endif  /*HMDCSEGSIM_H */