FrameData.c

Go to the documentation of this file.
00001 /*
00002 *  Copyright (C) 2007 Jolien Creighton
00003 *
00004 *  This program is free software; you can redistribute it and/or modify
00005 *  it under the terms of the GNU General Public License as published by
00006 *  the Free Software Foundation; either version 2 of the License, or
00007 *  (at your option) any later version.
00008 *
00009 *  This program is distributed in the hope that it will be useful,
00010 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012 *  GNU General Public License for more details.
00013 *
00014 *  You should have received a copy of the GNU General Public License
00015 *  along with with program; see the file COPYING. If not, write to the
00016 *  Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
00017 *  MA  02111-1307  USA
00018 */
00019 
00020 #if 0  /* autodoc block */
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 /* infinite loop reading frame data */
00072 while ( 1 )
00073 {
00074   LALGetFrameData( &status, &dmro, frameData );
00075 
00076   /* break out of loop if end of data */
00077   if ( frameData->endOfData )
00078   {
00079     break;
00080   }
00081 
00082   /* get response function if new calibration info */
00083   if ( frameData->newCalibration )
00084   {
00085     LALGetFrameDataResponse( &status, &resp, frameData );
00086   }
00087 
00088   /* seek 3 minutes into each new locked section */
00089   if ( frameData->newLock )
00090   {
00091     INT2TimeSeries seek;
00092     INT2Vector     svec;
00093 
00094     svec.length = 180/dmro.deltaT; /* 3 minutes */
00095     svec.data   = NULL;            /* seek mode */
00096     seek.data   = &svec;
00097     LALGetFrameData( &status, &seek, frameData );
00098 
00099     /* break out of loop if end of data */
00100     if ( frameData->endOfData )
00101     {
00102       break;
00103     }
00104 
00105     /* get response function if new calibration info */
00106     if ( frameData->newCalibration )
00107     {
00108       LALGetFrameDataResponse( &status, &resp, frameData );
00109     }
00110 
00111     /* go back to the beginning of the infinite loop */
00112     continue;
00113   }
00114 
00115   /* do something with the data here */
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 /* autodoc block */
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 /* <lalVerbatim file="FrameDataCP"> */
00148 void
00149 LALInitializeFrameData (
00150     LALStatus  *status,
00151     FrameData **frameData,
00152     CHAR       *framePath
00153     )
00154 { /* </lalVerbatim> */
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   /* make sure arguments are reasonable */
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   /* allocate memory */
00174   *frameData = LALCalloc (1, sizeof(FrameData));
00175   ASSERT (*frameData, status, FRAMEDATAH_ENULL, FRAMEDATAH_MSGENULL);
00176 
00177   /* debuglevel zero: don't report errors */
00178   FrLibIni (NULL, stderr, 0);
00179 
00180   /* set some flags and modes */
00181   (*frameData)->dataBreak = 1;
00182   (*frameData)->newLock   = 1;
00183   (*frameData)->inLock    = 1;
00184 
00185   /* set up frame files */
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   /* search directory for frame files */
00197   for (nameType = 0; nameType < numHeadNames; ++nameType)
00198   {
00199     FILE *fp;
00200     INT4  nbytes;
00201     INT4  numFiles;
00202 
00203     /* command to list frame files of current name type */
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     /* fp is a stream containing the filenames */
00211     fp = popen (command, "r");
00212     ASSERT (fp, status, FRAMEDATAH_EREAD, FRAMEDATAH_MSGEREAD);
00213 
00214     /* read the filenames into the stored filename list */
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 /* <lalVerbatim file="FrameDataCP"> */
00242 void
00243 LALFinalizeFrameData (
00244     LALStatus  *status,
00245     FrameData **frameData
00246     )
00247 { /* </lalVerbatim> */
00248   INITSTATUS (status, "LALFinalizeFrameData", FRAMEDATAC);
00249   ATTATCHSTATUSPTR (status);
00250 
00251   /* make sure argument is reasonable */
00252   ASSERT (frameData, status, FRAMEDATAH_ENULL, FRAMEDATAH_MSGENULL);
00253   ASSERT (*frameData, status, FRAMEDATAH_ENULL, FRAMEDATAH_MSGENULL);
00254 
00255   /* free an existing frame */
00256   if ((*frameData)->frame)
00257   {
00258     FrameFree ((struct FrameH *)((*frameData)->frame));
00259   }
00260 
00261   /* close an open file */
00262   if ((*frameData)->fileOpen)
00263   {
00264     FrFileOEnd ((*frameData)->frameFile);
00265   }
00266 
00267   /* destroy file name vector sequence */
00268   LALCHARDestroyVectorSequence (status->statusPtr, &(*frameData)->frameFileNames);
00269   CHECKSTATUSPTR (status);
00270 
00271   /* free memory */
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   /* make sure argument is not NULL */
00291   ASSERT (frameData, status, FRAMEDATAH_ENULL, FRAMEDATAH_MSGENULL);
00292 
00293   /* free an existing frame */
00294   if (frameData->frame)
00295   {
00296     FrameFree ((struct FrameH *)(frameData->frame));
00297   }
00298 
00299   /* get a new frame from the frame file */
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     /* set old calibration time */
00313     oldCalibTime = frameData->calibrationTime.gpsSeconds;
00314 
00315     /* get calibration info */
00316     {
00317       char name[]="sweptsine"; /* hack to get non-const string */
00318       frameData->calibration =
00319         FrStatDataFind (frame->detectProc, name, frame->GTimeS);
00320     }
00321     ASSERT (frameData->calibration, status,
00322             FRAMEDATAH_ENOSS, FRAMEDATAH_MSGENOSS);
00323 
00324     /* get new calibration time */
00325     newCalibTime = ((struct FrStatData *)(frameData->calibration))->timeStart;
00326 
00327     /* indicate if calibration data is new */
00328     if (newCalibTime != oldCalibTime)
00329     {
00330       frameData->calibrationTime.gpsSeconds     = newCalibTime;
00331       frameData->calibrationTime.gpsNanoSeconds = 0;
00332       frameData->newCalibration                 = 1;
00333     }
00334 
00335     /* get IFO_DMRO */
00336     {
00337       char name[]="IFO_DMRO"; /* hack to get non-const string */
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     /* get IFO_Lock */
00346     {
00347       char name[]="IFO_Lock"; /* hack to get non-const string */
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     /* ratio is number of IFO_DMRO samples to each IFO_Lock sample */
00356     frameData->ratio = frameData->numDmro/frameData->numLock;
00357 
00358     /* get lock-low and lock-high values */
00359     {
00360       char name[] = "locklo/lockhi"; /* hack to get non-const string */
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     /* get sample rate of IFO_DMRO */
00373     frameData->sampleRate = dmro->sampleRate;
00374 
00375     /* set start time for this frame */
00376     frameData->frameStartTime.gpsSeconds     = frame->GTimeS;
00377     frameData->frameStartTime.gpsNanoSeconds = frame->GTimeN;
00378 
00379     /* make sure frame data immediately follows previous frame's data */
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     /* set finish time for this frame */
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     /* no more frames in file: close the current frame file */
00401     FrFileOEnd (frameData->frameFile);
00402     frameData->fileOpen = 0;
00403   }
00404 
00405   RETURN (status);  
00406 }
00407 
00408 
00409 /* <lalVerbatim file="FrameDataCP"> */
00410 void
00411 LALGetFrameData (
00412     LALStatus      *status,
00413     INT2TimeSeries *data,
00414     FrameData      *frameData
00415     )
00416 { /* </lalVerbatim> */
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   /* make sure arguments are reasonable */
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   /* if data->data->data is NULL enter seek mode */
00433   if (data->data->data == NULL)
00434   {
00435     seek = 1;
00436   }
00437 
00438   /* initialize */
00439   needed = numPoints;
00440   frameData->newCalibration = 0;
00441 
00442   /* loop until all requested points are obtained */
00443   while (needed > 0)
00444   {
00445 
00446     /* do we need to open a new frame file? */
00447     if (!frameData->fileOpen)
00448     {
00449       CHAR *fileName;
00450 
00451       /* check to see if we have read all the files in list */
00452       if (frameData->fileNum >= frameData->numFiles)
00453       {
00454         /* we are done */
00455         frameData->endOfData = 1;
00456         DETATCHSTATUSPTR (status);
00457         RETURN (status);  
00458       }
00459 
00460       /* open next file in list */
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     /* are there points left in current frame? */
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       /* find next point in lock stream covering needed range */
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       /* scan to see if we drop out of lock during the interval */
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       /* did we drop out of lock (or do we care)? */
00500       if (frameData->inLock && i < imax) /* lost lock: look for return */
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 /* in lock or don't care: get data */
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         /* copy the data if desired */
00523         if (!seek)
00524         {
00525           INT2 *location = data->data->data + (numPoints - needed)*wordRatio;
00526           memcpy (location, dmroData + frameData->curDmro, ncopy*wordSize);
00527         }
00528 
00529         /* if starting buffer: mark start time and time step */
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         /* bookkeeping */
00543         needed  -= ncopy;
00544         frameData->curDmro += ncopy;
00545         frameData->curLock  = frameData->curDmro/frameData->ratio;
00546       }
00547 
00548     }
00549     else /* no more points left in current frame */
00550     {
00551       GetNewFrame (status->statusPtr, frameData);
00552       CHECKSTATUSPTR (status);
00553 
00554       /* check to see if there is a gap in the data */
00555       if (frameData->dataBreak)
00556       {
00557         brokenLock = 1;
00558         needed     = numPoints;
00559       }
00560     }
00561 
00562   }
00563 
00564   /* if lock was broken or there is a data gap, set newLock flag */
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   /* make sure arguments are reasonable */
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   /* create temporary vector */
00611   LALCreateVector (status->statusPtr, &yppvec, n);
00612   CHECKSTATUSPTR (status);
00613   ypp = yppvec->data;
00614 
00615   { /* setup second derivative array */
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     /* decomposition loop */
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     /* backsubstitution loop */
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   { /* do fit */
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 /* <lalVerbatim file="FrameDataCP"> */
00706 void
00707 LALGetFrameDataResponse (
00708     LALStatus               *status,
00709     COMPLEX8FrequencySeries *response,
00710     FrameData               *frameData
00711     )
00712 { /* </lalVerbatim> */
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   /* spline fit to real part */
00756   y.data = ssr;
00757   SplineFit (status->statusPtr, re, &y, &x);
00758   CHECKSTATUSPTR (status);
00759 
00760   /* spline fit to imagingary part */
00761   y.data = ssi;
00762   SplineFit (status->statusPtr, im, &y, &x);
00763   CHECKSTATUSPTR (status);
00764 
00765   factor  = sqrt(9.35);        /* square root bandwidth     */
00766   factor /= 21399;             /* Spero's constant k        */
00767   factor *= 10/(REAL4)2048;    /* volts IFO / ADC bit       */
00768   factor /= -4*LAL_PI*LAL_PI;  /* from two time derivatives */
00769 
00770   /* demand DC is zero */
00771   response->data->data[0].re = response->data->data[0].im = 0;
00772   
00773   /* other components (including possible Nyquist) */
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 }

Generated on Fri Aug 29 02:48:45 2008 for LAL by  doxygen 1.5.2