#ifndef HMDCTRKCAND_H
#define HMDCTRKCAND_H
#include "TObject.h"
class HMdcTrkCand : public TObject {
protected:
  Char_t  sector;               
  Char_t  flag;                 
  Short_t nCandForSeg1;         
                                
                                
                                
                                
  Int_t   nextCandInd;          
                                
  Int_t   firstCandInd;         
                                
  Int_t   seg1Ind;              
  Int_t   seg2Ind;              
  Int_t   metaMatchInd;         
  Float_t dedxInner;            
  Float_t dedxSigmaInner;       
  UChar_t dedxNWireInner;       
  UChar_t dedxNWireCutInner;    
  Float_t dedxOuter;            
  Float_t dedxSigmaOuter;       
  UChar_t dedxNWireOuter;       
  UChar_t dedxNWireCutOuter;    
  Float_t dedxCombined;         
  Float_t dedxSigmaCombined;    
  UChar_t dedxNWireCombined;    
  UChar_t dedxNWireCutCombined; 
  Float_t dedx[4];              
  Float_t dedxSigma[4];         
  UChar_t dedxNWire[4];         
  UChar_t dedxNWireCut[4];      
  enum {kIsSeg1Fake = BIT(14),  
        kIsSeg2Fake = BIT(15)}; 
private: 
  HMdcTrkCand* pFirstCand;   
                             
public:
  HMdcTrkCand(void) {clear();}
  HMdcTrkCand(Char_t sec, Int_t s1ind, Int_t ind);
  HMdcTrkCand(HMdcTrkCand* fTrkCand, Int_t s2ind, Int_t ind);
  ~HMdcTrkCand(void) {}
  void clear(void);
  
  void setSec(Char_t s)                 {sector=s;}
  void setSeg1Ind(Int_t ind)            {seg1Ind=ind;}
  void setSeg2Ind(Int_t ind)            {seg2Ind=ind;}
  void setNCandForSeg1(Short_t n)       {nCandForSeg1=n;}
  void setFirstCandInd(Int_t i)         {firstCandInd=i;}
  void setNextCandInd(Int_t n)          {nextCandInd=n;}
  void setMetaMatchInd(Int_t ind)       {metaMatchInd=ind;}
  void addSeg2Ind(Int_t ind)            {seg2Ind=ind; nCandForSeg1=1;}
  void setFlag(Char_t fl)               {flag=fl;}
  
  void setFakeFlagSeg1(void)            { SetBit(kIsSeg1Fake); }
  void setFakeFlagSeg2(void)            { SetBit(kIsSeg2Fake); }
  void resetFakeFlagSeg1(void)          { ResetBit(kIsSeg1Fake); }
  void resetFakeFlagSeg2(void)          { ResetBit(kIsSeg2Fake); }
  Bool_t isSeg1Fake(void) const         { return TestBit(kIsSeg1Fake); }
  Bool_t isSeg2Fake(void) const         { return TestBit(kIsSeg2Fake); }
  Bool_t isFake(void) const             { return TestBit(kIsSeg1Fake) || TestBit(kIsSeg2Fake); }
  
