00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091 #include <math.h>
00092 #include <lal/LALStdio.h>
00093 #include <lal/LALStdlib.h>
00094 #include <lal/LALError.h>
00095 #include <lal/Units.h>
00096 #include <lal/Random.h>
00097 #include <lal/Inject.h>
00098
00099 NRCSID( INJECTTIMESERIESC, "$Id: InjectTimeSeries.c,v 1.10 2007/06/08 14:41:47 bema Exp $" );
00100
00101
00102 void
00103 LALSI2InjectTimeSeries( LALStatus *stat,
00104 INT2TimeSeries *output,
00105 REAL4TimeSeries *signal,
00106 RandomParams *params )
00107 {
00108 INT4 n;
00109 INT4 i;
00110 INT2 *outData;
00111 REAL8 dt;
00112 REAL8 offset;
00113
00114 RandomParams *internal = NULL;
00115
00116 const INT2 max = 32767;
00117 const INT2 min = -32768;
00118
00119 INITSTATUS( stat, "LALSI2InjectTimeSeries", INJECTTIMESERIESC );
00120 ATTATCHSTATUSPTR( stat );
00121
00122
00123 ASSERT( signal, stat, INJECTH_ENUL, INJECTH_MSGENUL );
00124 ASSERT( signal->data, stat, INJECTH_ENUL, INJECTH_MSGENUL );
00125 ASSERT( signal->data->data, stat, INJECTH_ENUL, INJECTH_MSGENUL );
00126 ASSERT( output, stat, INJECTH_ENUL, INJECTH_MSGENUL );
00127 ASSERT( output->data, stat, INJECTH_ENUL, INJECTH_MSGENUL );
00128 ASSERT( output->data->data, stat, INJECTH_ENUL, INJECTH_MSGENUL );
00129 outData = output->data->data;
00130
00131
00132 ASSERT( signal->deltaT != 0.0, stat, INJECTH_EBAD, INJECTH_MSGEBAD );
00133 dt = output->deltaT / signal->deltaT;
00134 ASSERT( dt != 0.0, stat, INJECTH_EBAD, INJECTH_MSGEBAD );
00135
00136
00137 {
00138 CHAR newName[LALNameLength];
00139 BOOLEAN unitsOK;
00140 LALUnitPair pair;
00141
00142 pair.unitOne = &(signal->sampleUnits);
00143 pair.unitTwo = &lalADCCountUnit;
00144 TRY( LALUnitCompare( stat->statusPtr, &unitsOK, &pair ), stat );
00145 ASSERT( unitsOK, stat, INJECTH_EUNIT, INJECTH_MSGEUNIT );
00146 pair.unitOne = &(output->sampleUnits);
00147 TRY( LALUnitCompare( stat->statusPtr, &unitsOK, &pair ), stat );
00148 ASSERT( unitsOK, stat, INJECTH_EUNIT, INJECTH_MSGEUNIT );
00149 LALSnprintf( newName, LALNameLength, "%s plus %s", output->name,
00150 signal->name );
00151 memcpy( output->name, newName, LALNameLength*sizeof(CHAR) );
00152 }
00153
00154
00155 if ( !params )
00156 TRY( LALCreateRandomParams( stat->statusPtr, &internal, 0 ),
00157 stat );
00158 else
00159 internal = params;
00160
00161
00162 offset = ( output->epoch.gpsSeconds - signal->epoch.gpsSeconds ) /
00163 signal->deltaT;
00164 offset += ( output->epoch.gpsNanoSeconds -
00165 signal->epoch.gpsNanoSeconds ) * 1.0e-9 /
00166 signal->deltaT;
00167
00168
00169
00170 i = (INT4)( -offset / dt );
00171 if ( i < 0 )
00172 i = 0;
00173 while ( offset + i*dt < 0.0 )
00174 i++;
00175 if ( i >= (INT4)( output->data->length ) )
00176 LALWarning( stat, "Signal starts after the end of the output"
00177 " time series." );
00178
00179
00180
00181 n = (INT4)( ( signal->data->length - offset ) / dt );
00182 if ( n > (INT4)( output->data->length ) )
00183 n = output->data->length;
00184 while ( offset + n*dt > signal->data->length )
00185 n--;
00186 if ( n <= 0 )
00187 LALWarning( stat, "Signal ends before the start of the output"
00188 " time series." );
00189
00190
00191 for ( ; i < n; i++ ) {
00192 REAL4 x = (REAL4)( outData[i] );
00193 REAL4 d;
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203 INT4 j = (INT4)floor( offset + i*dt + 0.5 );
00204 REAL4 y = signal->data->data[j];
00205
00206
00207 LALUniformDeviate( stat->statusPtr, &d, internal );
00208 BEGINFAIL( stat )
00209 if ( !params ) {
00210 TRY( LALDestroyRandomParams( stat->statusPtr, &internal ),
00211 stat );
00212 }
00213 ENDFAIL( stat );
00214
00215
00216 x += d + y;
00217 if ( x > max )
00218 outData[i] = max;
00219 else if ( x < min )
00220 outData[i] = min;
00221 else
00222 outData[i] = (INT2)( floor( x ) );
00223 }
00224
00225
00226 if ( !params ) {
00227 TRY( LALDestroyRandomParams( stat->statusPtr, &internal ), stat );
00228 }
00229 DETATCHSTATUSPTR( stat );
00230 RETURN( stat );
00231 }
00232
00233
00234
00235 void
00236 LALSSInjectTimeSeries( LALStatus *stat,
00237 REAL4TimeSeries *output,
00238 REAL4TimeSeries *signal )
00239 {
00240 INT4 n;
00241 INT4 i;
00242 REAL4 *outData;
00243 REAL8 dt;
00244 REAL8 offset;
00245
00246
00247 INITSTATUS( stat, "LALSSInjectTimeSeries", INJECTTIMESERIESC );
00248 ATTATCHSTATUSPTR( stat );
00249
00250
00251 ASSERT( signal, stat, INJECTH_ENUL, INJECTH_MSGENUL );
00252 ASSERT( signal->data, stat, INJECTH_ENUL, INJECTH_MSGENUL );
00253 ASSERT( signal->data->data, stat, INJECTH_ENUL, INJECTH_MSGENUL );
00254 ASSERT( output, stat, INJECTH_ENUL, INJECTH_MSGENUL );
00255 ASSERT( output->data, stat, INJECTH_ENUL, INJECTH_MSGENUL );
00256 ASSERT( output->data->data, stat, INJECTH_ENUL, INJECTH_MSGENUL );
00257 outData = output->data->data;
00258
00259
00260 ASSERT( signal->deltaT != 0.0, stat, INJECTH_EBAD, INJECTH_MSGEBAD );
00261 dt = output->deltaT / signal->deltaT;
00262 ASSERT( dt != 0.0, stat, INJECTH_EBAD, INJECTH_MSGEBAD );
00263
00264
00265 {
00266 CHAR newName[LALNameLength];
00267 BOOLEAN unitsOK;
00268 LALUnitPair pair;
00269
00270 pair.unitOne = &(signal->sampleUnits);
00271 pair.unitTwo = &lalADCCountUnit;
00272 TRY( LALUnitCompare( stat->statusPtr, &unitsOK, &pair ), stat );
00273 ASSERT( unitsOK, stat, INJECTH_EUNIT, INJECTH_MSGEUNIT );
00274 pair.unitOne = &(output->sampleUnits);
00275 TRY( LALUnitCompare( stat->statusPtr, &unitsOK, &pair ), stat );
00276 ASSERT( unitsOK, stat, INJECTH_EUNIT, INJECTH_MSGEUNIT );
00277 LALSnprintf( newName, LALNameLength, "%s plus %s", output->name,
00278 signal->name );
00279 memcpy( output->name, newName, LALNameLength*sizeof(CHAR) );
00280 }
00281
00282
00283 offset = ( output->epoch.gpsSeconds - signal->epoch.gpsSeconds ) /
00284 signal->deltaT;
00285 offset += ( output->epoch.gpsNanoSeconds -
00286 signal->epoch.gpsNanoSeconds ) * 1.0e-9 /
00287 signal->deltaT;
00288
00289
00290
00291 i = (INT4)( -offset / dt );
00292 if ( i < 0 )
00293 i = 0;
00294 while ( offset + i*dt < 0.0 )
00295 i++;
00296 if ( i >= (INT4)( output->data->length ) )
00297 LALWarning( stat, "Signal starts after the end of the output"
00298 " time series." );
00299
00300
00301
00302 n = (INT4)( ( signal->data->length - offset ) / dt );
00303 if ( n > (INT4)( output->data->length ) )
00304 n = output->data->length;
00305 while ( offset + n*dt > signal->data->length )
00306 n--;
00307 if ( n <= 0 )
00308 LALWarning( stat, "Signal ends before the start of the output"
00309 " time series." );
00310
00311
00312 for ( ; i < n; i++ ) {
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322 INT4 j = (INT4)floor( offset + i*dt + 0.5 );
00323 REAL4 y = signal->data->data[j];
00324
00325
00326 outData[i] += y;
00327 }
00328
00329
00330 DETATCHSTATUSPTR( stat );
00331 RETURN( stat );
00332 }