////////////////////////////////////////////////////////////////////////
// $Id: AlgFitTrackMSList.cxx,v 1.5 2003/09/29 21:52:59 rhatcher Exp $
//
// AlgFitTrackMSList is a concrete FitTrackMSList Algorithm class.
//
// Tom Bringley
// ttb2@duke.edu
// 6/13/2001
////////////////////////////////////////////////////////////////////////

#include <cassert>
#include <vector>

#include "Algorithm/AlgFactory.h"
#include "Algorithm/AlgHandle.h"
#include "Algorithm/AlgConfig.h"
#include "Candidate/CandContext.h"
#include "CandFitTrackMS/AlgFitTrackMSList.h"
#include "CandFitTrackMS/CandFitTrackMS.h"
#include "CandFitTrackMS/CandFitTrackMS.h"
#include "CandFitTrackMS/CandFitTrackMSHandle.h"
#include "CandFitTrackMS/CandFitTrackMSList.h"
#include "CandFitTrackMS/CandFitTrackMSListHandle.h"
#include "Conventions/Mphysical.h"
#include "Conventions/Munits.h"
#include "Conventions/PlaneView.h"
#include "MessageService/MsgService.h"
#include "MinosObjectMap/MomNavigator.h"
#include "Navigation/NavKey.h"
#include "Navigation/NavSet.h"
#include "RecoBase/CandTrackHandle.h"
#include "RecoBase/CandTrackListHandle.h"
#include "RecoBase/CandSliceHandle.h"
#include "RecoBase/CandSliceListHandle.h"
#include "RecoBase/LinearFit.h"
#include "UgliGeometry/UgliGeomHandle.h"
#include "Validity/VldContext.h"


ClassImp(AlgFitTrackMSList)


//______________________________________________________________________
CVSID("$Id: AlgFitTrackMSList.cxx,v 1.5 2003/09/29 21:52:59 rhatcher Exp $");

//______________________________________________________________________
AlgFitTrackMSList::AlgFitTrackMSList()
{
}

//______________________________________________________________________
AlgFitTrackMSList::~AlgFitTrackMSList()
{
}

//______________________________________________________________________
void AlgFitTrackMSList::RunAlg(AlgConfig & /* ac */, 
                               CandHandle &ch,CandContext &cx)
{
  MSG("Alg", Msg::kDebug)
                           << "Starting AlgFitTrackMSList::RunAlg()" << endl;

  assert(cx.GetDataIn());

  if (!(cx.GetDataIn()->InheritsFrom("TObjArray"))) {
    return;
  }

  const CandSliceListHandle *slicelist = 0;
  const CandTrackListHandle *tracklist = 0;
  const TObjArray *cxin = dynamic_cast<const TObjArray *>(cx.GetDataIn());
  for (Int_t i=0; i<=cxin->GetLast(); i++) {
    TObject *tobj = cxin->At(i);
    if (tobj->InheritsFrom("CandSliceListHandle")) {
      slicelist = dynamic_cast<CandSliceListHandle*>(tobj);
    }
    if (tobj->InheritsFrom("CandTrackListHandle")) {
      tracklist = dynamic_cast<CandTrackListHandle*>(tobj);
    }
  }
  if (!slicelist || !tracklist) {
    MSG("FitTrackMS",Msg::kError) <<
      "CandSliceListHandle or CandTrackListHandle missing\n";
  }

// Create Candcontext
  CandContext cxx(this,cx.GetMom());

// Get singleton instance of AlgFactory
  AlgFactory &af = AlgFactory::GetInstance();

// Get an AlgHandle to AlgSliceMS with default AlgConfig
  AlgHandle ah = af.GetAlgHandle("AlgFitTrackMS","default");

  TIter trackItr(tracklist->GetDaughterIterator());

  Int_t t=0;

  while (CandTrackHandle *track =
    dynamic_cast<CandTrackHandle*>(trackItr.Next())) {

    t++;
    MSG("FitTrackMS",Msg::kDebug) << "track number " << t << endl;
    
    cxx.SetDataIn(track);
    CandFitTrackMSHandle fittrack = CandFitTrackMS::MakeCandidate(ah,cxx);
    ch.AddDaughterLink(fittrack);
  }

}


//______________________________________________________________________
void AlgFitTrackMSList::Trace(const char * /* c */) const
{
}

