BurstProcess.c

Go to the documentation of this file.
00001 /*
00002 *  Copyright (C) 2007 Julien Sylvestre
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 #include <stdio.h>
00021 #include <stdlib.h>
00022 #include <metaio.h>
00023 #include <string.h>
00024 #include <strings.h>
00025 #include <unistd.h>
00026 #include <math.h>
00027 #include <time.h>
00028 #include <BurstProcess.h>
00029 /*
00030 #include <libgen.h>
00031 */
00032 #include <sys/types.h>
00033 #include <regex.h>
00034 
00035 #define LIGOMETA_IFO_MAX 3
00036 #define LIGOMETA_SEARCH_MAX 25
00037 #define LIGOMETA_CHANNEL_MAX 65
00038 
00039 #define BUFSIZE 65536
00040 
00041 #ifdef linux
00042 static void endian_swap(char * pdata, int dsize, int nelements);
00043 #endif
00044 
00045 /******************************************************************/
00046 int BackFunNumberOfUnclusteredEvents(
00047                                      char **info,
00048                                      SnglBurstTableC *input,
00049                                      void *parameters,
00050                                      BurstSegParams *bparams
00051                                      ) {
00052   BackFunNumberOfUnclusteredEventsParams *params = (BackFunNumberOfUnclusteredEventsParams *)parameters;
00053 
00054   SnglBurstTableC *ptr;
00055 
00056   int i;
00057 
00058   (params->nSegments)++;
00059 
00060   if(params->Nbands == 0) {
00061 
00062     ptr = input->next;
00063     while(ptr) {
00064       (params->nBursts)++;
00065       ptr = ptr->next;
00066     }
00067 
00068     if(!(*info)) {
00069       *info = (char *)calloc(256,sizeof(char));
00070     }
00071 
00072     sprintf(*info,"%i,%i",params->nBursts,params->nSegments);
00073   } else {
00074 
00075     ptr = input->next;
00076     while(ptr) {
00077 
00078       for(i=0;i<params->Nbands;i++) {
00079         if(ptr->central_freq - ptr->bandwidth/2.0 <= params->Fbands[i+1] &&
00080            ptr->central_freq + ptr->bandwidth/2.0 >= params->Fbands[i]) {   
00081           (params->nBurstsBands[i])++;
00082         }
00083       }
00084 
00085       ptr = ptr->next;
00086 
00087     }
00088 
00089     if(!(*info)) {
00090       *info = (char *)calloc(1024,sizeof(char));
00091     }
00092 
00093     sprintf(*info,"%i",params->nBurstsBands[0]);
00094 
00095     for(i=1;i<params->Nbands;i++) {
00096       sprintf(*info,"%s,%i",*info,params->nBurstsBands[i]);
00097     }
00098     sprintf(*info,"%s,%i",*info,params->nSegments);
00099 
00100   }
00101 
00102   return 0;
00103 }
00104 
00105 /******************************************************************/
00106 #define TSIZ 65000
00107 
00108 int ForeFunIsDetected(
00109                       char **info,
00110                       SnglBurstTableC *input,
00111                       void *parameters,
00112                       BurstSegParams *bparams
00113                       ) {
00114 
00115   static char timstr[TSIZ];
00116 
00117   ForeFunIsDetectedParams *params = (ForeFunIsDetectedParams *)parameters;
00118 
00119   int i,po=0, nc=0, iind, nout, nin;
00120   char *str, *str2;
00121 
00122   char *bbuf = bparams->params;
00123   double twin = params->twin;
00124   double toff = params->toff;
00125   int t0s = bparams->t0s;
00126   int t0ns = bparams->t0ns;
00127 
00128   int dType = params->dType;
00129 
00130   SnglBurstTableC *ptr;
00131   
00132   size_t len = strlen(bbuf);
00133 
00134   for(i=0;i<len && nc<5;i++) {
00135     if(bbuf[i] == '(') {
00136       po = 1;
00137     } else if(bbuf[i] == ')') {
00138       po = 0;
00139     } else if(po==0 && bbuf[i] == ',') {
00140       nc++;
00141     }    
00142   }
00143 
00144   str = bbuf + i + 1;
00145   str2 = strchr(str,')');
00146 
00147   strncpy(timstr,str,str2-str);
00148 
00149   str = strtok(timstr,",");
00150 
00151   nout = 0;
00152   nin = 0;
00153 
00154   while(str) {
00155     
00156     nin++;
00157 
00158     iind = atoi(str);
00159 
00160     ptr = input->next;
00161 
00162     while(ptr) {
00163 
00164       if(params->doFCut ==0 ||
00165          (ptr->central_freq - 0.5*ptr->bandwidth <= params->f1 &&
00166           ptr->central_freq + 0.5*ptr->bandwidth >= params->f0)) {
00167 
00168         int t,tn;
00169         double dur;
00170 
00171         t = ptr->start_time.gpsSeconds;
00172         tn = ptr->start_time.gpsNanoSeconds;
00173         dur = ptr->duration;
00174 
00175         if(dType == 0) {
00176           if(fabs((double)(t-t0s)+1E-9*(double)(tn-t0ns)-(double)iind/16384.0-toff) < twin) {
00177             nout++;
00178             break;
00179           }
00180         } else {
00181           if((double)(t-t0s)+1E-9*(double)(tn-t0ns)-toff-twin <= (double)iind/16384.0 &&
00182              (double)(t-t0s)+1E-9*(double)(tn-t0ns)-toff+twin+dur >= (double)iind/16384.0) {
00183             nout++;
00184             break;
00185           }
00186         }
00187       }
00188         
00189       ptr = ptr->next;
00190 
00191     }
00192 
00193     str = strtok(NULL,",");
00194   }
00195 
00196   (params->nDetected) += nout;
00197   (params->nInjected) += nin;
00198 
00199   if(!(*info)) {
00200     *info = (char *)calloc(256,sizeof(char));
00201   }
00202 
00203   sprintf(*info,"%i,%i",params->nDetected,params->nInjected);
00204 
00205   return 0;
00206 }
00207 
00208 /******************************************************************/
00209 #define TSIZ 65000
00210 
00211 int EstimationErrors(
00212                      char **info,
00213                      SnglBurstTableC *input,
00214                      void *parameters,
00215                      BurstSegParams *bparams
00216                      ) {
00217 
00218   static char timstr[TSIZ];
00219 
00220   EstimationErrorsParams *params = (EstimationErrorsParams *)parameters;
00221 
00222   int i,po=0, nc=0, iind, nin, f1=1;
00223   char *str, *str2;
00224 
00225   FILE *fid = NULL;
00226   char waveName[256];
00227   char abuf[64]; 
00228 
00229   char *bbuf = bparams->params;
00230   double toff = params->toff;
00231   int t0s = bparams->t0s;
00232   int t0ns = bparams->t0ns;
00233 
00234   SnglBurstTableC *ptr;
00235   SnglBurstTableC *ptre = NULL;
00236 
00237   size_t len = strlen(bbuf);
00238 
00239   double f0, dur0, bw0;
00240   double h0 = 0.0; 
00241 
00242   for(i=0;i<len && nc<5;i++) {
00243     if(bbuf[i] == '(') {
00244       po = 1;
00245     } else if(bbuf[i] == ')') {
00246       po = 0;
00247     } else if(po==0 && bbuf[i] == ',') {
00248       if(f1) {
00249         char *ptr;
00250 
00251         strncpy(waveName, bbuf, i);
00252         waveName[i] = 0;
00253         f1 = 0;
00254 
00255 
00256         ptr = strchr(bbuf+i+1,',');
00257         if(bbuf[i+1] != '(') {
00258           strncpy(abuf, bbuf+i+1, ptr-bbuf-i-1);
00259           abuf[ptr-bbuf-i-1] = 0;
00260         } else {
00261           strncpy(abuf, bbuf+i+2, ptr-bbuf-i-2);
00262           abuf[ptr-bbuf-i-2] = 0;
00263         }
00264 
00265         h0 = atof(abuf);
00266         sprintf(waveName,"%s.%g",waveName,h0);
00267 
00268       } 
00269 
00270       nc++;
00271     }    
00272   }
00273 
00274   if(params->outfile) {
00275     fid = fopen(waveName,"a");
00276   }
00277 
00278   if(params->f0 <= 0.0 || params->bw0 <= 0.0 || params->dur0 <= 0.0)
00279     {
00280       double wavefreq;
00281       char *fptr = strpbrk(waveName,"0123456789");
00282       
00283       if(fptr) {
00284         wavefreq = atof(fptr);
00285         
00286         if(strstr(waveName,"SG")) {
00287           f0 = wavefreq;
00288           bw0 = 0.1499 * f0; /* 50% power, Q=9 */
00289           dur0 = 1.43613 / f0; /* for Q=9, 50% power */
00290         } else {
00291           /*
00292           fprintf(stderr,"Unknown waveform!\n");
00293           return 1;
00294           */
00295           f0 = bw0 = dur0 = 0.0;
00296         }
00297       } else {
00298         fprintf(stderr,"Can't get frequency out of wavefrom name!\n");
00299         return 1;
00300       }
00301     } else {
00302       f0 = params->f0;
00303       bw0 = params->bw0;
00304       dur0 = params->dur0;
00305     }
00306 
00307   nin = 0;
00308 
00309   str = bbuf + i + 1;
00310   str2 = strchr(str,')');
00311 
00312   strncpy(timstr,str,str2-str);
00313 
00314   str = strtok(timstr,",");
00315 
00316   while(str) { /* loop over times in toc */
00317     
00318     double mte = 1E30;
00319     double mtes = mte;
00320 
00321     nin++;
00322 
00323     iind = atoi(str);
00324 
00325     ptr = input->next;
00326     while(ptr) { /* loop over all events */
00327 
00328       int t,tn;
00329       double te, tes;
00330 
00331       t = ptr->start_time.gpsSeconds;
00332       tn = ptr->start_time.gpsNanoSeconds;
00333 
00334       /* NOTE: iind is time index of injection with respect to earth barycentre, i.e. is the same for all IFOs, even if delays are added due to sky position. */
00335       tes = (double)(t-t0s)+1E-9*(double)(tn-t0ns)-(double)iind/16384.0-toff;
00336       te = fabs(tes);
00337 
00338       if(te < mte) {
00339         mte = te;
00340         mtes = tes;
00341         ptre = ptr;
00342       }
00343 
00344       ptr = ptr->next;
00345 
00346     }
00347 
00348     if(mte <= params->twin) { /* got a detection */
00349 
00350       if(params->outfile) {
00351         fprintf(fid,"%g\t%g\t%g\t%g\t%g\t%g\t%g\n",mtes,ptre->central_freq,ptre->bandwidth,ptre->duration,ptre->amplitude,ptre->confidence,ptre->snr);
00352       }
00353 
00354       (params->nDetected)++;
00355       (params->dt) += mte;
00356       (params->dt2) += mte * mte;
00357       (params->df) += (ptre->central_freq - f0);
00358       (params->df2) += pow(ptre->central_freq - f0, 2.0);
00359       (params->dur) += (ptre->duration - dur0);
00360       (params->dur2) += pow(ptre->duration - dur0, 2.0);
00361       (params->bw) += (ptre->bandwidth - bw0);
00362       (params->bw2) += pow(ptre->bandwidth - bw0, 2.0);
00363       (params->h) += (ptre->amplitude);
00364       (params->h2) += pow(ptre->amplitude, 2.0);
00365       (params->conf) += (ptre->confidence);
00366       (params->conf2) += pow(ptre->confidence, 2.0);
00367       (params->snr) += (ptre->snr);
00368       (params->snr2) += pow(ptre->snr, 2.0);
00369 
00370     } else if(params->reportAll) {
00371       fprintf(fid,"-1\t-1\t-1\t-1\t-1\t-1\t-1\n");
00372     }
00373 
00374     str = strtok(NULL,",");
00375   }
00376 
00377   (params->nInjected) += nin;
00378 
00379   if(!(*info)) {
00380     *info = (char *)calloc(1024,sizeof(char));
00381   }
00382 
00383   sprintf(*info,"%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%i,%i",params->dt,params->dt2,params->df,params->df2,params->dur,params->dur2,params->bw,params->bw2,params->h,params->h2,params->conf,params->conf2,params->snr,params->snr2,params->nDetected,params->nInjected);
00384 
00385   if(params->outfile) {
00386     fclose(fid);
00387   }
00388 
00389   return 0;
00390 }
00391 
00392 /******************************************************************/
00393 int BackFunNumberOfUnclusteredEventsC2(
00394                                        char **info, 
00395                                        SnglBurstTableC *input1, 
00396                                        SnglBurstTableC *input2, 
00397                                        void *parameters, 
00398                                        BurstSegParams *bparams1, 
00399                                        BurstSegParams *bparams2
00400                                        ) {
00401 
00402   BackFunNumberOfUnclusteredEventsC2Params *params = (BackFunNumberOfUnclusteredEventsC2Params *)parameters;
00403 
00404   SnglBurstTableC coin;
00405 
00406   SnglBurstTableC *ptr, *optr;
00407 
00408   double dt;
00409 
00410   int nt,nb;
00411 
00412   if(bparams1->t0s != bparams2->t0s ||
00413      bparams1->t0ns != bparams2->t0ns) {
00414     fprintf(stderr,"Error: trying to compare two segments of different time origine\n");
00415     fprintf(stderr,"%i:%i\t\t%i:%i\n",bparams1->t0s,bparams1->t0ns,bparams2->t0s,bparams2->t0ns);
00416     return 1;
00417   }
00418 
00419   for(nt=nb=0, dt = params->dtmin; dt <= params->dtmax; dt += params->dt) {
00420     
00421     nt++;
00422     
00423     ptr = input2->next;
00424     while(ptr) {
00425       long long ti = (int)floor((double)(ptr->start_time.gpsNanoSeconds) + 1e9*dt);
00426       if(ti >= 1000000000) {
00427         ptr->start_time.gpsSeconds += ti / 1000000000;
00428         ptr->start_time.gpsNanoSeconds = ti - 1000000000*(ti / 1000000000);
00429       }
00430       if(ptr->start_time.gpsNanoSeconds < 0) {
00431         ti = llabs(ti);
00432         ptr->start_time.gpsSeconds -= 1 + ti / 1000000000;
00433         ti -= 1000000000*(ti / 1000000000);
00434         ptr->start_time.gpsNanoSeconds = 1000000000 - ti;
00435       }
00436 
00437       ptr = ptr->next;
00438     }
00439 
00440     bzero(&coin, sizeof(SnglBurstTableC));
00441 
00442     if(Get2Coincidences(&coin,input1,input2,params->cparams)) {
00443       fprintf(stderr,"Can't get coincidences!\n");
00444       return 1;
00445     }
00446 
00447     ptr = coin.next;
00448     while(ptr) {
00449       nb++;
00450       optr = ptr;
00451       ptr = ptr->next;
00452       free(optr);
00453     }
00454   }
00455 
00456   (params->nSegments)++;
00457   (params->nBursts)+= (double)nb / (double)nt;
00458 
00459   if(!(*info)) {
00460     *info = (char *)calloc(256,sizeof(char));
00461   }
00462 
00463   sprintf(*info,"%g,%i",params->nBursts,params->nSegments);
00464 
00465 
00466   return 0;
00467 }
00468 
00469 /******************************************************************/
00470 int ForeFunIsDetectedC2(
00471                         char **info,
00472                         SnglBurstTableC *input1,
00473                         SnglBurstTableC *input2,
00474                         void *parameters,
00475                         BurstSegParams *bparams1,
00476                         BurstSegParams *bparams2
00477                         ) {
00478 
00479   static char timstr1[TSIZ];
00480   /*  static char timstr2[TSIZ]; */
00481 
00482   ForeFunIsDetectedC2Params *params = (ForeFunIsDetectedC2Params *)parameters;
00483 
00484   SnglBurstTableC coin;
00485 
00486   int i,po=0, nc=0, iind, nout, nin;
00487   char *str, *str2;
00488 
00489   double twin = params->twin;
00490   double toff = params->toff;
00491 
00492   char *bbuf1 = bparams1->params;
00493   /*  char *bbuf2 = bparams2->params; */
00494 
00495   int t0s = bparams1->t0s;
00496   int t0ns = bparams1->t0ns;
00497 
00498   SnglBurstTableC *ptr, *optr;
00499 
00500   size_t len1; /* , len2;*/
00501 
00502   if(bparams1->t0s != bparams2->t0s ||
00503      bparams1->t0ns != bparams2->t0ns) {
00504     fprintf(stderr,"Error: trying to compare two segments of different time origine\n");
00505     return 1;
00506   }
00507 
00508   len1 = strlen(bbuf1);
00509 
00510   po=nc=0;
00511   for(i=0;i<len1 && nc<5;i++) {
00512     if(bbuf1[i] == '(') {
00513       po = 1;
00514     } else if(bbuf1[i] == ')') {
00515       po = 0;
00516     } else if(po==0 && bbuf1[i] == ',') {
00517       nc++;
00518     }    
00519   }
00520   str = bbuf1 + i + 1;
00521   str2 = strchr(str,')');
00522   strncpy(timstr1,str,str2-str);
00523 
00524   /*
00525   len2=strlen(bbuf2);
00526   po=nc=0;
00527   for(i=0;i<len2 && nc<5;i++) {
00528     if(bbuf2[i] == '(') {
00529       po = 1;
00530     } else if(bbuf2[i] == ')') {
00531       po = 0;
00532     } else if(po==0 && bbuf2[i] == ',') {
00533       nc++;
00534     }    
00535   }
00536   str = bbuf2 + i + 1;
00537   str2 = strchr(str,')');
00538   strncpy(timstr2,str,str2-str);
00539 
00540   if(strcmp(timstr1,timstr2)) {
00541     fprintf(stderr,"Error: trying to compare segments with different injection times\n");
00542     return 1;
00543   }
00544   */
00545 
00546   bzero(&coin, sizeof(SnglBurstTableC));
00547 
00548   if(Get2Coincidences(&coin,input1,input2,params->cparams)) {
00549     fprintf(stderr,"Can't get coincidences!\n");
00550     return 1;
00551   }
00552 
00553   str = strtok(timstr1,",");
00554   nout = 0;
00555   nin = 0;
00556 
00557   while(str) {
00558     
00559     nin++;
00560 
00561     iind = atoi(str);
00562 
00563     ptr = coin.next;
00564 
00565     while(ptr) {
00566 
00567       int t,tn;
00568 
00569       t = ptr->start_time.gpsSeconds;
00570       tn = ptr->start_time.gpsNanoSeconds;
00571 
00572       if(fabs((double)(t-t0s)+1E-9*(double)(tn-t0ns)-(double)iind/16384.0-toff) < twin) {
00573         nout++;
00574         break;
00575       }
00576 
00577       ptr = ptr->next;
00578 
00579     }
00580 
00581     str = strtok(NULL,",");
00582   }
00583 
00584   (params->nDetected) += nout;
00585   (params->nInjected) += nin;
00586 
00587   if(!(*info)) {
00588     *info = (char *)calloc(256,sizeof(char));
00589   }
00590 
00591   sprintf(*info,"%i,%i",params->nDetected,params->nInjected);
00592 
00593   ptr = coin.next;
00594   while(ptr) {
00595     optr = ptr;
00596     ptr = ptr->next;
00597     free(optr);
00598   }
00599 
00600   return 0;
00601 }
00602 
00603 /******************************************************************/
00604 #define SnglBurstTableCCopy(a,b) a=b
00605 /*
00606  memcpy(a.ifo, b.ifo, LIGOMETA_IFO_MAX * sizeof(char)); \
00607  memcpy(a.search, b.search, LIGOMETA_SEARCH_MAX * sizeof(char)); \
00608  memcpy(a.channel, b.channel, LIGOMETA_CHANNEL_MAX * sizeof(char))
00609 */
00610 
00611 void hpsort2(unsigned long n, int ra[], SnglBurstTableC rb[]) 
00612 { 
00613   unsigned long i,ir,j,l; 
00614   int rra; 
00615   SnglBurstTableC rrb;
00616 
00617   ra--;
00618   rb--;
00619 
00620   if (n < 2) return; 
00621 
00622   l=(n >> 1)+1; 
00623   ir=n; 
00624 
00625   for (;;) { 
00626     if (l > 1) {
00627       rra=ra[--l]; 
00628       SnglBurstTableCCopy(rrb,rb[l]);
00629     } else { 
00630       rra=ra[ir];
00631       SnglBurstTableCCopy(rrb,rb[ir]);
00632 
00633       ra[ir]=ra[1]; 
00634       SnglBurstTableCCopy(rb[ir],rb[1]);
00635 
00636       if (--ir == 1) { 
00637         ra[1]=rra; 
00638         SnglBurstTableCCopy(rb[1],rrb);
00639         break; } 
00640     } 
00641     
00642     i=l; 
00643     j=l+l; 
00644 
00645     while (j <= ir) { 
00646       if (j < ir && ra[j] < ra[j+1]) 
00647         j++; 
00648       if (rra < ra[j]) { 
00649         ra[i]=ra[j];
00650         SnglBurstTableCCopy(rb[i],rb[j]);
00651 
00652         i=j; 
00653         j <<= 1; 
00654       } else break; 
00655     } 
00656     ra[i]=rra; 
00657     SnglBurstTableCCopy(rb[i],rrb); 
00658   }
00659 }
00660 
00661 /******************************************************************/
00662 int AppendEvents(SnglBurstTableC *events, char *bbuf) {
00663 
00664   char *bbuf1;
00665   unsigned int i, N;
00666   SnglBurstTableC *ev, *eve;
00667   int *tim;
00668 
00669   size_t size1 = (LIGOMETA_IFO_MAX + LIGOMETA_SEARCH_MAX + LIGOMETA_CHANNEL_MAX) * sizeof(char) + 2*sizeof(int) + 6 * sizeof(float);
00670 
00671   bbuf1 = bbuf + strlen(bbuf) + 1;
00672 
00673   memcpy(&N,bbuf1,sizeof(unsigned int));
00674 
00675   bbuf1 += sizeof(unsigned int);
00676 
00677 #ifdef linux
00678   endian_swap((char *)(&N), sizeof(unsigned int), 1);
00679 #endif
00680 
00681   if(N>0) {
00682     tim = (int *)malloc(N*sizeof(int));
00683     eve = (SnglBurstTableC *)calloc(N, sizeof(SnglBurstTableC));
00684   
00685     for(i=0;i<N;i++) {
00686       char *p1 = bbuf1 + i*size1, *pst, *pr4;
00687 
00688       ev = eve + i;
00689 
00690       /*
00691       memcpy(ev->ifo, p1, LIGOMETA_IFO_MAX * sizeof(char));
00692       */
00693 
00694       p1 += LIGOMETA_IFO_MAX * sizeof(char);
00695       /*
00696       memcpy(ev->search, p1,LIGOMETA_SEARCH_MAX * sizeof(char));
00697       */
00698 
00699       p1 += LIGOMETA_SEARCH_MAX * sizeof(char);
00700       /*
00701       memcpy(ev->channel, p1, LIGOMETA_CHANNEL_MAX * sizeof(char));
00702       */
00703 
00704       pst = p1 + LIGOMETA_CHANNEL_MAX * sizeof(char);
00705 
00706       memcpy(&(ev->start_time.gpsSeconds), pst, sizeof(int));
00707       memcpy(&(ev->start_time.gpsNanoSeconds), pst+sizeof(int), sizeof(int));
00708 
00709 #ifdef linux
00710       endian_swap((char *)(&(ev->start_time.gpsSeconds)), sizeof(int), 1);
00711       endian_swap((char *)(&(ev->start_time.gpsNanoSeconds)), sizeof(int), 1);
00712 #endif
00713 
00714       tim[i] = ev->start_time.gpsSeconds;
00715 
00716       pr4 = pst + 2*sizeof(int);
00717 
00718       memcpy(&(ev->duration), pr4, sizeof(float));
00719 
00720 #ifdef linux
00721       endian_swap((char *)(&(ev->duration)), sizeof(float), 1);
00722 #endif
00723 
00724 
00725       p1 = pr4 + sizeof(float);
00726       memcpy(&(ev->central_freq), p1, sizeof(float));
00727 
00728 #ifdef linux
00729       endian_swap((char *)(&(ev->central_freq)), sizeof(float), 1);
00730 #endif
00731 
00732       p1 += sizeof(float);
00733       memcpy(&(ev->bandwidth), p1, sizeof(float));
00734       
00735 #ifdef linux
00736       endian_swap((char *)(&(ev->bandwidth)), sizeof(float), 1);
00737 #endif
00738 
00739       p1 += sizeof(float);
00740       memcpy(&(ev->amplitude), p1, sizeof(float));
00741     
00742 #ifdef linux
00743       endian_swap((char *)(&(ev->amplitude)), sizeof(float), 1);
00744 #endif
00745 
00746       p1 += sizeof(float);
00747       memcpy(&(ev->snr), p1, sizeof(float));
00748 
00749 #ifdef linux
00750       endian_swap((char *)(&(ev->snr)), sizeof(float), 1);
00751 #endif
00752 
00753       p1 += sizeof(float);
00754       memcpy(&(ev->confidence), p1, sizeof(float));
00755     
00756 #ifdef linux
00757       endian_swap((char *)(&(ev->confidence)), sizeof(float), 1);
00758 #endif
00759 
00760    }
00761 
00762     /* now sort events in time (seconds only) */
00763   
00764     hpsort2(N,tim,eve);
00765 
00766     ev = events;
00767     for(i=0;i<N;i++) {
00768       ev->next = (SnglBurstTableC *)calloc(1,sizeof(SnglBurstTableC));
00769       ev = ev->next;
00770 
00771       SnglBurstTableCCopy((*ev),(eve[i]));
00772     }
00773     
00774     free(eve);
00775     free(tim);
00776   }
00777 
00778   return 0;
00779 }
00780 
00781 /******************************************************************/
00782 
00783 char *getparams(char *bbuf) {
00784 
00785   int i,po=0, nc=0;
00786   size_t len = strlen(bbuf);
00787 
00788   for(i=0;i<len && nc<6;i++) {
00789     if(bbuf[i] == '(') {
00790       po = 1;
00791     } else if(bbuf[i] == ')') {
00792       po = 0;
00793     } else if(po==0 && bbuf[i] == ',') {
00794       nc++;
00795     }    
00796   }
00797 
00798   return bbuf+i;
00799 
00800 }
00801 
00802 /******************************************************************/
00803 
00804 char *getallparams(char *bbuf) {
00805 
00806   char *str;
00807   int i,j,po=0, nc=0, peo=0;
00808   size_t len = strlen(bbuf);
00809   
00810   str = calloc(2+len,1);
00811 
00812   for(i=j=0;i<len && nc<5;i++) {
00813     if(bbuf[i] == '(') {
00814       peo = po = 1;
00815     } else if(bbuf[i] == ')') {
00816       po = 0;
00817     } else if(po==0 && bbuf[i] == ',') {
00818       nc++;
00819     }    
00820     
00821     if(!peo) {
00822       str[j] = bbuf[i];
00823       j++;
00824     } 
00825 
00826     if(peo && !po) {
00827       peo = 0;
00828     }
00829 
00830   }
00831 
00832   strcat(str,getparams(bbuf));
00833 
00834   return str;
00835 
00836 }
00837 
00838 /******************************************************************/
00839 
00840 int paramsdiff(char *bbuf, char *toc, int compETG) {
00841 
00842   int i, i1, oi, oi1, po=0, nc=0, nc1=0, peo, peo1;
00843 
00844   /* first compare ETG parameters */
00845   if(compETG) {
00846     if(strcmp(getparams(bbuf),getparams(toc))) {
00847       return 1;
00848     }
00849   }
00850 
00851   /* now compare injection parameters. Thing in parentheses are not compared */
00852   oi = oi1 = 0;
00853 
00854   while(nc<5) {
00855 
00856     size_t len = strlen(bbuf);
00857 
00858     for(peo=po=0,i=oi;i<len;i++) {
00859       if(bbuf[i] == '(') {
00860         peo = po = 1;
00861       } else if(bbuf[i] == ')') {
00862         po = 0;
00863       } else if(po==0 && bbuf[i] == ',') {
00864         nc++;
00865         break;
00866       }    
00867     }
00868 
00869     len = strlen(toc);
00870     for(peo1=po=0,i1=oi1;i1<len;i1++) {
00871       if(toc[i1] == '(') {
00872         peo1 = po = 1;
00873       } else if(toc[i1] == ')') {
00874         po = 0;
00875       } else if(po==0 && toc[i1] == ',') {
00876         nc1++;
00877         break;
00878       }    
00879     }
00880 
00881     if(!peo && !peo1) {
00882       if(strncmp(bbuf+oi,toc+oi1,i-oi)) {
00883         return 1;
00884       }
00885     }
00886 
00887     oi = i+1;
00888     oi1 = i1+1;
00889 
00890   }
00891 
00892   return 0;
00893 }
00894 
00895 /******************************************************************/
00896 int paramsdiffcp(char *bbuf, char *toc, int ETGcomp) {
00897 
00898   int i, po=0, nc=0;
00899   size_t len;
00900 
00901   if(ETGcomp) {
00902     if(strcmp(getparams(bbuf),getparams(toc))) {
00903       return 1;
00904     }
00905   }
00906 
00907   len = strlen(bbuf);
00908 
00909   for(i=0;i<len && nc<5;i++) {
00910     char bbufi = bbuf[i];
00911 
00912     if(bbufi != toc[i]) {
00913       return 1;
00914     }
00915 
00916     if(bbufi == '(') {
00917       po = 1;
00918     } else if(bbufi == ')') {
00919       po = 0;
00920     } else if(po==0 && bbufi == ',') {
00921       nc++;
00922     }    
00923   }
00924 
00925   /*
00926   if(strncmp(bbuf,toc,i)) {
00927     return 1;
00928   }
00929   */
00930 
00931   return 0;
00932 }
00933 
00934 /******************************************************************/
00935 int paramsdiffIFO(char *s1, char *s2, char *IFO1, char *IFO2) {
00936 
00937   size_t off1, off2;
00938   size_t l1,l2;
00939 
00940   if(!strcmp(s1,s2)) {
00941     return 0;
00942   }
00943 
00944   off1 = off2 = 0;
00945 
00946   l1 = strlen(s1);
00947   l2 = strlen(s2);
00948 
00949   while(off1 < l1 &&
00950         off2 < l2) {
00951 
00952     while(s1[off1] == s2[off2]) {
00953       off1++;
00954       off2++;
00955 
00956       if(off1 >= l1 || off2>=l2) {
00957         return 0;
00958       }
00959     }
00960 
00961     if(l1<off1+2 || l2<off2+2) {
00962       return 1;
00963     }
00964 
00965     if(strncmp(s1+off1,IFO1,2) && strncmp(s1+off1,IFO2,2)) {
00966       return 1;
00967     }
00968 
00969     if(strncmp(s2+off2,IFO1,2) && strncmp(s2+off2,IFO2,2)) {
00970       return 1;
00971     }
00972 
00973     off1 += 2;
00974     off2 += 2;
00975 
00976   }
00977 
00978   return 0;
00979 }
00980 
00981 /******************************************************************/
00982 int isbackground(char *bbuf) {
00983 
00984   int i,po=0, nc=0;
00985   size_t len = strlen(bbuf);
00986 
00987    for(i=0;i<len && nc<5;i++) {
00988     if(bbuf[i] == '(') {
00989       po = 1;
00990     } else if(bbuf[i] == ')') {
00991       po = 0;
00992     } else if(po==0 && bbuf[i] == ',') {
00993       nc++;
00994     }    
00995    }
00996 
00997    if(i==5) {
00998      return 1;
00999    } 
01000      
01001    return 0;
01002 }
01003 
01004 
01005 /******************************************************************/
01006 int RemoveRepetitions(char *bbuf, size_t ui) {
01007 
01008   char *ptr;
01009 
01010   ptr = strchr(bbuf,',');
01011 
01012   if(ptr && ptr[1]=='(') {
01013     char *pend, *buf, *ph, *pin, *pout;
01014     double h0;
01015 
01016     pend = strchr(ptr+2,')');
01017     buf = (char *)malloc(1+strlen(bbuf));
01018     bzero(buf,1+strlen(bbuf));
01019     strncpy(buf,ptr+2,pend-ptr-1);
01020     
01021     ph = strtok(buf,",)");
01022 
01023     h0 = atof(ph);
01024 
01025     ph = strtok(NULL,",)");
01026 
01027     while(ph) {
01028       double h;
01029       h = atof(ph);
01030 
01031       if(fabs(h-h0)/fabs(h+h0) > 1e-6) {
01032         free(buf);
01033         return 0;
01034       }
01035       ph = strtok(NULL,",)");
01036     }
01037   
01038     free(buf);
01039     
01040     buf = (char *)malloc(1+ui);
01041     memcpy(buf,bbuf,ui);
01042     bzero(bbuf,ui);
01043 
01044     pin = buf;
01045     pout = bbuf;
01046 
01047     pend = strchr(pin,',');
01048     memcpy(pout,pin,pend-pin+1);
01049     pout += pend-pin+1;
01050     pin = pend+2; /* put us on char after ( */
01051 
01052     pend = strchr(pin,',');
01053     memcpy(pout,pin,pend-pin+1);
01054     pout += pend-pin+1;
01055 
01056     pin = strchr(pin,'(') + 1;
01057     pend = strchr(pin,',');
01058     memcpy(pout,pin,pend-pin+1);
01059     pout += pend-pin+1; /* alpha */
01060 
01061     pin = strchr(pin,'(') + 1;
01062     pend = strchr(pin,',');
01063     memcpy(pout,pin,pend-pin+1);
01064     pout += pend-pin+1; /* delta */
01065 
01066     pin = strchr(pin,'(') + 1;
01067     pend = strchr(pin,',');
01068     memcpy(pout,pin,pend-pin+1); 
01069     pout += pend-pin+1; /* psi */
01070 
01071     pin = strchr(pin,'(');
01072     memcpy(pout,pin,1+ui-(pin-buf));
01073 
01074     free(buf);
01075   }
01076 
01077   return 0;
01078 }
01079 
01080 /******************************************************************/
01081 int ProcessFilesSub(
01082                  unsigned int *nback, /* number of backgnd parameters */
01083                  unsigned int *nfore, /* number of foregnd parameters */
01084                  char **files,        /* list of input files */
01085                  int nfiles,          /* number of files */
01086                  int *nSeg,           /* number of jobs in all files */
01087                  int **isBack,        /* whether each job is backgnd */
01088                  int **jInd,          /* index in tocs of all jobs */
01089                  int *ntocs,          /* number of tocs entries */
01090                  char ***tocs,        /* indep. parameters list */
01091                  BurstSegParams **bparams, /* t0 & params for all jobs */
01092                  SnglBurstTableC ***events, /* events[tocs Id][job order] */
01093                  int **jeId,          /* second index in events of all jobs */
01094                  int **Nevents,       /* number of events per tocs entry */
01095                  int **backInd,       /* index in tocs of back params */
01096                  int **foreInd,        /* index in tocs of fore params */
01097                  regex_t *rexp
01098                  ) {
01099 
01100   FILE *fid;
01101   unsigned int j, fi, t0s, t0ns, ui, new1;
01102   int Zip = 0;
01103 
01104   clock_t tic, toc;
01105 
01106   char buf[BUFSIZE];
01107 
01108   size_t bsiz=0;
01109   char *bbuf=NULL;
01110   char *str2;
01111 
01112   char *file;
01113 
01114   char tmpfil[2048];
01115 
01116   *nback = 0;
01117   *nfore = 0;
01118   *ntocs = 0;
01119   *nSeg = 0;
01120 
01121   *tocs = NULL;
01122   *events = NULL;
01123   *jeId = NULL;
01124   *Nevents = NULL;
01125   *backInd = NULL;
01126   *foreInd = NULL;
01127   *isBack = NULL;
01128   *jInd = NULL;
01129   *bparams = NULL;
01130 
01131   for(fi=0;fi<nfiles;fi++) {
01132 
01133     file = files[fi];
01134 
01135     tic = clock();
01136 
01137     printf("Processing %s...",file);
01138     fflush(stdout);
01139 
01140     if(!strcmp(file+strlen(file)-3,".gz")) {
01141       char buf[65000];
01142       
01143       Zip = 1;
01144       
01145       sprintf(tmpfil,"/var/tmp/BurstProcessTmpFileXXXXXX");
01146 
01147       mkstemp(tmpfil);
01148 
01149       sprintf(buf,"cp %s %s.gz",file,tmpfil);
01150       system(buf);
01151 
01152       sprintf(buf,"gzip -df %s.gz",tmpfil);
01153       system(buf);
01154 
01155       /*
01156       *(file+strlen(file)-3) = 0;
01157       */
01158     } else {
01159       strcpy(tmpfil,file);
01160     }
01161     
01162     if(!(fid=fopen(tmpfil,"r"))) {
01163       fprintf(stderr,"Can't open %s\n",tmpfil);
01164       perror("System error");
01165       return 1;
01166     }
01167 
01168     while(fread(buf,sizeof(unsigned int),3,fid) == 3) {
01169 #ifdef linux
01170       endian_swap(buf, sizeof(unsigned int), 3);
01171 #endif
01172 
01173 
01174       memcpy(&t0s,buf,sizeof(unsigned int));
01175       memcpy(&t0ns,buf + sizeof(unsigned int),sizeof(unsigned int));
01176       memcpy(&ui,buf + 2*sizeof(unsigned int),sizeof(unsigned int));
01177       ui -= 3*sizeof(unsigned int);
01178       
01179       if(ui > bsiz) {
01180         bsiz = ui + 1024;
01181         if(!(bbuf=(char *)realloc(bbuf,bsiz))) {
01182           fprintf(stderr,"memory error:%u\n",bsiz);
01183           return 1;
01184         }
01185       }
01186       
01187       if(fread(bbuf,1,ui,fid) != ui) {
01188         fprintf(stderr,"File error!\n");
01189         return 1;
01190       }
01191 
01192       if(!rexp ||
01193          regex(rexp,bbuf)) {
01194 
01195       (*nSeg)++;
01196 
01197       (*isBack) = (int *)realloc((*isBack), (*nSeg) * sizeof(int));
01198       (*jInd) = (int *)realloc((*jInd), (*nSeg) * sizeof(int));
01199       (*jeId) = (int *)realloc(*jeId, *nSeg * sizeof(int));
01200 
01201       (*bparams) = (BurstSegParams *)realloc((*bparams), (*nSeg) * sizeof(BurstSegParams));
01202       (*bparams)[(*nSeg)-1].t0s = t0s;
01203       (*bparams)[(*nSeg)-1].t0ns = t0ns;
01204 
01205       RemoveRepetitions(bbuf,ui);
01206 
01207       (*bparams)[(*nSeg)-1].params = (char *)calloc(1+strlen(bbuf),sizeof(char));
01208       strcpy((*bparams)[(*nSeg)-1].params, bbuf);
01209 
01210       str2 = getallparams(bbuf);
01211 
01212       for(j=0;j<(*ntocs);j++) {
01213         if(!paramsdiff(str2,(*tocs)[j],1)) break;
01214       }
01215 
01216       (*jInd)[(*nSeg)-1] = j;
01217       
01218       if(j==(*ntocs)) {
01219         new1 = 1;
01220         (*ntocs)++;
01221         (*tocs) = (char **)realloc((*tocs), (*ntocs) * sizeof(char *));
01222         (*tocs)[j] = str2;
01223         
01224         (*events) = (SnglBurstTableC **)realloc((*events), (*ntocs) * sizeof(SnglBurstTableC *));
01225         (*events)[j] = NULL;
01226 
01227         (*Nevents) = (int *)realloc((*Nevents), (*ntocs)*sizeof(int));
01228         (*Nevents)[j] = 0;
01229 
01230       } else {
01231         new1 = 0;
01232         free(str2);
01233       }
01234       
01235       ((*Nevents)[j])++;
01236       (*events)[j] = (SnglBurstTableC *)realloc((*events)[j], ((*Nevents)[j]) * sizeof(SnglBurstTableC));
01237       bzero((*events)[j] + (*Nevents)[j] - 1, sizeof(SnglBurstTableC));
01238       AppendEvents((*events)[j] + (*Nevents)[j] - 1,bbuf);
01239       (*jeId)[*nSeg-1] = (*Nevents)[j] - 1;
01240 
01241       if(isbackground(bbuf)) {
01242 
01243         (*isBack)[(*nSeg)-1] = 1;
01244 
01245         if(new1) {
01246           (*nback)++;   
01247           (*backInd) = (int *)realloc((*backInd), (*nback)*sizeof(int));
01248           (*backInd)[(*nback)-1] = j;
01249         }
01250 
01251       } else {
01252 
01253         (*isBack)[(*nSeg)-1] = 0;
01254 
01255         if(new1) {
01256           (*nfore)++;
01257           (*foreInd) = (int *)realloc((*foreInd), (*nfore)*sizeof(int));
01258           (*foreInd)[(*nfore)-1] = j;
01259         }
01260       }
01261       }      
01262     }
01263     
01264     fclose(fid);
01265 
01266     if(Zip) {
01267       char buf[65000];
01268       sprintf(buf,"rm %s",tmpfil);
01269       system(buf);
01270     }
01271 
01272     toc = clock();
01273     
01274     printf("done (%g s)\n",(double)(toc-tic)/(double)CLOCKS_PER_SEC);
01275     
01276   }
01277 
01278   free(bbuf);
01279 
01280   return 0;
01281 }
01282 
01283 int ProcessFiles(
01284                  unsigned int *nback, /* number of backgnd parameters */
01285                  unsigned int *nfore, /* number of foregnd parameters */
01286                  char **files,        /* list of input files */
01287                  int nfiles,          /* number of files */
01288                  int *nSeg,           /* number of jobs in all files */
01289                  int **isBack,        /* whether each job is backgnd */
01290                  int **jInd,          /* index in tocs of all jobs */
01291                  int *ntocs,          /* number of tocs entries */
01292                  char ***tocs,        /* indep. parameters list */
01293                  BurstSegParams **bparams, /* t0 & params for all jobs */
01294                  SnglBurstTableC ***events, /* events[tocs Id][job order] */
01295                  int **jeId,          /* second index in events of all jobs */
01296                  int **Nevents,       /* number of events per tocs entry */
01297                  int **backInd,       /* index in tocs of back params */
01298                  int **foreInd