void preProcess(pulsar *psr,int npsr,int argc,char **argv) { int p,i,k,fitN=0,setN=0,j; char fitStr[10][100]; char setStr[10][100]; float dmvals[10000]; float startdmmjd = 0; int ndm; longdouble setVal[10]; FILE *fdmin; char newEpoch[100]="NONE"; char selectFname[1000]=""; char globalFname[1000]=""; char selectPlugName[1000]=""; char select1[100][100]; char select2[100][100]; char line[MAX_STRLEN]; char hashcheck; double select3[100]; double select4[100]; int nSelect=0; int v5; char name[100]; char dmfile[100]=""; int setName=0; double last=-1; int tempo1=0; int nojump=0; int nofit=0; int modify=0; //trim data to match dm correction, but don't correct for dm int trimonly = 0; char modifyFname[100]; double simulate=0; const char *CVS_verNum = "$Revision: 1.46 $"; if (displayCVSversion == 1) CVSdisplayVersion("preProcess.C","preProcess()",CVS_verNum); // logmsg("PreProcess"); logdbg("In preProcess"); //MAX_PSR = MAX_PSR_VAL; /* Maximum number of pulsars to fit simultaneously */ //MAX_OBSN = MAX_OBSN_VAL; ECLIPTIC_OBLIQUITY = ECLIPTIC_OBLIQUITY_VAL; // debugFlag = 0; for (i=0;i<argc;i++) { if (strcmp(argv[i],"-epoch")==0) strcpy(newEpoch,argv[++i]); else if (strcmp(argv[i],"-last")==0) sscanf(argv[++i],"%lf",&last); else if (strcmp(argv[i],"-setdm")==0) sscanf(argv[++i],"%s",dmfile); // Should deal with multiple pulsars else if (strcmp(argv[i],"-trimonly")==0) trimonly = 1; else if (strcmp(argv[i],"-tempo1")==0) tempo1=1; else if (strcmp(argv[i],"-nojump")==0) nojump=1; else if (strcmp(argv[i],"-select")==0) sscanf(argv[++i],"%s",selectFname); else if (strcmp(argv[i],"-splug")==0){ sscanf(argv[++i],"%s",selectPlugName); logdbg("Splug = %s\n",selectPlugName); } else if (strcmp(argv[i],"-global")==0){ forceGlobalFit=1; sscanf(argv[++i],"%s",globalFname); } else if (strcmp(argv[i],"-modify")==0) { modify=1; sscanf(argv[++i],"%s",modifyFname); } else if (strcmp(argv[i],"-name")==0) { setName=1; strcpy(name,argv[i+1]); } else if (strcmp(argv[i],"-fit")==0) strcpy(fitStr[fitN++],argv[i+1]); else if (strcmp(argv[i],"-set")==0) { strcpy(setStr[setN],argv[i+1]); sscanf(argv[i+2],"%Lf",&setVal[setN]); setN++; } else if (strcmp(argv[i],"-simulate")==0) { sscanf(argv[i+1],"%lf",&simulate); } else if (strcmp(argv[i],"-nofit")==0) nofit = 1; else if (strcmp(argv[i],"-clock")==0) { for (p=0;p<npsr;p++) strcpy(psr[p].clock,argv[i+1]); } } logdbg("Parsed command line"); for (p=0;p<npsr;p++) { for (i=0;i<MAX_PARAMS;i++){ if(psr[p].param[i].nLinkTo>0){ psr[p].param[i].val[0] = getParameterValue(&psr[p],i,0); psr[p].param[i].prefit[0] = getParameterValue(&psr[p],i,0); } } if (setName==1) strcpy(psr[p].name,name); if (nojump==1) psr[p].nJumps=0; // Check using white noise model file if (strcmp(psr[p].whiteNoiseModelFile,"NULL")!=0) { readWhiteNoiseModelFile(psr,p); } if (nofit==1) { for (i=0;i<MAX_PARAMS;i++) { if (i!=param_start && i!=param_finish){ for (k=0;k<psr[p].param[i].aSize;k++) psr[p].param[i].fitFlag[k] = 0; } } // Turn off fitting for jumps for (i=0;i<=psr[p].nJumps;i++) psr[p].fitJump[i]=0; } /* Select command line fitting */ for (i=0;i<fitN;i++) { for (j=0;j<MAX_PARAMS;j++) { for (k=0;k<psr[p].param[j].aSize;k++) { if (strcasecmp(fitStr[i],psr[p].param[j].shortlabel[k])==0) { if (psr[p].param[j].paramSet[k]!=1) { psr[p].param[j].paramSet[k]=1; psr[p].param[j].val[k]=0.0; psr[p].param[j].prefit[k]=0.0; } psr[p].param[j].fitFlag[k]=1; } } } } /* Simulate global parameter */ if (simulate!=0.0) { for (i=0;i<psr[p].nobs;i++) { psr[p].obsn[i].sat += simulate/SECDAY*sin(0.003*psr[p].obsn[i].sat); } } /* Set jump values if already set */ /* MOVED FOLLOWING INTO READPARFILE.C */ /* for (k=1;k<=psr[p].nJumps;k++) { v5 = -1; nread = sscanf(psr[p].jumpStr[k],"%s %s %s %s %s",str1,str2,str3,str4,str5); if (strcasecmp(str1,"MJD")==0 || strcasecmp(str1,"FREQ")==0) { if (nread>3) { sscanf(str4,"%lf",&(psr[p].jumpVal[k])); if (sscanf(str5,"%d",&v5)==1) { if (v5!=1) psr[p].fitJump[k]=0; } else psr[p].fitJump[k]=0; } } else if (strcasecmp(str1,"NAME")==0 || strcasecmp(str1,"TEL")==0 || str1[0]=='-') { if (nread>2) { sscanf(str3,"%lf",&(psr[p].jumpVal[k])); if (sscanf(str4,"%d",&v5)==1) { if (v5!=1) psr[p].fitJump[k]=0; } else psr[p].fitJump[k]=0; } } } */ /* Select command line parameter setting */ for (i=0;i<setN;i++) { if (strcasecmp(setStr[i],"NITS")==0) psr[p].nits = (int)setVal[i]; for (j=0;j<MAX_PARAMS;j++) { for (k=0;k<psr[p].param[j].aSize;k++) { if (strcasecmp(setStr[i],psr[p].param[j].shortlabel[k])==0) { psr[p].param[j].val[k]=setVal[i]; psr[p].param[j].prefit[k]=setVal[i]; psr[p].param[j].paramSet[k]=1; } } } } preProcessSimple1 (psr + p, tempo1, last); /* Update period epoch if necessary */ if (strcmp(newEpoch,"NONE")!=0) { longdouble nMJD,dt; longdouble earliest=-1; longdouble latest=-1; int okay=1; //=psr[p].obsn[0].sat,latest=psr[p].obsn[0].sat; for (i=0;i<psr[p].nobs;i++) { okay=1; if (psr[p].obsn[i].deleted==1) okay=0; if (psr[p].param[param_start].paramSet[0]==1 && psr[p].param[param_start].fitFlag[0]==1 && (psr[p].param[param_start].val[0] > psr[p].obsn[i].sat)) okay=0; if (psr[p].param[param_finish].paramSet[0]==1 && psr[p].param[param_finish].fitFlag[0]==1 && psr[p].param[param_finish].val[0] < psr[p].obsn[i].sat) okay=0; if (okay==1) { if (earliest==-1) { earliest = psr[p].obsn[i].sat; latest = psr[p].obsn[i].sat; } if (earliest > psr[p].obsn[i].sat) earliest = psr[p].obsn[i].sat; if (latest < psr[p].obsn[i].sat) latest = psr[p].obsn[i].sat; } } if (strcasecmp(newEpoch,"CENTRE")==0 || strcasecmp(newEpoch,"CENTER")==0) /* Find centre of data */ nMJD = (int)((earliest+latest)/2.0); else if (strcasecmp(newEpoch,"LEFT")==0) nMJD = (int)(earliest); else if (strcasecmp(newEpoch,"RIGHT")==0) nMJD = (int)(latest); else nMJD = parse_longdouble(newEpoch); dt = (nMJD - psr[p].param[param_pepoch].val[0])*86400.0; printf("dt = %g\n",(double)dt); psr[p].param[param_f].val[0] = psr[p].param[param_f].val[0]+ psr[p].param[param_f].val[1]*dt + 0.5*psr[p].param[param_f].val[2]*dt*dt; psr[p].param[param_f].val[1] += psr[p].param[param_f].val[2]*dt; if (psr[p].param[param_f].paramSet[3]==1) { psr[p].param[param_f].val[0] += 1.0/6.0*psr[p].param[param_f].val[3]*dt*dt*dt; psr[p].param[param_f].val[1] += 0.5*psr[p].param[param_f].val[3]*dt*dt; psr[p].param[param_f].val[2] += psr[p].param[param_f].val[3]*dt; } psr[p].param[param_f].prefit[0] = psr[p].param[param_f].val[0]; psr[p].param[param_f].prefit[1] = psr[p].param[param_f].val[1]; psr[p].param[param_pepoch].val[0] = nMJD; psr[p].param[param_pepoch].prefit[0] = nMJD; /* Update position epoch */ dt = (nMJD - psr[p].param[param_posepoch].val[0])/365.25; printf("pos dt = %g\n",(double)dt); if (psr[p].param[param_pmra].paramSet[0]==1) { char retstr[1000]; printf("Updating RAJ\n"); psr[p].param[param_raj].val[0] = psr[p].param[param_raj].val[0]+psr[p].param[param_pmra].val[0] /cos(psr[p].param[param_decj].val[0])/1000.0*(M_PI/180.0)/60.0/60.0*dt; psr[p].param[param_raj].prefit[0] = psr[p].param[param_raj].val[0]; /* Must obtain this in hms form */ turn_hms(psr[p].param[param_raj].val[0]/(2.0*M_PI), retstr); strcpy(psr[p].rajStrPost,retstr); strcpy(psr[p].rajStrPre,retstr); } if (psr[p].param[param_pmdec].paramSet[0]==1) { char retstr[1000]; psr[p].param[param_decj].val[0] = psr[p].param[param_decj].val[0]+psr[p].param[param_pmdec].val[0]/1000.0*(M_PI/180.0)/60.0/60.0*dt; psr[p].param[param_decj].prefit[0] = psr[p].param[param_decj].val[0]; turn_dms(psr[p].param[param_decj].val[0]/(2.0*M_PI), retstr); strcpy(psr[p].decjStrPost,retstr); strcpy(psr[p].decjStrPre,retstr); } psr[p].param[param_posepoch].val[0] = nMJD; psr[p].param[param_posepoch].prefit[0] = nMJD; /* Update dmepoch */ dt = (nMJD - psr[p].param[param_dmepoch].val[0])/365.25; psr[p].param[param_dm].val[0] = psr[p].param[param_dm].val[0]+ psr[p].param[param_dm].val[1]*dt + 0.5*psr[p].param[param_dm].val[2]*dt*dt; psr[p].param[param_dmepoch].val[0] = nMJD; psr[p].param[param_dmepoch].prefit[0] = nMJD; /* Should update wave epoch */ if (psr[p].param[param_waveepoch].paramSet[0]==1) { printf("ERROR: Not updating the FITWAVES to new EPOCH\n"); } if (psr[p].param[param_waveepoch_dm].paramSet[0]==1) { printf("ERROR: Not updating the FITWAVES(DM) to new EPOCH\n"); } /* Update binary parameters if necessary */ if (psr[p].param[param_pb].paramSet[0]==1 && 0 == 1) /* Binary pulsar */ { longdouble orbits,pb,tt0,pbdot,xpbdot,t0p,t0m=0.0; int norbits; if (psr[p].param[param_pbdot].paramSet[0]==1) pbdot = psr[p].param[param_pbdot].val[0]; else pbdot = 0.0; if (psr[p].param[param_xpbdot].paramSet[0] == 1) xpbdot = psr[p].param[param_xpbdot].val[0]; else xpbdot = 0.0; pb = psr[p].param[param_pb].val[0]*SECDAY; if (psr[p].param[param_tasc].paramSet[0]==1) tt0 = (nMJD-psr[p].param[param_tasc].val[0])*SECDAY; else tt0 = (nMJD-psr[p].param[param_t0].val[0])*SECDAY; printf("tt0 = %.14Lf %.14Lf %.14Lf %.14Lf\n",tt0,nMJD,psr[p].param[param_t0].val[0], nMJD-psr[p].param[param_t0].val[0]); orbits = tt0/pb - 0.5*(pbdot+xpbdot)*(tt0/pb)*(tt0/pb); norbits = (int)(orbits+0.5); printf("Orbits = %.5Lf (%d)\n",orbits,norbits); if (xpbdot > 0 || pbdot > 0) { /* t0p = (1.0/pb + sqrtl(1.0/(pb*pb)-2.0*(pbdot+xpbdot)*norbits/pb/pb)) /((pbdot+xpbdot)/pb/pb); t0m = (1.0/pb - sqrtl(1.0/(pb*pb)-2.0*(pbdot+xpbdot)*norbits/pb/pb))/((pbdot+xpbdot)/pb/pb); */ t0p = pb/(pbdot+xpbdot)*(1.0+sqrtl(1.0-2.0*(pbdot+xpbdot)*(longdouble)norbits)); t0m = pb/(pbdot+xpbdot)*(1.0-sqrtl(1.0-2.0*(pbdot+xpbdot)*(longdouble)norbits)); if (psr[p].param[param_tasc].paramSet[0]==1) { t0p = psr[p].param[param_tasc].val[0]+t0p/SECDAY; t0m = psr[p].param[param_tasc].val[0]+t0m/SECDAY; if (fabs(t0p-psr[p].param[param_tasc].val[0]) > fabs(t0m-psr[p].param[param_tasc].val[0])) t0p = t0m; } else { t0p = psr[p].param[param_t0].val[0]+t0p/SECDAY; t0m = psr[p].param[param_t0].val[0]+t0m/SECDAY; if (fabs(t0p-psr[p].param[param_t0].val[0]) > fabs(t0m-psr[p].param[param_t0].val[0])) t0p = t0m; } } else { t0p = norbits*pb; if (psr[p].param[param_tasc].paramSet[0]==1) t0p = psr[p].param[param_tasc].val[0]+t0p/SECDAY; else t0p = psr[p].param[param_t0].val[0]+t0p/SECDAY; } if (psr[p].param[param_tasc].paramSet[0]==1) { psr[p].param[param_tasc].val[0] = t0p; psr[p].param[param_tasc].prefit[0] = psr[p].param[param_tasc].val[0]; } else { psr[p].param[param_t0].val[0] = t0p; psr[p].param[param_t0].prefit[0] = psr[p].param[param_t0].val[0]; } printf("Result = %.14Lf %.14Lf\n",t0p,t0m); psr[p].param[param_pb].val[0] += psr[p].param[param_pbdot].val[0]*tt0/SECDAY; psr[p].param[param_pb].prefit[0] = psr[p].param[param_pb].val[0]; psr[p].param[param_om].val[0] += psr[p].param[param_omdot].val[0]*tt0/SECDAY/365.25; psr[p].param[param_om].prefit[0] = psr[p].param[param_om].val[0]; if (psr[p].param[param_a1dot].paramSet[0]==1) { psr[p].param[param_a1].val[0] += psr[p].param[param_a1dot].val[0]*1.0e-12*tt0; psr[p].param[param_a1].prefit[0] = psr[p].param[param_a1].val[0]; } } } if (psr[p].param[param_pepoch].paramSet[0]==1 && psr[p].param[param_pepoch].fitFlag[0]==1) {printf("Warning: Cannot fit for pepoch\n"); psr[p].param[param_pepoch].fitFlag[0]=0;} if (psr[p].param[param_posepoch].paramSet[0]==1 && psr[p].param[param_posepoch].fitFlag[0]==1) {printf("Warning: Cannot fit for posepoch\n"); psr[p].param[param_posepoch].fitFlag[0]=0;} if (psr[p].param[param_dmepoch].paramSet[0]==1 && psr[p].param[param_dmepoch].fitFlag[0]==1) {printf("Warning: Cannot fit for dmepoch\n"); psr[p].param[param_dmepoch].fitFlag[0]=0;} if (psr[p].param[param_track].paramSet[0]==1 && psr[p].param[param_track].fitFlag[0]==1) {printf("Warning: Cannot fit for track\n"); psr[p].param[param_track].fitFlag[0]=0;} if (strlen(dmfile)>0) { float tt; fdmin = fopen(dmfile,"r"); ndm=0; while (!feof(fdmin)) { //check wheter a line is a comment (= starts with a hash) fgets(line,MAX_STRLEN,fdmin); sscanf(line,"%c",&hashcheck); if (hashcheck == '#') { //do nothing, perhaps give a debug message logdbg("preProces():skipping line in dmfile\n"); } else if (sscanf(line,"%f %f",&tt,&dmvals[ndm])==2) { if (ndm==0) startdmmjd = tt; ndm++; } } fclose(fdmin); } //Check efacs and equads if (psr[p].nT2efac > 0 || psr[p].nT2equad > 0 || psr[p].T2globalEfac!=1.0) { double err; printf("Updating TOA errors using T2EFAC, T2EQUAD and T2GLOBALEFAC\n"); for (i=0;i<psr[p].nobs;i++) { err = psr[p].obsn[i].toaErr; for (j=0;j<psr[p].obsn[i].nFlags;j++) { // Check equad for (k=0;k<psr[p].nT2equad;k++) { if (strcmp(psr[p].obsn[i].flagID[j],psr[p].T2equadFlagID[k])==0) { if (strcmp(psr[p].obsn[i].flagVal[j],psr[p].T2equadFlagVal[k])==0) err = (sqrt(pow(err,2)+pow(psr[p].T2equadVal[k],2))); } } // Check efac for (k=0;k<psr[p].nT2efac;k++) { if (strcmp(psr[p].obsn[i].flagID[j],psr[p].T2efacFlagID[k])==0) { if (strcmp(psr[p].obsn[i].flagVal[j],psr[p].T2efacFlagVal[k])==0) err *= psr[p].T2efacVal[k]; } } } err *= psr[p].T2globalEfac; psr[p].obsn[i].toaErr = err; } } // Check TNEF and TNEQ if (psr[p].nTNEF > 0 || psr[p].nTNEQ > 0 || psr[p].nTNSQ > 0) { double err; printf("Updating TOA errors using TN parameters.\n"); for (i=0;i<psr[p].nobs;i++) { err = psr[p].obsn[i].toaErr; for (j=0;j<psr[p].obsn[i].nFlags;j++) { //Check efac for (k=0;k<psr[p].nTNEF;k++) { if (strcmp(psr[p].obsn[i].flagID[j],psr[p].TNEFFlagID[k])==0) { if (strcmp(psr[p].obsn[i].flagVal[j],psr[p].TNEFFlagVal[k])==0) err *= psr[p].TNEFVal[k]; } } //Check equad for (k=0;k<psr[p].nTNEQ;k++) { if (strcmp(psr[p].obsn[i].flagID[j],psr[p].TNEQFlagID[k])==0) { if (strcmp(psr[p].obsn[i].flagVal[j],psr[p].TNEQFlagVal[k])==0){ double TNEquad = pow(10.0,psr[p].TNEQVal[k]+6)*pow(10.0,psr[p].TNEQVal[k]+6); err = sqrt(err*err + TNEquad); } } } //Check Squad for (k=0;k<psr[p].nTNSQ;k++) { if (strcmp(psr[p].obsn[i].flagID[j],psr[p].TNSQFlagID[k])==0) { if (strcmp(psr[p].obsn[i].flagVal[j],psr[p].TNSQFlagVal[k])==0){ double tobsval=0; for (int tf=0;tf<psr[p].obsn[i].nFlags;tf++){ if(strcasecmp(psr[p].obsn[i].flagID[tf],"-tobs")==0){ if(strcasecmp(psr[p].obsn[i].flagVal[tf],"UNKNOWN")==0){ tobsval=1; } else{ double tobs=atof(psr[p].obsn[i].flagVal[tf]); tobsval=tobs; } } } double TNSquad = pow(10.0,psr[p].TNSQVal[k]+6)*pow(10.0,psr[p].TNSQVal[k]+6)*tobsval; err = sqrt(err*err + TNSquad); } } } } psr[p].obsn[i].toaErr = err; } } // Modify TOA flags if required if (modify==1) { FILE *fin; double mjd1,mjd2; char flag1[MAX_STRLEN],flag2[MAX_STRLEN],flag3[MAX_STRLEN]; if (!(fin = fopen(modifyFname,"r"))) { printf("Unable to open >%s< to modify the flags\n",modifyFname); exit(1); } while (!feof(fin)) { if (fscanf(fin,"%s %s %lf %lf %s",flag1,flag2,&mjd1,&mjd2,flag3)==5) { for (i=0;i<psr[p].nobs;i++) { for (j=0;j<psr[p].obsn[i].nFlags;j++) { if (strcmp(psr[p].obsn[i].flagID[j],flag1)==0 && strcmp(psr[p].obsn[i].flagVal[j],flag2)==0 && (double)psr[p].obsn[i].sat > mjd1 && (double)psr[p].obsn[i].sat < mjd2) strcpy(psr[p].obsn[i].flagVal[j],flag3); } } } } fclose(fin); } preProcessSimple2 (psr + p, startdmmjd, ndm, dmvals, trimonly); // Check for select file if (strlen(selectPlugName) > 0) { char *(*entry)(int,char **,pulsar *,int *); void * module; char str[1000]; logdbg("Dealing with the select plugin"); for (int iplug=0; iplug < tempo2_plug_path_len; iplug++){ sprintf(str,"%s/%s_%s_splug.t2",tempo2_plug_path[iplug], selectPlugName,tempo2MachineType); logmsg("Looking for %s",str); module = dlopen(str, RTLD_NOW); if(module==NULL){ printf("dlerror() = %s\n",dlerror()); } else break; } // strcpy(tempo2MachineType, getenv("LOGIN_ARCH")); // sprintf(str,"%s/plugins/%s_%s_splugt2",getenv(TEMPO2_ENVIRON), // selectPlugName,tempo2MachineType); // printf("Looking for %s\n",str); // module = dlopen(str, RTLD_NOW); if(!module) { fprintf(stderr, "[error]: dlopen() failed while resolving symbols.\n" ); fprintf(stderr, "dlerror() = %s\n",dlerror()); exit(1); } /* * Check that the plugin is compiled against the same version of tempo2.h */ char ** pv = (char**)dlsym(module, "plugVersionCheck"); if(pv!=NULL){ // there is a version check for this plugin if(strcmp(TEMPO2_h_VER,*pv)){ fprintf(stderr, "[error]: Plugin version mismatch\n"); fprintf(stderr, " '%s' != '%s'\n",TEMPO2_h_VER,*pv); fprintf(stderr, " Please recompile plugin against same tempo2 version!\n"); dlclose(module); exit(1); } } entry = (char*(*)(int,char **,pulsar *,int *))dlsym(module, "selectInterface"); if( entry == NULL ) { dlclose(module); fprintf(stderr, "[error]: dlerror() failed while retrieving address.\n" ); fprintf(stderr, "dlerror() = %s\n",dlerror()); exit(1); } entry(argc,argv,psr,&npsr); } else { if (strlen(selectFname) > 0) { logdbg("Using select file"); useSelectFile(selectFname,psr,npsr); logdbg("Complete using select file"); } } preProcessSimple3 (psr + p); } // Now check for global parameters if (strlen(globalFname) > 0) { char tpar[MAX_STRLEN][MAX_FILELEN]; char ttim[MAX_STRLEN][MAX_FILELEN]; sprintf(tpar[0],globalFname); printf("Setting global parameters\n"); readParfileGlobal(psr,npsr,tpar,ttim); printf("Complete setting global parameters\n"); } }
void preProcessSimple2 (pulsar *psr, float startdmmjd, int ndm, float* dmvals, int trimonly) { logdbg("In preProcessSimple2"); int i=0, j=0, k=0; for (i=0;i<psr->nobs;i++) { //psr->obsn[i].efac = 1.0; //psr->obsn[i].equad = 0.0; /* Check whether any error = 0 */ if (psr->fitMode==1 && psr->obsn[i].toaErr==0) { printf("Error: the uncertainty for TOA %d (MJD %f) is equal to zero\n ",i+1,(double)psr->obsn[i].sat); exit(1); } for (k=0; k<6; k++) /* zero these vectors for first call to tt2tb */ { psr->obsn[i].earthMoonBary_ssb[k] = 0.0; psr->obsn[i].earthMoonBary_earth[k] = 0.0; psr->obsn[i].observatory_earth[k] = 0.0; psr->obsn[i].earth_ssb[k] = 0.0; } // Correctly taking note of the phase offset psr->obsn[i].sat += ((psr->obsn[i].phaseOffset/psr->param[param_f].val[0])/SECDAY); for (k=0;k<psr->nToffset;k++) /* Calculate time offsets */ { char offsetSite[256], obsSite[256]; lookup_observatory_alias(psr->tOffsetSite[k], offsetSite); lookup_observatory_alias(psr->obsn[i].telID, obsSite); if ((psr->tOffset_f1[k]==0.0 || (psr->obsn[i].freq > psr->tOffset_f1[k])) && (psr->tOffset_f2[k]==0.0 || (psr->obsn[i].freq < psr->tOffset_f2[k])) && (psr->tOffset_t1[k]==0.0 || (psr->obsn[i].sat > psr->tOffset_t1[k])) && (psr->tOffset_t2[k]==0.0 || (psr->obsn[i].sat < psr->tOffset_t2[k])) && (strcmp(offsetSite,"0")==0 || strcmp(offsetSite,obsSite)==0)) { int use=1; /* Check for flags */ if (strlen(psr->tOffsetFlags[k])>0) { char *myStr,str1[1000],flagID[100]; use=0; strcpy(str1,psr->tOffsetFlags[k]); myStr = strtok(str1," "); do { if (myStr[0]=='-' && (myStr[1]<48 || myStr[1]>57)) /* Look for flag */ { strcpy(flagID,myStr); myStr = strtok(NULL," "); for (int l=0;l<psr->obsn[i].nFlags;l++) { if (strcmp(flagID,psr->obsn[i].flagID[l])==0 && strcmp(myStr,psr->obsn[i].flagVal[l])==0) { use=1; break; } } } } while ((myStr = strtok(NULL," "))!=NULL); } if (use==1) {psr->obsn[i].sat += psr->tOffset[k]/SECDAY;} } } /* Check filtering */ if (strlen(psr->filterStr)>0) { char flag[100],filtS[1000],*filt; strcpy(filtS,psr->filterStr); filt = strtok(filtS," "); strcpy(flag,filt); while (filt != NULL) { if (filt[0]=='-') strcpy(flag,filt); else { for (j=0;j<psr->obsn[i].nFlags;j++) { if (strcmp(psr->obsn[i].flagID[j],flag)==0 && strcmp(psr->obsn[i].flagVal[j],filt)==0) psr->obsn[i].deleted=1; } } filt = strtok(NULL," "); } } /* Check filtering for 'pass' */ if (strlen(psr->passStr)>0) { char flag[100],filtS[1000],*filt; int found; strcpy(filtS,psr->passStr); filt = strtok(filtS," "); found=0; while ( filt != NULL && found==0) { if (filt[0]=='-') // Have a flag strcpy(flag,filt); else { for (j=0;j<psr->obsn[i].nFlags;j++) { if (strcmp(psr->obsn[i].flagID[j],flag)==0 && strcmp(psr->obsn[i].flagVal[j],filt)==0) { found=1; break; } } } filt = strtok(NULL," "); } if (found==0) psr->obsn[i].deleted=1; } /* CHECK JUMPS */ for (k=1;k<=psr->nJumps;k++) { int yes=0; char str1[100],str2[100],str3[100],str4[100],str5[100]; double val1, val2; /* Must parse jump string to determine whether this observation should jump or not */ int nread = sscanf(psr->jumpStr[k],"%s %s %s",str1,str2,str3); if (strcasecmp(str1,"MJD")==0 || strcasecmp(str1,"FREQ")==0) { sscanf(str2,"%lf",&val1); sscanf(str3,"%lf",&val2); if (strcasecmp(str1,"MJD")==0) { if (psr->obsn[i].sat >= val1 && psr->obsn[i].sat < val2) { yes=1; } } else if (strcasecmp(str1,"FREQ")==0) { if (psr->obsn[i].freq >= val1 && psr->obsn[i].freq < val2) { yes=1; } } } if (strcasecmp(str1,"NAME")==0 && strstr(psr->obsn[i].fname,str2)!=NULL) yes=1; if (strcasecmp(str1,"TEL")==0) { char selectedSite[256], obsSite[256]; lookup_observatory_alias(str2, selectedSite); lookup_observatory_alias(psr->obsn[i].telID, obsSite); if (strcasecmp(selectedSite, obsSite)!=0) yes=1; } else if (str1[0]=='-') { int jj; for (jj=0;jj<psr->obsn[i].nFlags;jj++) { if (strcmp(psr->obsn[i].flagID[jj],str1)==0 && strcmp(psr->obsn[i].flagVal[jj],str2)==0) yes=1; } } if (yes==1) {psr->obsn[i].jump[psr->obsn[i].obsNjump]=k; (psr->obsn[i].obsNjump)++;} } // Check for time offset flags for (k=0;k<psr->obsn[i].nFlags;k++) { if (strcmp(psr->obsn[i].flagID[k],"-to")==0) { longdouble v; v = parse_longdouble(psr->obsn[i].flagVal[k]); psr->obsn[i].sat += v/SECDAY; } } // Check for dm updates if (startdmmjd && ndm && dmvals) { //float dm; //not needed any more if ((int)(psr->obsn[i].sat-startdmmjd+0.5) > 0) { if ((int)(psr->obsn[i].sat-startdmmjd+0.5) >= ndm) psr->obsn[i].deleted=1; else if (trimonly == 0) // set flags only if really correcting for dm, not only trimming the data { strcpy(psr->obsn[i].flagID[psr->obsn[i].nFlags],"-dm"); sprintf(psr->obsn[i].flagVal[psr->obsn[i].nFlags],"%g",dmvals[(int)(psr->obsn[i].sat-startdmmjd+0.5)]); psr->obsn[i].nFlags++; if (psr->obsn[i].nFlags >= MAX_FLAGS) { printf("Number of different flags in the .tim file > MAX_FLAGS (%d)\n",MAX_FLAGS); exit(1); } //dm = dmvals[(int)(psr->obsn[i].sat-startdmmjd+0.5)]; } } else { psr->obsn[i].deleted=1; } } } logdbg("Complete preProcessSimple2"); }