diff --git a/makefile b/makefile index 452df99..fed7c96 100644 --- a/makefile +++ b/makefile @@ -8,7 +8,7 @@ LFLAGS = -lcpgplot -lpgplot -lX11 -lpng -lm -lgsl -lgslcblas CC = gcc all: - make rfedit rfplot rffft rfpng + make rfedit rfplot rffft rfpng rffind rfpng: rfpng.o rftime.o rfio.o rftrace.o sgdp4.o satutl.o deep.o ferror.o gfortran -o rfpng rfpng.o rftime.o rfio.o rftrace.o sgdp4.o satutl.o deep.o ferror.o $(LFLAGS) diff --git a/rffind.c b/rffind.c index 4f35883..40b424b 100644 --- a/rffind.c +++ b/rffind.c @@ -2,128 +2,101 @@ #include #include #include -#include #include #include "rftime.h" #include "rfio.h" -#include #define LIM 128 #define NMAX 64 - void usage(void) { } -float fit_polynomial(float *x,float *y,int n,int m,float *a) +void filter(struct spectrogram s,int site_id,float sigma,char *filename) { + int i,j,k,l; + float s1,s2,avg,std,dz; + FILE *file; + double f; + int *mask; - int i,j; - double chisq; - gsl_matrix *X,*cov; - gsl_vector *yy,*w,*c; - - - X=gsl_matrix_alloc(n,m); - yy=gsl_vector_alloc(n); - w=gsl_vector_alloc(n); - - c=gsl_vector_alloc(m); - cov=gsl_matrix_alloc(m,m); - - // Fill matrices - for(i=0;isigma*std) { + mask[j]=0; + l++; + } + } } - nn=j; - - // Fit polynomial - chi2=fit_polynomial(xx,yy,nn,m,a); - - // Scale - for (i=0,rms=0.0,nn=0;isigma*std) + mask[j]=1; + else + mask[j]=0; + } + + // Find maximum when points are adjacent + for (j=0;j=0;j--) { + if (mask[j]==1 && mask[j-1]==1) { + if (s.z[i+s.nsub*j]sigma*rms) - mask[i]=0; + // Mark points + for (j=0;j1.0) + fprintf(file,"%lf %lf %f %d\n",s.mjd[i],f,s.z[i+s.nsub*j],site_id); + } } - } + } - // Recompute final mask - for (i=0;isigma*rms) - mask[i]=0; - else - mask[i]=1; - } + fclose(file); - // Free - free(a); - free(xx); - free(yy); + free(mask); return; } @@ -139,8 +112,6 @@ int main(int argc,char *argv[]) float avg,std; int arg=0; float sigma=5.0; - float *x,*y; - int *mask; FILE *file; double f,f0,df0; char filename[128]="find.dat"; @@ -155,7 +126,7 @@ int main(int argc,char *argv[]) // Read arguments if (argc>1) { - while ((arg=getopt(argc,argv,"p:f:w:s:l:hc:o:"))!=-1) { + while ((arg=getopt(argc,argv,"p:f:w:s:l:hc:o:S:"))!=-1) { switch (arg) { case 'p': @@ -178,6 +149,10 @@ int main(int argc,char *argv[]) f0=(double) atof(optarg); break; + case 'S': + sigma=atof(optarg); + break; + case 'w': df0=(double) atof(optarg); break; @@ -199,42 +174,18 @@ int main(int argc,char *argv[]) // Read data s=read_spectrogram(path,isub,nsub,f0,df0,1); - x=(float *) malloc(sizeof(float)*s.nchan); - y=(float *) malloc(sizeof(float)*s.nchan); - mask=(int *) malloc(sizeof(int)*s.nchan); + // Exit on emtpy file + if (s.nsub==0) + return 0; printf("Read spectrogram\n%d channels, %d subints\nFrequency: %g MHz\nBandwidth: %g MHz\n",s.nchan,s.nsub,s.freq*1e-6,s.samp_rate*1e-6); - file=fopen(filename,"w"); - - // Loop over subints - for (i=0;i1.0) - fprintf(file,"%lf %lf %f %d\n",s.mjd[i],f,s.z[i+s.nsub*j],site_id); - } - } - } - fclose(file); + // Filter + filter(s,site_id,sigma,filename); // Free free(s.z); free(s.mjd); - free(x); - free(y); - free(mask); return 0; } diff --git a/rfio.c b/rfio.c index 12586f9..11f1eb8 100644 --- a/rfio.c +++ b/rfio.c @@ -6,7 +6,7 @@ struct spectrogram read_spectrogram(char *prefix,int isub,int nsub,double f0,double df0,int nbin) { - int i,j,k,l,flag=0,status,msub,ibin; + int i,j,k,l,flag=0,status,msub,ibin,nadd; char filename[128],header[256],nfd[32]; FILE *file; struct spectrogram s; @@ -23,6 +23,7 @@ struct spectrogram read_spectrogram(char *prefix,int isub,int nsub,double f0,dou file=fopen(filename,"r"); if (file==NULL) { printf("%s does not exist\n",filename); + s.nsub=0; return s; } @@ -40,8 +41,12 @@ struct spectrogram read_spectrogram(char *prefix,int isub,int nsub,double f0,dou j0=(int) ((f0-0.5*df0-s.freq+0.5*s.samp_rate)*(float) nch/s.samp_rate); j1=(int) ((f0+0.5*df0-s.freq+0.5*s.samp_rate)*(float) nch/s.samp_rate); - if (j0<0 || j1>nch) + if (j0<0 || j1>nch) { fprintf(stderr,"Requested frequency range out of limits\n"); + s.nsub=0; + s.nchan=0; + return s; + } } else { s.nchan=nch; j0=0; @@ -64,7 +69,7 @@ struct spectrogram read_spectrogram(char *prefix,int isub,int nsub,double f0,dou s.mjd[j]=0.0; // Loop over files - for (k=0,i=0,l=0,ibin=0;l0.0 && df0>0.0) { diff --git a/rfplot.c b/rfplot.c index 11c1306..35cb0b4 100644 --- a/rfplot.c +++ b/rfplot.c @@ -22,6 +22,95 @@ void usage(void); void plot_traces(struct trace *t,int nsat); struct trace locate_trace(struct spectrogram s,struct select sel,int site_id); +void filter(struct spectrogram s,int site_id) +{ + int i,j,k,l,jmax,zmax; + float s1,s2,avg,std,dz; + FILE *file; + double f; + int *mask; + float sigma=5; + + mask=(int *) malloc(sizeof(int)*s.nchan); + + // Open file + file=fopen("filter.dat","w"); + + // Loop over subints + for (i=0;isigma*std) { + mask[j]=0; + l++; + } + } + } + // Reset mask + for (j=0;jsigma*std) + mask[j]=1; + else + mask[j]=0; + } + + // Find maximum when points are adjacent + for (j=0;j=0;j--) { + if (mask[j]==1 && mask[j-1]==1) { + if (s.z[i+s.nsub*j]1.0) + fprintf(file,"%lf %lf %f %d\n",s.mjd[i],f,s.z[i+s.nsub*j],site_id); + cpgpt1((float) i+0.5,(float) j+0.5,17); + } + } + } + fclose(file); + + free(mask); + + return; +} + int main(int argc,char *argv[]) { struct spectrogram s; @@ -48,7 +137,7 @@ int main(int argc,char *argv[]) double f0=0.0,df0=0.0; int foverlay=1; struct trace *t,tf; - int nsat,satno; + int nsat,satno,status; struct select sel; char *env; int site_id=0; @@ -120,9 +209,13 @@ int main(int argc,char *argv[]) // Read data s=read_spectrogram(path,isub,nsub,f0,df0,nbin); - + printf("Read spectrogram\n%d channels, %d subints\nFrequency: %g MHz\nBandwidth: %g MHz\n",s.nchan,s.nsub,s.freq*1e-6,s.samp_rate*1e-6); + // Exit on empty data + if (s.nsub==0) + return 0; + // Compute traces t=compute_trace(tlefile,s.mjd,s.nsub,site_id,s.freq*1e-6,s.samp_rate*1e-6,&nsat); printf("Traces for %d objects for location %d\n",nsat,site_id); @@ -237,6 +330,9 @@ int main(int argc,char *argv[]) continue; } + if (c=='g') + filter(s,site_id); + // Fit if (c=='f') { tf=locate_trace(s,sel,site_id); @@ -254,7 +350,7 @@ int main(int argc,char *argv[]) // Identify if (c=='I') { printf("Provide satno: "); - scanf("%d",&satno); + status=scanf("%d",&satno); identify_trace(tlefile,tf,satno); redraw=1; continue; @@ -399,7 +495,7 @@ int main(int argc,char *argv[]) j1=s.nchan-1; printf("Provide filename: "); - scanf("%s",filename); + status=scanf("%s",filename); file=fopen(filename,"a"); // Loop over image diff --git a/rfpng.c b/rfpng.c new file mode 100644 index 0000000..04953c3 --- /dev/null +++ b/rfpng.c @@ -0,0 +1,422 @@ +#include +#include +#include +#include +#include +#include +#include "rftime.h" +#include "rfio.h" +#include "rftrace.h" + +#define LIM 128 +#define NMAX 64 + +struct select { + int flag,n; + float x[NMAX],y[NMAX],w; +}; + +void dec2sex(double x,char *s,int f,int len); +void time_axis(double *mjd,int n,float xmin,float xmax,float ymin,float ymax); +void usage(void); +void plot_traces(struct trace *t,int nsat); +struct trace locate_trace(struct spectrogram s,struct select sel,int site_id); + +int main(int argc,char *argv[]) +{ + struct spectrogram s; + float tr[]={-0.5,1.0,0.0,-0.5,0.0,1.0}; + float cool_l[]={-0.5,0.0,0.17,0.33,0.50,0.67,0.83,1.0,1.7}; + float cool_r[]={0.0,0.0,0.0,0.0,0.6,1.0,1.0,1.0,1.0}; + float cool_g[]={0.0,0.0,0.0,1.0,1.0,1.0,0.6,0.0,1.0}; + float cool_b[]={0.0,0.3,0.8,1.0,0.3,0.0,0.0,0.0,1.0}; + float xmin,xmax,ymin,ymax,zmin,zmax=8.0; + int i,j,k; + float dt,zzmax,s1,s2; + int ix=0,iy=0,isub=0; + int i0,j0,i1,j1,jmax; + float width=1500; + float x,y,x0,y0; + char c; + char path[128],xlabel[64],ylabel[64],filename[32],tlefile[128],pngfile[128]; + int sec,lsec,ssec; + char stime[16]; + double fmin,fmax,fcen,f; + FILE *file; + int arg=0,nsub=900,nbin=1; + double f0=0.0,df0=0.0,dy=2500; + int foverlay=1; + struct trace *t,tf; + int nsat,satno; + struct select sel; + char *env; + int site_id=0; + + // Get site + env=getenv("ST_COSPAR"); + if (env!=NULL) { + site_id=atoi(env); + } else { + printf("ST_COSPAR environment variable not found.\n"); + } + env=getenv("ST_TLEDIR"); + sprintf(tlefile,"%s/bulk.tle",env); + + // Read arguments + if (argc>1) { + while ((arg=getopt(argc,argv,"p:f:w:s:l:b:z:hc:C:"))!=-1) { + switch (arg) { + + case 'p': + strcpy(path,optarg); + break; + + case 'f': + f0=(double) atof(optarg); + break; + + case 'w': + df0=(double) atof(optarg); + break; + + case 'z': + zmax=atof(optarg); + break; + + case 'c': + strcpy(tlefile,optarg); + break; + + case 'h': + usage(); + return 0; + + default: + usage(); + return 0; + } + } + } else { + usage(); + return 0; + } + + for (isub=0;;isub+=15) { + // Read data + s=read_spectrogram(path,isub,nsub,f0,df0,nbin); + if (s.mjd[0]<54000) + break; + + // Output filename + sprintf(pngfile,"%.19s_%8.3f.png/png",s.nfd0,s.freq*1e-6); + + printf("Read spectrogram\n%d channels, %d subints\nFrequency: %g MHz\nBandwidth: %g MHz\n",s.nchan,s.nsub,s.freq*1e-6,s.samp_rate*1e-6); + + // Compute traces + t=compute_trace(tlefile,s.mjd,s.nsub,site_id,s.freq*1e-6,s.samp_rate*1e-6,&nsat); + printf("Traces for %d objects for location %d\n",nsat,site_id); + + printf("%s\n",pngfile); + cpgopen(pngfile); + cpgctab(cool_l,cool_r,cool_g,cool_b,9,1.0,0.5); + cpgsch(0.8); + cpgask(1); + + // Default limits + xmin=0.0; + xmax=(float) s.nsub; + ymin=0; + ymax=(float) s.nchan; + zmin=0.0; + + cpgsci(1); + cpgpage(); + cpgsvp(0.1,0.95,0.1,0.95); + cpgswin(xmin,xmax,ymin,ymax); + + cpgimag(s.z,s.nsub,s.nchan,1,s.nsub,1,s.nchan,zmin,zmax,tr); + + // Pixel axis + cpgbox("CTSM1",0.,0,"CTSM1",0.,0); + + // Time axis + cpgbox("B",0.,0,"",0.,0); + time_axis(s.mjd,s.nsub,xmin,xmax,ymin,ymax); + + // Freq axis + fmin=s.freq-0.5*s.samp_rate+ymin*s.samp_rate/(float) s.nchan; + fmax=s.freq-0.5*s.samp_rate+ymax*s.samp_rate/(float) s.nchan; + fmin*=1e-6; + fmax*=1e-6; + + // Plot traces + cpgswin(xmin,xmax,fmin,fmax); + cpgsci(3); + plot_traces(t,nsat); + cpgsci(1); + + // Human readable frequency axis + fcen=0.5*(fmax+fmin); + fcen=floor(1000*fcen)/1000.0; + sprintf(ylabel,"Frequency - %.3f MHz",fcen); + fmin-=fcen; + fmax-=fcen; + cpgswin(xmin,xmax,fmin,fmax); + cpgbox("",0.,0,"BTSN",0.,0); + + sprintf(xlabel,"UT Date: %.10s",s.nfd0); + cpglab(xlabel,ylabel," "); + + cpgswin(xmin,xmax,ymin,ymax); + + cpgend(); + + // Free + free(s.z); + free(s.mjd); + + for (i=0;imjdmax) mjdmax=mjd[i]; + } + } + dt=(float) 86400*(mjdmax-mjdmin); + + // Choose tickmarks + if (dt>43000) { + lsec=10800; + ssec=3600; + } else if (dt>21600) { + lsec=10800; + ssec=3600; + } else if (dt>7200) { + lsec=1800; + ssec=300; + } else if (dt>3600) { + lsec=600; + ssec=120; + } else if (dt>900) { + lsec=300; + ssec=60; + } else { + lsec=60; + ssec=10; + } + // Override + lsec=60; + ssec=10; + + // Extrema + tmin=86400.0*(mjdmin-floor(mjdmin)); + tmax=tmin+dt; + tmin=lsec*floor(tmin/lsec); + tmax=lsec*ceil(tmax/lsec); + + // Large tickmarks + for (t=tmin;t<=tmax;t+=lsec) { + mjdt=floor(mjdmin)+t/86400.0; + if (mjdt>=mjdmin && mjdt=mjd[i] && mjdt=mjdmin && mjdt=mjd[i] && mjdt Input path to file /a/b/c_??????.bin\n"); + printf("-s Number of starting subintegration [0]\n"); + printf("-l Number of subintegrations to plot [3600]\n"); + printf("-b Number of subintegrations to bin [1]\n"); + printf("-z Image scaling upper limit [8.0]\n"); + printf("-f Frequency to zoom into (Hz)\n"); + printf("-w Bandwidth to zoom into (Hz)\n"); + printf("-h This help\n"); + + return; +} + +void plot_traces(struct trace *t,int nsat) +{ + int i,j,flag,textflag; + char text[8]; + + // Loop over objects + for (i=0;i0 && t[i].za[j-1]>90.0 && t[i].za[j]<=90.0) + cpgtext((float) j,(float) t[i].freq[j],text); + + // Plot line + if (flag==0) { + cpgmove((float) j,(float) t[i].freq[j]); + flag=1; + } else { + cpgdraw((float) j,(float) t[i].freq[j]); + } + + // Below horizon + if (t[i].za[j]>90.0) + flag=0; + else + flag=1; + } + } + + return; +} + +// Locate trace +struct trace locate_trace(struct spectrogram s,struct select sel,int site_id) +{ + int i,j,k,l,sn; + int i0,i1,j0,j1,jmax; + double f; + float x,y,s1,s2,z,za,zs,zm,sigma; + struct trace t; + FILE *file; + + // Set up trace + t.satno=99999; + t.n=(int) ceil(sel.x[sel.n-1]-sel.x[0]); + t.mjd=(double *) malloc(sizeof(double)*t.n); + t.freq=(double *) malloc(sizeof(double)*t.n); + t.za=(float *) malloc(sizeof(float)*t.n); + + // Open file + file=fopen("out.dat","w"); + + // Loop over selected regions + for (k=0,l=0;k=s.nchan) + j1=s.nchan; + + // Find maximum and significance + zm=0.0; + jmax=0; + s1=0.0; + s2=0.0; + sn=0; + for (j=j0;jzm) { + zm=z; + jmax=j; + } + } + za=s1/(float) sn; + zs=sqrt(s2/(float) sn-za*za); + sigma=(zm-za)/zs; + + // Store + if (sigma>5.0 && s.mjd[i]>1.0) { + f=s.freq-0.5*s.samp_rate+(double) jmax*s.samp_rate/(double) s.nchan; + fprintf(file,"%lf %lf %f %d\n",s.mjd[i],f,sigma,site_id); + cpgpt1((float) i,(float) jmax,17); + t.mjd[l]=s.mjd[i]; + t.freq[l]=f; + t.za[l]=0.0; + l++; + } + } + } + t.n=l; + + // Close file + fclose(file); + + return t; +} diff --git a/rftrace.c b/rftrace.c index cf74975..66daf46 100644 --- a/rftrace.c +++ b/rftrace.c @@ -96,7 +96,7 @@ void obspos_xyz(double mjd,double lng,double lat,float alt,xyz_t *pos,xyz_t *vel // Get observing site struct site get_site(int site_id) { - int i=0; + int i=0,status; char line[LIM]; FILE *file; int id; @@ -123,7 +123,7 @@ struct site get_site(int site_id) line[strlen(line)-1]='\0'; // Read data - sscanf(line,"%4d %2s %lf %lf %f", + status=sscanf(line,"%4d %2s %lf %lf %f", &id,abbrev,&lat,&lng,&alt); strcpy(observer,line+38); @@ -148,7 +148,7 @@ struct site get_site(int site_id) // Identify trace void identify_trace(char *tlefile,struct trace t,int satno) { - int i,imode,flag=0; + int i,imode,flag=0,status; struct point *p; struct site s; double *v; @@ -246,7 +246,7 @@ void identify_trace(char *tlefile,struct trace t,int satno) printf("\nBest fitting object:\n"); printf("%05d: %s %8.3f MHz %8.3f kHz\n",satnomin,nfdmin,1e-6*freqmin,1e-3*rmsmin); printf("Store frequency? [y/n]\n"); - scanf("%s",text); + status=scanf("%s",text); if (text[0]=='y') { file=fopen(freqlist,"a"); fprintf(file,"%05d %8.3f\n",satnomin,1e-6*freqmin); @@ -270,7 +270,7 @@ void identify_trace(char *tlefile,struct trace t,int satno) // Compute trace struct trace *compute_trace(char *tlefile,double *mjd,int n,int site_id,float freq,float bw,int *nsat) { - int i,j,imode,flag,satno,tflag,m; + int i,j,imode,flag,satno,tflag,m,status; struct point *p; struct site s; FILE *file,*infile; @@ -299,7 +299,7 @@ struct trace *compute_trace(char *tlefile,double *mjd,int n,int site_id,float fr for (i=0;;) { if (fgetline(infile,line,LIM)<=0) break; - sscanf(line,"%d %lf",&satno,&freq0); + status=sscanf(line,"%d %lf",&satno,&freq0); if (freq0>=fmin && freq0<=fmax) i++; @@ -334,7 +334,7 @@ struct trace *compute_trace(char *tlefile,double *mjd,int n,int site_id,float fr for (j=0;;) { if (fgetline(infile,line,LIM)<=0) break; - sscanf(line,"%d %lf",&satno,&freq0); + status=sscanf(line,"%d %lf",&satno,&freq0); if (freq0fmax) continue;