/*****************************************************************************
******************************************************************************
**<AUTO>
**
** FILE:	tclPm.cc
**
**<HTML>
**	This file contains TCL functions to fetch objects and their proper
**	motions.
**</HTML>
**</AUTO>
**
**
** ENVIRONMENT:
**	C++.
**
** REQUIRED PRODUCTS:
**	photoSch
**
******************************************************************************
******************************************************************************
*/

#include <arProduct.h>
#include <arChunk.h>
#include <arSegment.h>
#include <dervish.h>
#include <taCosmic.h>
#include <taDiag.h>
#include "tsTarget.h"
#include "tsPM.h"

RET_CODE tsSegmentPMFetch(ooHandle(arSegment)& segment, int field0Proc,
			  int nFieldsProc, int scanline,
			  CHAIN *objChain);

/*============================================================================
**<AUTO EXTRACT>
**
** TCL VERB: segmentExportPM
**
**<HTML>
**	Export lite versions of objects in a segment with their proper motions.
**</HTML>
**
**</AUTO>
**============================================================================
*/
static char segmentExportPMCmd[] = "segmentExportPM";
static int segmentExportPMFlg = FTCL_ARGV_NO_LEFTOVERS;
static ftclArgvInfo segmentExportPMTbl[] = {
   {NULL, FTCL_ARGV_HELP, NULL, NULL,
    "Export lite versions of objects with proper motions\n"},
   {"<segment>", FTCL_ARGV_STRING, NULL, NULL,
    "Handle to segment or frames pipeline run"},
   {"-scanline", FTCL_ARGV_CONSTANT, (void *) 1, NULL,
    "Export OK_SCANLINE objects (defaults to PRIMARY)"},
   {"-field0", FTCL_ARGV_INT, NULL, NULL,
    "First field to export (defaults to first field in the segment/run)"},
   {"-nFields", FTCL_ARGV_INT, NULL, NULL,
    "Export this number of fields only (starting with first field, default=0=all)"},
   {NULL, FTCL_ARGV_END, NULL, NULL, NULL}
};

static int
tclSegmentExportPM (ClientData clientData,
		  Tcl_Interp *interp,
		  int argc,
		  char **argv)
{
  ooHandle(arSegment) *segment = NULL;
  char *segmentHandle = NULL;
  int scanline = 0;
  int field0 = -1;
  int nFields = 0;
  int status;

  // Parse the arguments
  segmentExportPMTbl[1].dst = &segmentHandle;
  segmentExportPMTbl[2].dst = &scanline;
  segmentExportPMTbl[3].dst = &field0;
  segmentExportPMTbl[4].dst = &nFields;
  if ((status = shTclParseArgv(interp, &argc, argv, segmentExportPMTbl,
			       segmentExportPMFlg, segmentExportPMCmd))
      != FTCL_ARGV_SUCCESS)
    return status;
   
  // Get handle to segment
  if (shTclAddrGetFromName (interp, segmentHandle, (void **)&segment,
			    "ooHandle(arSegment)") != TCL_OK)
    {
      Tcl_AppendResult(interp, segmentExportPMCmd,
		       ": error getting handle to segment", NULL);
      return TCL_ERROR;
    }

  // Set up cosmic color for use by atTransApply().
   taTransCosmicSet(cosmicColor, cosmicScatter);

  // Export calibrated versions of the primary objects
  CHAIN *objChain = shChainNew("TS_PM_OBJ");
  if (tsSegmentPMFetch(*segment, field0, nFields, scanline, objChain)
      != SH_SUCCESS)
    {
      shTclInterpAppendWithErrStack(interp);
      return TCL_ERROR;
    }

  // Return the chain
  char name[100];
  if (shTclHandleNew (interp, name, "CHAIN", objChain) != TCL_OK)
    {
      return(TCL_ERROR);
    }
  Tcl_SetResult(interp,name,TCL_VOLATILE);
  return(TCL_OK);
}

//****************************************************************************/
//
// Declare my new tcl verbs to tcl
//
void
tsTclPMDeclare(Tcl_Interp *interp) 
{
  char *tclHelpFacil = "ts";
  shTclDeclare(interp, segmentExportPMCmd,
	       (Tcl_CmdProc *)tclSegmentExportPM,
	       (ClientData) 0,	(Tcl_CmdDeleteProc *)NULL, tclHelpFacil,
	       shTclGetArgInfo(interp, segmentExportPMTbl,
			       segmentExportPMFlg,
			       segmentExportPMCmd),
	       shTclGetUsage(interp, segmentExportPMTbl,
			     segmentExportPMFlg,
			     segmentExportPMCmd));
}
