40 REAL8 chunkLength = 0.;
42 INT4 i = 0,
j = 0, length = 0, cl = 0, counter = 0;
53 length =
data->compTimeData->data->length;
55 for (
i = 0, counter = 0;
i < length;
i += chunkLength, counter++ ) {
56 REAL8 vari = 0., meani = 0.;
58 chunkLength = (
REAL8 )chunkLengths->
data[counter];
59 cl =
i + (
INT4 )chunkLength;
63 for (
j =
i ;
j < cl ;
j++ ) {
64 meani += ( creal( meddata->
data[
j] ) + cimag( meddata->
data[
j] ) );
67 meani /= ( 2.*chunkLength );
69 for (
j =
i ;
j < cl ;
j++ ) {
70 vari +=
SQUARE( ( creal( meddata->
data[
j] ) - meani ) );
71 vari +=
SQUARE( ( cimag( meddata->
data[
j] ) - meani ) );
74 vari /= ( 2.*chunkLength - 1. );
77 for (
j =
i ;
j < cl ;
j++ ) {
78 data->varTimeData->data->data[
j] = vari;
118 if (
i > length - 2 ) {
191 gsl_vector_complex_view meddatagsl = gsl_vector_complex_view_array( (
double * )meddata->
data, meddata->
length );
192 chunkIndex =
chop_data( &meddatagsl.vector, chunkMin );
200 if ( chunkMax > chunkMin ) {
207 for (
j = 0;
j < chunkIndex->
length;
j++ ) {
216 if ( outputchunks ) {
225 FILE *fpcheck = NULL;
226 if ( ( fpcheck = fopen(
outfile,
"r" ) ) != NULL ) {
228 if ( ( fpsegs = fopen(
outfile,
"a" ) ) == NULL ) {
229 fprintf( stderr,
"Non-fatal error open file to output segment list.\n" );
233 if ( ( fpsegs = fopen(
outfile,
"w" ) ) == NULL ) {
234 fprintf( stderr,
"Non-fatal error open file to output segment list.\n" );
240 for (
j = 0;
j < chunkIndex->
length;
j++ ) {
279 mrange = 2 * floor( ( length - 1 ) / 2 );
281 N = (
UINT4 )floor( mrange / 2 );
285 for (
i = 1;
i < length + 1;
i++ ) {
294 if (
i > length -
N ) {
306 for (
j = 0;
j <
n;
j++ ) {
307 dre[
j] = creal(
data->data[
j + sidx] );
308 dim[
j] = cimag(
data->data[
j + sidx] );
312 gsl_sort( dre, 1,
n );
313 gsl_sort( dim, 1,
n );
316 submed->
data[
i - 1] = ( creal(
data->data[
i - 1] ) - gsl_stats_median_from_sorted_data( dre, 1,
n ) )
317 + I * ( cimag(
data->data[
i - 1] ) - gsl_stats_median_from_sorted_data( dim, 1,
n ) );
359 UINT4 changepoint = 0;
361 REAL8 threshold = 0.;
368 threshold = 4.07 + 1.33 * log10( (
REAL8 )length );
370 if ( logodds > threshold ) {
374 gsl_vector_complex_view data1 = gsl_vector_complex_subvector(
data, 0, changepoint );
375 gsl_vector_complex_view data2 = gsl_vector_complex_subvector(
data, changepoint, length - changepoint );
379 cp1 =
chop_data( &data1.vector, chunkMin );
380 cp2 =
chop_data( &data2.vector, chunkMin );
397 chunkIndex->
data[0] = length;
430 UINT4 changepoint = 0,
i = 0;
435 REAL8 logsingle = 0., logtot = -INFINITY;
436 REAL8 logdouble = 0., logdouble_min = -INFINITY;
439 REAL8 sumforward = 0., sumback = 0.;
443 if ( length < (
UINT4 )( 2 * minlength ) ) {
444 logratio = -INFINITY;
445 memcpy( logodds, &logratio,
sizeof(
REAL8 ) );
450 for (
i = 0;
i < length;
i++ ) {
451 dval = gsl_vector_complex_get(
data,
i );
452 datasum +=
SQUARE( gsl_complex_abs( dval ) );
458 lsum = length - 2 * minlength + 1;
460 for (
i = 0;
i < length;
i++ ) {
461 dval = gsl_vector_complex_get(
data,
i );
462 if (
i < minlength - 1 ) {
463 sumforward +=
SQUARE( gsl_complex_abs( dval ) );
465 sumback +=
SQUARE( gsl_complex_abs( dval ) );
472 for (
i = 0;
i < lsum;
i++ ) {
473 UINT4 ln1 =
i + minlength, ln2 = ( length -
i - minlength );
475 REAL8 log_1 = 0., log_2 = 0.;
477 dval = gsl_vector_complex_get(
data, ln1 - 1 );
487 logdouble = log_1 + log_2;
490 logtot =
LOGPLUS( logtot, logdouble );
493 if ( logdouble > logdouble_min ) {
495 logdouble_min = logdouble;
500 logratio = logtot - logsingle;
501 memcpy( logodds, &logratio,
sizeof(
REAL8 ) );
524 UINT4 startindex = 0, chunklength = 0;
528 for (
i = 0;
i < length;
i++ ) {
532 startindex = cip->
data[
i - 1];
535 chunklength = cip->
data[
i] - startindex;
537 if ( chunklength > chunkMax ) {
538 UINT4 remain = chunklength % chunkMax;
541 for (
j = 0;
j < floor( chunklength / chunkMax );
j++ ) {
542 newindex[
count] = startindex + (
j + 1 ) * chunkMax;
549 newindex[
count] = startindex +
j * chunkMax + remain;
551 if ( remain < chunkMin ) {
554 UINT4 n1 = ( chunkMax + remain ) - chunkMin;
557 newindex[
count - 1] = newindex[
count] - chunkMin;
559 if ( n1 < chunkMin ) {
560 XLAL_PRINT_WARNING(
"Non-fatal error... segment no. %d is %d long, which is less than chunkMin = %d.\n",
count, n1, chunkMin );
575 cip->
data[
i] = newindex[
i];
594 REAL8 threshold = 0.;
601 UINT4 mergepoint = 0;
604 for (
j = 1;
j < ncells;
j++ ) {
605 REAL8 summerged = 0., sum1 = 0., sum2 = 0.;
606 UINT4 i = 0, n1 = 0, n2 = 0, nm = 0;
607 UINT4 cellstarts1 = 0, cellends1 = 0, cellstarts2 = 0, cellends2 = 0;
608 REAL8 log_merged = 0., log_individual = 0.;
614 cellstarts1 = segs->
data[
j - 2];
617 cellends1 = segs->
data[
j - 1];
619 cellstarts2 = segs->
data[
j - 1];
620 cellends2 = segs->
data[
j];
622 n1 = cellends1 - cellstarts1;
623 n2 = cellends2 - cellstarts2;
624 nm = cellends2 - cellstarts1;
626 for (
i = cellstarts1;
i < cellends1;
i++ ) {
630 for (
i = cellstarts2;
i < cellends2;
i++ ) {
634 summerged = sum1 + sum2;
637 log_merged = -2 + gsl_sf_lnfact( nm - 1 ) - (
REAL8 )nm *
log( summerged );
639 log_individual = -2 + gsl_sf_lnfact( n1 - 1 ) - (
REAL8 )n1 *
log( sum1 );
640 log_individual += -2 + gsl_sf_lnfact( n2 - 1 ) - (
REAL8 )n2 *
log( sum2 );
642 logodds = log_merged - log_individual;
644 if ( logodds > minl ) {
651 if ( minl < threshold ) {
655 for (
UINT4 i = 0;
i < ncells - ( mergepoint + 1 );
i++ ) {
656 segs->
data[mergepoint +
i] = segs->
data[mergepoint +
i + 1];
676 CHAR *inputstr = NULL;
687 if ( inputstr == NULL ) {
721 INT4 ephemstart = 630720013;
722 INT4 ephemend = 1893024018;
725 if ( gpsstart < ephemstart || gpsend < ephemstart || gpsstart > ephemend || gpsend > ephemend ) {
int PulsarCheckParam(const PulsarParameters *pars, const CHAR *name)
Check for the existence of the parameter name in the PulsarParameters structure.
const CHAR * PulsarGetStringParam(const PulsarParameters *pars, const CHAR *name)
Return a string parameter.
TimeCorrectionType
Enumerated type denoting the time system type to be produced in the solar system barycentring routine...
void LALInferenceAddVariable(LALInferenceVariables *vars, const char *name, const void *value, LALInferenceVariableType type, LALInferenceParamVaryType vary)
void LALInferenceRemoveVariable(LALInferenceVariables *vars, const char *name)
void * LALInferenceGetVariable(const LALInferenceVariables *vars, const char *name)
int LALInferenceCheckVariable(LALInferenceVariables *vars, const char *name)
LALInferenceParamVaryType LALInferenceGetVariableVaryType(LALInferenceVariables *vars, const char *name)
void * XLALCalloc(size_t m, size_t n)
char char * XLALStringDuplicate(const char *s)
int char * XLALStringAppend(char *s, const char *append)
char * XLALStringToken(char **s, const char *delim, int empty)
void XLALDestroyUINT4Vector(UINT4Vector *vector)
UINT4Vector * XLALResizeUINT4Vector(UINT4Vector *vector, UINT4 length)
COMPLEX16Vector * XLALCreateCOMPLEX16Vector(UINT4 length)
void XLALDestroyCOMPLEX16Vector(COMPLEX16Vector *vector)
UINT4Vector * XLALCreateUINT4Vector(UINT4 length)
#define XLAL_PRINT_WARNING(...)
REAL8 XLALGPSGetREAL8(const LIGOTimeGPS *epoch)
Header file for the signal models functions used in parameter estimation code for known pulsar search...
#define IFO_XTRA_DATA(ifo)
void rechop_data(UINT4Vector **chunkIndex, UINT4 chunkMax, UINT4 chunkMin)
Chop up the data into chunks smaller the the maximum allowed length.
void check_and_add_fixed_variable(LALInferenceVariables *vars, const char *name, void *value, LALInferenceVariableType type)
Add a variable, checking first if it already exists and is of type LALINFERENCE_PARAM_FIXED and if so...
UINT4Vector * chop_data(gsl_vector_complex *data, UINT4 chunkMin)
Chops the data into stationary segments based on Bayesian change point analysis.
void compute_variance(LALInferenceIFOData *data, LALInferenceIFOModel *model)
Compute the noise variance for each data segment.
UINT4Vector * get_chunk_lengths(LALInferenceIFOModel *ifo, UINT4 chunkMax)
Split the data into segments.
UINT4 find_change_point(gsl_vector_complex *data, REAL8 *logodds, UINT4 minlength)
Find a change point in complex data.
TimeCorrectionType XLALAutoSetEphemerisFiles(CHAR **efile, CHAR **sfile, CHAR **tfile, PulsarParameters *pulsar, INT4 gpsstart, INT4 gpsend)
Automatically set the solar system ephemeris file based on environment variables and data time span.
UINT4Vector * chop_n_merge(LALInferenceIFOData *data, UINT4 chunkMin, UINT4 chunkMax, UINT4 outputchunks)
Chops and remerges data into stationary segments.
void merge_data(COMPLEX16Vector *data, UINT4Vector **segments)
Merge adjacent segments.
COMPLEX16Vector * subtract_running_median(COMPLEX16Vector *data)
Subtract the running median from complex data.
INT4 count_csv(CHAR *csvline)
Counts the number of comma separated values in a string.
Header file for the helper functions for the parameter estimation code for known pulsar searches usin...
#define LOGPLUS(x, y)
Macro to perform addition of two values within logarithm space .
LALInferenceVariables * params
The PulsarParameters structure to contain a set of pulsar parameters.