/** * Compute the largest magnitude of antenna velocity * \param [in] t0 Start time (GPS seconds) * \param [in] Tcoh Coherence length of the SFTs (in seconds) * \param [in] SFToverlap Overlap of the SFTs (in seconds) * \param [in] Tobs Observation time (in seconds) * \param [in] det A LALDetector struct * \param [in] edat Pointer to EphemerisData * \return Maximum magnitude of antenna velocity */ REAL4 CompDetectorVmax(REAL8 t0, REAL8 Tcoh, REAL8 SFToverlap, REAL8 Tobs, LALDetector det, EphemerisData *edat) { XLAL_CHECK( edat != NULL, XLAL_EINVAL ); INT4 ii; INT4 numffts = (INT4)floor(Tobs/(Tcoh-SFToverlap)-1); //Number of FFTs LALStatus XLAL_INIT_DECL(status); REAL8 detvel[3]; REAL4 Vmax = 0.0; for (ii=0; ii<numffts; ii++) { LIGOTimeGPS gpstime = LIGOTIMEGPSZERO; gpstime.gpsSeconds = (INT4)floor(t0 + ii*(Tcoh-SFToverlap) + 0.5*Tcoh); gpstime.gpsNanoSeconds = (INT4)floor((t0+ii*(Tcoh-SFToverlap)+0.5*Tcoh - floor(t0+ii*(Tcoh-SFToverlap)+0.5*Tcoh))*1e9); if (ii==0) { LALDetectorVel(&status, detvel, &gpstime, det, edat); XLAL_CHECK_REAL4( status.statusCode == 0, XLAL_EFUNC ); Vmax = (REAL4)sqrt(detvel[0]*detvel[0] + detvel[1]*detvel[1] + detvel[2]*detvel[2]); } else { LALDetectorVel(&status, detvel, &gpstime, det, edat); XLAL_CHECK_REAL4( status.statusCode == 0, XLAL_EFUNC ); REAL4 V = (REAL4)sqrt(detvel[0]*detvel[0] + detvel[1]*detvel[1] + detvel[2]*detvel[2]); if (V > Vmax) Vmax = V; } /* if ii==0 else ... */ } /* for ii < numffts */ return Vmax; } /* CompDetectorVmax() */
/** * Compute the largest magnitude of antenna velocity * \param [in] t0 Start time (GPS seconds) * \param [in] Tsft Coherence length of the SFTs (in seconds) * \param [in] SFToverlap Overlap of the SFTs (in seconds) * \param [in] Tobs Observation time (in seconds) * \param [in] det A LALDetector struct * \param [in] edat Pointer to EphemerisData * \return Maximum magnitude of antenna velocity */ REAL4 CompDetectorVmax(const REAL8 t0, const REAL8 Tsft, const REAL8 SFToverlap, const REAL8 Tobs, const LALDetector det, EphemerisData *edat) { XLAL_CHECK( edat != NULL, XLAL_EINVAL ); INT4 numffts = (INT4)floor(Tobs/(Tsft-SFToverlap)-1); //Number of FFTs LALStatus XLAL_INIT_DECL(status); LIGOTimeGPS gpstime = LIGOTIMEGPSZERO; gpstime.gpsSeconds = (INT4)floor(t0 + 0.5*Tsft); gpstime.gpsNanoSeconds = (INT4)floor((t0+0.5*Tsft - floor(t0+0.5*Tsft))*1e9); REAL8 detvel[3]; LALDetectorVel(&status, detvel, &gpstime, det, edat); XLAL_CHECK_REAL4( status.statusCode == 0, XLAL_EFUNC ); REAL4 Vmax = (REAL4)sqrt(detvel[0]*detvel[0] + detvel[1]*detvel[1] + detvel[2]*detvel[2]); for (INT4 ii=1; ii<numffts; ii++) { gpstime.gpsSeconds = (INT4)floor(t0 + ii*(Tsft-SFToverlap) + 0.5*Tsft); gpstime.gpsNanoSeconds = (INT4)floor((t0+ii*(Tsft-SFToverlap)+0.5*Tsft - floor(t0+ii*(Tsft-SFToverlap)+0.5*Tsft))*1e9); LALDetectorVel(&status, detvel, &gpstime, det, edat); XLAL_CHECK_REAL4( status.statusCode == 0, XLAL_EFUNC ); REAL4 V = (REAL4)sqrt(detvel[0]*detvel[0] + detvel[1]*detvel[1] + detvel[2]*detvel[2]); if (V > Vmax) Vmax = V; } /* for ii < numffts */ return Vmax; } /* CompDetectorVmax() */
/** * Compute the maximum change in antenna velocity * \param [in] t0 Start time (GPS seconds) * \param [in] Tsft Coherence length of the SFTs (in seconds) * \param [in] SFToverlap Overlap of the SFTs (in seconds) * \param [in] Tobs Observation time (in seconds) * \param [in] det A LALDetector struct * \param [in] edat Pointer to EphemerisData * \return Maximum change in antenna velocity */ REAL4 CompDetectorDeltaVmax(const REAL8 t0, const REAL8 Tsft, const REAL8 SFToverlap, const REAL8 Tobs, const LALDetector det, EphemerisData *edat) { XLAL_CHECK( edat != NULL, XLAL_EINVAL ); INT4 numffts = (INT4)floor(Tobs/(Tsft-SFToverlap)-1); //Number of FFTs LALStatus XLAL_INIT_DECL(status); REAL8 detvel[3], detvel0[3], dv[3]; REAL4 deltaVmax = 0.0; for (INT4 ii=0; ii<numffts; ii++) { LIGOTimeGPS gpstime = LIGOTIMEGPSZERO; gpstime.gpsSeconds = (INT4)floor(t0 + ii*(Tsft-SFToverlap) + 0.5*Tsft); gpstime.gpsNanoSeconds = (INT4)floor((t0+ii*(Tsft-SFToverlap)+0.5*Tsft - floor(t0+ii*(Tsft-SFToverlap)+0.5*Tsft))*1e9); if (ii==0) { LALDetectorVel(&status, detvel0, &gpstime, det, edat); XLAL_CHECK_REAL4( status.statusCode == 0, XLAL_EFUNC ); } else { LALDetectorVel(&status, detvel, &gpstime, det, edat); XLAL_CHECK_REAL4( status.statusCode == 0, XLAL_EFUNC ); dv[0] = detvel[0] - detvel0[0]; dv[1] = detvel[1] - detvel0[1]; dv[2] = detvel[2] - detvel0[2]; REAL4 deltaV = (REAL4)sqrt(dv[0]*dv[0] + dv[1]*dv[1] + dv[2]*dv[2]); if (deltaV > deltaVmax) deltaVmax = deltaV; } /* if ii==0 else ... */ } /* for ii < numffts */ return deltaVmax; } /* CompDetectorDeltaVmax() */
/** * Compute the antenna velocity * \param [out] output Pointer to REAL4Vector of antenna velocities * \param [in] ra Right ascension value (radians) * \param [in] dec Declination value (radians) * \param [in] t0 Start time (GPS seconds) * \param [in] Tcoh Coherence length of the SFTs (in seconds) * \param [in] SFToverlap Overlap of the SFTs (in seconds) * \param [in] Tobs Observation time (in seconds) * \param [in] det A LALDetector struct * \param [in] edat Pointer to EphemerisData * \return Status value */ INT4 CompAntennaVelocity(REAL4Vector *output, REAL4 ra, REAL4 dec, REAL8 t0, REAL8 Tcoh, REAL8 SFToverlap, REAL8 Tobs, LALDetector det, EphemerisData *edat) { XLAL_CHECK( output != NULL && edat != NULL, XLAL_EINVAL ); INT4 ii; INT4 numffts = (INT4)floor(Tobs/(Tcoh-SFToverlap)-1); //Number of FFTs LALStatus XLAL_INIT_DECL(status); REAL8 detvel[3]; for (ii=0; ii<numffts; ii++) { LIGOTimeGPS gpstime = LIGOTIMEGPSZERO; gpstime.gpsSeconds = (INT4)floor(t0 + ii*(Tcoh-SFToverlap) + 0.5*Tcoh); gpstime.gpsNanoSeconds = (INT4)floor((t0+ii*(Tcoh-SFToverlap)+0.5*Tcoh - floor(t0+ii*(Tcoh-SFToverlap)+0.5*Tcoh))*1e9); LALDetectorVel(&status, detvel, &gpstime, det, edat); XLAL_CHECK( status.statusCode == 0, XLAL_EFUNC ); output->data[ii] = (REAL4)(detvel[0]*cos(ra)*cos(dec) + detvel[1]*sin(ra)*cos(dec) + detvel[2]*sin(dec)); } /* for ii < numffts */ return XLAL_SUCCESS; } /* CompAntennaVelocity() */
/** * Compute the antenna velocity * \param [out] output Pointer to REAL4Vector of antenna velocities * \param [in] skypos Sky position measured in RA and Dec in radians * \param [in] t0 Start time (GPS seconds) * \param [in] Tsft Coherence length of the SFTs (in seconds) * \param [in] SFToverlap Overlap of the SFTs (in seconds) * \param [in] Tobs Observation time (in seconds) * \param [in] det A LALDetector struct * \param [in] edat Pointer to EphemerisData * \return Status value */ INT4 CompAntennaVelocity(REAL4VectorAligned *output, const SkyPosition skypos, const REAL8 t0, const REAL8 Tsft, const REAL8 SFToverlap, const REAL8 Tobs, const LALDetector det, EphemerisData *edat) { XLAL_CHECK( output != NULL && edat != NULL, XLAL_EINVAL ); INT4 numffts = (INT4)floor(Tobs/(Tsft-SFToverlap)-1); //Number of FFTs LALStatus XLAL_INIT_DECL(status); REAL8 detvel[3]; for (INT4 ii=0; ii<numffts; ii++) { LIGOTimeGPS gpstime = LIGOTIMEGPSZERO; gpstime.gpsSeconds = (INT4)floor(t0 + ii*(Tsft-SFToverlap) + 0.5*Tsft); gpstime.gpsNanoSeconds = (INT4)floor((t0+ii*(Tsft-SFToverlap)+0.5*Tsft - floor(t0+ii*(Tsft-SFToverlap)+0.5*Tsft))*1e9); LALDetectorVel(&status, detvel, &gpstime, det, edat); XLAL_CHECK( status.statusCode == 0, XLAL_EFUNC ); output->data[ii] = (REAL4)(detvel[0]*cos(skypos.longitude)*cos(skypos.latitude) + detvel[1]*sin(skypos.longitude)*cos(skypos.latitude) + detvel[2]*sin(skypos.latitude)); } /* for ii < numffts */ return XLAL_SUCCESS; } /* CompAntennaVelocity() */
/** * Compute the largest magnitude of antenna velocity * \param [in] t0 Start time (GPS seconds) * \param [in] Tsft Coherence length of the SFTs (in seconds) * \param [in] SFToverlap Overlap of the SFTs (in seconds) * \param [in] Tobs Observation time (in seconds) * \param [in] det A LALDetector struct * \param [in] edat Pointer to EphemerisData * \return Maximum magnitude of antenna velocity */ REAL4 CompDetectorVmax(const REAL8 t0, const REAL8 Tsft, const REAL8 SFToverlap, const REAL8 Tobs, const LALDetector det, EphemerisData *edat) { XLAL_CHECK( edat != NULL, XLAL_EINVAL ); INT4 numffts = (INT4)floor(Tobs/(Tsft-SFToverlap)-1); //Number of FFTs LALStatus XLAL_INIT_DECL(status); LIGOTimeGPS gpstime = LIGOTIMEGPSZERO; gpstime.gpsSeconds = (INT4)floor(t0 + 0.5*Tsft); gpstime.gpsNanoSeconds = (INT4)floor((t0+0.5*Tsft - floor(t0+0.5*Tsft))*1e9); REAL8 detvel[3]; LALDetectorVel(&status, detvel, &gpstime, det, edat); XLAL_CHECK_REAL4( status.statusCode == 0, XLAL_EFUNC ); REAL4 Vmax = (REAL4)sqrt(detvel[0]*detvel[0] + detvel[1]*detvel[1] + detvel[2]*detvel[2]); for (INT4 ii=1; ii<numffts; ii++) { gpstime.gpsSeconds = (INT4)floor(t0 + ii*(Tsft-SFToverlap) + 0.5*Tsft); gpstime.gpsNanoSeconds = (INT4)floor((t0+ii*(Tsft-SFToverlap)+0.5*Tsft - floor(t0+ii*(Tsft-SFToverlap)+0.5*Tsft))*1e9); LALDetectorVel(&status, detvel, &gpstime, det, edat); XLAL_CHECK_REAL4( status.statusCode == 0, XLAL_EFUNC ); REAL4 V = (REAL4)sqrt(detvel[0]*detvel[0] + detvel[1]*detvel[1] + detvel[2]*detvel[2]); if (V > Vmax) Vmax = V; } /* for ii < numffts */ return Vmax; } /* CompDetectorVmax() */ REAL4 CompDetectorVmax2(const LIGOTimeGPSVector *timestamps, const LALDetector det, EphemerisData *edat) { XLAL_CHECK( timestamps!=NULL && edat != NULL, XLAL_EINVAL ); LALStatus XLAL_INIT_DECL(status); LIGOTimeGPS gpstime = timestamps->data[0]; REAL8 detvel[3]; LALDetectorVel(&status, detvel, &gpstime, det, edat); XLAL_CHECK_REAL4( status.statusCode == 0, XLAL_EFUNC ); REAL4 Vmax = (REAL4)sqrt(detvel[0]*detvel[0] + detvel[1]*detvel[1] + detvel[2]*detvel[2]); for (UINT4 ii=1; ii<timestamps->length; ii++) { gpstime = timestamps->data[ii]; LALDetectorVel(&status, detvel, &gpstime, det, edat); XLAL_CHECK_REAL4( status.statusCode == 0, XLAL_EFUNC ); REAL4 V = (REAL4)sqrt(detvel[0]*detvel[0] + detvel[1]*detvel[1] + detvel[2]*detvel[2]); if (V > Vmax) Vmax = V; } /* for ii < numffts */ return Vmax; }
/* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv------------------------------------ */ int main(int argc, char *argv[]){ static LALStatus status; static VelocityPar velPar; static REAL8 vel[3]; static REAL8 pos[3]; static EphemerisData *edat = NULL; LIGOTimeGPS tGPS; INT4 arg; /* Argument counter */ REAL8 vTol=0.01 ; /* INT4 c, errflg=0;*/ /* optarg = NULL; */ /* ------------------------------------------------------- */ /* default values */ velPar.detector = lalCachedDetectors[LALDetectorIndexGEO600DIFF]; velPar.startTime.gpsSeconds = T0SEC; velPar.startTime.gpsNanoSeconds = T0NSEC; velPar.tBase = TBASE; velPar.vTol = ACCURACY; /********************************************************/ /* Parse argument list. i stores the current position. */ /********************************************************/ arg = 1; while ( arg < argc ) { /* Parse debuglevel option. */ if ( !strcmp( argv[arg], "-d" ) ) { if ( argc > arg + 1 ) { arg++; } else { ERROR( TESTVELOCITYC_EARG, TESTVELOCITYC_MSGEARG, 0 ); XLALPrintError( USAGE, *argv ); return TESTVELOCITYC_EARG; } } /* Parse accuracy option. */ else if ( !strcmp( argv[arg], "-a" ) ) { if ( argc > arg + 1 ) { arg++; vTol= atof( argv[arg++]); velPar.vTol= vTol; } else { ERROR( TESTVELOCITYC_EARG, TESTVELOCITYC_MSGEARG, 0 ); XLALPrintError( USAGE, *argv ); return TESTVELOCITYC_EARG; } } /* Unrecognized option. */ else { ERROR( TESTVELOCITYC_EARG, TESTVELOCITYC_MSGEARG, 0 ); XLALPrintError( USAGE, *argv ); return TESTVELOCITYC_EARG; } } /* End of argument parsing loop. */ /******************************************************************/ /* read ephemeris data */ /* ephemeris info */ edat = (EphemerisData *)LALMalloc(sizeof(EphemerisData)); (*edat).ephiles.earthEphemeris = EARTHDATA; (*edat).ephiles.sunEphemeris = SUNDATA; /* read in ephemeris data */ SUB( LALInitBarycenter( &status, edat), &status); /* fill in ephemeris data in velPar */ velPar.edat = edat; tGPS.gpsSeconds = T0SEC; tGPS.gpsNanoSeconds = T0NSEC; SUB( LALDetectorVel( &status, vel, &tGPS, velPar.detector, velPar.edat), &status); printf("Detector velocity at %d = %g, %g, %g \n", T0SEC, vel[0],vel[1],vel[2]); SUB( LALDetectorPos( &status, vel, &tGPS, velPar.detector, velPar.edat), &status); printf("Detector position at %d = %g, %g, %g \n", T0SEC, vel[0],vel[1],vel[2]); SUB( LALAvgDetectorVel ( &status, vel, &velPar), &status ); printf("Avg. detector velocity in a interval of %g from %d = %g, %g, %g \n", TBASE, T0SEC, vel[0],vel[1],vel[2]); SUB( LALAvgDetectorPos ( &status, pos, &velPar), &status ); printf("Avg. detector position in a interval of %g from %d = %g, %g, %g \n", TBASE, T0SEC, pos[0],pos[1],pos[2]); LALFree(edat->ephemE); LALFree(edat->ephemS); LALFree(edat); LALCheckMemoryLeaks(); //INFO(TESTVELOCITYC_MSGENORM); return TESTVELOCITYC_ENORM; }