//_____________________________________________________________________________
///
/// \class AlgFitTrackSAList
///
/// AlgFitTrackSA receives CandTrackListHandle* from the job module
/// and passes CandTrackHandle's one by one to AlgFitTrackSA that
/// does the actual fitting.
///
/// \author Sergei avva@fnal.gov
///

#include <cassert>
#include <vector>

#include "TClonesArray.h"

#include "Algorithm/AlgFactory.h"
#include "Algorithm/AlgHandle.h"
#include "Algorithm/AlgConfig.h"
#include "Candidate/CandContext.h"
#include "RecoBase/CandTrackHandle.h"
#include "RecoBase/CandTrackListHandle.h"
#include "MessageService/MsgService.h"
#include "Validity/VldContext.h"

#include "CandFitTrackSA/AlgFitTrackSAList.h"
#include "CandFitTrackSA/CandFitTrackSA.h"
#include "CandFitTrackSA/CandFitTrackSAHandle.h"
#include "CandFitTrackSA/TracerSA.h"

CVSID("$Id: AlgFitTrackSAList.cxx,v 1.9 2006/02/13 05:06:09 avva Exp $");

ClassImp(AlgFitTrackSAList)

///
/// ctor
///
AlgFitTrackSAList::AlgFitTrackSAList() 
{
    TracerSA trace("AlgFitTrackSAList::AlgFitTrackSAList()");
}

///
/// dtor
///
AlgFitTrackSAList::~AlgFitTrackSAList() 
{
    TracerSA trace("AlgFitTrackSAList::~AlgFitTrackSAList()");
}

///
/// RunAlg - get CandTrackHandle's and pass them to AlgFitTrackSA
/// one by one.
///
void AlgFitTrackSAList::RunAlg(AlgConfig& ac, 
                            CandHandle& cftlh, CandContext& trackListContext) 
{
    TracerSA trace("AlgFitTrackSAList::RunAlg(AlgConfig&,CandHandle&,CandContext&)");

    const CandRecord* candrec = trackListContext.GetCandRecord();
    assert(candrec && "CandRecord* is NULL!!!");
    const CandTrackListHandle* ctlh = 
        static_cast<const CandTrackListHandle*> (trackListContext.GetDataIn());
    assert(ctlh && "CandTrackListHandle* is NULL!!!");

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

    // Get an AlgHandle of FitTrackSAAlgorithm
    AlgHandle afth = af.GetAlgHandle(ac.GetCharString("FitTrackSAAlgorithm"), 
                                     ac.GetCharString("FitTrackSAAlgConfig"));
    
    TIter trackItr(ctlh->GetDaughterIterator());
    while (CandTrackHandle *track = 
                            dynamic_cast<CandTrackHandle*>(trackItr())) {
        // Create Candcontext for AlgFitTrackSA
        CandContext trackContext(this,trackListContext.GetMom());
        // set CandTrackHandle* as the "context data"
        trackContext.SetDataIn(track);
        // fit track (=== create handle)
        CandFitTrackSAHandle fittrack =
                            CandFitTrackSA::MakeCandidate(afth,trackContext);
        // add fit track to CandFitTrackListHandle daughter list
        cftlh.AddDaughterLink(fittrack);
    }

}
