/** Initialize Fstat-code: handle user-input and set everything up. */ int XLALInitCode ( ConfigVariables *cfg, const UserInput_t *uvar ) { /* generate log-string for file-output, containing cmdline-options + code VCS version info */ char *vcs; if ( (vcs = XLALGetVersionString(0)) == NULL ) { /* short VCS version string */ XLALPrintError ( "%s: XLALGetVersionString(0) failed with errno=%d.\n", __func__, xlalErrno ); XLAL_ERROR ( XLAL_EFUNC ); } char *cmdline; if ( (cmdline = XLALUserVarGetLog ( UVAR_LOGFMT_CMDLINE )) == NULL ) { XLALPrintError ( "%s: XLALUserVarGetLog ( UVAR_LOGFMT_CMDLINE ) failed with errno=%d.\n", __func__, xlalErrno ); XLAL_ERROR ( XLAL_EFUNC ); } const char fmt[] = "%%%% cmdline: %s\n%%%%\n%s%%%%\n"; UINT4 len = strlen(vcs) + strlen(cmdline) + strlen(fmt) + 1; if ( ( cfg->logString = XLALMalloc ( len )) == NULL ) { XLALPrintError ("%s: XLALMalloc ( %d ) failed.\n", __func__, len ); XLAL_ERROR ( XLAL_ENOMEM ); } sprintf ( cfg->logString, fmt, cmdline, vcs ); XLALFree ( cmdline ); XLALFree ( vcs ); /* trivial settings from user-input */ cfg->SignalOnly = uvar->SignalOnly; /* ----- parse user-input on signal amplitude-paramters + ranges ----- */ /* skypos */ cfg->skypos.longitude = uvar->Alpha; /* Alpha < 0 indicates 'allsky' */ cfg->skypos.latitude = uvar->Delta; cfg->skypos.system = COORDINATESYSTEM_EQUATORIAL; /* ----- amplitude-params: create prior pdfs reflecting the user-input */ if ( XLALInitAmplitudePrior ( &cfg->AmpPrior, uvar ) != XLAL_SUCCESS ) XLAL_ERROR ( XLAL_EFUNC ); /* ----- initialize random-number generator ----- */ /* read out environment variables GSL_RNG_xxx * GSL_RNG_SEED: use to set random seed: default = 0, override by using --randSeed on cmdline * GSL_RNG_TYPE: type of random-number generator to use: default = 'mt19937' */ gsl_rng_env_setup (); /* allow overriding the random-seed per command-line */ if ( XLALUserVarWasSet ( &uvar->randSeed ) ) gsl_rng_default_seed = uvar->randSeed; cfg->rng = gsl_rng_alloc (gsl_rng_default); LogPrintf ( LOG_DEBUG, "random-number generator type: %s\n", gsl_rng_name (cfg->rng)); LogPrintf ( LOG_DEBUG, "seed = %lu\n", gsl_rng_default_seed ); /* init ephemeris-data */ EphemerisData *edat = XLALInitBarycenter( uvar->ephemEarth, uvar->ephemSun ); if ( !edat ) { LogPrintf ( LOG_CRITICAL, "%s: XLALInitBarycenter failed: could not load Earth ephemeris '%s' and Sun ephemeris '%s'\n", __func__, uvar->ephemEarth, uvar->ephemSun); XLAL_ERROR ( XLAL_EFUNC ); } UINT4 numDetectors = uvar->IFOs->length; MultiLALDetector multiDet; XLAL_CHECK ( XLALParseMultiLALDetector ( &multiDet, uvar->IFOs ) == XLAL_SUCCESS, XLAL_EFUNC ); /* init timestamps vector covering observation time */ UINT4 numSteps = (UINT4) ceil ( uvar->dataDuration / uvar->TAtom ); MultiLIGOTimeGPSVector * multiTS; if ( (multiTS = XLALCreateMultiLIGOTimeGPSVector (numDetectors)) == NULL ) { XLALPrintError ("%s: XLALCreateMultiLIGOTimeGPSVector(%d) failed.\n", __func__, numDetectors ); } for ( UINT4 X=0; X < numDetectors; X++ ) { if ( (multiTS->data[X] = XLALCreateTimestampVector (numSteps)) == NULL ) { XLALPrintError ("%s: XLALCreateTimestampVector(%d) failed.\n", __func__, numSteps ); } multiTS->data[X]->deltaT = uvar->TAtom; UINT4 i; for ( i=0; i < numSteps; i ++ ) { UINT4 ti = uvar->dataStartGPS + i * uvar->TAtom; multiTS->data[X]->data[i].gpsSeconds = ti; multiTS->data[X]->data[i].gpsNanoSeconds = 0; } } /* get detector states */ if ( (cfg->multiDetStates = XLALGetMultiDetectorStates ( multiTS, &multiDet, edat, 0.5 * uvar->TAtom )) == NULL ) { XLALPrintError ( "%s: XLALGetMultiDetectorStates() failed.\n", __func__ ); XLAL_ERROR ( XLAL_EFUNC ); } if ( uvar->sqrtSX ) { /* translate user-input PSD sqrt(SX) to noise-weights (this actually does not care whether they were normalized or not) */ /* parse input comma-separated list */ MultiNoiseFloor multiNoiseFloor; XLAL_CHECK ( XLALParseMultiNoiseFloor ( &multiNoiseFloor, uvar->sqrtSX, numDetectors ) == XLAL_SUCCESS, XLAL_EFUNC ); /* translate to noise weights */ XLAL_CHECK ( ( cfg->multiNoiseWeights = XLALComputeConstantMultiNoiseWeightsFromNoiseFloor ( &multiNoiseFloor, multiTS, uvar->TAtom ) ) != NULL, XLAL_EFUNC ); } /* if ( uvar->sqrtSX ) */ /* get rid of all temporary memory allocated for this step */ XLALDestroyEphemerisData ( edat ); XLALDestroyMultiTimestamps ( multiTS ); multiTS = NULL; /* ---------- initialize transient window ranges, for injection ... ---------- */ cfg->transientInjectRange.type = TRANSIENT_NONE; /* default: no transient signal window */ /* apply correct defaults if unset: t0=dataStart, t0Band=dataDuration-3*tauMax */ // cfg->transientInjectRange.t0 = uvar->dataStartGPS + uvar->injectWindow_t0Days * DAY24; cfg->transientSearchRange = cfg->transientInjectRange; return XLAL_SUCCESS; } /* XLALInitCode() */
/** Initialize Fstat-code: handle user-input and set everything up. */ int XLALInitCode ( ConfigVariables *cfg, const UserInput_t *uvar ) { /* generate log-string for file-output, containing cmdline-options + code VCS version info */ char *vcs; if ( (vcs = XLALGetVersionString(0)) == NULL ) { /* short VCS version string */ XLALPrintError ( "%s: XLALGetVersionString(0) failed with errno=%d.\n", __func__, xlalErrno ); XLAL_ERROR ( XLAL_EFUNC ); } char *cmdline; if ( (cmdline = XLALUserVarGetLog ( UVAR_LOGFMT_CMDLINE )) == NULL ) { XLALPrintError ( "%s: XLALUserVarGetLog ( UVAR_LOGFMT_CMDLINE ) failed with errno=%d.\n", __func__, xlalErrno ); XLAL_ERROR ( XLAL_EFUNC ); } const char fmt[] = "%%%% cmdline: %s\n%%%%\n%s%%%%\n"; UINT4 len = strlen(vcs) + strlen(cmdline) + strlen(fmt) + 1; if ( ( cfg->logString = XLALMalloc ( len )) == NULL ) { XLALPrintError ("%s: XLALMalloc ( %d ) failed.\n", __func__, len ); XLAL_ERROR ( XLAL_ENOMEM ); } sprintf ( cfg->logString, fmt, cmdline, vcs ); XLALFree ( cmdline ); XLALFree ( vcs ); /* trivial settings from user-input */ cfg->SignalOnly = uvar->SignalOnly; /* ----- parse user-input on signal amplitude-paramters + ranges ----- */ /* skypos */ cfg->skypos.longitude = uvar->Alpha; /* Alpha < 0 indicates 'allsky' */ cfg->skypos.latitude = uvar->Delta; cfg->skypos.system = COORDINATESYSTEM_EQUATORIAL; /* ----- amplitude-params: create prior pdfs reflecting the user-input */ if ( XLALInitAmplitudePrior ( &cfg->AmpPrior, uvar ) != XLAL_SUCCESS ) XLAL_ERROR ( XLAL_EFUNC ); /* ----- initialize random-number generator ----- */ /* read out environment variables GSL_RNG_xxx * GSL_RNG_SEED: use to set random seed: default = 0, override by using --randSeed on cmdline * GSL_RNG_TYPE: type of random-number generator to use: default = 'mt19937' */ gsl_rng_env_setup (); /* allow overriding the random-seed per command-line */ if ( XLALUserVarWasSet ( &uvar->randSeed ) ) gsl_rng_default_seed = uvar->randSeed; cfg->rng = gsl_rng_alloc (gsl_rng_default); LogPrintf ( LOG_DEBUG, "random-number generator type: %s\n", gsl_rng_name (cfg->rng)); LogPrintf ( LOG_DEBUG, "seed = %lu\n", gsl_rng_default_seed ); /* init ephemeris-data */ EphemerisData *edat = XLALInitBarycenter( uvar->ephemEarth, uvar->ephemSun ); if ( !edat ) { LogPrintf ( LOG_CRITICAL, "%s: XLALInitBarycenter failed: could not load Earth ephemeris '%s' and Sun ephemeris '%s'\n", __func__, uvar->ephemEarth, uvar->ephemSun); XLAL_ERROR ( XLAL_EFUNC ); } /* init detector info */ LALDetector *site; if ( (site = XLALGetSiteInfo ( uvar->IFO )) == NULL ) { XLALPrintError ("%s: Failed to get site-info for detector '%s'\n", __func__, uvar->IFO ); XLAL_ERROR ( XLAL_EFUNC ); } MultiLALDetector multiDet; multiDet.length = 1; multiDet.sites[0] = (*site); /* copy! */ XLALFree ( site ); /* init timestamps vector covering observation time */ UINT4 numSteps = (UINT4) ceil ( uvar->dataDuration / uvar->TAtom ); MultiLIGOTimeGPSVector * multiTS; if ( (multiTS = XLALCalloc ( 1, sizeof(*multiTS))) == NULL ) { XLAL_ERROR ( XLAL_ENOMEM ); } multiTS->length = 1; if ( (multiTS->data = XLALCalloc (1, sizeof(*multiTS->data))) == NULL ) { XLAL_ERROR ( XLAL_ENOMEM ); } if ( (multiTS->data[0] = XLALCreateTimestampVector (numSteps)) == NULL ) { XLALPrintError ("%s: XLALCreateTimestampVector(%d) failed.\n", __func__, numSteps ); } multiTS->data[0]->deltaT = uvar->TAtom; UINT4 i; for ( i=0; i < numSteps; i ++ ) { UINT4 ti = uvar->dataStartGPS + i * uvar->TAtom; multiTS->data[0]->data[i].gpsSeconds = ti; multiTS->data[0]->data[i].gpsNanoSeconds = 0; } /* get detector states */ if ( (cfg->multiDetStates = XLALGetMultiDetectorStates ( multiTS, &multiDet, edat, 0.5 * uvar->TAtom )) == NULL ) { XLALPrintError ( "%s: XLALGetMultiDetectorStates() failed.\n", __func__ ); XLAL_ERROR ( XLAL_EFUNC ); } /* get rid of all temporary memory allocated for this step */ XLALDestroyEphemerisData ( edat ); XLALDestroyMultiTimestamps ( multiTS ); multiTS = NULL; /* ---------- initialize transient window ranges, for injection ... ---------- */ transientWindowRange_t XLAL_INIT_DECL(InjectRange); int twtype; XLAL_CHECK ( (twtype = XLALParseTransientWindowName ( uvar->injectWindow_type )) >= 0, XLAL_EFUNC ); InjectRange.type = twtype; /* make sure user doesn't set window=none but sets window-parameters => indicates she didn't mean 'none' */ if ( InjectRange.type == TRANSIENT_NONE ) { if ( XLALUserVarWasSet ( &uvar->injectWindow_t0Days ) || XLALUserVarWasSet ( &uvar->injectWindow_t0DaysBand ) || XLALUserVarWasSet ( &uvar->injectWindow_tauDays ) || XLALUserVarWasSet ( &uvar->injectWindow_tauDaysBand ) ) { XLALPrintError ("%s: ERROR: injectWindow_type == NONE, but window-parameters were set! Use a different window-type!\n", __func__ ); XLAL_ERROR ( XLAL_EINVAL ); } } if ( uvar->injectWindow_t0DaysBand < 0 || uvar->injectWindow_tauDaysBand < 0 ) { XLALPrintError ("%s: only positive t0/tau window injection bands allowed (%f, %f)\n", __func__, uvar->injectWindow_t0DaysBand, uvar->injectWindow_tauDaysBand ); XLAL_ERROR ( XLAL_EINVAL ); } /* apply correct defaults if unset: t0=dataStart, t0Band=dataDuration-3*tauMax */ InjectRange.t0 = uvar->dataStartGPS + uvar->injectWindow_t0Days * DAY24; REAL8 tauMax = ( uvar->injectWindow_tauDays + uvar->injectWindow_tauDaysBand ) * DAY24; if ( XLALUserVarWasSet (&uvar->injectWindow_t0DaysBand ) ) InjectRange.t0Band = uvar->injectWindow_t0DaysBand * DAY24; else InjectRange.t0Band = fmax ( 0.0, uvar->dataDuration - TRANSIENT_EXP_EFOLDING * tauMax - InjectRange.t0 ); /* make sure it's >= 0 */ InjectRange.tau = (UINT4) ( uvar->injectWindow_tauDays * DAY24 ); InjectRange.tauBand = (UINT4) ( uvar->injectWindow_tauDaysBand * DAY24 ); cfg->transientInjectRange = InjectRange; /* ---------- ... and for search -------------------- */ transientWindowRange_t XLAL_INIT_DECL(SearchRange); XLAL_CHECK ( (twtype = XLALParseTransientWindowName ( uvar->searchWindow_type )) >= 0, XLAL_EFUNC ); SearchRange.type = twtype; /* apply correct defaults if unset: use inect window */ if ( !XLALUserVarWasSet ( &uvar->searchWindow_type ) ) SearchRange.type = InjectRange.type; if ( !XLALUserVarWasSet ( &uvar->searchWindow_t0Days ) ) SearchRange.t0 = InjectRange.t0; else SearchRange.t0 = uvar->dataStartGPS + uvar->searchWindow_t0Days * DAY24; if ( !XLALUserVarWasSet ( &uvar->searchWindow_t0DaysBand ) ) SearchRange.t0Band = InjectRange.t0Band; else SearchRange.t0Band = (UINT4) (uvar->searchWindow_t0DaysBand * DAY24); if ( !XLALUserVarWasSet ( &uvar->searchWindow_tauDays ) ) SearchRange.tau = InjectRange.tau; else SearchRange.tau = (UINT4) ( uvar->searchWindow_tauDays * DAY24 ); if ( !XLALUserVarWasSet ( &uvar->searchWindow_tauDaysBand ) ) SearchRange.tauBand = InjectRange.tauBand; else SearchRange.tauBand = (UINT4) ( uvar->searchWindow_tauDaysBand * DAY24 ); if ( XLALUserVarWasSet ( &uvar->searchWindow_dt0 ) ) SearchRange.dt0 = uvar->searchWindow_dt0; else SearchRange.dt0 = uvar->TAtom; if ( XLALUserVarWasSet ( &uvar->searchWindow_dtau ) ) SearchRange.dtau = uvar->searchWindow_dtau; else SearchRange.dtau = uvar->TAtom; /* make sure user doesn't set window=none but sets window-parameters => indicates she didn't mean 'none' */ if ( SearchRange.type == TRANSIENT_NONE ) if ( XLALUserVarWasSet ( &uvar->searchWindow_t0Days ) || XLALUserVarWasSet ( &uvar->searchWindow_t0DaysBand ) || XLALUserVarWasSet ( &uvar->searchWindow_tauDays ) || XLALUserVarWasSet ( &uvar->searchWindow_tauDaysBand ) ) { XLALPrintError ("%s: ERROR: searchWindow_type == NONE, but window-parameters were set! Use a different window-type!\n", __func__ ); XLAL_ERROR ( XLAL_EINVAL ); } if ( uvar->searchWindow_t0DaysBand < 0 || uvar->searchWindow_tauDaysBand < 0 ) { XLALPrintError ("%s: only positive t0/tau window injection bands allowed (%f, %f)\n", __func__, uvar->searchWindow_t0DaysBand, uvar->searchWindow_tauDaysBand ); XLAL_ERROR ( XLAL_EINVAL ); } cfg->transientSearchRange = SearchRange; return XLAL_SUCCESS; } /* XLALInitCode() */