#include "CalDetPID/CalDetTOFRange.h"
#include "MessageService/MsgService.h"
#include "DatabaseInterface/DbiOutRowStream.h"
#include "DatabaseInterface/DbiResultSet.h"
#include "DatabaseInterface/DbiValidityRec.h"

ClassImp(CalDetTOFRange)


CVSID("$Id: CalDetTOFRange.cxx,v 1.5 2005/03/11 16:17:48 west Exp $\n  \
      CVSID_DBIRESULTPTR ");

#include "DatabaseInterface/DbiResultPtr.tpl"
template class  DbiResultPtr<CalDetTOFRange>;

#include "DatabaseInterface/DbiWriter.tpl"
template class  DbiWriter<CalDetTOFRange>;

void CalDetTOFRange::Fill(DbiResultSet& rs, 
                       const DbiValidityRec* /* vrec */) {

     if ( rs.TableName() == "CALDETTOFRANGE" ) {
     // dumb filling
	  rs>> fParticleType
	    >> fTDC0Low
	    >> fTDC0High
	    >> fTDC1Low
	    >> fTDC1High
	    >> fTDC2Low
	    >> fTDC2High
	    >> fTDC2_Minus_TDC0_Low
	    >> fTDC2_Minus_TDC0_High
	    >> fTDC2_Minus_TDC1_Low
	    >> fTDC2_Minus_TDC1_High;
     }
     else{
     // Smart method
      Int_t numCol = rs.NumCols();
      //  The first column (SeqNo) has already been processed.
      for (Int_t curCol = rs.HasRowCounter() ? 3 : 2; curCol <= numCol; ++curCol) {
	 string colName = rs.CurColName();
	 if (      colName == "PARTICLETYPE" ) rs >> fParticleType;
	 else if ( colName == "TDC0LOW" )       rs >> fTDC0Low;
	 else if ( colName == "TDC0HIGH" )       rs >> fTDC0High;
	 else if ( colName == "TDC1LOW" )       rs >> fTDC1Low;
	 else if ( colName == "TDC1HIGH" )       rs >> fTDC1High;
	 else if ( colName == "TDC2LOW" )       rs >> fTDC2Low;
	 else if ( colName == "TDC2HIGH" )       rs >> fTDC2High;
	 else if ( colName == "TDC2MINUSTDC0LOW" ) rs >> fTDC2_Minus_TDC0_Low;
	 else if ( colName == "TDC2MINUSTDC0HIGH" ) rs >> fTDC2_Minus_TDC0_High;
	 else if ( colName == "TDC2MINUSTDC1LOW" ) rs >> fTDC2_Minus_TDC1_Low;
	 else if ( colName == "TDC2MINUSTDC1HIGH" ) rs >> fTDC2_Minus_TDC1_High;
	 else {
	    MSG("Dbi",Msg::kDebug) << "Ignoring column " << curCol 
				   << "(" << colName << ")"
				   << "; not part of CalDetTOFRange" 
				   << endl;
	 rs.IncrementCurCol();
	 }
      }

     }
}

void CalDetTOFRange::Store(DbiOutRowStream& ors,
			   const DbiValidityRec* /* vrec */) const {
//     MSG("Dbi", Msg::kVerbose)<<"Calling Store!"<<std::endl;
	  ors<< fParticleType
	    << fTDC0Low
	    << fTDC0High
	    << fTDC1Low
	    << fTDC1High
	    << fTDC2Low
	    << fTDC2High
	    << fTDC2_Minus_TDC0_Low
	    << fTDC2_Minus_TDC0_High
	    << fTDC2_Minus_TDC1_Low
	    << fTDC2_Minus_TDC1_High;
}

std::ostream& CalDetTOFRange::Print(std::ostream& os, Option_t*) const
{
     os<< "-----------------------------------------------\n"
       << "PARTICLETYPE: "<<fParticleType<<"\n"
       << "TDC0LOW: "<<fTDC0Low<<"\n"
       << "TDC0HIGH: "<<fTDC0High<<"\n"
       << "TDC1LOW: "<<fTDC1Low<<"\n"
       << "TDC1HIGH: "<<fTDC1High<<"\n"
       << "TDC2LOW: "<<fTDC2Low<<"\n"
       << "TDC2HIGH: "<<fTDC2High<<"\n"
       << "TDC2MINUSTDC0LOW: "<<fTDC2_Minus_TDC0_Low<<"\n"
       << "TDC2MINUSTDC0HIGH: "<<fTDC2_Minus_TDC0_High<<"\n"
       << "TDC2MINUSTDC1LOW: "<<fTDC2_Minus_TDC1_Low<<"\n"
       << "TDC2MINUSTDC1HIGH: "<<fTDC2_Minus_TDC1_High<<"\n"
       << "-----------------------------------------------";
     return os;
}

std::ostream& operator<<(std::ostream&os, const CalDetTOFRange& tr)
{
     return tr.Print(os);
}

void CalDetTOFRange::Print(Option_t* op) const
{
     Print(std::cout,op);
}

std::string CalDetTOFRange::GetTableDesc(){
     return std::string(
	  "(SeqNo int,   PARTICLETYPE  int,"
	  " TDC0LOW float, TDC0HIGH float, "
	  " TDC1LOW float, TDC1HIGH float, "
	  " TDC2LOW float, TDC2HIGH float, "
	  " TDC2MINUSTDC0LOW float, TDC2MINUSTDC0HIGH float, "
	  " TDC2MINUSTDC1LOW float, TDC2MINUSTDC1HIGH float )"
	  );
}

