00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
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
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;
00289 dur0 = 1.43613 / f0;
00290 } else {
00291
00292
00293
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) {
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) {
00327
00328 int t,tn;
00329 double te, tes;
00330
00331 t = ptr->start_time.gpsSeconds;
00332 tn = ptr->start_time.gpsNanoSeconds;
00333
00334
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) {
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
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
00494
00495 int t0s = bparams1->t0s;
00496 int t0ns = bparams1->t0ns;
00497
00498 SnglBurstTableC *ptr, *optr;
00499
00500 size_t len1;
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
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
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
00607
00608
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
00692
00693
00694 p1 += LIGOMETA_IFO_MAX * sizeof(char);
00695
00696
00697
00698
00699 p1 += LIGOMETA_SEARCH_MAX * sizeof(char);
00700
00701
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
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
00845 if(compETG) {
00846 if(strcmp(getparams(bbuf),getparams(toc))) {
00847 return 1;
00848 }
00849 }
00850
00851
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
00927
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;
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;
01060
01061 pin = strchr(pin,'(') + 1;
01062 pend = strchr(pin,',');
01063 memcpy(pout,pin,pend-pin+1);
01064 pout += pend-pin+1;
01065
01066 pin = strchr(pin,'(') + 1;
01067 pend = strchr(pin,',');
01068 memcpy(pout,pin,pend-pin+1);
01069 pout += pend-pin+1;
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,
01083 unsigned int *nfore,
01084 char **files,
01085 int nfiles,
01086 int *nSeg,
01087 int **isBack,
01088 int **jInd,
01089 int *ntocs,
01090 char ***tocs,
01091 BurstSegParams **bparams,
01092 SnglBurstTableC ***events,
01093 int **jeId,
01094 int **Nevents,
01095 int **backInd,
01096 int **foreInd,
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
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,
01285 unsigned int *nfore,
01286 char **files,
01287 int nfiles,
01288 int *nSeg,
01289 int **isBack,
01290 int **jInd,
01291 int *ntocs,
01292 char ***tocs,
01293 BurstSegParams **bparams,
01294 SnglBurstTableC ***events,
01295 int **jeId,
01296 int **Nevents,
01297 int **backInd,
01298 int **foreInd