// add all used_pixel's sky, last: sky= addsky/used_pixels
// each frame - white; then * flux
// average pixel's value, used d[];
// pixel's value + sky;
#include <stdio.h>
#include <math.h>
//#define maxpix 400000000     // 20,000*20,000
#define maxpix 13000*13000    // 20,000*20,000
int n1,n2,n3;                  // n3 =0,1-4; if>0, use CCD_? only.
char   head[72][80],b[144],f1[50],f2[50];
float  a[maxpix];      
int    e[maxpix],ee,e2[31]={1,2,4,8,16,32,64,128,
       256,512,1024,2048,4096,8192,16384,32768,
       65536,131072,262144,524288,1048576,2097152,4194304,8388608,
       16777216,33554432,67108864,134217728,268435456,536870912,1073741824};

float  sky;                   // standard sky: sky, plate sky: white
int    isky;
float  d[maxpix];             // weight:  sky/standard_sky
char   ubad[4032][4096];      // unin coef:  1/weight 
float  c[4032][4096];
float  xx[5],yy[5];
char   c0[28],c1[14],c2[14];
double a8[8],b8[8],s8[8],t8[8],aa[4],dd[4];
double rc,dc,hs2, pi,cx,cy;
int    ix[4],iy[4],is=0,ip=0;
int    ccdno,idate,id1=9999,id2=0;;
float  white;
double addsky=0.;
float  scale;
FILE   *fp,*fp1,*fp2;
int    q1d[2][4],q2u[2][4],q3l[2][4],q4r[2][4];                     
float  flux,fr=0.;
main(int ac, char **av)
{
  int    i,j,k,i1,i2,j1,j2,ij;
  double x,y,alpha,delta,x1,y1;
  int    ix0,ix1,iy0,iy1;
  float  z0,z1,z2,z3;
  float  zx,zy,wx,wy,q0;
  int    p1,p2,q1,q2;
  char   c9=34;              // "

  if(ac<5){
    printf("\n\t ***** REarrange UBAND mosaic fits (fluxcorr) ********");
    printf("\n\t                                            jiang 2011,10,04");
    printf("\n\tUsage: z_9 outfile Scale RA DEC [X Y, c] [flux_r]\n");
    printf("\n\tSample:z_9 aa.fit 0.454 1:00 1:00 12288 12288 0.6");
    printf("\n\t   or: z_9 aa.fit 0.454 1:00 1:00 100 (fixed sky)");
    printf("\n\t   or: z_9 aa.fit 0.454 1:00 1:00 [1-4] (CCD_?,for test)\n");
    printf("\n\t    RA DEC: (2000.0) center of pic; X,Y in pixel");
    printf("\n\t    Scale: arcsec/pixel  (0.2~~0.454~~1.00), no limited");
    printf("\n\t    Our Uband CCD's platescale: 0.454 arcsec/pixel,recommend!");
    printf("\n\t    [X Y] default is 12288 12288");
    printf("\n\t    [flux_r] less than it, not use; default use all"); 
    printf("\n\tnotice: ");
    printf("\n\t    can erase bottom & top of each ccd's bad lines");
    printf("\n\t    use /vega2/rhbin/ubandlines.dat, may copy & edit");
    printf("\n\t    also use /vega2/rhbin/ubad_?.fit");
    printf("\n\t    if Pixels: 12288*12288, then can use shrink3 -->4k_fit");
    printf("\n\tflux_adjust of CCD: according ../cat/fits.pos9");
    printf("\n\t    also may copy & edit, # mean not use, * mean at end");
    printf("\n\tMAX pixel: 13,000*13,000, system limited");
    printf("\n\tmark_file produced at sametime, m_aa.fit");
    printf("\n\tnext: must run c9 for calibration & check\n");
    exit(0);
  }

  fp=fopen("ubandlines.dat","r");
  if(fp==0)fp=fopen("/vega2/rhbin/ubandlines.dat","r");
  if(fp==0){ printf("ubandlines.dat not found!\n"); exit(0); }
  for(i=0;i<4;i++){
l00: fgets(b,80,fp); if(b[0]=='#')goto l00;
     sscanf(b,"%d %d %d %d",&q1d[0][i],&q2u[0][i],&q3l[0][i],&q4r[0][i]);}
  for(i=0;i<4;i++){
l01: fgets(b,80,fp); if(b[0]=='#')goto l01;
     sscanf(b,"%d %d %d %d",&q1d[1][i],&q2u[1][i],&q3l[1][i],&q4r[1][i]);}
  fclose(fp); 
 
  strcpy(f1,av[1]);  strcpy(f2,f1);     // output file name
  k=strlen(f2); f2[k-3]='c'; f2[k-2]='a'; f2[k-1]='t';
  fp2=fopen(f2,"w");                    // output used filename's file
  sscanf(av[2],"%f",&scale);            // arcsec/pixel
  strcpy(c1,av[3]);  chs(c1,&rc);       // center of RA
  strcpy(c2,av[4]);  chs(c2,&dc);       //        of Dec

  i=n3=j=isky=0; sky=0.; n1=n2=12288; 
  if(ac>5)sscanf(av[5],"%d",&i); 
  if(ac>6){ sscanf(av[6],"%d",&j); n1=i; n2=j; }
  else { if(i<=4)n3=i; else { sky=i; isky=1; } }
  if(ac>7)sscanf(av[7],"%f",&fr);
//    printf("%d %d %d %f\n",n1,n2,n3,sky);
  if(n1*n2>maxpix){ printf("\n error: array is too large ! %d*%d\n",n1,n2);
                    exit(0); }
  pi=4.*atan(1.0); cx=pi/12.; cy=pi/180.;
  for(j=0;j<n2*n1;j++)a[j]=d[j]=0.;
  for(i=0;i<72;i++)for(k=0;k<80;k++)head[i][k]=32;
  toms2(rc,c1,1); toms2(dc,c2,0);
  printf("center: %s %s    %d*%d pixels,%12.4f%c scale\n",c1,c2,n1,n2,scale,c9);
  rc*=cx; dc*=cy; a8[6]=rc; a8[7]=dc;  
  hs2=(3600.*180./pi)/scale;                 
  b8[0]=-hs2; b8[1]=b8[2]=0; b8[3]=-b8[0]; b8[4]=(n1+1)/2.; b8[5]=(n2+1)/2.;
  xytoad(b8,a8);
  x=(n1+1)/2.; y=(n2+1)/2.;  xy_rad(rc,dc,x,y,&alpha,&delta,1,0);
  toms2(alpha,c1,1); toms2(delta,c2,0);
  rad_xy(rc,dc,alpha,delta,&x1,&y1,1,0);
  printf("%8.2lf %8.2lf-> %s %s-> %8.2lf %8.2lf\n",x,y,c1,c2,x1,y1);
  printf("4 corner's coodination:\n");
  x=n1;    y=n2;     xy_rad(rc,dc,x,y,&alpha,&delta,1,0);
  toms2(alpha,c1,1); toms2(delta,c2,0); 
  rad_xy(rc,dc,alpha,delta,&x1,&y1,1,0);
  printf("%8.2lf %8.2lf-> %s %s-> %8.2lf %8.2lf\n",x,y,c1,c2,x1,y1);

  x=1;     y=n2;     xy_rad(rc,dc,x,y,&alpha,&delta,1,0);
  toms2(alpha,c1,1); toms2(delta,c2,0);
  rad_xy(rc,dc,alpha,delta,&x1,&y1,1,0);
  printf("%8.2lf %8.2lf-> %s %s-> %8.2lf %8.2lf\n",x,y,c1,c2,x1,y1);

  x=n1;    y=1;      xy_rad(rc,dc,x,y,&alpha,&delta,1,0);
  toms2(alpha,c1,1); toms2(delta,c2,0); 
  rad_xy(rc,dc,alpha,delta,&x1,&y1,1,0);
  printf("%8.2lf %8.2lf-> %s %s-> %8.2lf %8.2lf\n",x,y,c1,c2,x1,y1);

  x=1;     y=1;      xy_rad(rc,dc,x,y,&alpha,&delta,1,0);
  toms2(alpha,c1,1); toms2(delta,c2,0); 
  rad_xy(rc,dc,alpha,delta,&x1,&y1,1,0);
  printf("%8.2lf %8.2lf-> %s %s-> %8.2lf %8.2lf\n",x,y,c1,c2,x1,y1);
/*
 i=0;     j=1;            pgbegin_(&i,"/xw",&j,&j,3);
 z0=17.;  z1=0.1;         pgpap_(&z0,&z1);
 z0=0.;   z1=n1;  z2=n2;  pgenv_(&z0,&z1,&z0,&z2,&i,&i);
*/
  fp1=fopen("fits.pos9","r");
  if(fp1==0)fp1=fopen("/line3/uband-data/cat/fits.pos9","r");
  if(fp1==0){ printf("fits.pos9 not found!\n"); exit(0); }
l10:
  fgets(b,144,fp1); if(feof(fp1))goto l20;
  if(b[0]=='#')goto l10;
  if(b[0]=='*')goto l20;
  for(ij=0;ij<80;ij++)if(b[ij]==32)break;
      flux=0.;
  sscanf(&b[ij],"%lf %lf %lf %lf %lf %lf %lf %lf %f",
  &aa[0],&dd[0],&aa[1],&dd[1],&aa[3],&dd[3],&aa[2],&dd[2],&flux); 
      if(flux==0.)goto l10;
  if(n3 && (b[ij-5]-48) !=n3)goto l10;   // use CCD_? only
  sscanf(&b[30],"%d",&k); idate=0; if(k>5700)idate=1;

  for(i=0;i<4;i++){
    rad_xy(rc,dc,aa[i],dd[i],&x1,&y1,1,0); // as Schmidt tel.
    xx[i]=x1; yy[i]=y1;
  } xx[4]=xx[0]; yy[4]=yy[0];
  for(i=0;i<4;i++){ ix[i]=xx[i]+0.5; iy[i]=yy[i]+0.5; }
  i1=ix[0]; if(i1>ix[1])i1=ix[1];
  i2=ix[2]; if(i2<ix[3])i2=ix[3];
  j1=iy[0]; if(j1>iy[3])j1=iy[3];
  j2=iy[1]; if(j2<iy[2])j2=iy[2];
  if(j1<0)j1=0; if(j2>n2-1)j2=n2-1;
  if(i1<0)i1=0; if(i2>n1-1)i2=n1-1;
  if(j2-j1<10 || i2-i1<10)goto l10;   // <10 line overlap, not do
//     printf("%d %d    %d %d dj_di: %d %d\n",i1,j1,i2,j2,j2-j1,i2-i1);

  if(flux<fr){ fprintf(fp2,"#%s",b); goto l10; }
  if(k<id1)id1=k; if(k>id2)id2=k;
  fprintf(fp2,"%s",b);
  b[ij]=0; shrinkv();          // B_filename. c[]_work, d[]_shrink_data
  if(ip==0){
    if(sky==0.)sky=white;                  // standard sky
//    printf("Backgorund: %7.1f   Flux standard: %7.1f\n",sky,flux);
    printf("used file:                ccd_? real center (2000.)\n");
  }

// read ubad_?.fit in shrinkv
  i=ccdno-1;
  p1=q3l[idate][i]; p2=4095-q4r[idate][i]; 
  q1=q1d[idate][i]; q2=4031-q2u[idate][i];
  if(ip<31){ ee=e2[ip];
    sprintf(&head[ip][31],"/ %2d: %s %d",ip+1,&b[29],ee);    
    for(j=35;j<80;j++)if(head[ip][j]==0)break; head[ip][j]=32;
  } else ee=0;
  printf("%2d: %s %d %s sky:%7.2f  flux_r:%7.4f\n",
            ip+1,&b[29],idate,c0,white,flux); 
  for(j=j1;j<=j2;j++)for(i=i1;i<=i2;i++){
    x=i; y=j;                          
    xy_rad(rc,dc,x,y,&alpha,&delta,1,0);             // big ix,iy
    rad_xy(s8[6],s8[7],alpha,delta,&x1,&y1,2,1);     // small x,y
    x=t8[0]*x1+t8[2]*y1+t8[4];
    y=t8[1]*x1+t8[3]*y1+t8[5];                       
    if(x<=p1 || x>=p2 )continue;         
    if(y<=q1 || y>=q2 )continue;          
    if(idate==0 && ccdno==4)if(x<=2048 || y>=2015)continue;   
    iy0=y;
    iy1=iy0+1;  
    wy=y-iy0;   zy=1.-wy;
    ix0=x;
    ix1=ix0+1;  
    if(ubad[iy0][ix0])continue;
    if(ubad[iy0][ix1])continue;
    if(ubad[iy1][ix0])continue;
    if(ubad[iy1][ix1])continue;
    wx=x-ix0;   zx=1.-wx;
    z0=zx*zy; z1=wx*zy; z2=zx*wy; z3=wx*wy;
    k=j*n1+i; 
    q0=c[iy0][ix0]*z0+c[iy0][ix1]*z1+c[iy1][ix0]*z2+c[iy1][ix1]*z3;
//    q0+=a[k]*d[k];
//    d[k]++; a[k]=q0/d[k];
/*   z_8batc
    a[k]=sky*(d[k]*a[k]+q0)/(d[k]*sky+white);
    d[k]+=white/sky;
    e[k]+=ee;
    addsky+=white; is++;
--------
#include <stdio.h>
main()
{
  float sky=200,a,d,b[4][2]={1.2,1000., 0.97,1500., 1.,2000., 1.5,4001.};
  int i;
  a=d=0.;
  for(i=0;i<4;i++){ a=(d*a+b[i][1])/(d+b[i][0]); d+=b[i][0]; }
  printf("%f %f\n",a,d);
  a=d=0.;
  for(i=3;i>=0;i--){a=(d*a+b[i][1])/(d+b[i][0]); d+=b[i][0]; }
  printf("%f %f\n",a,d);
}
*/
// set sky==1.;  white use flux substude
    a[k]=(d[k]*a[k]+q0)/(d[k]+flux);
    d[k]+=flux; 
    e[k]+=ee;
    addsky+=white; is++;
  }
  ip++; goto l10;
l20:
  fclose(fp1); fclose(fp2);
  if(ip>31){ sprintf(&head[31][31],"/ total files:%3d",ip); head[31][48]=32; }

  white=addsky/is;  
  printf("average sky:%9.3f\n",white);
  if(isky)white=sky;
  for(i=0;i<=n1*n2;i++)if(a[i]!=0.)a[i]+=white;   
  puthead();
  fp=fopen(f1,"wb");
  fwrite(head,72,80,fp); swap4(a,n1*n2*4);
  fwrite(a,n1*n2,4,fp);  fclose(fp);
  printf("produce file: %s    ok!\n",f1);
  k=strlen(f1)-1;
  for(i=k;i>=0;i--)if(f1[i]=='/')break;
  if(i<0) sprintf(b,"m_%s",f1); else {
    f1[i]=0;
    sprintf(b,"%s/m_%s",f1,&f1[i+1]);
  }
  fp=fopen(b,"wb");  head[1][27]=32;
  fwrite(head,72,80,fp); swap4(e,n1*n2*4);
  fwrite(e,n1*n2,4,fp);  fclose(fp);
  printf("produce mark file: %s    ok!\n",b);
  printf("produce used files' name: %s ok!\n",f2);
}

