80 likes | 220 Views
Effects of Timing Errors and Timing Offsets in Pulsar Searches and Upper Limits Bruce Allen, UWM. Typical pulsar signal: f 0 = 1 kHz (nominal) 0.001 Hz daily frequency modulation (Earth rotation) 0.1 Hz annual frequency modulation (Earth orbit around Sun)
E N D
Effects of Timing Errors and Timing Offsets in Pulsar Searches and Upper LimitsBruce Allen, UWM LIGO Scientific Collaboration - U. Wisconsin - Milwaukee
Typical pulsar signal: f0 = 1 kHz (nominal) 0.001 Hz daily frequency modulation (Earth rotation) 0.1 Hz annual frequency modulation (Earth orbit around Sun) Typical search methods (both time-domain and frequency domain) use optimal filtering:(t)=templates(t)=dataNote: sometimes called the F-statistic. Effect of a smallconstant timing offsetton 1-detector SNR is quadratic in the timing error:Example: t =100 sec error, 1kHz signal, fractional loss of SNR is 18%: Example: t =10 sec error, 1kHz signal, fractional loss of SNR is 0.2%. Timing Precision in Pulsar Searches LIGO Scientific Collaboration - U. Wisconsin - Milwaukee
If the signal were a pure sinusoid (no amplitude or frequency modulation) then maximization over the unknown initial phase would erase the effects of a constant timing offset error: What happens with a real pulsar signal? Since it is not a pure sinusoid, it’s not obvious if maximization over the unknown phase can compensate for a timing error.Let’s address this next… Maximization over phase (single detector) LIGO Scientific Collaboration - U. Wisconsin - Milwaukee
Convenient to write SNR in the frequency domain: Typical pulsar signal: f0 = 1 kHz (nominal) 0.001 Hz daily frequency modulation (Earth rotation) 0.1 Hz annual frequency modulation (Earth orbit around Sun) Bandwidth of signal is: Effect of timing error t:which makes the SNRso the effects of the timing error are on 1-detector SNR are negligible if Effects of timing error on real pulsar signals (one detector) LIGO Scientific Collaboration - U. Wisconsin - Milwaukee
Search time T < 1 yeareffects of the constant timing error are small if Example: for S1, with T=3 weeks, the effects of constant timing errors on SNR are small provided that t<20 seconds Search time T > 1 yeareffects of the constant timing error are small ifExample: in a year-long search, the efffects of a constant timing error on SNR would be small provided that t<1 second Effects of constant timing offset on real pulsar signals (one detector) LIGO Scientific Collaboration - U. Wisconsin - Milwaukee
If the timing offset is varying, or one does a coherent search using more than one detector, then the fractional SNR loss iswhere t is the mean of the absolute timing errors. Example: timing error t =30 s, fractional SNR loss is 2% To correct timing errors for S1 pulsar analysis we “shifted data to nearest bin”. Sampling period is 61 s so that biggest timing error was ±30.5 s. Actual errors smaller. To prevent problems in the future, please try to keep all timing errors < 10 s. Varying timing offset & multiple-detector coherent searches LIGO Scientific Collaboration - U. Wisconsin - Milwaukee
int deltatime(const char *instrument, int gpstime, int *valid){ int (*data)[4]; int i; /* corrections for Livingston L1 during S1. It would probably make sense to discard the first few hours for which there IS no timing data, but since the first SFT that we make starts at time L1.714179401 there is no need. And the first calibrated SFT is at time 714299280 */ int l1time[][4]={ {714177080, 714855840, -121, 678760}, {714855841, 715618813, -120, 762972}, /* value to use if time range not found */ {0, INT_MAX, -121, 0} }; /* corrections for Hanford H1 during S1. Again, it would probably make sense to discard the early times for which we have no timing data (about the first fifty hours of the run). In fact the first SFT is at time 714151661 which is BEFORE the first time listed below. But in fact we don't have calibration information until time 714357188. So this table is OK. */ int h1time[][4]={ {714335520, 715618813, -95, 1283293}, /* value to use if time range not found */ {0, INT_MAX, -95, 0} }; /* corrections for Hanford H2 during S1. Here the pattern of timing is SO irregular that we discard any segments for which we have no data. */ int h2time[][4]={ {714256920, 714407160, 5463, 150240}, {714407640, 714507180, -164, 99540}, {714507300, 714587880, 141, 80580}, {714697680, 714704820, 995, 7140}, {714705000, 714786780, -162, 81780}, {714786900, 715008660, 204, 221760}, {715008780, 715026480, 448, 17700}, {715026780, 715079460, -163, 52680}, {715079580, 715101120, 142, 21540}, {715101240, 715129260, 447, 28020}, {715129500, 715165740, -162, 36240}, {715166640, 715265820, -163, 99180}, {715266180, 715274580, -102, 8400}, {715274700, 715296960, 630, 22260}, {715297440, 715298280, -163, 840}, {715299420, 715305660, -163, 6240}, {715306920, 715545120, -163, 238200}, {715545240, 715556400, 814, 11160}, {715556640, 715594020, -163, 37380}, {715594140, 715618800, 81, 24660}, /* discard data if time range not found */ {-1, 0, 0, 0} }; The dirty details: cut-and-paste from lalapps (1) /* select the correct instrument */ if (!strcmp(instrument,"H1")) data=h1time; else if (!strcmp(instrument,"H2")) data=h2time; else if (!strcmp(instrument,"L1")) data=l1time; else { pout("Unrecognized detector: %s in deltatime().” “ Not H1, H2, or L1.\n", instrument); exit(1); } /* search along list to see if we find the correct time range */ for (i=0; data[i][0]>=0; i++) if (data[i][0]<=gpstime && gpstime<=data[i][1]){ *valid=1; return data[i][2]; } /* value we should use if time range NOT found */ *valid=0; return 0; } LIGO Scientific Collaboration - U. Wisconsin - Milwaukee
The dirty details: cut and paste from lalapps (2) /* Utility function for cyclically shifting an array "in place". Written for clarity and simplicity, not for efficiency. shift >= 0 : data[0] (moves to) -> data[shift] data[1] -> data[shift+1] data[length-1-shift] -> data[length-1] data[length-1-shift+1] -> data[0] data[length-1-shift+2] -> data[1] ... shift < 0 : replace shift by length+shift and follow the rules above. ... */ void shifter(float *data, int length, int shift){ float *temp=NULL; int delta=shift>=0?shift:length+shift; int i; /* if no shift is required, we are done */ if (shift==0) return; /* check that shift range seems reasonable */ if (abs(shift)>length/8){ pout("shifter(): shift amount %d seems too big/small for length %d array\n", shift, length); exit(1); } /* allocate memory */ if (!(temp=(float *)LALMalloc(sizeof(float)*length))){ pout("Unable to allocate %d bytes of memory in shifter\n", sizeof(float)*length); exit(1); } /* copy data */ memcpy(temp, data, sizeof(float)*length); /* now do shift */ for (i=0; i<length; i++) data[(delta+i) % length]=temp[i]; /* free memory and return */ LALFree(temp); return; } LIGO Scientific Collaboration - U. Wisconsin - Milwaukee