/*** ^^A -*-C++-*- **********************************************/
/*	convbin2asc		01.08.2004			*/
/****************************************************************/
/*	Short Description :					*/
/*	AU program to convert 1r and/or 1i data file into an	*/
/*	ascii table containing point number, Hz, ppm and	*/
/*	intensity values.					*/
/****************************************************************/
/*	Keywords :						*/
/*	ascii conversion					*/
/****************************************************************/
/*	Description/Usage :					*/
/*	AU program to convert 1r and/or 1i data file into an	*/
/*	ascii table containing point number, Hz, ppm and	*/
/*	intensity values. To get the imaginary data points as	*/
/*	as well, start the AU program with: "convbin2asc i"	*/
/*	The output file is stored in the same directory as the	*/
/*	spectrum. It can be used for calculations in spread-	*/
/*	sheet programs or other third-party software.		*/
/****************************************************************/
/*	Author(s) :						*/
/*	Name		: Clemens Anklin			*/
/*	Organisation	: Bruker BioSpin			*/
/*      Email           : Clemens.Anklin@bruker.com             */
/****************************************************************/
/*	Name		Date    Modification:			*/
/*	cga		040801  created				*/
/*	eng		050201  byte order check added		*/
/*      cga             170731  scaling with NC_proc added      */
/****************************************************************/
/*
$Id:$
*/

char infile[PATH_MAX], outfile[PATH_MAX], *inbuf1;
int  *inbufint1;
int  pparmode, si, i, fdin, bytordp, bytetoread, dtypp, ncproc;
float offset, hzppt;
double sf, swp, hz, ppm, hzoffset, ppmppt, intens, scale;
FILE *fpout, *fpin;

GETCURDATA;


FETCHPARS("PPARMOD",&pparmode);
if (pparmode != 0)
{
  Proc_err(DEF_ERR_OPT, "convbin2asc only works for 1D data.");
  ABORT
}

FETCHPARS("DTYPP",&dtypp);
if (dtypp != 0)
{
  Proc_err(DEF_ERR_OPT, "convbin2asc only works for 1D integer data.");
  ABORT
}

FETCHPARS("BYTORDP",&bytordp);
FETCHPARS("SI",&si);
FETCHPARS("OFFSET",&offset);
FETCHPARS("SF",&sf);
FETCHPARS("SW_p",&swp);
FETCHPARS("HZpPT",&hzppt);
FETCHPARS("NC_proc",&ncproc);

ppmppt=(double)hzppt/sf;
hzoffset=(double)offset*sf;
bytetoread = si*sizeof(int);

/*
Proc_err(DEF_ERR_OPT, "offset %.4f, sf %.7f, SW_p %.3f,\n"
"HZpPT %.2f, ppmppt %.4f, hzoffset %.2f, bytetoread %d",
offset, sf, swp, hzppt, ppmppt, hzoffset, bytetoread );
*/

strcpy(infile,PROCPATH("1r"));
/*strcpy(outfile,PROCPATH("ascii-spec.txt")); */
sprintf(outfile,"%s/Documents/asciifiles/%s-%d-%d-ascii.txt",PathSystemHome(),name,expno,procno);

if ( (fdin=open(infile,O_RDONLY)) == (-1) )
{
  Perror(DEF_ERR_OPT,infile);
  ABORT
}
if ( (fpout=fopen(outfile,"wt")) == NULL)
{
  Perror(DEF_ERR_OPT,outfile);
  ABORT
}

if ( (fpin = fopen(PROCPATH("title"),"rt")) != NULL)
{
    char linebuf[1024];
    if (fgets(linebuf, (int)sizeof(linebuf), fpin))
    {
	fputs(linebuf,fpout);
    }
    fclose(fpin);
}
if ( (inbuf1 = calloc (bytetoread,sizeof(char*))) == NULL)
{
  Perror(DEF_ERR_OPT,infile);
  close (fdin);
  fclose (fpout);
  ABORT
}
if ( (i = read (fdin,inbuf1,bytetoread)) != bytetoread )
{
  Perror(DEF_ERR_OPT,infile);
  fclose (fpout);
  close (fdin);
  ABORT
}
close(fdin);
local_swap4(inbuf1,bytetoread,bytordp);

inbufint1 = (int *)inbuf1;
i=ncproc;
scale = 1;

while (i > 0)
{
  scale *= 2;
  i--;
}

while (i < 0)
{
  scale /= 2;
  i++;
}

for (i=0; i < si; i++)
  {
  intens=(double)inbufint1[i]*scale;
  ppm=offset-ppmppt*(i+0.5);
  hz=hzoffset-hzppt*(i+0.5);
  fprintf(fpout,"%i, %.0f, %.4f, %.6f\n",i+1,intens,hz,ppm);
  }

if (i_argc > 2  &&  strcmp(i_argv[2], "i") == 0)
{
  strcpy(infile,PROCPATH("1i"));

  if ( (fdin=open(infile,O_RDONLY)) == (-1) )
  {
    Perror(DEF_ERR_OPT,infile);
    ABORT
  }
  if ( (i = read (fdin,inbuf1,bytetoread)) != bytetoread )
  {
    Perror(DEF_ERR_OPT,infile);
    fclose (fpout);
    close (fdin);
    ABORT
  }
  close(fdin);
  local_swap4(inbuf1,bytetoread,bytordp);

  for (i=0; i < si; i++)
  {
    intens=(double)inbufint1[i]*scale;
    ppm=offset-ppmppt*(i+0.5);
    hz=hzoffset-hzppt*(i+0.5);
    fprintf(fpout,"%i, %.0f, %.4f, %.6f\n",i+1,intens,hz,ppm);
  }
}

fclose(fpout);

QUIT