shrinkv()
{
  int i,j,k,ii,jj,i1,j1;
  char h[72][80],f1[60];
  fp=fopen(b,"rb");
  if(fp==0){ printf("%s not found!\n",b); exit(0); }
  fread(h,72,80,fp);
  fread(c,4096*4032,4,fp); fclose(fp); swap4(c,4096*4032*4);
  k=indexpos(h,"CCD_NO: ",72);
  sscanf(&h[k][23],"%d",&ccdno);
  k=indexpos(h,"SKYADU  ",72);
  sscanf(&h[k][23],"%f",&white);
  k=indexpos(h,"A81     ",72);
  for(i=0;i<8;i++)sscanf(&h[k+i][10],"%le",&s8[i]);
  xytoad(s8,t8);  
  for(j=0;j<4032;j++)for(i=0;i<4096;i++)c[j][i]-=white;
  for(i=0;i<27;i++)c0[i]=h[6][52+i]; c0[i]=0;
  sprintf(f1,"/vega2/rhbin/ubad_%d%d.fit",idate,ccdno);
  fp=fopen(f1,"rb");
  fseek(fp,36*80,0); fread(ubad,4032,4096,fp); fclose(fp);
} 

int mon[12]={31,28,31,30,31,30,31,31,30,31,30,31};
jd2date(int jd4,int *y,int *m,int *d)
{
  int iy,im,id,k;
  k=jd4; if(k<9354)k+=10000;
  for(iy=1994;iy<=2021;iy++){
    mon[1]=28; if(iy%4==0)mon[1]=29;
    for(im=0;im<12;im++)for(id=1;id<=mon[im];id++){
      if(k==jd2(iy,im+1,id)){ im++;
        printf("%d ---> %02d %02d %02d\n",k-10000,iy,im,id);
        *y=iy; *m=im; *d=id; return;
      }
    }
  }
}

