# include <dvo.h>

/* convert elixir-format measures to internal measures */
Measure *MeasureElixirToInternal (MeasureElixir *in, int Nvalues) {

  int i;
  Measure *out;

  ALLOCATE (out, Measure, Nvalues);

  for (i = 0; i < Nvalues; i++) {
    out[i].dR_PS   = in[i].dR * 0.01;
    out[i].dD_PS   = in[i].dD * 0.01;
    out[i].M_PS    = in[i].M  * 0.001;
    out[i].dM_PS   = in[i].dM * 0.001;
    out[i].dt_PS      = in[i].dt * 0.001;
    out[i].Mcal_PS    = in[i].Mcal * 0.001;
    out[i].Mgal_PS    = in[i].Mgal * 0.001;
    out[i].airmass_PS = in[i].airmass * 0.001;
    out[i].FWx 	   = in[i].FWx;
    out[i].FWy 	   = in[i].fwy * in[i].FWx * 0.01;
    out[i].theta   = in[i].theta;
    out[i].dophot  = in[i].dophot;
    out[i].source  = in[i].source;
    out[i].t       = in[i].t;
    out[i].averef  = in[i].averef;
    out[i].flags   = in[i].flags;
  }
  return (out);
}

/* convert internal measures to elixir-format measures */
MeasureElixir *MeasureInternalToElixir (Measure *in, int Nvalues) {

  int i;
  MeasureElixir *out;

  ALLOCATE (out, MeasureElixir, Nvalues);

  for (i = 0; i < Nvalues; i++) {
    out[i].dR      = in[i].dR_PS * 100.0;
    out[i].dD 	   = in[i].dD_PS * 100.0;
    out[i].M       = in[i].M_PS  * 1000.0;
    out[i].dM      = in[i].dM_PS * 1000.0;
    out[i].dt      = in[i].dt_PS * 1000.0;
    out[i].Mcal    = in[i].Mcal_PS * 1000.0;
    out[i].Mgal    = in[i].Mgal_PS * 1000.0;
    out[i].airmass = in[i].airmass_PS * 1000.0;
    out[i].FWx 	   = in[i].FWx;
    out[i].fwy 	   = 100.0 * in[i].FWy / in[i].FWx;
    out[i].theta   = in[i].theta;
    out[i].dophot  = in[i].dophot;
    out[i].source  = in[i].source;
    out[i].t       = in[i].t;
    out[i].averef  = in[i].averef;
    out[i].flags   = in[i].flags;
  }
  return (out);
}

/* convert elixir-format averages to internal averages */
Average *AverageElixirToInternal (AverageElixir *in, int Nvalues) {

  int i;
  Average *out;

  ALLOCATE (out, Average, Nvalues);

  for (i = 0; i < Nvalues; i++) {
    out[i].R       = in[i].R;      
    out[i].D       = in[i].D;      
    out[i].M       = in[i].M  * 0.001;      
    out[i].dM      = in[i].dM * 0.001;      
    out[i].Xp      = in[i].Xp;     
    out[i].Xm      = in[i].Xm;     
    out[i].Nm      = in[i].Nm;     
    out[i].Nn      = in[i].Nn;     
    out[i].code    = in[i].code;   
    out[i].offset  = in[i].offset; 
    out[i].missing = in[i].missing;
    out[i].Xg      = in[i].Xg;

    /* these don't exist in Elixir */
    out[i].dR      = 0;
    out[i].dD      = 0;
    out[i].uR      = 0;
    out[i].uD      = 0;
    out[i].duR     = 0;
    out[i].duD     = 0;
    out[i].P       = 0;
    out[i].dP      = 0;
  }
  return (out);
}

/* convert internal averages to elixir-format averages */
AverageElixir *AverageInternalToElixir (Average *in, int Nvalues) {

  int i;
  AverageElixir *out;

  ALLOCATE (out, AverageElixir, Nvalues);

  for (i = 0; i < Nvalues; i++) {
    out[i].R       = in[i].R;      
    out[i].D       = in[i].D;      
    out[i].M       = in[i].M  * 1000.0;      
    out[i].dM      = in[i].dM * 1000.0;
    out[i].Xp      = in[i].Xp;     
    out[i].Xm      = in[i].Xm;     
    out[i].Nm      = in[i].Nm;     
    out[i].Nn      = in[i].Nn;     
    out[i].code    = in[i].code;   
    out[i].offset  = in[i].offset; 
    out[i].missing = in[i].missing;
    out[i].Xg      = in[i].Xg;
  }
  return (out);
}

/* convert elixir-format secfilts to internal secfilts */
SecFilt *SecFiltElixirToInternal (SecFiltElixir *in, int Nvalues) {

  int i;
  SecFilt *out;

  ALLOCATE (out, SecFilt, Nvalues);

  for (i = 0; i < Nvalues; i++) {
    out[i].M_PS    = in[i].M  * 0.001;      
    out[i].dM_PS   = in[i].dM * 0.001;      
    out[i].Xm      = in[i].Xm;     
  }
  return (out);
}

/* convert internal secfilts to elixir-format secfilts */
SecFiltElixir *SecFiltInternalToElixir (SecFilt *in, int Nvalues) {

  int i;
  SecFiltElixir *out;

  ALLOCATE (out, SecFiltElixir, Nvalues);

  for (i = 0; i < Nvalues; i++) {
    out[i].M       = in[i].M_PS  * 1000.0;      
    out[i].dM      = in[i].dM_PS * 1000.0;
    out[i].Xm      = in[i].Xm;     
  }
  return (out);
}

