void preProcessSimple (pulsar *psr) { const char *CVS_verNum = "$Revision: 1.9 $"; if (displayCVSversion == 1) CVSdisplayVersion("preProcessSimple.C","preProcessSimple()",CVS_verNum); preProcessSimple1 (psr, 0, -1); preProcessSimple2 (psr, 0, 0, 0, 0); preProcessSimple3 (psr); }
void preProcessSimple (pulsar *psr) { const char *CVS_verNum = "$Id: a8e7bdafd71a550d7a893aad3c9cc43b009ccf36 $"; if (displayCVSversion == 1) CVSdisplayVersion("preProcessSimple.C","preProcessSimple()",CVS_verNum); preProcessSimple1 (psr, 0, -1); preProcessSimple2 (psr, 0, 0, 0, 0); preProcessSimple3 (psr); }
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"); } }