jd2(int year,int im,int id)
{
  int i,j,iy=year-1900;
  i=(im+9)*0.09; i=(i+iy)*1.75+0.01;
  j=30.56*im;  j=(iy-50)*367+id+j-i;
  return(j-6661);
}

puthead()
{
  int i,j,k;
  double x;
  strcpy(&head[ 0][0], "SIMPLE  =                    T ");
  strcpy(&head[ 1][0], "BITPIX  =                  -32 ");
  strcpy(&head[ 2][0], "NAXIS   =                    2 ");
  sprintf(&head[3][0], "NAXIS1  =                %5d ",n1);
  sprintf(&head[4][0], "NAXIS2  =                %5d ",n2);
  jd2date(id1+1,&i,&j,&k);
  sprintf(&head[8][0], "DATE-OBS=%4d,%02d,%02d ",i,j,k); head[8][20]=32;
  jd2date(id2+1,&i,&j,&k); sprintf(&head[8][20],"~%4d,%02d,%02d",i,j,k); 
  strcpy(&head[ 9][0], "TIME-OBS=                      ");
  strcpy(&head[10][0], "EXPTIME =                  150 ");
  toms2(rc/cx,c1,1); toms2(dc/cy,c2,0);
  sprintf(&head[11][0],"RA      =        %s ", c1);
  sprintf(&head[12][0],"DEC     =         %s ",c2);
  strcpy(&head[13][0], "HA      =                      ");
  strcpy(&head[14][0], "EPOCH   =               2000.0 ");
  strcpy(&head[15][0], "FILTER  =                    u ");
  sprintf(&head[16][0],"SCALE   =         %12.4f ",scale);
  strcpy(&head[18][0], "INSTRUME=        BOK   90prime ");
  sprintf(&head[32][0],"SKYADU  =         %12.3f ",white);

  k=34;
  sprintf(&head[k++][0],"A81     = %20.12le ",a8[0]);
  sprintf(&head[k++][0],"A82     = %20.12le ",a8[1]);
  sprintf(&head[k++][0],"A83     = %20.12le ",a8[2]);
  sprintf(&head[k++][0],"A84     = %20.12le ",a8[3]);
  sprintf(&head[k++][0],"A85     = %20.12le ",a8[4]);
  sprintf(&head[k++][0],"A86     = %20.12le ",a8[5]);
  sprintf(&head[k++][0],"A87     = %20.12le ",a8[6]);
  sprintf(&head[k++][0],"A88     = %20.12le ",a8[7]);

  k=48;
  x=(a8[1]+a8[2])/(a8[0]-a8[3])/cy;                        // BOKs
  sprintf(&head[k++][0],"CTYPE1  = 'RA---ARC'           ");
  sprintf(&head[k++][0],"CTYPE2  = 'DEC--ARC'           ");
  sprintf(&head[k++][0],"CROTA2  = %20.12le ",x);
  sprintf(&head[k++][0],"CRVAL1  = %20.12le ",rc/cy);
  sprintf(&head[k++][0],"CRVAL2  = %20.12le ",dc/cy);
  sprintf(&head[k++][0],"CDELT1  = %20.12le ",a8[0]/cy);
  sprintf(&head[k++][0],"CDELT2  = %20.12le ",a8[3]/cy);
  sprintf(&head[k++][0],"CRPIX1  = %20.12le ",(n1+1)/2.);
  sprintf(&head[k++][0],"CRPIX2  = %20.12le ",(n2+1)/2.);

  for(i=0;i<70;i++)if(head[i][0]!=32)head[i][31]='/';
  strcpy(&head[71][0], "END"); head[71][3]=32;
}