  void setdedx(Int_t mod,Float_t dEdx)      {dedx        [mod]=dEdx;}
  void setSigmadedx(Int_t mod,Float_t Sig)  {dedxSigma   [mod]=Sig;}
  void setNWirededx(Int_t mod,UChar_t nW)   {dedxNWire   [mod]=nW;}
  void setNWireCutdedx(Int_t mod,UChar_t nW){dedxNWireCut[mod]=nW;}
  void setdedxInnerSeg(Float_t dedx)    {dedxInner=dedx;}
  void setdedxOuterSeg(Float_t dedx)    {dedxOuter=dedx;}
  void setdedxCombinedSeg(Float_t dedx) {dedxCombined=dedx;}
  void setdedxSeg(Int_t seg,Float_t dedx)
  {
      if(seg==0)     {dedxInner=dedx;}
      else if(seg==1){dedxOuter=dedx;}
      else if(seg==2){dedxCombined=dedx;}
  }
  void setSigmadedxInnerSeg(Float_t sig)    {dedxSigmaInner=sig;}
  void setSigmadedxOuterSeg(Float_t sig)    {dedxSigmaOuter=sig;}
  void setSigmadedxCombinedSeg(Float_t sig) {dedxSigmaCombined=sig;}
  void setSigmadedxSeg(Int_t seg,Float_t sig)
  {
      if(seg==0)     {dedxSigmaInner=sig;}
      else if(seg==1){dedxSigmaOuter=sig;}
      else if(seg==2){dedxSigmaCombined=sig;}
  }
  void setNWirededxInnerSeg(UChar_t nw){dedxNWireInner=nw;}
  void setNWirededxOuterSeg(UChar_t nw){dedxNWireOuter=nw;}
  void setNWirededxCombinedSeg(UChar_t nw){dedxNWireCombined=nw;}
  void setNWirededxSeg(Int_t seg,UChar_t nw)
  {
      if(seg==0)     {dedxNWireInner=nw;}
      else if(seg==1){dedxNWireOuter=nw;}
      else if(seg==2){dedxNWireCombined=nw;}
  }
  void setNWireCutdedxInnerSeg(UChar_t nw){dedxNWireCutInner=nw;}
  void setNWireCutdedxOuterSeg(UChar_t nw){dedxNWireCutOuter=nw;}
  void setNWireCutdedxCombinedSeg(UChar_t nw){dedxNWireCutCombined=nw;}
  void setNWireCutdedxSeg(Int_t seg,UChar_t nw)
  {
      if(seg==0)     {dedxNWireCutInner=nw;}
      else if(seg==1){dedxNWireCutOuter=nw;}
      else if(seg==2){dedxNWireCutCombined=nw;}
  }
  Char_t  getSec(void) const     {return sector;}
  Int_t   getSeg1Ind(void) const {return seg1Ind;}
  Int_t   getSeg2Ind(void) const {return seg2Ind;}
  Int_t   getSegInd(const Int_t seg) const {
    return (seg==0) ? seg1Ind : ((seg==1) ? seg2Ind:-1); }
  Short_t getNCandForSeg1(void) const    {return nCandForSeg1;}
  Int_t   getNextCandInd(void) const     {return nextCandInd;}
  Int_t   getFirstCandInd(void) const    {return firstCandInd;}
  Int_t   getMetaMatchInd(void) const    {return metaMatchInd;}
  Char_t  getFlag(void) const            {return flag;}
  Float_t getdedx(Int_t mod)        {return dedx        [mod];}
  Float_t getSigmadedx(Int_t mod)   {return dedxSigma   [mod];}
  UChar_t getNWirededx(Int_t mod)   {return dedxNWire   [mod];}
  UChar_t getNWireCutdedx(Int_t mod){return dedxNWireCut[mod];}
  Float_t getdedxInnerSeg(void) const    {return dedxInner;}
  Float_t getdedxOuterSeg(void) const    {return dedxOuter;}
  Float_t getdedxCombinedSeg(void) const {return dedxCombined;}
  Float_t getdedxSeg(Int_t seg)
  {
      if(seg==0)     {return dedxInner;}
      else if(seg==1){return dedxOuter;}
      else if(seg==2){return dedxCombined;}
      else {return -1;}
  }
  Float_t getSigmadedxInnerSeg(){return dedxSigmaInner;}
  Float_t getSigmadedxOuterSeg(){return dedxSigmaOuter;}
  Float_t getSigmadedxCombinedSeg(){return dedxSigmaCombined;}
  Float_t getSigmadedxSeg(Int_t seg)
  {
      if(seg==0)     {return dedxSigmaInner;}
      else if(seg==1){return dedxSigmaOuter;}
      else if(seg==2){return dedxSigmaCombined;}
      else {return -1;}
  }
  UChar_t getNWirededxInnerSeg()    {return dedxNWireInner;}
  UChar_t getNWirededxOuterSeg()    {return dedxNWireOuter;}
  UChar_t getNWirededxCombinedSeg() {return dedxNWireCombined;}
  UChar_t getNWirededxSeg(Int_t seg)
  {
      if(seg==0)     {return dedxNWireInner;}
      else if(seg==1){return dedxNWireOuter;}
      else if(seg==2){return dedxNWireCombined;}
      else {return 0;}
  }
  UChar_t getNWireCutdedxInnerSeg(){return dedxNWireCutInner;}
  UChar_t getNWireCutdedxOuterSeg(){return dedxNWireCutOuter;}
  UChar_t getNWireCutdedxCombinedSeg(){return dedxNWireCutCombined;}
  UChar_t getNWireCutdedxSeg(Int_t seg)
  {
      if(seg==0)     {return dedxNWireCutInner;}
      else if(seg==1){return dedxNWireCutOuter;}
      else if(seg==2){return dedxNWireCutCombined;}
      else {return 0;}
  }
  virtual void print(void) const;
  
  ClassDef(HMdcTrkCand,1) 
};
#endif  /* HMDCTRKCAND_H */