Ejemplo n.º 1
0
int test_skip_1(bitfile* bf, int* truevals)
{
    int i, vi=0;
    // instead of
    //CHECKVAL(vi, bitfile_read_int(bf,10), truevals);
    //CHECKVAL(vi, bitfile_read_int(bf,3), truevals);
    //CHECKVAL(vi, bitfile_read_int(bf,3), truevals);
    bitfile_skip(bf, 16); vi += 3;
    CHECKVAL(vi, bitfile_read_int(bf,16), truevals);
    //CHECKVAL(vi, bitfile_read_int(bf,30), truevals);
    bitfile_skip(bf, 30); vi += 1;
    
    for (i = 0; i < 64; i++) {
        CHECKVAL(vi, bitfile_read_unary(bf), truevals);
    }
    
    for (i = 0; i < 64; i++) {
        int n = 1, v;
        if ((i+n)<(64-1)) { bitfile_skip_gammas(bf,n); i+=n; vi+=n; }
        v = bitfile_read_gamma(bf); // printf("vi = %4i; v = %5i\n", vi, v);
        CHECKVAL(vi, v, truevals);
    }
    
    for (i = 0; i < 64; i++) {
        CHECKVAL(vi, bitfile_read_zeta(bf,3), truevals);
    }

    return (vi);
}
Ejemplo n.º 2
0
static int run_test(const char *aliases, const char *nodes, const char *expect)
{
	int list[MAX_NODES];
	const char *s;
	void *blob;
	int i;

	blob = malloc(FDT_SIZE);
	if (!blob) {
		printf("%s: out of memory\n", __func__);
		return 1;
	}

	printf("aliases=%s, nodes=%s, expect=%s: ", aliases, nodes, expect);
	CHECKVAL(make_fdt(blob, FDT_SIZE, aliases, nodes), 0);
	CHECKVAL(fdtdec_find_aliases_for_id(blob, "i2c",
			COMPAT_UNKNOWN,
			list, ARRAY_SIZE(list)), strlen(expect));

	/* Check we got the right ones */
	for (i = 0, s = expect; *s; s++, i++) {
		int want = *s;
		const char *name;
		int got = ' ';

		name = list[i] ? fdt_get_name(blob, list[i], NULL) : NULL;
		if (name)
			got = name[3] + 'a' - '0';

		if (got != want) {
			printf("Position %d: Expected '%c', got '%c' ('%s')\n",
			       i, want, got, name);
			return 1;
		}
	}

	printf("pass\n");
	return 0;
}
Ejemplo n.º 3
0
int test_read_1(bitfile *bf, int* truevals)
{
    int i, vi=0;

    CHECKVAL(vi, bitfile_read_int(bf,10), truevals);
    CHECKVAL(vi, bitfile_read_int(bf,3), truevals);
    CHECKVAL(vi, bitfile_read_int(bf,3), truevals);
    CHECKVAL(vi, bitfile_read_int(bf,16), truevals);
    CHECKVAL(vi, bitfile_read_int(bf,30), truevals);
    
    for (i = 0; i < 64; i++) {
        CHECKVAL(vi, bitfile_read_unary(bf), truevals);
    }
    
    for (i = 0; i < 64; i++) {
        CHECKVAL(vi, bitfile_read_gamma(bf), truevals);
    }
    
    for (i = 0; i < 64; i++) {
        CHECKVAL(vi, bitfile_read_zeta(bf,3), truevals);
    }

    return (vi);
}
Ejemplo n.º 4
0
int
main(int argc, char **argv)
{
  /* Command-line parsing variables. */
  int arg;                   /* command-line argument counter */
  static LALStatus stat;     /* status structure */
  CHAR *sourcefile = NULL;   /* name of sourcefile */
  CHAR *respfile = NULL;     /* name of respfile */
  CHAR *infile = NULL;       /* name of infile */
  CHAR *outfile = NULL;      /* name of outfile */
  INT4 seed = 0;             /* random number seed */
  INT4 sec = SEC;            /* ouput epoch.gpsSeconds */
  INT4 nsec = NSEC;          /* ouput epoch.gpsNanoSeconds */
  INT4 npt = NPT;            /* number of output points */
  REAL8 dt = DT;             /* output sampling interval */
  REAL4 sigma = SIGMA;       /* noise amplitude */

  /* File reading variables. */
  FILE *fp = NULL; /* generic file pointer */
  BOOLEAN ok = 1;  /* whether input format is correct */
  UINT4 i;         /* generic index over file lines */
  INT8 epoch;      /* epoch stored as an INT8 */

  /* Other global variables. */
  RandomParams *params = NULL; /* parameters of pseudorandom sequence */
  DetectorResponse detector;   /* the detector in question */
  INT2TimeSeries output;       /* detector ACD output */


  /*******************************************************************
   * PARSE ARGUMENTS (arg stores the current position)               *
   *******************************************************************/

  /* Exit gracefully if no arguments were given.
  if ( argc <= 1 ) {
    INFO( "No testing done." );
    return 0;
  } */

  arg = 1;
  while ( arg < argc ) {
    /* Parse source file option. */
    if ( !strcmp( argv[arg], "-s" ) ) {
      if ( argc > arg + 1 ) {
	arg++;
	sourcefile = argv[arg++];
      }else{
	ERROR( BASICINJECTTESTC_EARG, BASICINJECTTESTC_MSGEARG, 0 );
        LALPrintError( USAGE, *argv );
        return BASICINJECTTESTC_EARG;
      }
    }
    /* Parse response file option. */
    else if ( !strcmp( argv[arg], "-r" ) ) {
      if ( argc > arg + 1 ) {
	arg++;
	respfile = argv[arg++];
      }else{
	ERROR( BASICINJECTTESTC_EARG, BASICINJECTTESTC_MSGEARG, 0 );
        LALPrintError( USAGE, *argv );
        return BASICINJECTTESTC_EARG;
      }
    }
    /* Parse input file option. */
    else if ( !strcmp( argv[arg], "-i" ) ) {
      if ( argc > arg + 1 ) {
	arg++;
	infile = argv[arg++];
      }else{
	ERROR( BASICINJECTTESTC_EARG, BASICINJECTTESTC_MSGEARG, 0 );
        LALPrintError( USAGE, *argv );
        return BASICINJECTTESTC_EARG;
      }
    }
    /* Parse noise output option. */
    else if ( !strcmp( argv[arg], "-n" ) ) {
      if ( argc > arg + 5 ) {
	arg++;
	sec = atoi( argv[arg++] );
	nsec = atoi( argv[arg++] );
	npt = atoi( argv[arg++] );
	dt = atof( argv[arg++] );
	sigma = atof( argv[arg++] );
      }else{
	ERROR( BASICINJECTTESTC_EARG, BASICINJECTTESTC_MSGEARG, 0 );
        LALPrintError( USAGE, *argv );
        return BASICINJECTTESTC_EARG;
      }
    }
    /* Parse output file option. */
    else if ( !strcmp( argv[arg], "-o" ) ) {
      if ( argc > arg + 1 ) {
	arg++;
	outfile = argv[arg++];
      }else{
	ERROR( BASICINJECTTESTC_EARG, BASICINJECTTESTC_MSGEARG, 0 );
        LALPrintError( USAGE, *argv );
        return BASICINJECTTESTC_EARG;
      }
    }
    /* Parse debug level option. */
    else if ( !strcmp( argv[arg], "-d" ) ) {
      if ( argc > arg + 1 ) {
	arg++;
      }else{
	ERROR( BASICINJECTTESTC_EARG, BASICINJECTTESTC_MSGEARG, 0 );
        LALPrintError( USAGE, *argv );
        return BASICINJECTTESTC_EARG;
      }
    }
    /* Parse random seed option. */
    else if ( !strcmp( argv[arg], "-e" ) ) {
      if ( argc > arg + 1 ) {
	arg++;
	seed = atoi( argv[arg++] );
      }else{
	ERROR( BASICINJECTTESTC_EARG, BASICINJECTTESTC_MSGEARG, 0 );
        LALPrintError( USAGE, *argv );
        return BASICINJECTTESTC_EARG;
      }
    }
    /* Check for unrecognized options. */
    else if ( argv[arg][0] == '-' ) {
      ERROR( BASICINJECTTESTC_EARG, BASICINJECTTESTC_MSGEARG, 0 );
      LALPrintError( USAGE, *argv );
      return BASICINJECTTESTC_EARG;
    }
  } /* End of argument parsing loop. */

  /* Check for redundant or bad argument values. */
  CHECKVAL( npt, 0, 2147483647 );
  CHECKVAL( dt, 0, LAL_REAL4_MAX );


  /*******************************************************************
   * SETUP                                                           *
   *******************************************************************/

  /* Set up output, detector, and random parameter structures. */
  output.data = NULL;
  detector.transfer = (COMPLEX8FrequencySeries *)
    LALMalloc( sizeof(COMPLEX8FrequencySeries) );
  if ( !(detector.transfer) ) {
    ERROR( BASICINJECTTESTC_EMEM, BASICINJECTTESTC_MSGEMEM, 0 );
    return BASICINJECTTESTC_EMEM;
  }
  detector.transfer->data = NULL;
  detector.site = NULL;
  SUB( LALCreateRandomParams( &stat, &params, seed ), &stat );

  /* Set up units. */
  output.sampleUnits = lalADCCountUnit;
  if (XLALUnitDivide( &(detector.transfer->sampleUnits),
                      &lalADCCountUnit, &lalStrainUnit ) == NULL) {
    return LAL_EXLAL;
  }

  /* Read response function. */
  if ( respfile ) {
    REAL4VectorSequence *resp = NULL; /* response as vector sequence */
    COMPLEX8Vector *response = NULL;  /* response as complex vector */
    COMPLEX8Vector *unity = NULL;     /* vector of complex 1's */

    if ( ( fp = fopen( respfile, "r" ) ) == NULL ) {
      ERROR( BASICINJECTTESTC_EFILE, BASICINJECTTESTC_MSGEFILE,
	     respfile );
      return BASICINJECTTESTC_EFILE;
    }

    /* Read header. */
    ok &= ( fscanf( fp, "# epoch = %" LAL_INT8_FORMAT "\n", &epoch ) == 1 );
    I8ToLIGOTimeGPS( &( detector.transfer->epoch ), epoch );
    ok &= ( fscanf( fp, "# f0 = %lf\n", &( detector.transfer->f0 ) )
	    == 1 );
    ok &= ( fscanf( fp, "# deltaF = %lf\n",
		    &( detector.transfer->deltaF ) ) == 1 );
    if ( !ok ) {
      ERROR( BASICINJECTTESTC_EINPUT, BASICINJECTTESTC_MSGEINPUT,
	     respfile );
      return BASICINJECTTESTC_EINPUT;
    }

    /* Read and convert body to a COMPLEX8Vector. */
    SUB( LALSReadVectorSequence( &stat, &resp, fp ), &stat );
    fclose( fp );
    if ( resp->vectorLength != 2 ) {
      ERROR( BASICINJECTTESTC_EINPUT, BASICINJECTTESTC_MSGEINPUT,
	     respfile );
      return BASICINJECTTESTC_EINPUT;
    }
    SUB( LALCCreateVector( &stat, &response, resp->length ), &stat );
    memcpy( response->data, resp->data, 2*resp->length*sizeof(REAL4) );
    SUB( LALSDestroyVectorSequence( &stat, &resp ), &stat );

    /* Convert response function to a transfer function. */
    SUB( LALCCreateVector( &stat, &unity, response->length ), &stat );
    for ( i = 0; i < response->length; i++ ) {
      unity->data[i] = 1.0;
    }
    SUB( LALCCreateVector( &stat, &( detector.transfer->data ),
			   response->length ), &stat );
    SUB( LALCCVectorDivide( &stat, detector.transfer->data, unity,
			    response ), &stat );
    SUB( LALCDestroyVector( &stat, &response ), &stat );
    SUB( LALCDestroyVector( &stat, &unity ), &stat );
  }

  /* No response file, so generate a unit response. */
  else {
    I8ToLIGOTimeGPS( &( detector.transfer->epoch ), EPOCH );
    detector.transfer->f0 = 0.0;
    detector.transfer->deltaF = 1.5*FSTOP;
    SUB( LALCCreateVector( &stat, &( detector.transfer->data ), 2 ),
	 &stat );
    detector.transfer->data->data[0] = 1.0;
    detector.transfer->data->data[1] = 1.0;
  }


  /* Read input data. */
  if ( infile ) {
    REAL4VectorSequence *input = NULL; /* input as vector sequence */
    if ( ( fp = fopen( infile, "r" ) ) == NULL ) {
      ERROR( BASICINJECTTESTC_EFILE, BASICINJECTTESTC_MSGEFILE,
	     infile );
      return BASICINJECTTESTC_EFILE;
    }

    /* Read header. */
    ok &= ( fscanf( fp, "# epoch = %" LAL_INT8_FORMAT "\n", &epoch ) == 1 );
    I8ToLIGOTimeGPS( &( output.epoch ), epoch );
    ok &= ( fscanf( fp, "# deltaT = %lf\n", &( output.deltaT ) )
	    == 1 );
    if ( !ok ) {
      ERROR( BASICINJECTTESTC_EINPUT, BASICINJECTTESTC_MSGEINPUT,
	     infile );
      return BASICINJECTTESTC_EINPUT;
    }

    /* Read and convert body. */
    SUB( LALSReadVectorSequence( &stat, &input, fp ), &stat );
    fclose( fp );
    if ( input->vectorLength != 1 ) {
      ERROR( BASICINJECTTESTC_EINPUT, BASICINJECTTESTC_MSGEINPUT,
	     infile );
      return BASICINJECTTESTC_EINPUT;
    }
    SUB( LALI2CreateVector( &stat, &( output.data ), input->length ),
	 &stat );
    for ( i = 0; i < input->length; i++ )
      output.data->data[i] = (INT2)( input->data[i] );
    SUB( LALSDestroyVectorSequence( &stat, &input ), &stat );
  }

  /* No input file, so generate one randomly. */
  else {
    output.epoch.gpsSeconds = sec;
    output.epoch.gpsNanoSeconds = nsec;
    output.deltaT = dt;
    SUB( LALI2CreateVector( &stat, &( output.data ), npt ), &stat );
    if ( sigma == 0 ) {
      memset( output.data->data, 0, npt*sizeof(INT2) );
    } else {
      REAL4Vector *deviates = NULL; /* unit Gaussian deviates */
      SUB( LALSCreateVector( &stat, &deviates, npt ), &stat );
      SUB( LALNormalDeviates( &stat, deviates, params ), &stat );
      for ( i = 0; i < (UINT4)( npt ); i++ )
	output.data->data[i] = (INT2)
	  floor( sigma*deviates->data[i] + 0.5 );
      SUB( LALSDestroyVector( &stat, &deviates ), &stat );
    }
  }


  /*******************************************************************
   * INJECTION                                                       *
   *******************************************************************/

  /* Open sourcefile. */
  if ( sourcefile ) {
    if ( ( fp = fopen( sourcefile, "r" ) ) == NULL ) {
      ERROR( BASICINJECTTESTC_EFILE, BASICINJECTTESTC_MSGEFILE,
	     sourcefile );
      return BASICINJECTTESTC_EFILE;
    }
  }

  /* For each line in the sourcefile... */
  while ( ok ) {
    PPNParamStruc ppnParams;       /* wave generation parameters */
    REAL4 m1, m2, dist, inc, phic; /* unconverted parameters */
    CoherentGW waveform;           /* amplitude and phase structure */
    REAL4TimeSeries signalvec;     /* GW signal */
    REAL8 time;                    /* length of GW signal */
    CHAR timeCode;                 /* code for signal time alignment */
    CHAR message[MSGLEN];          /* warning/info messages */

    /* Read and convert input line. */
    if ( sourcefile ) {
      ok &= ( fscanf( fp, "%c %" LAL_INT8_FORMAT " %f %f %f %f %f\n", &timeCode,
		      &epoch, &m1, &m2, &dist, &inc, &phic ) == 7 );
      ppnParams.mTot = m1 + m2;
      ppnParams.eta = m1*m2/( ppnParams.mTot*ppnParams.mTot );
      ppnParams.d = dist*LAL_PC_SI*1000.0;
      ppnParams.inc = inc*LAL_PI/180.0;
      ppnParams.phi = phic*LAL_PI/180.0;
    } else {
      timeCode = 'i';
      ppnParams.mTot = M1 + M2;
      ppnParams.eta = M1*M2/( ppnParams.mTot*ppnParams.mTot );
      ppnParams.d = DIST;
      ppnParams.inc = INC;
      ppnParams.phi = PHIC;
      epoch = EPOCH;
    }

    if ( ok ) {
      /* Set up other parameter structures. */
      ppnParams.epoch.gpsSeconds = ppnParams.epoch.gpsNanoSeconds = 0;
      ppnParams.position.latitude = ppnParams.position.longitude = 0.0;
      ppnParams.position.system = COORDINATESYSTEM_EQUATORIAL;
      ppnParams.psi = 0.0;
      ppnParams.fStartIn = FSTART;
      ppnParams.fStopIn = FSTOP;
      ppnParams.lengthIn = 0;
      ppnParams.ppn = NULL;
      ppnParams.deltaT = DELTAT;
      memset( &waveform, 0, sizeof(CoherentGW) );

      /* Generate waveform at zero epoch. */
      SUB( LALGeneratePPNInspiral( &stat, &waveform, &ppnParams ),
	   &stat );
      snprintf( message, MSGLEN, "%d: %s", ppnParams.termCode,
		   ppnParams.termDescription );
      INFO( message );
      if ( ppnParams.dfdt > 2.0 ) {
	snprintf( message, MSGLEN,
		     "Waveform sampling interval is too large:\n"
		     "\tmaximum df*dt = %f", ppnParams.dfdt );
	WARNING( message );
      }

      /* Compute epoch for waveform. */
      time = waveform.a->data->length*DELTAT;
      if ( timeCode == 'f' )
	epoch -= (INT8)( 1000000000.0*time );
      else if ( timeCode == 'c' )
	epoch -= (INT8)( 1000000000.0*ppnParams.tc );
      I8ToLIGOTimeGPS( &( waveform.a->epoch ), epoch );
      waveform.f->epoch = waveform.phi->epoch = waveform.a->epoch;

      /* Generate and inject signal. */
      signalvec.epoch = waveform.a->epoch;
      signalvec.epoch.gpsSeconds -= 1;
      signalvec.deltaT = output.deltaT/4.0;
      signalvec.f0 = 0;
      signalvec.data = NULL;
      time = ( time + 2.0 )/signalvec.deltaT;
      SUB( LALSCreateVector( &stat, &( signalvec.data ), (UINT4)time ),
	   &stat );
      SUB( LALSimulateCoherentGW( &stat, &signalvec, &waveform,
				  &detector ), &stat );
      SUB( LALSI2InjectTimeSeries( &stat, &output, &signalvec, params ),
	   &stat );
      SUB( LALSDestroyVectorSequence( &stat, &( waveform.a->data ) ),
	   &stat );
      SUB( LALSDestroyVector( &stat, &( waveform.f->data ) ), &stat );
      SUB( LALDDestroyVector( &stat, &( waveform.phi->data ) ), &stat );
      LALFree( waveform.a );
      LALFree( waveform.f );
      LALFree( waveform.phi );
      SUB( LALSDestroyVector( &stat, &( signalvec.data ) ), &stat );
    }

    /* If there is no source file, inject only one source. */
    if ( !sourcefile )
      ok = 0;
  }

  /* Input file is exhausted (or has a badly-formatted line ). */
  if ( sourcefile )
    fclose( fp );


  /*******************************************************************
   * CLEANUP                                                         *
   *******************************************************************/

  /* Print output file. */
  if ( outfile ) {
    if ( ( fp = fopen( outfile, "w" ) ) == NULL ) {
      ERROR( BASICINJECTTESTC_EFILE, BASICINJECTTESTC_MSGEFILE,
	     outfile );
      return BASICINJECTTESTC_EFILE;
    }
    epoch = 1000000000LL*(INT8)( output.epoch.gpsSeconds );
    epoch += (INT8)( output.epoch.gpsNanoSeconds );
    fprintf( fp, "# epoch = %" LAL_INT8_FORMAT "\n", epoch );
    fprintf( fp, "# deltaT = %23.16e\n", output.deltaT );
    for ( i = 0; i < output.data->length; i++ )
      fprintf( fp, "%8.1f\n", (REAL4)( output.data->data[i] ) );
    fclose( fp );
  }

  /* Destroy remaining memory. */
  SUB( LALDestroyRandomParams( &stat, &params ), &stat );
  SUB( LALI2DestroyVector( &stat, &( output.data ) ), &stat );
  SUB( LALCDestroyVector( &stat, &( detector.transfer->data ) ),
       &stat );
  LALFree( detector.transfer );

  /* Done! */
  LALCheckMemoryLeaks();
  INFO( BASICINJECTTESTC_MSGENORM );
  return BASICINJECTTESTC_ENORM;
}
Ejemplo n.º 5
0
int
main(int argc, char **argv)
{
  /* Variables for parsing command-line arguments. */
  INT4  arg;               /* argument list counter */
  CHAR *metricfile = NULL; /* metric output filename */
  CHAR *rangefile = NULL;  /* parameter range output filename */
  UINT4 n = NSTACKS;       /* number of stacks */
  REAL8 dt = STACKLENGTH;  /* length of each stack (s) */
  REAL8 t0 = STARTTIME;    /* start time of first stack (GPS s) */
  REAL8 f0 = FREQUENCY;    /* maximum frequency of search */
  REAL8 lat = LATITUDE;    /* latitude of detector (degrees N) */
  REAL8 lon = LONGITUDE;   /* longitude of detector (degrees E) */
  REAL8 ra[2], dec[2];     /* RA and dec ranges (degrees) */

  /* Other variables. */
  UINT4 i, j, k;                 /* indecies */
  UINT4 nRA, nDec;               /* sizes of metric grid in RA and dec */
  REAL8 dRA, dDec;               /* grid intervals in RA and dec */
  UINT4 warnings = 0;            /* points with large uncertainties */
  UINT4 errors = 0;              /* points with bad metrics */
  static LALStatus stat;         /* top-level status structure */
  static LIGOTimeGPS start;      /* GPS start time of first stack */
  REAL4Grid *metricGrid = NULL;  /* grid of metric values */
  REAL4 *gData;                  /* pointer to metricGrid->data->data */
  REAL4Grid *rangeGrid = NULL;   /* grid of range delimiters */
  REAL4 *rData;                  /* pointer to rangeGrid->data->data */
  REAL4 propVol = 0.0;           /* average proper volume element */
  UINT4 nVol = 0;                /* number of points used in average */
  UINT4Vector *dimLength = NULL; /* used to allocate metricGrid */
  REAL8Vector *lambda = NULL;    /* metric parameter space vector */
  REAL8Vector *metric = NULL;    /* metric components */
  REAL8 *mData;                  /* pointer to metric->data */
  INT4 *topRange, *botRange;     /* preliminary grid range limits */
  INT4 *topRange2, *botRange2;   /* adjusted grid range limits */
  static MetricParamStruc params; /* metric computation parameters */
  static PulsarTimesParamStruc baryParams; /* barycentring parameters */


  /* Some more initializations. */
  ra[0] = RA_MIN; dec[0] = DEC_MIN;
  ra[1] = RA_MAX; dec[1] = DEC_MAX;

  /******************************************************************
   * ARGUMENT PARSING                                               *
   ******************************************************************/

  /* Parse argument list.  arg stores the current position. */
  arg = 1;
  while ( arg < argc ) {
    /* Parse output file option. */
    if ( !strcmp( argv[arg], "-o" ) ) {
      if ( argc > arg + 2 ) {
	arg++;
	metricfile = argv[arg++];
	rangefile = argv[arg++];
      } else {
	ERROR( SKYMETRICTESTC_EARG, SKYMETRICTESTC_MSGEARG, 0 );
        XLALPrintError( USAGE, *argv );
        return SKYMETRICTESTC_EARG;
      }
    }
    /* Parse search parameter option. */
    else if ( !strcmp( argv[arg], "-p" ) ) {
      if ( argc > arg + 4 ) {
	arg++;
	n = atoi( argv[arg++] );
	dt = atof( argv[arg++] );
	t0 = atof( argv[arg++] );
	f0 = atof( argv[arg++] );
      } else {
	ERROR( SKYMETRICTESTC_EARG, SKYMETRICTESTC_MSGEARG, 0 );
        XLALPrintError( USAGE, *argv );
        return SKYMETRICTESTC_EARG;
      }
    }
    /* Parse detector position option. */
    else if ( !strcmp( argv[arg], "-l" ) ) {
      if ( argc > arg + 2 ) {
	arg++;
	lat = atof( argv[arg++] );
	lon = atof( argv[arg++] );
      } else {
	ERROR( SKYMETRICTESTC_EARG, SKYMETRICTESTC_MSGEARG, 0 );
        XLALPrintError( USAGE, *argv );
        return SKYMETRICTESTC_EARG;
      }
    }
    /* Parse parameter space range option. */
    else if ( !strcmp( argv[arg], "-r" ) ) {
      if ( argc > arg + 4 ) {
	arg++;
	ra[0] = atof( argv[arg++] );
	ra[1] = atof( argv[arg++] );
	dec[0] = atof( argv[arg++] );
	dec[1] = atof( argv[arg++] );
      } else {
	ERROR( SKYMETRICTESTC_EARG, SKYMETRICTESTC_MSGEARG, 0 );
        XLALPrintError( USAGE, *argv );
        return SKYMETRICTESTC_EARG;
      }
    }
    /* Parse debug level option. */
    else if ( !strcmp( argv[arg], "-d" ) ) {
      if ( argc > arg + 1 ) {
	arg++;
      } else {
	ERROR( SKYMETRICTESTC_EARG, SKYMETRICTESTC_MSGEARG, 0 );
        XLALPrintError( USAGE, *argv );
        return SKYMETRICTESTC_EARG;
      }
    }
    /* Check for unrecognized options. */
    else if ( argv[arg][0] == '-' ) {
      ERROR( SKYMETRICTESTC_EARG, SKYMETRICTESTC_MSGEARG, 0 );
      XLALPrintError( USAGE, *argv );
      return SKYMETRICTESTC_EARG;
    }
  } /* End of argument parsing loop. */

  /* Do error trapping on input parameters. */
  if ( lalDebugLevel & LALERROR ) {
    CHECKVAL( n, 0, NMAX );
    CHECKVAL( f0, 0.0, F0MAX );
    CHECKVAL( dt, 1.0/f0, DTMAX );
    CHECKVAL( lat, -90.0, 90.0 );
    CHECKVAL( lon, -360.0, 360.0 );
  }

  /******************************************************************
   * METRIC COMPUTATION                                             *
   ******************************************************************/

  /* Set up start time. */
  start.gpsSeconds = (INT4)t0;
  start.gpsNanoSeconds = (INT4)( 1.0e9*( t0 - start.gpsSeconds ) );
  t0 = 0.0;

  /* Set up constant parameters for barycentre transformation. */
  baryParams.epoch = start;
  baryParams.latitude = LAL_PI_180*lat;
  baryParams.longitude = LAL_PI_180*lon;
  SUB( LALGetEarthTimes( &stat, &baryParams ), &stat );

  /* Set up constant parameters for metric calculation. */
  params.dtCanon = LALDTBaryPtolemaic;
  params.constants = &baryParams;
  params.start = t0;
  params.deltaT = dt;
  params.n = n;
  params.errors = 1;

  /* Set up the metric vector, metric grid, and parameter vector. */
  if ( params.errors )
    SUB( LALDCreateVector( &stat, &metric, 12 ), &stat );
  else
    SUB( LALDCreateVector( &stat, &metric, 6 ), &stat );
  mData = metric->data;
  SUB( LALU4CreateVector( &stat, &dimLength, 3 ), &stat );
  nRA = (UINT4)( ( ra[1] - ra[0] )/SPACING ) + 2;
  nDec = (UINT4)( ( dec[1] - dec[0] )/SPACING ) + 2;
  dimLength->data[0] = nDec;
  dimLength->data[1] = nRA;
  dimLength->data[2] = 3;
  SUB( LALSCreateGrid( &stat, &metricGrid, dimLength, 2 ), &stat );
  SUB( LALU4DestroyVector( &stat, &dimLength ), &stat );
  metricGrid->offset->data[0] = dec[0];
  metricGrid->offset->data[1] = ra[0];
  metricGrid->interval->data[0] = dDec = ( dec[1] - dec[0] )/( nDec - 1.0 );
  metricGrid->interval->data[1] = dRA = ( ra[1] - ra[0] )/( nRA - 1.0 );
  gData = metricGrid->data->data;
  SUB( LALDCreateVector( &stat, &lambda, 3 ), &stat );
  lambda->data[0] = f0;

  /* Set up preliminary range delimiters. */
  topRange = (INT4 *)LALMalloc( nRA*sizeof( INT4 ) );
  botRange = (INT4 *)LALMalloc( nRA*sizeof( INT4 ) );
  if ( !topRange || !botRange ) {
    ERROR( SKYMETRICTESTC_EMEM, SKYMETRICTESTC_MSGEMEM, 0 );
    return SKYMETRICTESTC_EMEM;
  }
  for ( i = 0; i < nRA; i++ ) {
    topRange[i] = 0;
    botRange[i] = nRA;
  }

  /* Fill the metric grid with the projected metric. */
  k = 0;
  fprintf( stdout, "Computing metric on %ix%i grid:\n", nDec, nRA );
  for ( i = 0; i < nDec; i++ ) {
    BOOLEAN bottom = 1, top = 0; /* whether we're at the bottom or top
                                    of the grid column */
    lambda->data[2] = LAL_PI_180*( dec[0] + i*dDec );
    for ( j = 0; j < nRA; j++ ) {
      if ( top )
	fprintf( stdout, "o" );
      else {
	REAL4 gxx, gyy, gxy; /* metric components */
	lambda->data[1] = LAL_PI_180*( ra[0] + j*dRA );
	SUB( LALStackMetric( &stat, metric, lambda, &params ), &stat );
	SUB( LALProjectMetric( &stat, metric, params.errors ), &stat );

	/* If uncertainties are given, generate conservative metric. */
	if ( params.errors ) {
	  INT2 sign = 1; /* sign of xy metric component */
	  gxx = mData[10] + mData[11];
	  gyy = mData[4] + mData[5];
	  gxy = mData[8];
	  if ( gxy < 0.0 )
	    sign = -1;
	  if ( fabs( gxy ) <= fabs( mData[9] ) )
	    gxy = 0.0;
	  else
	    gxy = sign*( fabs( gxy ) - fabs( mData[9] ) );
	  if ( gxx < 0.0 || gyy < 0.0 || gxx*gyy - gxy*gxy < 0.0 ) {
	    errors++;
	    fprintf( stdout, "o" );
	  } else if ( fabs( mData[4]*mData[11] ) +
		      fabs( mData[5]*mData[10] ) +
		      fabs( mData[8]*mData[9] )*2.0 >=
		      mData[4]*mData[10] - mData[8]*mData[8] ) {
	    warnings++;
	    fprintf( stdout, "*" );
	  } else
	    fprintf( stdout, "+" );
	}

	/* If uncertainties are not given, just use best estimate. */
	else {
	  gxx = mData[5];
	  gxy = mData[4];
	  gyy = mData[2];
	  if ( gxx < 0.0 || gyy < 0.0 || gxx*gyy - gxy*gxy < 0.0 ) {
	    errors++;
	    fprintf( stdout, "o" );
	  } else
	    fprintf( stdout, "+" );
	}

	/* See whether we've crossed a range boundary. */
	if ( gxx > 0.0 && gyy > 0.0 && gxx*gyy - gxy*gxy > 0.0 ) {
	  if ( bottom ) {
	    bottom = 0;
	    botRange[i] = j - 1;
	  }
	  propVol += LAL_PI_180*LAL_PI_180*sqrt( gxx*gyy - gxy*gxy );
	  nVol++;
	} else {
	  if ( !bottom ) {
	    top = 1;
	    topRange[i] = j;
	  }
	}
	*(gData++) = LAL_PI_180*LAL_PI_180*gxx;
	*(gData++) = LAL_PI_180*LAL_PI_180*gyy;
	*(gData++) = LAL_PI_180*LAL_PI_180*gxy;
      }
      fflush( stdout );
    }
    if ( !top )
      topRange[i] = j;
    fprintf( stdout, "\n" );
  }

  /* Free memory that's no longer needed. */
  SUB( LALDDestroyVector( &stat, &metric ), &stat );
  SUB( LALDDestroyVector( &stat, &lambda ), &stat );

  /* Warn if any points had bad values or large uncertainties. */
  if ( errors ) {
    CHAR msg[MSGLEN];
    snprintf( msg, MSGLEN, "%i of %i points had"
		 " non-positive-definite metric", warnings,
		 nRA*nDec );
    WARNING( msg );
  }
  if ( warnings ) {
    CHAR msg[MSGLEN];
    snprintf( msg, MSGLEN, "%i of %i points had metric component"
		 " errors larger than values", warnings, nRA*nDec );
    WARNING( msg );
  }

  /* Write the proper volume element. */
  fprintf( stdout, "Average proper volume element: %10.3e per square"
	   " degree\n", propVol /= nVol );

  /******************************************************************
   * RANGE COMPUTATION                                              *
   ******************************************************************/

  /* Each bad metric point affects the four squares adjoining it, so
     top and bottom ranges need to be adjusted down or up one point
     based on the adjoining columns. */
  topRange2 = (INT4 *)LALMalloc( nDec*sizeof(INT4) );
  botRange2 = (INT4 *)LALMalloc( nDec*sizeof(INT4) );
  if ( !topRange2 || !botRange2 ) {
    ERROR( SKYMETRICTESTC_EMEM, SKYMETRICTESTC_MSGEMEM, 0 );
    return SKYMETRICTESTC_EMEM;
  }
  topRange2[0] = topRange[1] < topRange[0] ?
    topRange[1] - 1 : topRange[0] - 1;
  botRange2[0] = botRange[1] > botRange[0] ?
    botRange[1] + 1 : botRange[0] + 1;
  topRange2[nDec-1] = topRange[nDec] < topRange[nDec-1] ?
    topRange[nDec] - 1 : topRange[nDec-1] - 1;
  botRange2[nDec-1] = botRange[nDec] > botRange[nDec-1] ?
    botRange[nDec] + 1 : botRange[nDec-1] + 1;
  for ( i = 1; i < nDec - 1; i++ ) {
    INT4 topMin = topRange[i-1], botMax = botRange[i-1];
    if ( topRange[i] < topMin )
      topMin = topRange[i];
    if ( topRange[i+1] < topMin )
      topMin = topRange[i+1];
    if ( botRange[i] > botMax )
      botMax = botRange[i];
    if ( botRange[i+1] > botMax )
      botMax = botRange[i+1];
    topRange2[i] = topMin - 1;
    botRange2[i] = botMax + 1;
  }
  LALFree( topRange );
  LALFree( botRange );

  /* Determine the contiguous domain with open range intervals. */
  if ( topRange2[0] > botRange2[0] && topRange2[1] > botRange2[1] )
    i = 0;
  else {
    i = 1;
    while ( i < nDec - 1 && topRange2[i] <= botRange2[i] &&
	    topRange2[i+1] <= botRange2[i+1] )
      i++;
  }
  j = i;
  while ( j < nDec - 1 && topRange2[j+1] > botRange2[j+1] )
    j++;
  if ( j == i ) {
    ERROR( SKYMETRICTESTC_ERNG, SKYMETRICTESTC_MSGERNG, 0 );
    return SKYMETRICTESTC_ERNG;
  }

  /* Set up range grid. */
  j = j - i + 1;
  SUB( LALU4CreateVector( &stat, &dimLength, 2 ), &stat );
  dimLength->data[0] = j;
  dimLength->data[1] = 2;
  SUB( LALSCreateGrid( &stat, &rangeGrid, dimLength, 1 ), &stat );
  SUB( LALU4DestroyVector( &stat, &dimLength ), &stat );
  rangeGrid->offset->data[0] = dec[0] + i*dDec;
  rangeGrid->interval->data[0] = dDec;
  rData = rangeGrid->data->data;
  nVol = 0;
  for ( k = 0; k < j; k++ ) {
    *(rData++) = ra[0] + botRange2[k]*dRA;
    *(rData++) = ra[0] + topRange2[k]*dRA;
    nVol += topRange2[k] - botRange2[k] - 1;
  }
  nVol -= topRange2[j-1] - botRange2[j-1] - 1;
  LALFree( topRange2 );
  LALFree( botRange2 );

  /* Write the total proper volume of the covered range. */
  fprintf( stdout, "Total proper volume:           %10.3e\n",
	   propVol*nVol*dRA*dDec );

  /******************************************************************
   * FINISH                                                         *
   ******************************************************************/

  /* Write the output files, if requested. */
  if ( metricfile ) {
    FILE *fp = fopen( metricfile, "w" ); /* output file pointer */
    if ( !fp ) {
      ERROR( SKYMETRICTESTC_EFILE, "- " SKYMETRICTESTC_MSGEFILE,
	     metricfile );
      return SKYMETRICTESTC_EFILE;
    }
    SUB( LALSWriteGrid( &stat, fp, metricGrid ), &stat );
    fclose( fp );
  }
  if ( rangefile ) {
    FILE *fp = fopen( rangefile, "w" ); /* output file pointer */
    if ( !fp ) {
      ERROR( SKYMETRICTESTC_EFILE, "- " SKYMETRICTESTC_MSGEFILE,
	     rangefile );
      return SKYMETRICTESTC_EFILE;
    }
    SUB( LALSWriteGrid( &stat, fp, rangeGrid ), &stat );
    fclose( fp );
  }

  /* Clean up and exit. */
  SUB( LALSDestroyGrid( &stat, &metricGrid ), &stat );
  SUB( LALSDestroyGrid( &stat, &rangeGrid ), &stat );
  LALCheckMemoryLeaks();
  INFO( SKYMETRICTESTC_MSGENORM );
  return SKYMETRICTESTC_ENORM;
}
Ejemplo n.º 6
0
int test_position_1(bitfile* bf, int* truevals) 
{
    int i, off=0, vi=0;

    CHECKVAL(vi, bitfile_read_int(bf,10), truevals);
    CHECKVAL(vi, bitfile_read_int(bf,3), truevals);
    CHECKVAL(vi, bitfile_read_int(bf,3), truevals);
    CHECKVAL(vi, bitfile_read_int(bf,16), truevals);
    CHECKVAL(vi, bitfile_read_int(bf,30), truevals);
    
    for (i = 0; i < 64; i++) {
        // each unary takes (i+1) bytes, so we just always position the stream
        bitfile_position(bf, 62+off); off+=(i+1);
        CHECKVAL(vi, bitfile_read_unary(bf), truevals);
    }

    // reset the stream
    bitfile_position(bf, 0);
    vi=0;
    CHECKVAL(vi, bitfile_read_int(bf,10), truevals);
    CHECKVAL(vi, bitfile_read_int(bf,3), truevals);
    CHECKVAL(vi, bitfile_read_int(bf,3), truevals);
    CHECKVAL(vi, bitfile_read_int(bf,16), truevals);
    CHECKVAL(vi, bitfile_read_int(bf,30), truevals);
    
    // position after all the unary values
    bitfile_position(bf,62+off); 
    vi += 64;
    
    for (i = 0; i < 64; i++) {
        CHECKVAL(vi, bitfile_read_gamma(bf), truevals);
    }
    
    for (i = 0; i < 64; i++) {
        CHECKVAL(vi, bitfile_read_zeta(bf,3), truevals);
    }

    return (vi);
}