xytoad(x,a)
double *x,*a;
{
  double z;
  z=x[0]*x[3]-x[2]*x[1];
  a[0]= x[3]/z;
  a[1]=-x[1]/z;
  a[2]=-x[2]/z;
  a[3]= x[0]/z;
  a[4]= (x[2]*x[5]-x[4]*x[3])/z;
  a[5]= (x[4]*x[1]-x[0]*x[5])/z;
}

chs(a,y)
char *a; double *y;
{
  double x;
  char b[20];
  int i,j,k;
  strcpy(b,a); k=strlen(b);
  j=1; for(i=0;i<k;i++){ if(b[i]==32)continue; if(b[i]=='-')j=-1; break; }
  for(i=0;i<k;i++)if(b[i]<'.' || b[i]> '9')b[i]=32;
  i=k=0; x=0.; sscanf(b,"%d %d %lf",&i,&k,&x);
  x=k/60.+x/3600.+i;
  *y=x*j;
}

#define bok  48.
rad_xy(ac,dc,ra,de,x,y,type,k)
double ac,dc,ra,de,*x,*y;  int type,k;
{
  double xi,xn, tmp,rar,der;
  rar=ra*cx; der=de*cy;
/*                         // same discribe formula as following 3 lines
  double sd,cd,td,co;      // china bai_ke_quan_shu (astronmy) p.552
  sd=sin(dc);  cd=cos(dc);  td=tan(der);
  co=cos(rar-ac);  tmp=sd*td+cd*co;
  xi=sin(rar-ac)/tmp;
  xn=(cd*td-sd*co)/tmp;
*/
  tmp=atan(tan(der)/cos(rar-ac));
  xi=cos(tmp)*tan(rar-ac)/cos(tmp-dc);
  xn=tan(tmp-dc);
  if(type==1){     // schmidt TELESCOPE
    tmp=sqrt(xi*xi+xn*xn);
    if(tmp!=0.){
      tmp=atan(tmp)/tmp;
      xi*=tmp; xn*=tmp;
    }
  }
  if(type==2){    //  BOK telescope
    tmp=1.+bok*(xi*xi+xn*xn);
    xi*=tmp; xn*=tmp;
  }
  if(k==0){
    *x=b8[0]*xi+b8[2]*xn+b8[4];
    *y=b8[1]*xi+b8[3]*xn+b8[5];
  }
  if(k==1){ *x=xi; *y=xn;}
}

