////////////////////////////////////////////////////////////////////////
// Analysis Module for CandFitTrackCam
//
// marshall@hep.phy.cam.ac.uk
////////////////////////////////////////////////////////////////////////
#ifndef FITTRACKCAMANALYSISMODULE_H
#define FITTRACKCAMANALYSISMODULE_H
#ifndef JOBCMODULE_H
#include "JobControl/JobCModule.h"
#endif
#include "TString.h"
#include "TFile.h"
#include "TTree.h"
#include "TMarker.h"
#include "DataUtil/Truthifier.h"
#include <vector>
using std::vector;

class CandRecord;
class TFile;
class TTree;
class TCanvas;
class TPad;
class TH2F;


class FitTrackCamAnalysisModule : public JobCModule
{
public:
  FitTrackCamAnalysisModule();
  ~FitTrackCamAnalysisModule();

public:
  // Handle job status changes
  void BeginJob();
  void EndJob();

  void ConfigureAxes(VldContext *vldc);
  void SliceSection();
  void ShowerSection();
  void TrackSection();
  void FittedTrackSection();

  void TruthSection(SimSnarlRecord* simrec);
  void TruthSliceSection(Truthifier* mytruth);
  void EfficiencySection(Truthifier* mytruth);

  void Draw();
  void Pause();
  void CleanUp();

  // Analysis and Reconstruction methods
  JobCResult Ana(const MomNavigator* mom);

  // Module configuration
  const Registry& DefaultConfig() const;
  void  Config(const Registry& r);

private:
  CandRecord* candrec;

  // Module member data
  TString fListInSlc;
  TString fListInShw;
  TString fListInTrk;
  TString fListInFitTrk;
  TString fFileName;

  TCanvas* fTrackCanvas;
  TPad* fUZPad;
  TPad* fVZPad;
  TH2F* fUZAxis;
  TH2F* fVZAxis;

  TPad* fUZMCPad;
  TPad* fVZMCPad;
  TH2F* fUZMCAxis;
  TH2F* fVZMCAxis;

  vector<vector <TMarker> > fUZSliceMarker;
  vector<vector <TMarker> > fVZSliceMarker;

  vector<vector <TMarker> > fUZShowerMarker;
  vector<vector <TMarker> > fVZShowerMarker;

  vector<vector <TMarker> > fUZTrackMarker;
  vector<vector <TMarker> > fVZTrackMarker;

  vector<vector <TMarker> > fUZFitTrackMarker;
  vector<vector <TMarker> > fVZFitTrackMarker;

  vector<vector <TMarker> > fUZSliceMarkerTruth;
  vector<vector <TMarker> > fVZSliceMarkerTruth;

  vector<vector <TMarker> > fUZTrackMarkerTruth;
  vector<vector <TMarker> > fVZTrackMarkerTruth;

  float fMaxZ;
  float fMinZ;
  float fMaxUorV;
  float fMinUorV;

  int fFitEndPlane;
  int fFitVtxPlane;
  int fTrueMaxPlane;
  int fTrueMinPlane;

  int isMC;

  TFile* FTCFile;
  TTree* FTCTree;

  bool CareAboutXTalk;
  bool debug;

  // Header info
  int Run;
  int Snarl;
  int NumFittedTracks;
  int Pass;

  // Momentum-related quantities
  double RecoQP;
  double TrueQP;
  double QPVtxError;
  double RecoMomCurve;
  double RecoMomRange;
  double TrueMom;
  double RecoTime;

  // For checking tracking efficency
  int FitTrackStrips;
  int TrueMuonStrips;
  int FitAndTruthAgree;
  int FitTrackLength;
  int TrueTrackLength;
  int TotalStripsInSnarl;
  int FDFullyContained;
  int NTrackStrip;
  int NTrackDigit;

  // Track fit quality
  double Chi2;
  int NDOF;
  int NIterate;
  int NSwimFail;

  // Timing info
  double TimeSlope;
  double TimeOffset;
  double VtxT;
  double EndT;
  double TimeFitChi2;
  double NTimeFitDigit;
  double TimeForwardFitRMS;
  int TimeForwardFitNDOF;
  double TimeBackwardFitRMS;
  int TimeBackwardFitNDOF;

  // Vtx properties
  double VtxU;
  double VtxV;
  double VtxZ;
  int VtxPlane;

  double VtxDirCosU;
  double VtxDirCosV;
  double VtxDirCosZ;

  double VtxUError;
  double VtxVError;
  double VtxdUError;
  double VtxdVError;

  // End properties
  double EndU;
  double EndV;
  double EndZ;
  int EndPlane;
  double EndQP;
  
  double EndDirCosU;
  double EndDirCosV;
  double EndDirCosZ;

  double EndUError;
  double EndVError;
  double EnddUError;
  double EnddVError;
  double EndQPError;

  // Range and dS
  double Range;
  double dS;

  // Traces
  double VtxTrace;
  double VtxTraceZ;
  double EndTrace;
  double EndTraceZ;

};
#endif // FITTRACKANALYSISMODULE_H
////////////////////////////////////////////////////////////////////////
