/// 
/// For questions or suggestions about this module please contact the 
/// current responsible and CC in the oaAnalysis package manager.
///
/// 21-Jul-2010: The module initially created  by 
/// Tomasz Wachala (Tomasz.Wachala [*a*t*] ifj.edu.pl)
///
/// current manager is 
/// Alexander Izmaylov (izmaylov [*a*t*] inr.ru)

#ifndef _TSmrdReconModule_hxx_seen
#define _TSmrdReconModule_hxx_seen

#include <TClonesArray.h>

#include "IoaAnalysisUtils.hxx"
#include "IAnalysisReconModuleBase.hxx"

namespace COMET {
  class IReconSMRDModule;
}

/// Summary information from ReconSMRD output.
// [TW]
class COMET::IReconSMRDModule : public IAnalysisReconModuleBase {
  public:
      enum ESMRDWall {kTop = 0, kBottom, kRight, kLeft};

      ///Both-sided SMRD IReconHit that isn't included in any reconstructed track.
      ///It contains Z position calculated according to the time difference between two sides.
      class IReconSMRDHit : public TObject {
        public:
            virtual ~IReconSMRDHit();
            
            TLorentzVector Position;
            TLorentzVector PositionUncertainty;
            double Charge;
        double dZ;
        double dT;
              double ContribCharge[2];
    
            int Wall;
            int Yoke;
            int Layer;
            int Tower;
            int Counter;
        UInt_t RMM;
        UInt_t TFB;
        
        //flags for hit types
        bool IsInnerMatched;
        bool IsUsed;
            

    ClassDef(IReconSMRDModule::IReconSMRDHit, 1);
      };
  
      ///SMRD isolated track.
      class ISmrdIsoTrack : public TObject {
        public:
            virtual ~ISmrdIsoTrack();
    
                                ///Unique ID used for global - subdetector matching
                                UInt_t UniqueID;

            ///Name of the reconstruction algorithm.
            std::string AlgorithmName;
    
            TLorentzVector FrontPos;
            TLorentzVector FrontPosVariance;

            TLorentzVector BackPos;
            TLorentzVector BackPosVariance;

            TVector3 Direction;
            TVector3 DirectionVariance;
        
            int NHits;
            int NNodes;
      
        int Status;///<status of the refitted smrd track (kSuccess)

        int KalmanStatus;				///<status to check that a track was successfully Kalman refitted

        int NDOF;


            double EDeposit;                                ///<total charge of the object

        
        double avgtime;				///<hits averaged time

            double Range;    
            double Chi2;
    
            double ThetaAngle;
            double PhiAngle;
            //std::vector<TVector3*> HitPositions;
        
        //MC Truth information.
        TLorentzVector 			TrueInitPos;
        IoaAnalysisUtils::ESubdetector 	TrueInitDet;
        
        TLorentzVector 			TrueFinalPos;
        IoaAnalysisUtils::ESubdetector 	TrueFinalDet;	

        TLorentzVector 			TrueInitMom;
                
        int 				TrueId;
        int 				TruePDG;
        
        int 				TrueParentId;				
        //int 				TrueParentPDG;
        
        double 				TrueHitPurity;
        double 				TrueHitEff;
            
        ClassDef(IReconSMRDModule::ISmrdIsoTrack, 1);
      };
 
  public:
      IReconSMRDModule(const char *name = "SMRD", const char *title = "SMRD Recon Module");
      virtual ~IReconSMRDModule();
  
      virtual Bool_t ProcessFirstEvent(COMET::ICOMETEvent &event);
      virtual Bool_t IsEnabledByDefault() const {return kTRUE;}  
        
  protected:
      virtual void InitializeModule();  
      virtual void InitializeBranches();  
      virtual bool FillTree(COMET::ICOMETEvent &);
  
  public:
      Int_t fNSmrdReconHits;	        ///< The number of SMRD TReconHits.
      TClonesArray *fSmrdReconHits;	///< The SMRD TReconHits.

      Int_t fNSmrdIsoTracks;	        ///< The number of SMRD isolated tracks.
      TClonesArray *fSmrdIsoTracks;	///< The SMRD isolated tracks.
    
  private:
    ClassDef(IReconSMRDModule, 3);
};

#endif