xy_rad(ac,dc,x,y,ra,de,type,k)
double ac,dc,x,y,*ra,*de;  int type,k;
{
  double xi,xn,tmp,tmp1;
  double x1,y1,r1,d1;
  int i;
  xi=a8[0]*x+a8[2]*y+a8[4];
  xn=a8[1]*x+a8[3]*y+a8[5];
  if(type==1){
    tmp=sqrt(xi*xi+xn*xn);
    if(tmp!=0.){
      tmp=tan(tmp)/tmp;
      xi*=tmp;  xn*=tmp;
    }
  }
  if(type==2){
    tmp=1.+bok*(xi*xi+xn*xn);
    for(i=0;i<4;i++){
      x1=xi/tmp; y1=xn/tmp;
      tmp=tan(dc);  tmp1=1.-y1*tmp;
      r1=atan(x1/cos(dc)/tmp1);
      d1=atan((y1+tmp)*cos(r1)/tmp1);
      r1+=ac;
      tmp=atan(tan(d1)/cos(r1-ac));
      x1=cos(tmp)*tan(r1-ac)/cos(tmp-dc);
      y1=tan(tmp-dc);
      tmp=1.+bok*(x1*x1+y1*y1);
//                                 printf("%lf\n",tmp);
    }
    xi/=tmp; xn/=tmp;
  }
  tmp=tan(dc);  tmp1=1.-xn*tmp;
  *ra=atan(xi/cos(dc)/tmp1);
  *de=atan((xn+tmp)*cos(*ra)/tmp1);
  *ra+=ac;
  tmp=(*de)-dc; if(tmp<0.)tmp=-tmp;
  if(tmp>2.){  *de=-(*de);  *ra+=pi; }
  if(*ra<0.)*ra+=(pi+pi);
  if(k==0){ *ra/=cx; *de/=cy; }
}

toms2(aa,c,k)
double aa;           // input
char c[14];          // output
int k;               // input
/*
 hour or degree to char_line
 if k=1 (hour case) in **:**:**.***
    k=0 (degree       -**:**:**.**
*/
{
  int  i,j;
  double a,b,x;
  a=aa;
  if(k==1){ if(a>24.)a-=24.; if(a<0.)a+=24.; }
  c[0]=32; if(a<0.){ a=-a; c[0]='-'; }
  i=a; b=(a-i)*60.;
  j=b; x=(b-j)*60.;
  if(j==60){ j=0; i++; }
  if(k==1)sprintf(&c[1],"%2.2d:%2.2d:%6.3f",i,j,x);
  if(k==0)sprintf(&c[1],"%2.2d:%2.2d:%5.2f",i,j,x);
  if(c[7]==32)c[7]='0';   if(c[8]==32)c[8]='0';
  if(c[7]=='6'){
    c[7]='0'; j++; sprintf(&c[4],"%2.2d",j);
    if(c[4]=='6'){
      c[4]='0'; i++; sprintf(&c[1],"%2.2d",i);
    }
    c[3]=':'; c[6]=':';
  }
}