/* convert elixir-format images to internal images */
Image *ImageElixirToInternal (ImageElixir *in, int Nvalues) {

  int i;
  Image *out;

  ALLOCATE (out, Image, Nvalues);

  for (i = 0; i < Nvalues; i++) {
    memcpy (&out[i].coords, &in[i].coords, sizeof(Coords));
    memcpy (out[i].dummy, in[i].dummy, 20);
    strcpy (out[i].name, in[i].name);

    out[i].tzero    	    = in[i].tzero;
    out[i].nstar    	    = in[i].nstar;
    out[i].secz_PS    	    = in[i].secz * 0.001;
    out[i].NX	    	    = in[i].NX;
    out[i].NY	    	    = in[i].NY;
    out[i].apmifit_PS  	    = in[i].apmifit * 0.001;
    out[i].dapmifit_PS 	    = in[i].dapmifit * 0.001;
    out[i].Mcal_PS   	    = in[i].Mcal * 0.001;
    out[i].dMcal_PS   	    = in[i].dMcal * 0.001;
    out[i].Xm	    	    = in[i].Xm;
    out[i].source   	    = in[i].source;
    out[i].exptime  	    = in[i].exptime;
    out[i].detection_limit  = in[i].detection_limit;
    out[i].saturation_limit = in[i].saturation_limit;
    out[i].cerror	    = in[i].cerror;
    out[i].fwhm_x	    = in[i].fwhm_x;
    out[i].fwhm_y	    = in[i].fwhm_y;
    out[i].trate	    = in[i].trate;
    out[i].code		    = in[i].code;
    out[i].ccdnum	    = in[i].ccdnum;
    out[i].order	    = in[i].order;
    out[i].Mx		    = in[i].Mx;
    out[i].My		    = in[i].My;
    out[i].Mxx		    = in[i].Mxx;
    out[i].Mxy		    = in[i].Mxy;
    out[i].Myy		    = in[i].Myy;
    out[i].Mxxx		    = in[i].Mxxx;
    out[i].Mxxy		    = in[i].Mxxy;
    out[i].Mxyy		    = in[i].Mxyy;
    out[i].Myyy		    = in[i].Myyy;
    out[i].Mxxxx	    = in[i].Mxxxx;
    out[i].Mxxxy	    = in[i].Mxxxy;
    out[i].Mxxyy	    = in[i].Mxxyy;
    out[i].Mxyyy	    = in[i].Mxyyy;
    out[i].Myyyy	    = in[i].Myyyy;
  }
  return (out);
}

/* convert internal images to elixir-format images */
ImageElixir *ImageInternalToElixir (Image *in, int Nvalues) {

  int i;
  ImageElixir *out;

  ALLOCATE (out, ImageElixir, Nvalues);

  for (i = 0; i < Nvalues; i++) {
    memcpy (&out[i].coords, &in[i].coords, sizeof(Coords));
    memcpy (out[i].dummy, in[i].dummy, 20);
    strcpy (out[i].name, in[i].name);

    out[i].tzero    	    = in[i].tzero;
    out[i].nstar    	    = in[i].nstar;
    out[i].secz	    	    = in[i].secz_PS * 1000.0;
    out[i].NX	    	    = in[i].NX;
    out[i].NY	    	    = in[i].NY;
    out[i].apmifit  	    = in[i].apmifit_PS * 1000.0;
    out[i].dapmifit 	    = in[i].dapmifit_PS * 1000.0;
    out[i].Mcal	    	    = in[i].Mcal_PS * 1000.0;
    out[i].dMcal    	    = in[i].dMcal_PS * 1000.0;
    out[i].Xm	    	    = in[i].Xm;
    out[i].source   	    = in[i].source;
    out[i].exptime  	    = in[i].exptime;
    out[i].detection_limit  = in[i].detection_limit;
    out[i].saturation_limit = in[i].saturation_limit;
    out[i].cerror	    = in[i].cerror;
    out[i].fwhm_x	    = in[i].fwhm_x;
    out[i].fwhm_y	    = in[i].fwhm_y;
    out[i].trate	    = in[i].trate;
    out[i].code		    = in[i].code;
    out[i].ccdnum	    = in[i].ccdnum;
    out[i].order	    = in[i].order;
    out[i].Mx		    = in[i].Mx;
    out[i].My		    = in[i].My;
    out[i].Mxx		    = in[i].Mxx;
    out[i].Mxy		    = in[i].Mxy;
    out[i].Myy		    = in[i].Myy;
    out[i].Mxxx		    = in[i].Mxxx;
    out[i].Mxxy		    = in[i].Mxxy;
    out[i].Mxyy		    = in[i].Mxyy;
    out[i].Myyy		    = in[i].Myyy;
    out[i].Mxxxx	    = in[i].Mxxxx;
    out[i].Mxxxy	    = in[i].Mxxxy;
    out[i].Mxxyy	    = in[i].Mxxyy;
    out[i].Mxyyy	    = in[i].Mxyyy;
    out[i].Myyyy	    = in[i].Myyyy;
  }
  return (out);
}
