diff --git a/rffit.c b/rffit.c index ee975f5..d609dfc 100644 --- a/rffit.c +++ b/rffit.c @@ -42,6 +42,7 @@ int fgetline(FILE *file,char *s,int lim); struct data read_data(char *filename,int graves,float offset); double date2mjd(int year,int month,double day); void mjd2nfd(double mjd,char *nfd); +double nfd2mjd(char *date); struct point decode_line(char *line); double modulo(double,double); double gmst(double); @@ -289,16 +290,16 @@ int main(int argc,char *argv[]) float xmin,xmax,ymin,ymax; float xminsel,xmaxsel,yminsel,ymaxsel; float x0=0.0,y0=0.0,x=0.0,y=0.0; - double mjd,v,v1,azi,alt,rms=0.0,day,mjdtca=56658.0,altmin=0.0,mjdmid; + double mjd,v,v1,azi,alt,rms=0.0,day,mjdtca=-1,altmin=0.0,mjdmid,mjdepoch=-1; float t,f,vtca,foffset=0.0; - char c,nfd[32]="2014-01-01T00:00:00"; + char c,nfdtca[32]="2014-01-01T00:00:00",nfd[32]="2014-01-01T00:00:00",nfdepoch[32]="2014-01-01T00:00:00"; int mode=0,posn=0,click=0; char *catalog=NULL,*datafile=NULL,filename[64],string[64],bstar[10]=" 00000-0"; int arg=0,nobs=0; FILE *fp,*std,*fpres; char line0[72],line1[72],line2[72]; int ia[]={0,0,0,0,0,0,0}; - float dx[]={0.1,0.1,0.35,0.35,0.6,0.6,0.85,0.85},dy[]={0.0,-0.25,0.0,-0.25,0.0,-0.25,0.0,-0.25}; + float dx[]={0.1,0.1,0.35,0.35,0.6,0.6,0.85,0.85},dy[]={-0.05,-0.30,-0.05,-0.30,-0.05,-0.30,-0.05,-0.30}; int satno=-1,status; site_t site,s0,s1; int site_number[16],nsite=0,graves=0; @@ -435,11 +436,8 @@ int main(int argc,char *argv[]) ymax=20*d.f0/C; } - // ymin=d.freqmin; - // ymax=d.freqmax; - - day=mjd2doy(d.mjd0,&year); - sprintf(xlabel,"MJD - %5.0f (%02d%03.0f)",d.mjd0,year-2000,floor(day)); + mjd2nfd(d.mjd0,nfd); + sprintf(xlabel, "Date (UTC) - %s",nfd); sprintf(ylabel,"Frequency - %.0f kHz",d.f0); // For ever loop @@ -451,14 +449,14 @@ int main(int argc,char *argv[]) cpgswin(0.0,1.0,-0.5,0.5); // Buttons - cpgtext(0.12,-0.05,"Inclination"); - cpgtext(0.372,-0.05,"Eccentricity"); - cpgtext(0.62,-0.05,"Mean Anomaly"); - cpgtext(0.87,-0.05,"B\\u*\\d"); - cpgtext(0.12,-0.3,"Ascending Node"); - cpgtext(0.37,-0.3,"Arg. of Perigee"); - cpgtext(0.62,-0.3,"Mean Motion"); - cpgtext(0.87,-0.3,"Frequency"); + cpgtext(0.12,-0.10,"Inclination"); + cpgtext(0.37,-0.10,"Eccentricity"); + cpgtext(0.62,-0.10,"Mean Anomaly"); + cpgtext(0.87,-0.10,"B\\u*\\d"); + cpgtext(0.12,-0.35,"Ascending Node"); + cpgtext(0.37,-0.35,"Arg. of Perigee"); + cpgtext(0.62,-0.35,"Mean Motion"); + cpgtext(0.87,-0.35,"Frequency"); // Toggles for (i=0;i<7;i++) { @@ -514,7 +512,7 @@ int main(int argc,char *argv[]) cpgdraw(x,y); vtca=v; } - mjd2nfd(mjdtca,nfd); + mjd2nfd(mjdtca,nfdtca); cpgsci(1); cpgsls(1); @@ -545,30 +543,42 @@ int main(int argc,char *argv[]) } // Diagnostics - cpgsvp(0.715,0.95,0.2,0.5); + cpgsvp(0.715,0.95,0.2,0.55); cpgwnad(0.0,1.0,0.0,1.0); + sprintf(text,"Measurements: %d",nobs); cpgtext(0.0,1.0,text); sprintf(text,"Frequency: %.3f MHz",d.ffit/1000.0); cpgtext(0.0,0.85,text); - sprintf(text,"rms: %.3f kHz",rms); - cpgtext(0.0,0.7,text); - sprintf(text,"TCA: %s",nfd); - cpgtext(0.0,0.55,text); + + // Print/plot TCA + if (mjdtca>0) { + sprintf(text,"rms: %.3f kHz",rms); + cpgtext(0.0,0.7,text); + sprintf(text,"TCA: %s",nfdtca); + cpgtext(0.0,0.55,text); + } + // Print TLE epoch + if (satno>0) { + mjdepoch=doy2mjd(orb.ep_year,orb.ep_day); + mjd2nfd(mjdepoch,nfdepoch); + sprintf(text,"TEP: %s",nfdepoch); + cpgtext(0.0,0.425,text); + } + sprintf(text,"%s (%04d)",site.observer,site.id); - cpgtext(0.0,0.4,text); + cpgtext(0.0,0.3,text); + // Plot site numbers for (j=0;j0) { + cpgsci(2); + cpgsls(2); + cpgmove(mjdtca-d.mjd0,ymin); + cpgdraw(mjdtca-d.mjd0,ymax); + cpgtext(mjdtca-d.mjd0,ymin+0.95*(ymax-ymin)," TCA"); + cpgsci(1); + cpgsls(1); + } + + // Plot Epoch + if (satno>0) { + cpgsci(1); + cpgsls(4); + cpgmove(mjdepoch-d.mjd0,ymin); + cpgdraw(mjdepoch-d.mjd0,ymax); + cpgtext(mjdepoch-d.mjd0,ymin+0.05*(ymax-ymin)," TEP"); + cpgsci(1); + cpgsls(1); + } + // Plot orbit if (satno>0 && plot_curve==1 && residuals==0) { // Plot tle if (d.satname != NULL) { - cpgmtxt("T", 3.0, 0.0, 0.0, d.satname); + cpgmtxt("T", 3.0, 0.0, 0.0, d.satname); } format_tle(orb,line1,line2); cpgmtxt("T",2.0,0.0,0.0,line1); @@ -605,7 +637,7 @@ int main(int argc,char *argv[]) s0 = get_site(site_number[j]); if (d.p[0].rsite_id != 0) { s1 = get_site(d.p[0].rsite_id); - } + } color=j+2; for (i=0;i=0 && i<=11) { printf("\nNew value: "); @@ -722,10 +754,8 @@ int main(int argc,char *argv[]) if (i==5) orb.mnan=RAD(atof(string)); if (i==6) orb.rev=atof(string); if (i==7) orb.bstar=atof(string); - if (i==8) { - orb.ep_year=2000+(int) floor(atof(string)/1000.0); - orb.ep_day=atof(string)-1000*floor(atof(string)/1000.0); - } + if (i==8) + orb.ep_day=mjd2doy(nfd2mjd(string),&orb.ep_year); if (i==9) orb.satno=atoi(string); if (i==10) d.satname=string; @@ -777,8 +807,7 @@ int main(int argc,char *argv[]) printf("No points selected!\n"); } else { rms=fit_curve(orb,ia); - //printf("rms: %.3f kHz, cf: %.6f MHz, TCA: %s\n",rms,d.ffit/1000.0,nfd); - printf("%05d %.6f %.3f %s %04d %02d%010.6f\n",orb.satno,d.ffit/1000.0,rms,nfd,d.p[0].site_id,orb.ep_year-2000,orb.ep_day); + printf("%05d %.6f %.3f %s %04d %02d%010.6f\n",orb.satno,d.ffit/1000.0,rms,nfdtca,d.p[0].site_id,orb.ep_year-2000,orb.ep_day); redraw=1; } } @@ -1019,7 +1048,7 @@ int main(int argc,char *argv[]) // Save if (c=='S') { - printf("%s_%.3f_%04d_%05d.dat\n",nfd,d.ffit/1000.0,d.p[0].site_id,satno); + printf("%s_%.3f_%04d_%05d.dat\n",nfdtca,d.ffit/1000.0,d.p[0].site_id,satno); printf("Save highlighted points, provide filename: "); status=scanf("%s",filename); save_data(xmin,ymin,xmax,ymax,filename); @@ -1698,6 +1727,20 @@ double compute_rms(void) return rms; } +// nfd2mjd +double nfd2mjd(char *date) +{ + int year,month,day,hour,min; + double mjd,dday; + float sec; + + sscanf(date,"%04d-%02d-%02dT%02d:%02d:%f",&year,&month,&day,&hour,&min,&sec); + dday=day+hour/24.0+min/1440.0+sec/86400.0; + mjd=date2mjd(year,month,dday); + + return mjd; +} + // Compute Date from Julian Day void mjd2nfd(double mjd,char *nfd) {