LIGO- XXX Bruce Allen, LSC Talk LIGO Scientific Collaboration - U. Wisconsin - Milwaukee 1 Effects of Timing Errors and Timing Offsets in Pulsar Searches and Upper Limits Bruce Allen, UWM
LIGO- XXX Bruce Allen, LSC Talk LIGO Scientific Collaboration - U. Wisconsin - Milwaukee 2 Timing Precision in Pulsar Searches 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) Typical search methods (both time-domain and frequency domain) use optimal filtering: (t)=template s(t)=data Note: sometimes called the F- statistic. Effect of a small constant timing offset t on 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%.
LIGO- XXX Bruce Allen, LSC Talk LIGO Scientific Collaboration - U. Wisconsin - Milwaukee 3 Maximization over phase (single detector) 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…
LIGO- XXX Bruce Allen, LSC Talk LIGO Scientific Collaboration - U. Wisconsin - Milwaukee 4 Effects of timing error on real pulsar signals (one detector) Convenient to write SNR in the frequency domain: 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) Bandwidth of signal is: Effect of timing error t: which makes the SNR so the effects of the timing error are on 1-detector SNR are negligible if
LIGO- XXX Bruce Allen, LSC Talk LIGO Scientific Collaboration - U. Wisconsin - Milwaukee 5 Effects of constant timing offset on real pulsar signals (one detector) Search time T < 1 year effects 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 year effects of the constant timing error are small if Example: in a year-long search, the efffects of a constant timing error on SNR would be small provided that t<1 second
LIGO- XXX Bruce Allen, LSC Talk LIGO Scientific Collaboration - U. Wisconsin - Milwaukee 6 Varying timing offset & multiple- detector coherent searches If the timing offset is varying, or one does a coherent search using more than one detector, then the fractional SNR loss is where 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.
LIGO- XXX Bruce Allen, LSC Talk LIGO Scientific Collaboration - U. Wisconsin - Milwaukee 7 The dirty details: cut-and-paste from lalapps (1) 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 L there is no need. And the first calibrated SFT is at time */ int l1time[][4]={ { , , -121, }, { , , -120, }, /* 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 which is BEFORE the first time listed below. But in fact we don't have calibration information until time So this table is OK. */ int h1time[][4]={ { , , -95, }, /* 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]={ { , , 5463, }, { , , -164, 99540}, { , , 141, 80580}, { , , 995, 7140}, { , , -162, 81780}, { , , 204, }, { , , 448, 17700}, { , , -163, 52680}, { , , 142, 21540}, { , , 447, 28020}, { , , -162, 36240}, { , , -163, 99180}, { , , -102, 8400}, { , , 630, 22260}, { , , -163, 840}, { , , -163, 6240}, { , , -163, }, { , , 814, 11160}, { , , -163, 37380}, { , , 81, 24660}, /* discard data if time range not found */ {-1, 0, 0, 0} }; /* 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- XXX Bruce Allen, LSC Talk LIGO Scientific Collaboration - U. Wisconsin - Milwaukee 8 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; }