////////////////////////////////////////////////////////////////////////
// $Id: CandFitTrackSRList.cxx,v 1.3 2003/10/12 21:28:37 gmieg Exp $
//
// CandFitTrackSRList
//
// This is a concrete Event Candidate (Reconstruction) object.
// CandFitTrackSRList is descended from CandFitTrackList.
//
// Each concrete CandBase must define a Dup function.
// CandBase must grant friendship to class CandRefer.
//
// Author:  R. Lee 2001.03.30
////////////////////////////////////////////////////////////////////////

#include "Algorithm/AlgHandle.h"
#include "CandFitTrackSR/CandFitTrackSRList.h"
#include "CandFitTrackSR/CandFitTrackSRListHandle.h"
#include "MessageService/MsgService.h"

ClassImp(CandFitTrackSRList)

//______________________________________________________________________
CVSID("$Id: CandFitTrackSRList.cxx,v 1.3 2003/10/12 21:28:37 gmieg Exp $");

//______________________________________________________________________
CandFitTrackSRList::CandFitTrackSRList()
{
  MSG("Cand", Msg::kDebug)
               << "Begin CandFitTrackSRList::CandFitTrackSRList() ctor:"
                                   << endl << "UidInt = " << GetUidInt()
                           << ", ArchUidInt " << GetArchUidInt() << endl
                             << "No. of links = " << GetNLinks() << endl
        << "End CandFitTrackSRList::CandFitTrackSRList() ctor." << endl;
}

//______________________________________________________________________
CandFitTrackSRList::CandFitTrackSRList(AlgHandle &ah) :
  CandFitTrackList(ah)   // Should be next class up on inheritance chain
{

// The sole purpose of this constructor is to transmit the AlgHandle
// up the inheritance chain to CandBase without having to invoke the
// full constructor of an intermediate Candidate type which the highest
// level Candidate might inherit from.  One only wants to create the
// LocalHandle and invoke the RunAlg() method in the lowest level class.
}

//______________________________________________________________________
CandFitTrackSRList::CandFitTrackSRList(AlgHandle &ah, CandHandle &ch,
                                                      CandContext &cx) :
  CandFitTrackList(ah)   // Should be next class up on inheritance chain
{
  CreateLocalHandle();
  MSG("Cand", Msg::kDebug)
                       << "Begin CandFitTrackSRList::CandFitTrackSRList"
    << "(AlgHandle &, CandHandle &, " << "CandContext &) ctor: " << endl
                                           << "UidInt = " << GetUidInt()
                           << ", ArchUidInt " << GetArchUidInt() << endl
                             << "No. of links = " << GetNLinks() << endl
                         << "End CandFitTrackSRList::CandFitTrackSRList"
    << "(AlgHandle &, CandHandle &, " << "CandContext &) ctor." << endl;

// Run Algorithm to construct Candidate
   {                                                   // Start of scope
     CandFitTrackSRListHandle cshl(this);   // cshl will go out of scope
     ch = cshl;                                     // after setting ch.
   }                                                     // End of scope
   ah.RunAlg(ch, cx);
}

//______________________________________________________________________
CandFitTrackSRList::CandFitTrackSRList(const CandFitTrackSRList &rhs) :
  CandFitTrackList(rhs)  // Should be next class up on inheritance chain
{

//CreateLocalHandle(); // Moved to Dup function following copy-ctor call
  MSG("Cand", Msg::kDebug)
                       << "Begin CandFitTrackSRList::CandFitTrackSRList"
                     << "(const CandFitTrackSRList &rhs) ctor: " << endl
                                           << "UidInt = " << GetUidInt()
                           << ", ArchUidInt " << GetArchUidInt() << endl
                             << "No. of links = " << GetNLinks() << endl
                         << "End CandFitTrackSRList::CandFitTrackSRList"
                     << "(const CandFitTrackSRList &rhs) ctor." << endl;
}

//______________________________________________________________________
CandFitTrackSRList::~CandFitTrackSRList()
{
  MSG("Cand", Msg::kDebug)
     << "Begin CandFitTrackSRList::~CandFitTrackSRList() dtor: " << endl
                                           << "UidInt = " << GetUidInt()
                           << ", ArchUidInt " << GetArchUidInt() << endl
                             << "No. of links = " << GetNLinks() << endl
       << "End CandFitTrackSRList::~CandFitTrackSRList() dtor." << endl;
}

//______________________________________________________________________
void CandFitTrackSRList::CreateLocalHandle()
{
  SetLocalHandle(new CandFitTrackSRListHandle(this));
}

//______________________________________________________________________
CandFitTrackSRList *CandFitTrackSRList::Dup() const
{

// Base copy ctor dups owned pointers, but defers copying Daughter List.
// Daughter List copy is made in the derived class Dup() function.
// This is because base class copy constructor hasn't yet created
// fLocalHandle with a CandHandle* of the full derived type.
  CandFitTrackSRList *cb = new CandFitTrackSRList(*this);   // Copy-ctor
  cb->CreateLocalHandle();   // Initializes fLocalHandle after copy-ctor
  TIter iterdau = GetDaughterIterator();
  CandHandle *dau;
  while ((dau=(CandHandle *) iterdau())) cb->AddDaughterLink(*dau);
  return cb;
}

//______________________________________________________________________
Bool_t CandFitTrackSRList::IsEquivalent(const TObject *rhs) const
{
  Bool_t result = true;
  if (!CandFitTrackList::IsEquivalent(rhs)) result = false;// superclass
  TestDisplayCandBanner("CandFitTrackSRList");
  const CandFitTrackSRList* rCnd =
                           dynamic_cast<const CandFitTrackSRList*>(rhs);
  if (rCnd == NULL) return false;

  TestNothing("CandFitTrackSRList");

  return result;
}

//______________________________________________________________________
CandFitTrackSRListHandle CandFitTrackSRList::MakeCandidate(
                                         AlgHandle &ah, CandContext &cx)
{
  CandFitTrackSRListHandle cshl;
  new CandFitTrackSRList(ah, cshl, cx);  // cshl owns CandFitTrackSRList
  return cshl;
}
