00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #if 0
00021
00022 <lalVerbatim file="FrameDataCV">
00023 $Id: FrameData.c,v 1.11 2007/06/08 14:41:46 bema Exp $
00024 </lalVerbatim>
00025
00026 <lalLaTeX>
00027 \subsection{Module \texttt{FrameData.c}}
00028 \label{ss:FrameData.c}
00029
00030 Functions for reading frame data.
00031
00032 \subsubsection*{Prototypes}
00033 \vspace{0.1in}
00034 \input{FrameDataCP}
00035 \idx{LALInitializeFrameData()}
00036 \idx{LALFinalizeFrameData()}
00037 \idx{LALGetFrameData()}
00038 \idx{LALGetFrameDataResponse()}
00039
00040 \subsubsection*{Description}
00041
00042 The routine \texttt{LALInitializeFrameData()} searches for frame files in a
00043 specified directory and performs the necessary preparation for reading these
00044 files. When the user is finished reading frame data from the path, the
00045 routine \texttt{LALFinalizeFrameData()} should be called.
00046
00047 The routine \texttt{LALGetFrameData()} gets the next frame IFO\_DMRO data while
00048 the routine \texttt{LALGetFrameDataResponse()} gets the current response
00049 function. The routine \texttt{LALGetFrameDataResponse()} does a spline-fit to
00050 the sweptsine response of the instrument in order to get the response
00051 function.
00052
00053 If the output time series has a \texttt{NULL} data field, then
00054 \texttt{LALGetFrameData()} enters seek mode in which no data is returned but
00055 the frame data is advanced the required amount.
00056
00057 \subsubsection*{Operating Instructions}
00058
00059 \begin{verbatim}
00060 const UINT4 numPoints = 1024;
00061 const CHAR *framePath = "/data/frames";
00062 static Status status;
00063 static FrameData frameData;
00064 static INT2TimeSeries dmro;
00065 static COMPLEX8FrequencySeries resp;
00066
00067 LALI2CreateVector( &status, &dmro.data, numPoints );
00068 LALCCreateVector( &status, &resp.data, numPoints/2 + 1 );
00069 LALInitializeFrameData( &status, &frameData, framePath );
00070
00071
00072 while ( 1 )
00073 {
00074 LALGetFrameData( &status, &dmro, frameData );
00075
00076
00077 if ( frameData->endOfData )
00078 {
00079 break;
00080 }
00081
00082
00083 if ( frameData->newCalibration )
00084 {
00085 LALGetFrameDataResponse( &status, &resp, frameData );
00086 }
00087
00088
00089 if ( frameData->newLock )
00090 {
00091 INT2TimeSeries seek;
00092 INT2Vector svec;
00093
00094 svec.length = 180/dmro.deltaT;
00095 svec.data = NULL;
00096 seek.data = &svec;
00097 LALGetFrameData( &status, &seek, frameData );
00098
00099
00100 if ( frameData->endOfData )
00101 {
00102 break;
00103 }
00104
00105
00106 if ( frameData->newCalibration )
00107 {
00108 LALGetFrameDataResponse( &status, &resp, frameData );
00109 }
00110
00111
00112 continue;
00113 }
00114
00115
00116
00117 }
00118
00119 LALFinalizeFrameData( &status, &frameData );
00120 LALCDestroyVector( &status, &resp.data );
00121 LALI2DestroyVector( &status, &dmro.data );
00122 \end{verbatim}
00123
00124 \subsubsection*{Algorithm}
00125
00126 \subsubsection*{Uses}
00127
00128 \subsubsection*{Notes}
00129 \vfill{\footnotesize\input{FrameDataCV}}
00130
00131 </lalLaTeX>
00132
00133 #endif
00134
00135
00136 #include <stdio.h>
00137 #include <string.h>
00138 #include <math.h>
00139 #include <FrameL.h>
00140 #include <lal/LALStdlib.h>
00141 #include <lal/LALConstants.h>
00142 #include <lal/SeqFactories.h>
00143 #include <lal/FrameData.h>
00144
00145 NRCSID (FRAMEDATAC, "$Id: FrameData.c,v 1.11 2007/06/08 14:41:46 bema Exp $");
00146
00147
00148 void
00149 LALInitializeFrameData (
00150 LALStatus *status,
00151 FrameData **frameData,
00152 CHAR *framePath
00153 )
00154 {
00155 const CHAR *headNames[] = {"C1-*.F", "H-*.F", "H-*.T", "L-*.F",
00156 "L-*.T", "C1-*[0-9]"};
00157 const INT4 numHeadNames = 6;
00158 const INT4 maxNumFiles = 2048;
00159 const INT4 maxFileNameLength = 256;
00160
00161 CreateVectorSequenceIn frameFileNameIn;
00162 CHAR command[1024];
00163 INT4 nameType;
00164
00165 INITSTATUS (status, "LALInitializeFrameData", FRAMEDATAC);
00166 ATTATCHSTATUSPTR (status);
00167
00168
00169 ASSERT (framePath, status, FRAMEDATAH_ENULL, FRAMEDATAH_MSGENULL);
00170 ASSERT (frameData, status, FRAMEDATAH_ENULL, FRAMEDATAH_MSGENULL);
00171 ASSERT (!(*frameData), status, FRAMEDATAH_ENNUL, FRAMEDATAH_MSGENNUL);
00172
00173
00174 *frameData = LALCalloc (1, sizeof(FrameData));
00175 ASSERT (*frameData, status, FRAMEDATAH_ENULL, FRAMEDATAH_MSGENULL);
00176
00177
00178 FrLibIni (NULL, stderr, 0);
00179
00180
00181 (*frameData)->dataBreak = 1;
00182 (*frameData)->newLock = 1;
00183 (*frameData)->inLock = 1;
00184
00185
00186
00187 frameFileNameIn.length = maxNumFiles;
00188 frameFileNameIn.vectorLength = maxFileNameLength;
00189 LALCHARCreateVectorSequence (
00190 status->statusPtr,
00191 &(*frameData)->frameFileNames,
00192 &frameFileNameIn
00193 );
00194 CHECKSTATUSPTR (status);
00195
00196
00197 for (nameType = 0; nameType < numHeadNames; ++nameType)
00198 {
00199 FILE *fp;
00200 INT4 nbytes;
00201 INT4 numFiles;
00202
00203
00204 nbytes = sprintf (command, "ls %s/%s 2>/dev/null",
00205 framePath, headNames[nameType]);
00206 ASSERT (nbytes > 0, status, FRAMEDATAH_EREAD, FRAMEDATAH_MSGEREAD);
00207 ASSERT (nbytes < (INT4)sizeof(command), status,
00208 FRAMEDATAH_EREAD, FRAMEDATAH_MSGEREAD);
00209
00210
00211 fp = popen (command, "r");
00212 ASSERT (fp, status, FRAMEDATAH_EREAD, FRAMEDATAH_MSGEREAD);
00213
00214
00215 numFiles = (*frameData)->numFiles;
00216 while (numFiles < maxNumFiles)
00217 {
00218 CHAR *fileName;
00219 fileName = (*frameData)->frameFileNames->data;
00220 fileName += numFiles*maxFileNameLength;
00221 if (EOF == fscanf (fp, "%s\n", fileName))
00222 break;
00223 ASSERT ((INT4)strlen(fileName) < maxFileNameLength, status,
00224 FRAMEDATAH_EREAD, FRAMEDATAH_MSGEREAD);
00225 ++numFiles;
00226 }
00227 (*frameData)->numFiles = numFiles;
00228
00229 pclose (fp);
00230 }
00231 ASSERT ((*frameData)->numFiles > 0, status,
00232 FRAMEDATAH_EREAD, FRAMEDATAH_MSGEREAD);
00233 ASSERT ((*frameData)->numFiles < maxNumFiles, status,
00234 FRAMEDATAH_EREAD, FRAMEDATAH_MSGEREAD);
00235
00236 DETATCHSTATUSPTR (status);
00237 RETURN (status);
00238 }
00239
00240
00241
00242 void
00243 LALFinalizeFrameData (
00244 LALStatus *status,
00245 FrameData **frameData
00246 )
00247 {
00248 INITSTATUS (status, "LALFinalizeFrameData", FRAMEDATAC);
00249 ATTATCHSTATUSPTR (status);
00250
00251
00252 ASSERT (frameData, status, FRAMEDATAH_ENULL, FRAMEDATAH_MSGENULL);
00253 ASSERT (*frameData, status, FRAMEDATAH_ENULL, FRAMEDATAH_MSGENULL);
00254
00255
00256 if ((*frameData)->frame)
00257 {
00258 FrameFree ((struct FrameH *)((*frameData)->frame));
00259 }
00260
00261
00262 if ((*frameData)->fileOpen)
00263 {
00264 FrFileOEnd ((*frameData)->frameFile);
00265 }
00266
00267
00268 LALCHARDestroyVectorSequence (status->statusPtr, &(*frameData)->frameFileNames);
00269 CHECKSTATUSPTR (status);
00270
00271
00272 LALFree (*frameData);
00273 *frameData = NULL;
00274
00275 DETATCHSTATUSPTR (status);
00276 RETURN (status);
00277 }
00278
00279
00280 static void
00281 GetNewFrame (
00282 LALStatus *status,
00283 FrameData *frameData
00284 )
00285 {
00286 const REAL4 resolution = 3.2e-3;
00287
00288 INITSTATUS (status, "GetNewFrame", FRAMEDATAC);
00289
00290
00291 ASSERT (frameData, status, FRAMEDATAH_ENULL, FRAMEDATAH_MSGENULL);
00292
00293
00294 if (frameData->frame)
00295 {
00296 FrameFree ((struct FrameH *)(frameData->frame));
00297 }
00298
00299
00300 frameData->frame = FrameRead ((struct FrFile *)(frameData->frameFile));
00301
00302 if (frameData->frame)
00303 {
00304 struct FrameH *frame = frameData->frame;
00305 struct FrAdcData *dmro;
00306 struct FrAdcData *lock;
00307 REAL8 startTime;
00308 REAL8 finishTime;
00309 INT4 oldCalibTime;
00310 INT4 newCalibTime;
00311
00312
00313 oldCalibTime = frameData->calibrationTime.gpsSeconds;
00314
00315
00316 {
00317 char name[]="sweptsine";
00318 frameData->calibration =
00319 FrStatDataFind (frame->detectProc, name, frame->GTimeS);
00320 }
00321 ASSERT (frameData->calibration, status,
00322 FRAMEDATAH_ENOSS, FRAMEDATAH_MSGENOSS);
00323
00324
00325 newCalibTime = ((struct FrStatData *)(frameData->calibration))->timeStart;
00326
00327
00328 if (newCalibTime != oldCalibTime)
00329 {
00330 frameData->calibrationTime.gpsSeconds = newCalibTime;
00331 frameData->calibrationTime.gpsNanoSeconds = 0;
00332 frameData->newCalibration = 1;
00333 }
00334
00335
00336 {
00337 char name[]="IFO_DMRO";
00338 frameData->dmro = dmro = FrAdcDataFind (frame, name);
00339 }
00340 ASSERT (dmro, status, FRAMEDATAH_EDMRO, FRAMEDATAH_MSGEDMRO);
00341
00342 frameData->numDmro = dmro->data->nData;
00343 frameData->curDmro = 0;
00344
00345
00346 {
00347 char name[]="IFO_Lock";
00348 frameData->lock = lock = FrAdcDataFind (frame, name);
00349 }
00350 ASSERT (lock, status, FRAMEDATAH_ELOCK, FRAMEDATAH_MSGELOCK);
00351
00352 frameData->numLock = lock->data->nData;
00353 frameData->curLock = 0;
00354
00355
00356 frameData->ratio = frameData->numDmro/frameData->numLock;
00357
00358
00359 {
00360 char name[] = "locklo/lockhi";
00361 frameData->lockLowHigh =
00362 FrStatDataFind (frame->detectProc, name, frame->GTimeS);
00363 }
00364 ASSERT (frameData->lockLowHigh, status,
00365 FRAMEDATAH_ELOHI, FRAMEDATAH_MSGELOHI);
00366
00367 frameData->lockLow =
00368 ((struct FrStatData *)(frameData->lockLowHigh))->data->dataS[0];
00369 frameData->lockHigh =
00370 ((struct FrStatData *)(frameData->lockLowHigh))->data->dataS[1];
00371
00372
00373 frameData->sampleRate = dmro->sampleRate;
00374
00375
00376 frameData->frameStartTime.gpsSeconds = frame->GTimeS;
00377 frameData->frameStartTime.gpsNanoSeconds = frame->GTimeN;
00378
00379
00380 startTime = frameData->frameStartTime.gpsSeconds
00381 + 1e-9*frameData->frameStartTime.gpsNanoSeconds;
00382 finishTime = frameData->frameFinishTime.gpsSeconds
00383 + 1e-9*frameData->frameFinishTime.gpsNanoSeconds;
00384 if (!frameData->dataBreak && fabs(startTime - finishTime) > resolution)
00385 {
00386 frameData->dataBreak = 1;
00387 }
00388 else
00389 {
00390 frameData->dataBreak = 0;
00391 }
00392
00393
00394 finishTime = startTime + frame->dt;
00395 frameData->frameFinishTime.gpsSeconds = (INT4)finishTime;
00396 frameData->frameFinishTime.gpsNanoSeconds = (INT4)fmod(1e9*finishTime, 1e9);
00397 }
00398 else
00399 {
00400
00401 FrFileOEnd (frameData->frameFile);
00402 frameData->fileOpen = 0;
00403 }
00404
00405 RETURN (status);
00406 }
00407
00408
00409
00410 void
00411 LALGetFrameData (
00412 LALStatus *status,
00413 INT2TimeSeries *data,
00414 FrameData *frameData
00415 )
00416 {
00417 INT4 seek = 0;
00418 INT4 brokenLock = 0;
00419 INT4 numPoints;
00420 INT4 needed;
00421
00422 INITSTATUS (status, "LALGetFrameData", FRAMEDATAC);
00423 ATTATCHSTATUSPTR (status);
00424
00425
00426 ASSERT (frameData, status, FRAMEDATAH_ENULL, FRAMEDATAH_MSGENULL);
00427 ASSERT (data, status, FRAMEDATAH_ENULL, FRAMEDATAH_MSGENULL);
00428 ASSERT (data->data, status, FRAMEDATAH_ENULL, FRAMEDATAH_MSGENULL);
00429 numPoints = data->data->length;
00430 ASSERT (numPoints, status, FRAMEDATAH_ESIZE, FRAMEDATAH_MSGESIZE);
00431
00432
00433 if (data->data->data == NULL)
00434 {
00435 seek = 1;
00436 }
00437
00438
00439 needed = numPoints;
00440 frameData->newCalibration = 0;
00441
00442
00443 while (needed > 0)
00444 {
00445
00446
00447 if (!frameData->fileOpen)
00448 {
00449 CHAR *fileName;
00450
00451
00452 if (frameData->fileNum >= frameData->numFiles)
00453 {
00454
00455 frameData->endOfData = 1;
00456 DETATCHSTATUSPTR (status);
00457 RETURN (status);
00458 }
00459
00460
00461 fileName = frameData->frameFileNames->data;
00462 fileName += frameData->fileNum*frameData->frameFileNames->vectorLength;
00463 frameData->frameFile = FrFileINew (fileName);
00464 ASSERT (frameData->frameFile, status,
00465 FRAMEDATAH_EOPEN, FRAMEDATAH_MSGEOPEN);
00466 frameData->fileOpen = 1;
00467 ++frameData->fileNum;
00468 }
00469
00470
00471 if (frameData->numDmro > frameData->curDmro)
00472 {
00473 short *dmroData;
00474 short *lockData;
00475 INT4 top;
00476 INT4 imax;
00477 INT4 i;
00478
00479 dmroData = ((struct FrAdcData *)(frameData->dmro))->data->dataS;
00480 lockData = ((struct FrAdcData *)(frameData->lock))->data->dataS;
00481
00482
00483 top = (frameData->curDmro + needed)/frameData->ratio;
00484 if (top%frameData->ratio != 0)
00485 ++top;
00486 imax = (top < frameData->numLock ? top : frameData->numLock);
00487
00488
00489 i = frameData->curLock;
00490 while (frameData->inLock && i < imax)
00491 {
00492 if (lockData[i] < frameData->lockLow)
00493 break;
00494 if (lockData[i] > frameData->lockHigh)
00495 break;
00496 ++i;
00497 }
00498
00499
00500 if (frameData->inLock && i < imax)
00501 {
00502 imax = frameData->numLock;
00503 while (i < imax)
00504 {
00505 if (lockData[i] >= frameData->lockLow
00506 && lockData[i] <= frameData->lockHigh)
00507 break;
00508 ++i;
00509 }
00510 frameData->curLock = i;
00511 frameData->curDmro = i*frameData->ratio;
00512 brokenLock = 1;
00513 needed = numPoints;
00514 }
00515 else
00516 {
00517 INT4 remaining = frameData->numDmro - frameData->curDmro;
00518 INT4 ncopy = remaining < needed ? remaining : needed;
00519 INT4 wordSize = ((struct FrAdcData *)(frameData->dmro))->data->wSize;
00520 INT4 wordRatio = wordSize > (INT4)sizeof(INT2) ? wordSize/sizeof(INT2) : 1;
00521
00522
00523 if (!seek)
00524 {
00525 INT2 *location = data->data->data + (numPoints - needed)*wordRatio;
00526 memcpy (location, dmroData + frameData->curDmro, ncopy*wordSize);
00527 }
00528
00529
00530 if (needed == numPoints)
00531 {
00532 REAL8 starttime;
00533 starttime = frameData->frameStartTime.gpsSeconds;
00534 starttime += 1e-9*frameData->frameStartTime.gpsNanoSeconds;
00535 starttime += frameData->curDmro/frameData->sampleRate;
00536 data->epoch.gpsSeconds = (INT4)starttime;
00537 data->epoch.gpsNanoSeconds = (INT4)fmod(1e9*starttime, 1e9);
00538 data->deltaT = 1/frameData->sampleRate;
00539 data->f0 = 0;
00540 }
00541
00542
00543 needed -= ncopy;
00544 frameData->curDmro += ncopy;
00545 frameData->curLock = frameData->curDmro/frameData->ratio;
00546 }
00547
00548 }
00549 else
00550 {
00551 GetNewFrame (status->statusPtr, frameData);
00552 CHECKSTATUSPTR (status);
00553
00554
00555 if (frameData->dataBreak)
00556 {
00557 brokenLock = 1;
00558 needed = numPoints;
00559 }
00560 }
00561
00562 }
00563
00564
00565 if (brokenLock == 1)
00566 {
00567 frameData->newLock = 1;
00568 }
00569 else
00570 {
00571 frameData->newLock = 0;
00572 }
00573
00574 DETATCHSTATUSPTR (status);
00575 RETURN (status);
00576 }
00577
00578
00579
00580 static void
00581 SplineFit (
00582 LALStatus *status,
00583 REAL4Vector *yout,
00584 REAL4Vector *yinp,
00585 REAL4Vector *xinp
00586 )
00587 {
00588 REAL4Vector *yppvec = NULL;
00589 REAL4 *ypp;
00590 UINT4 n;
00591
00592 INITSTATUS (status, "SplineFit", FRAMEDATAC);
00593 ATTATCHSTATUSPTR (status);
00594
00595
00596
00597 ASSERT (yout, status, FRAMEDATAH_ENULL, FRAMEDATAH_MSGENULL);
00598 ASSERT (yout->data, status, FRAMEDATAH_ENULL, FRAMEDATAH_MSGENULL);
00599 ASSERT (yout->length > 2, status, FRAMEDATAH_ESIZE, FRAMEDATAH_MSGESIZE);
00600
00601 ASSERT (yinp, status, FRAMEDATAH_ENULL, FRAMEDATAH_MSGENULL);
00602 ASSERT (yinp->data, status, FRAMEDATAH_ENULL, FRAMEDATAH_MSGENULL);
00603 n = yinp->length;
00604 ASSERT (n > 2, status, FRAMEDATAH_ESIZE, FRAMEDATAH_MSGESIZE);
00605
00606 ASSERT (xinp, status, FRAMEDATAH_ENULL, FRAMEDATAH_MSGENULL);
00607 ASSERT (xinp->data, status, FRAMEDATAH_ENULL, FRAMEDATAH_MSGENULL);
00608 ASSERT (xinp->length == n, status, FRAMEDATAH_ESIZE, FRAMEDATAH_MSGESIZE);
00609
00610
00611 LALCreateVector (status->statusPtr, &yppvec, n);
00612 CHECKSTATUSPTR (status);
00613 ypp = yppvec->data;
00614
00615 {
00616
00617 REAL4Vector *uvec = NULL;
00618 REAL4 *u;
00619
00620 REAL4 *x = xinp->data;
00621 REAL4 *y = yinp->data;
00622
00623 UINT4 i;
00624 INT4 j;
00625
00626 LALCreateVector (status->statusPtr, &uvec, n);
00627 CHECKSTATUSPTR (status);
00628 u = uvec->data;
00629
00630
00631 ypp[0] = u[0] = 0;
00632 for (i = 1; i < n - 1; ++i)
00633 {
00634 REAL4 dx0 = x[i] - x[i-1];
00635 REAL4 dx1 = x[i+1] - x[i];
00636 REAL4 dx2 = x[i+1] - x[i-1];
00637 REAL4 dy0 = y[i] - y[i-1];
00638 REAL4 dy1 = y[i+1] - y[i];
00639 REAL4 ddydx = dy1/dx1 - dy0/dx0;
00640 REAL4 sigma = dx0/dx2;
00641 REAL4 fac = 1/(sigma*ypp[i-1] + 2);
00642
00643 ypp[i] = fac*(sigma - 1);
00644 u[i] = fac*(6*ddydx/dx2 - sigma*u[i-1]);
00645 }
00646
00647
00648 ypp[n-1] = 0;
00649 for (j = n - 2; j >= 0; --j)
00650 {
00651 ypp[j] = ypp[j]*ypp[j+1] + u[j];
00652 }
00653
00654 LALDestroyVector (status->statusPtr, &uvec);
00655 CHECKSTATUSPTR (status);
00656
00657 }
00658
00659 {
00660
00661 REAL4 *x = xinp->data;
00662 REAL4 *y = yinp->data;
00663 REAL4 dx = (x[n - 1] - x[0])/(yout->length - 1);
00664
00665 UINT4 i;
00666 UINT4 j = 0;
00667
00668 for (i = 0; i < yout->length; ++i)
00669 {
00670 REAL4 xx = x[0] + i*dx;
00671 REAL4 a;
00672 REAL4 b;
00673 REAL4 c;
00674 REAL4 d;
00675 REAL4 h;
00676 REAL4 dx0;
00677 REAL4 dx1;
00678
00679 while (j < n - 1 && x[j] <= xx)
00680 {
00681 ++j;
00682 }
00683
00684 h = x[j] - x[j-1];
00685 dx0 = xx - x[j-1];
00686 dx1 = x[j] - xx;
00687 a = dx1/h;
00688 b = dx0/h;
00689 c = dx1*(dx1*a - h)/6;
00690 d = dx0*(dx0*b - h)/6;
00691
00692 yout->data[i] = a*y[j-1] + b*y[j] + c*ypp[j-1] + d*ypp[j];
00693 }
00694
00695 }
00696
00697 LALDestroyVector (status->statusPtr, &yppvec);
00698 CHECKSTATUSPTR (status);
00699
00700 DETATCHSTATUSPTR (status);
00701 RETURN (status);
00702 }
00703
00704
00705
00706 void
00707 LALGetFrameDataResponse (
00708 LALStatus *status,
00709 COMPLEX8FrequencySeries *response,
00710 FrameData *frameData
00711 )
00712 {
00713 REAL4Vector *re = NULL;
00714 REAL4Vector *im = NULL;
00715 REAL4Vector x;
00716 REAL4Vector y;
00717
00718 REAL4 factor;
00719
00720 REAL4 *fri;
00721 REAL4 *ssf;
00722 REAL4 *ssr;
00723 REAL4 *ssi;
00724 INT4 ssn;
00725 INT4 n;
00726 UINT4 i;
00727
00728 INITSTATUS (status, "LALGetFrameDataResponse", FRAMEDATAC);
00729 ATTATCHSTATUSPTR (status);
00730
00731 ASSERT (frameData, status, FRAMEDATAH_ENULL, FRAMEDATAH_MSGENULL);
00732 ASSERT (response, status, FRAMEDATAH_ENULL, FRAMEDATAH_MSGENULL);
00733 ASSERT (response->data, status, FRAMEDATAH_ENULL, FRAMEDATAH_MSGENULL);
00734 ASSERT (response->data->data, status, FRAMEDATAH_ENULL, FRAMEDATAH_MSGENULL);
00735 ASSERT (response->data->length > 2, status,
00736 FRAMEDATAH_ESIZE, FRAMEDATAH_MSGESIZE);
00737
00738 fri = ((struct FrStatData *)(frameData->calibration))->data->dataF;
00739 n = ((struct FrStatData *)(frameData->calibration))->data->nData;
00740 ssn = n/3;
00741 ssf = fri;
00742 ssr = ssf + ssn;
00743 ssi = ssr + ssn;
00744 ASSERT (ssn > 2, status, FRAMEDATAH_ESSSZ, FRAMEDATAH_MSGESSSZ);
00745
00746 LALCreateVector (status->statusPtr, &re, response->data->length);
00747 CHECKSTATUSPTR (status);
00748 LALCreateVector (status->statusPtr, &im, response->data->length);
00749 CHECKSTATUSPTR (status);
00750
00751 x.data = ssf;
00752 x.length = ssn;
00753 y.length = ssn;
00754
00755
00756 y.data = ssr;
00757 SplineFit (status->statusPtr, re, &y, &x);
00758 CHECKSTATUSPTR (status);
00759
00760
00761 y.data = ssi;
00762 SplineFit (status->statusPtr, im, &y, &x);
00763 CHECKSTATUSPTR (status);
00764
00765 factor = sqrt(9.35);
00766 factor /= 21399;
00767 factor *= 10/(REAL4)2048;
00768 factor /= -4*LAL_PI*LAL_PI;
00769
00770
00771 response->data->data[0].re = response->data->data[0].im = 0;
00772
00773
00774 for (i = 1; i < response->data->length; ++i)
00775 {
00776 REAL4 f = 0.5*i*frameData->sampleRate/response->data->length;
00777 REAL4 fsq = f*f;
00778 REAL4 ssre = re->data[i];
00779 REAL4 ssim = im->data[i];
00780 REAL4 ssmod = ssre*ssre + ssim*ssim;
00781 REAL4 fac = factor/(fsq*ssmod);
00782
00783 response->data->data[i].re = fac*ssre;
00784 response->data->data[i].im = fac*ssim;
00785 }
00786
00787 response->epoch = frameData->calibrationTime;
00788 response->f0 = 0;
00789 response->deltaF = 0.5*frameData->sampleRate/response->data->length;
00790
00791 LALDestroyVector (status->statusPtr, &re);
00792 CHECKSTATUSPTR (status);
00793 LALDestroyVector (status->statusPtr, &im);
00794 CHECKSTATUSPTR (status);
00795
00796 DETATCHSTATUSPTR (status);
00797 RETURN (status);
00798 }