////////////////////////////////////////////////////////////////////////
// $Id: AlgChop.cxx,v 1.1.1.1 2005/05/16 15:17:11 tagg Exp $
//
// AlgChop.cxx
//
////////////////////////////////////////////////////////////////////////

#include <cassert>

#include "CandChop/AlgChop.h"
#include "CandChop/CandChopListHandle.h"
#include "CandChop/DigitVector.h"

#include "Algorithm/AlgConfig.h"
#include "Algorithm/AlgFactory.h"
#include "Algorithm/AlgHandle.h"
#include "CandData/CandHeader.h"
#include "CandData/CandRecord.h"
#include "CandDigit/CandDigitHandle.h"
#include "CandDigit/CandDigitListHandle.h"
#include "Candidate/CandContext.h"
#include "MessageService/MsgService.h"
#include "MinosObjectMap/MomNavigator.h"
#include "RawData/RawHeader.h"
#include "RawData/RawRecord.h"
#include "RawData/RawDigitDataBlock.h"
#include "UgliGeometry/UgliGeomHandle.h"
#include "UgliGeometry/UgliStripHandle.h"
#include "Validity/VldContext.h"

#include <vector>

ClassImp(AlgChop)
CVSID( " $Id: AlgChop.cxx,v 1.1.1.1 2005/05/16 15:17:11 tagg Exp $ ");


//______________________________________________________________________
AlgChop::AlgChop()
{
}

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

//______________________________________________________________________

void AlgChop::RunAlg(AlgConfig & /*algConfig*/, 
		       CandHandle &candHandle,  // thing to make
		       CandContext &candContext)
{
  ///
  /// Makes a CandDigitList from a std::vector of CandDigitHandles.
  ///

  const DigitVector* data_ptr =  
    dynamic_cast<const DigitVector*>((candContext.GetDataIn()));

  if(!data_ptr) {
    MSG("Chop",Msg::kError) << "Data input to AlgChop was bad." << std::endl;
    return;
  }

  assert(candHandle.InheritsFrom("CandDigitListHandle"));
  CandDigitListHandle &digitList = dynamic_cast<CandDigitListHandle &>(candHandle);

  // Loop through the digits and add them.
  // Select the first non-veto digit to be the start time for the slice.

  double tfirst = 9e99;

  for(UInt_t i=0;i<data_ptr->size(); i++) {
    CandDigitHandle digit = (*data_ptr)[i];
    digitList.AddDaughterLink(digit);

    if(! (digit.GetPlexSEIdAltL().IsVetoShield()) ) {
      double t = digit.GetTime();
      if(t<tfirst) tfirst = t;
    }
  }

  if(tfirst==9e99) tfirst = 0;
  digitList.SetAbsTime(tfirst);  
}

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