LALApps 10.1.0.1-eeff03c
coh_PTF_bankveto.c
Go to the documentation of this file.
1#include "config.h"
2#include "coh_PTF.h"
3
4#ifdef __GNUC__
5#define UNUSED __attribute__ ((unused))
6#else
7#define UNUSED
8#endif
9
11 struct coh_PTF_params *params,
12 struct bankTemplateOverlaps **bankNormOverlapsP,
13 struct bankComplexTemplateOverlaps **bankOverlapsP,
14 struct bankDataOverlaps **dataOverlapsP,
15 FindChirpTemplate **bankFcTmpltsP,
16 FindChirpTemplate *fcTmplt,
17 FindChirpTmpltParams *fcTmpltParams,
18 REAL4FrequencySeries **invspec,
19 struct timeval startTime
20)
21{
22 UINT4 ui,uj,ifoNumber,subBankSize;
23 InspiralTemplate *PTFBankTemplates = NULL;
24 InspiralTemplate *PTFBankvetoHead = NULL;
25
26 struct bankTemplateOverlaps *bankNormOverlaps;
27 struct bankComplexTemplateOverlaps *bankOverlaps;
28 struct bankDataOverlaps *dataOverlaps;
29 FindChirpTemplate *bankFcTmplts;
30
31 verbose("Initializing bank veto filters at %ld \n", timeval_subtract(&startTime));
32 /* Reads in and initializes the bank veto sub bank */
33 subBankSize = coh_PTF_read_sub_bank(params,&PTFBankTemplates);
34 params->BVsubBankSize = subBankSize;
35 bankNormOverlaps = LALCalloc(subBankSize,sizeof(*bankNormOverlaps));
36 bankOverlaps = LALCalloc(subBankSize,sizeof(*bankOverlaps));
37 dataOverlaps = LALCalloc(subBankSize,sizeof(*dataOverlaps));
38 bankFcTmplts = LALCalloc(subBankSize, sizeof(*bankFcTmplts));
39 /* Create necessary structure to hold Q(f) */
40 for (ui =0 ; ui < subBankSize; ui++)
41 {
42 bankFcTmplts[ui].PTFQtilde =
44 }
45 PTFBankvetoHead = PTFBankTemplates;
46
47 for (ui=0 ; ui < subBankSize ; ui++)
48 {
49 coh_PTF_template(fcTmplt,PTFBankTemplates,
50 fcTmpltParams);
51 PTFBankTemplates = PTFBankTemplates->next;
52 /* Only store Q1. Structures used in fcTmpltParams will be overwritten */
53 for (uj = 0 ; uj < params->numFreqPoints ; uj++)
54 {
55 if (params->approximant == FindChirpPTF)
56 bankFcTmplts[ui].PTFQtilde->data[uj] = fcTmplt->PTFQtilde->data[uj];
57 else
58 bankFcTmplts[ui].PTFQtilde->data[uj] = fcTmplt->data->data[uj];
59 }
60 }
61 /* Calculate the overlap between templates for bank veto */
62 for (ui = 0 ; ui < subBankSize; ui++)
63 {
64 for(ifoNumber = 0; ifoNumber < LAL_NUM_IFO; ifoNumber++)
65 {
66 if (params->haveTrig[ifoNumber])
67 {
68 bankNormOverlaps[ui].PTFM[ifoNumber]=
69 XLALCreateREAL8ArrayL(2, 1, 1);
70 memset(bankNormOverlaps[ui].PTFM[ifoNumber]->data,
71 0, 1 * sizeof(REAL8));
72 bankOverlaps[ui].PTFM[ifoNumber]=XLALCreateCOMPLEX8ArrayL(2,1,1);
73 dataOverlaps[ui].PTFqVec[ifoNumber] = XLALCreateCOMPLEX8VectorSequence(\
74 1, params->numAnalPointsBuf);
75 /* This function calculates the overlaps between templates */
76 /* This returns a REAL4 as the overlap between identical templates*/
77 /* must be real. */
78 coh_PTF_template_overlaps(params,&(bankFcTmplts[ui]),
79 &(bankFcTmplts[ui]),invspec[ifoNumber],0,
80 bankNormOverlaps[ui].PTFM[ifoNumber]);
81 }
82 }
83 }
84
85 while (PTFBankvetoHead)
86 {
87 InspiralTemplate *thisTmplt;
88 thisTmplt = PTFBankvetoHead;
89 PTFBankvetoHead = PTFBankvetoHead->next;
90 LALFree(thisTmplt);
91 }
92
93 verbose("Generated bank veto filters at %ld \n", timeval_subtract(&startTime));
94 /* Return pointers to parent function */
95 *bankNormOverlapsP = bankNormOverlaps;
96 *bankOverlapsP = bankOverlaps;
97 *dataOverlapsP = dataOverlaps;
98 *bankFcTmpltsP = bankFcTmplts;
99
100 return subBankSize;
101}
102
104 struct coh_PTF_params *params,
105 struct bankDataOverlaps *dataOverlaps,
106 FindChirpTemplate *bankFcTmplts,
107 RingDataSegments **segments,
109 COMPLEX8FFTPlan *invplan,
110 INT4 segmentNum,
111 struct timeval startTime
112)
113{
114 UINT4 ifoNumber,ui;
115 for (ui = 0 ; ui < params->BVsubBankSize ; ui++)
116 {
117 for(ifoNumber = 0; ifoNumber < LAL_NUM_IFO; ifoNumber++)
118 {
119 if (params->haveTrig[ifoNumber])
120 {
121 /* This function calculates the overlap */
122 coh_PTF_bank_filters(params, &(bankFcTmplts[ui]), 0,
123 &segments[ifoNumber]->sgmnt[segmentNum], invplan,
124 PTFqVec[ifoNumber],
125 dataOverlaps[ui].PTFqVec[ifoNumber], 0, 0);
126 }
127 }
128 }
129 verbose("Generated bank veto filters for segment %d at %ld \n", segmentNum,
131}
132
134 struct coh_PTF_params *params,
135 FindChirpTemplate *bankFcTmplts,
136 FindChirpTemplate *fcTmplt,
137 REAL4FrequencySeries **invspec,
138 struct bankComplexTemplateOverlaps *bankOverlaps
139)
140{
141 UINT4 ifoNumber,ui;
142 for(ifoNumber = 0; ifoNumber < LAL_NUM_IFO; ifoNumber++)
143 {
144 if (params->haveTrig[ifoNumber])
145 {
146 for (ui = 0 ; ui < params->BVsubBankSize ; ui++)
147 {
148 memset(bankOverlaps[ui].PTFM[ifoNumber]->data,0,1*sizeof(COMPLEX8));
149 /* This function calculates the overlap between template and the
150 * * bank veto template */
151 coh_PTF_complex_template_overlaps(params, &(bankFcTmplts[ui]),
152 fcTmplt, invspec[ifoNumber], 0,
153 bankOverlaps[ui].PTFM[ifoNumber]);
154 }
155 }
156 }
157}
158
159
161 struct coh_PTF_params *params,
162 gsl_matrix **Bankeigenvecs,
163 gsl_vector **Bankeigenvals,
164 struct bankCohTemplateOverlaps **bankCohOverlapsP,
165 struct bankComplexTemplateOverlaps *bankOverlaps,
166 REAL4 *Fplus,
167 REAL4 *Fcross,
168 REAL8Array **PTFM,
169 struct bankTemplateOverlaps *bankNormOverlaps,
170 UINT4 csVecLength,
171 UINT4 csVecLengthTwo,
172 UINT4 vecLength
173)
174{
175 UINT4 j;
176 struct bankCohTemplateOverlaps *bankCohOverlaps;
177
178 /* If they don't already exist, calculate the eigenvectors for each bank
179 * template. This will be different from the search template */
180 for (j = 0 ; j < params->BVsubBankSize+1 ; j++)
181 {
182 if (! Bankeigenvecs[j])
183 {
184 Bankeigenvecs[j] = gsl_matrix_alloc(csVecLengthTwo,
185 csVecLengthTwo);
186 Bankeigenvals[j] = gsl_vector_alloc(csVecLengthTwo);
187 if (j == params->BVsubBankSize)
188 {
189 /* For non-spinning this will be the same as eigenvecs */
190 coh_PTF_calculate_bmatrix(params,Bankeigenvecs[j],
191 Bankeigenvals[j],Fplus,Fcross,PTFM,csVecLength,csVecLengthTwo,
192 vecLength);
193 }
194 else
195 {
196 coh_PTF_calculate_bmatrix(params,Bankeigenvecs[j],
197 Bankeigenvals[j],Fplus,Fcross,bankNormOverlaps[j].PTFM,csVecLength,
198 csVecLengthTwo,vecLength);
199 }
200 }
201 }
202
203 /* If they don't already exist, calculate the coherent overlaps between
204 * bank veto templates and the search template */
205
206 if (! *bankCohOverlapsP)
207 {
208 bankCohOverlaps = LALCalloc(params->BVsubBankSize,sizeof(*bankCohOverlaps));
209 *bankCohOverlapsP = bankCohOverlaps;
210 for (j = 0 ; j < params->BVsubBankSize; j++)
211 {
212 bankCohOverlaps[j].rotReOverlaps = gsl_matrix_alloc(
213 csVecLengthTwo,csVecLengthTwo);
214 bankCohOverlaps[j].rotImOverlaps = gsl_matrix_alloc(
215 csVecLengthTwo,csVecLengthTwo);
217 bankCohOverlaps[j],Fplus,Fcross,Bankeigenvecs[params->BVsubBankSize],
218 Bankeigenvals[params->BVsubBankSize],Bankeigenvecs[j],
219 Bankeigenvals[j],csVecLength,csVecLengthTwo);
220 }
221 }
222}
223
225 struct coh_PTF_params *params,
226 struct bankComplexTemplateOverlaps **autoTempOverlapsP,
227 struct timeval startTime
228)
229{
230 struct bankComplexTemplateOverlaps *autoTempOverlaps;
231 UINT4 uj,ifoNumber,timeStepPoints;
232 verbose("Initializing auto veto filters at %ld \n",
234 /* Initializations */
235 autoTempOverlaps = LALCalloc(params->numAutoPoints,
236 sizeof(*autoTempOverlaps));
237 timeStepPoints = params->autoVetoTimeStep*params->sampleRate;
238 for (uj = 0; uj < params->numAutoPoints; uj++)
239 {
240 for(ifoNumber = 0; ifoNumber < LAL_NUM_IFO; ifoNumber++)
241 {
242 if (params->haveTrig[ifoNumber])
243 {
244 /* If it will be used initialize and zero out the overlap structure*/
245 autoTempOverlaps[uj].PTFM[ifoNumber] = XLALCreateCOMPLEX8ArrayL(2, 1,
246 1);
247 memset(autoTempOverlaps[uj].PTFM[ifoNumber]->data, 0,
248 1*sizeof(COMPLEX8));
249 }
250 else
251 autoTempOverlaps[uj].PTFM[ifoNumber] = NULL;
252 }
253 }
254 verbose("Generated auto veto filters at %ld \n",
256
257 *autoTempOverlapsP = autoTempOverlaps;
258 return timeStepPoints;
259}
260
262 struct coh_PTF_params *params,
263 FindChirpTemplate *fcTmplt,
264 struct bankComplexTemplateOverlaps *autoTempOverlaps,
265 REAL4FrequencySeries **invspec,
266 COMPLEX8FFTPlan *invplan,
267 UINT4 timeStepPoints
268)
269{
270 UINT4 ifoNumber;
271
272 for(ifoNumber = 0; ifoNumber < LAL_NUM_IFO; ifoNumber++)
273 {
274 if (params->haveTrig[ifoNumber])
275 {
276 coh_PTF_auto_veto_overlaps(params,fcTmplt,autoTempOverlaps,
277 invspec[ifoNumber],invplan,0,params->numAutoPoints,
278 timeStepPoints,ifoNumber);
279 }
280 }
281}
282
284 struct coh_PTF_params *params,
285 gsl_matrix **AutoeigenvecsP,
286 gsl_vector **AutoeigenvalsP,
287 struct bankCohTemplateOverlaps **autoCohOverlapsP,
288 struct bankComplexTemplateOverlaps *autoTempOverlaps,
289 REAL4 *Fplus,
290 REAL4 *Fcross,
292 UINT4 csVecLength,
293 UINT4 csVecLengthTwo,
294 UINT4 vecLength
295)
296{
297 UINT4 j;
298 gsl_matrix *Autoeigenvecs = *AutoeigenvecsP;
299 gsl_vector *Autoeigenvals = *AutoeigenvalsP;
300 struct bankCohTemplateOverlaps *autoCohOverlaps;
301
302 /* Calculate the eigenvectors/values for the auto_veto. For non-spin these
303 * are identical to the values used for the search template */
304 if (! *AutoeigenvecsP)
305 {
306 Autoeigenvecs = gsl_matrix_alloc(csVecLengthTwo,csVecLengthTwo);
307 Autoeigenvals = gsl_vector_alloc(csVecLengthTwo);
308 *AutoeigenvecsP = Autoeigenvecs;
309 *AutoeigenvalsP = Autoeigenvals;
310 coh_PTF_calculate_bmatrix(params,Autoeigenvecs,Autoeigenvals,
311 Fplus,Fcross,PTFM,csVecLength,csVecLengthTwo,vecLength);
312 }
313
314 /* And calculate the coherent time-delay overlaps */
315 if (! *autoCohOverlapsP)
316 {
317 autoCohOverlaps = LALCalloc(params->numAutoPoints,\
318 sizeof(*autoCohOverlaps));
319 *autoCohOverlapsP = autoCohOverlaps;
320 for (j = 0 ; j < params->numAutoPoints; j++)
321 {
322 autoCohOverlaps[j].rotReOverlaps = gsl_matrix_alloc(
323 csVecLengthTwo,csVecLengthTwo);
324 autoCohOverlaps[j].rotImOverlaps = gsl_matrix_alloc(
325 csVecLengthTwo,csVecLengthTwo);
327 params,autoTempOverlaps[j],
328 autoCohOverlaps[j],Fplus,Fcross,Autoeigenvecs,Autoeigenvals,
329 Autoeigenvecs,Autoeigenvals,csVecLength,csVecLengthTwo);
330 }
331 }
332}
333
335 struct coh_PTF_params *params,
336 gsl_matrix **AutoeigenvecsP,
337 gsl_vector **AutoeigenvalsP,
338 REAL4 **frequencyRangesPlus,
339 REAL4 **frequencyRangesCross,
340 REAL4 **powerBinsPlus,
341 REAL4 **powerBinsCross,
342 REAL4 **overlapCont,
343 struct bankDataOverlaps **chisqOverlapsP,
344 FindChirpTemplate *fcTmplt,
345 REAL4FrequencySeries **invspec,
346 RingDataSegments **segments,
347 REAL4 *Fplus,
348 REAL4 *Fcross,
349 REAL8Array **PTFM,
350 COMPLEX8FFTPlan *invPlan,
351 INT4 segmentNumber,
352 UINT4 csVecLength,
353 UINT4 csVecLengthTwo,
354 UINT4 vecLength
355)
356{
357 UINT4 j,k;
358 REAL4 fLowPlus,fHighPlus,fLowCross,fHighCross;
359 gsl_matrix *Autoeigenvecs = *AutoeigenvecsP;
360 gsl_vector *Autoeigenvals = *AutoeigenvalsP;
361 struct bankDataOverlaps *chisqOverlaps = *chisqOverlapsP;
362 COMPLEX8VectorSequence *tempqVec;
363
364 /* Calculate the eigenvectors/values for the auto_veto. For non-spin these
365 * are identical to the values used for the search template */
366 if (! *AutoeigenvecsP)
367 {
368 Autoeigenvecs = gsl_matrix_alloc(csVecLengthTwo,csVecLengthTwo);
369 Autoeigenvals = gsl_vector_alloc(csVecLengthTwo);
370 *AutoeigenvecsP = Autoeigenvecs;
371 *AutoeigenvalsP = Autoeigenvals;
372 coh_PTF_calculate_bmatrix(params,Autoeigenvecs,Autoeigenvals,
373 Fplus,Fcross,PTFM,csVecLength,csVecLengthTwo,vecLength);
374 }
375
376 if (! frequencyRangesPlus[LAL_NUM_IFO])
377 {
378 frequencyRangesPlus[LAL_NUM_IFO] = (REAL4 *)
379 LALCalloc(params->numChiSquareBins-1, sizeof(REAL4));
380 frequencyRangesCross[LAL_NUM_IFO] = (REAL4 *)
381 LALCalloc(params->numChiSquareBins-1, sizeof(REAL4));
383 Fplus,Fcross,frequencyRangesPlus[LAL_NUM_IFO],\
384 frequencyRangesCross[LAL_NUM_IFO],Autoeigenvecs,LAL_NUM_IFO,\
385 params->singlePolFlag);
386 }
387
388 if (! powerBinsPlus[LAL_NUM_IFO])
389 {
390 powerBinsPlus[LAL_NUM_IFO] = (REAL4 *)
391 LALCalloc(params->numChiSquareBins, sizeof(REAL4));
392 powerBinsCross[LAL_NUM_IFO] = (REAL4 *)
393 LALCalloc(params->numChiSquareBins, sizeof(REAL4));
395 Fplus,Fcross,frequencyRangesPlus[LAL_NUM_IFO],\
396 frequencyRangesCross[LAL_NUM_IFO],powerBinsPlus[LAL_NUM_IFO],\
397 powerBinsCross[LAL_NUM_IFO],overlapCont,Autoeigenvecs,LAL_NUM_IFO,\
398 params->singlePolFlag);
399 }
400
401 if (! chisqOverlaps)
402 {
403 tempqVec = XLALCreateCOMPLEX8VectorSequence (1, params->numTimePoints);
404 chisqOverlaps = LALCalloc(2*params->numChiSquareBins,\
405 sizeof(*chisqOverlaps));
406 *chisqOverlapsP = chisqOverlaps;
407 /* Loop over the chisq bins */
408 for(j = 0; j < params->numChiSquareBins; j++)
409 {
410 /* Figure out the upper and lower frequencies for each bin */
411 if (params->numChiSquareBins == 1)
412 {
413 /* This is a stupid case to run! */
414 fLowPlus = 0;
415 fHighPlus = 0;
416 fLowCross = 0;
417 fHighCross = 0;
418 }
419 else if (j == 0)
420 {
421 fLowPlus = 0;
422 fHighPlus = frequencyRangesPlus[LAL_NUM_IFO][0];
423 fLowCross = 0;
424 fHighCross = frequencyRangesCross[LAL_NUM_IFO][0];
425 }
426 else if (j == params->numChiSquareBins-1)
427 {
428 fLowPlus = frequencyRangesPlus[LAL_NUM_IFO][params->numChiSquareBins-2];
429 fHighPlus = 0;
430 fLowCross = \
431 frequencyRangesCross[LAL_NUM_IFO][params->numChiSquareBins-2];
432 fHighCross = 0;
433 }
434 else
435 {
436 fLowPlus = frequencyRangesPlus[LAL_NUM_IFO][j-1];
437 fHighPlus = frequencyRangesPlus[LAL_NUM_IFO][j];
438 fLowCross = frequencyRangesCross[LAL_NUM_IFO][j-1];
439 fHighCross = frequencyRangesCross[LAL_NUM_IFO][j];
440 }
441 /* Calculate the single detector filters for each bin (this is SLOW!)*/
442 for(k = 0; k < LAL_NUM_IFO; k++)
443 {
444 if (params->haveTrig[k])
445 {
446 /* The + filters done first */
447 chisqOverlaps[j].PTFqVec[k] = \
448 XLALCreateCOMPLEX8VectorSequence (1,params->numAnalPointsBuf);
450 &segments[k]->sgmnt[segmentNumber],invPlan,tempqVec,
451 chisqOverlaps[j].PTFqVec[k],fLowPlus,fHighPlus);
452
453 /* The x filters done here */
454 chisqOverlaps[j+params->numChiSquareBins].PTFqVec[k] = \
455 XLALCreateCOMPLEX8VectorSequence (1,params->numAnalPointsBuf);
457 &segments[k]->sgmnt[segmentNumber],invPlan,tempqVec,
458 chisqOverlaps[j+params->numChiSquareBins].PTFqVec[k],
459 fLowCross,fHighCross);
460 }
461 else
462 {
463 chisqOverlaps[j].PTFqVec[k] = NULL;
464 chisqOverlaps[j+params->numChiSquareBins].PTFqVec[k] = NULL;
465 }
466 }/* End loop over ifos */
467 }/* End loop over chi-square bins */
469 }
470
471}
472
474 struct coh_PTF_params *params,
475 REAL4 **frequencyRangesPlus,
476 REAL4 **frequencyRangesCross,
477 REAL4 **powerBinsPlus,
478 REAL4 **powerBinsCross,
479 REAL4 **overlapCont,
480 struct bankDataOverlaps **chisqSnglOverlapsP,
481 FindChirpTemplate *fcTmplt,
482 REAL4FrequencySeries **invspec,
483 RingDataSegments **segments,
484 REAL8Array **PTFM,
485 COMPLEX8FFTPlan *invPlan,
486 INT4 segmentNumber
487)
488{
489 UINT4 j,k;
491 struct bankDataOverlaps *chisqSnglOverlaps = *chisqSnglOverlapsP;
492 COMPLEX8VectorSequence *tempqVec = NULL;
493
494 if (! chisqSnglOverlaps)
495 {
496 chisqSnglOverlaps = LALCalloc(params->numChiSquareBins,\
497 sizeof(*chisqSnglOverlaps));
498 *chisqSnglOverlapsP = chisqSnglOverlaps;
499 for (k = 0; k < LAL_NUM_IFO; k++)
500 {
501 for(j = 0; j < params->numChiSquareBins; j++)
502 {
503 chisqSnglOverlaps[j].PTFqVec[k] = NULL;
504 }
505 }
506 }
507
508 for(k = 0; k < LAL_NUM_IFO; k++)
509 {
510 if (params->haveTrig[k])
511 {
512 /* FIXME: For sngl detector Plus and Cross ranges/bins are identical, do
513 * not need to calculate both */
514 /* NOTE: I do not think any substantial slow down will be experienced here
515 * The filters are *not* calculated for both + and x at least */
516 if (! frequencyRangesPlus[k])
517 {
518 frequencyRangesPlus[k] = (REAL4 *)
519 LALCalloc(params->numChiSquareBins-1, sizeof(REAL4));
520 frequencyRangesCross[k] = (REAL4 *)
521 LALCalloc(params->numChiSquareBins-1, sizeof(REAL4));
523 PTFM,NULL,NULL,frequencyRangesPlus[k],frequencyRangesCross[k],\
524 NULL,k,0);
525 }
526 if (! powerBinsPlus[k])
527 {
528 powerBinsPlus[k] = (REAL4 *)
529 LALCalloc(params->numChiSquareBins, sizeof(REAL4));
530 powerBinsCross[k] = (REAL4 *)
531 LALCalloc(params->numChiSquareBins, sizeof(REAL4));
533 PTFM,NULL,NULL,frequencyRangesPlus[k],frequencyRangesCross[k],\
534 powerBinsPlus[k],powerBinsCross[k],overlapCont,NULL,k,0);
535 }
536 for(j = 0; j < params->numChiSquareBins; j++)
537 {
538 if (! chisqSnglOverlaps[j].PTFqVec[k])
539 {
540 if (! tempqVec)
541 {
543 params->numTimePoints);
544 }
545 /* Work out the upper and lower frequency bins */
546 if (params->numChiSquareBins == 1)
547 {
548 fLow = 0;
549 fHigh = 0;
550 }
551 else if (j == 0)
552 {
553 fLow = 0;
554 fHigh = frequencyRangesPlus[k][0];
555 }
556 else if (j == params->numChiSquareBins-1)
557 {
558 fLow = frequencyRangesPlus[k][params->numChiSquareBins-2];
559 fHigh = 0;
560 }
561 else
562 {
563 fLow = frequencyRangesPlus[k][j-1];
564 fHigh = frequencyRangesPlus[k][j];
565 }
566 /* Calculate the overlaps */
567 chisqSnglOverlaps[j].PTFqVec[k] =
568 XLALCreateCOMPLEX8VectorSequence (1,params->numAnalPointsBuf);
569 coh_PTF_bank_filters(params,fcTmplt,0,\
570 &segments[k]->sgmnt[segmentNumber],invPlan,tempqVec,\
571 chisqSnglOverlaps[j].PTFqVec[k],fLow,fHigh);
572 }
573 } /* End loop over chisq bins */
574 } /* End of if params->haveTrig */
575 } /* End loop over ifos */
576
577 if (tempqVec)
578 {
580 }
581
582}
583
584
586 struct coh_PTF_params *params,
587 InspiralTemplate **PTFBankTemplates)
588{
589 UINT4 i,numTemplates;
590 InspiralTemplate *bankTemplate;
591
592 numTemplates = InspiralTmpltBankFromLIGOLw( PTFBankTemplates,
593 params->bankVetoBankName,-1, -1 );
594
595 bankTemplate = *PTFBankTemplates;
596
597 for (i=0; (i < numTemplates); bankTemplate = bankTemplate->next,i++)
598 {
599 bankTemplate->fLower = params->lowTemplateFrequency;
600 }
601 return numTemplates;
602}
603
605struct coh_PTF_params *params,
606InspiralTemplate *PTFBankTemplates,
607FindChirpTemplate *bankFcTmplts,
608UINT4 subBankSize,
610{
611 /* I think this function is now unused and can be removed */
612 UINT4 i;
613 srand(params->randomSeed);
614
615 REAL4 maxmass1 = 30.;
616 REAL4 minmass1 = 1.;
617 REAL4 minmass2 = 1.;
618 REAL4 maxchi = 0.;
619 REAL4 minchi = 0.;
620 REAL4 maxkappa = 1.;
621 REAL4 minkappa = 1.;
622
623 for ( i=0 ; i < subBankSize ; i++ )
624 {
625 bankFcTmplts[i].PTFQtilde =
627 PTFBankTemplates[i].approximant = FindChirpPTF;
628 PTFBankTemplates[i].order = LAL_PNORDER_TWO;
629 PTFBankTemplates[i].mass1 = pow(rand()/(float)RAND_MAX,2)*(maxmass1-minmass1)+minmass1;
630 PTFBankTemplates[i].mass2 = rand()/(float)RAND_MAX*(PTFBankTemplates[i].mass1 - minmass2) + minmass2;
631 PTFBankTemplates[i].chi = rand()/(float)RAND_MAX*(maxchi-minchi)+minchi;
632 PTFBankTemplates[i].kappa = rand()/(float)RAND_MAX*(maxkappa-minkappa)+minkappa;
633 PTFBankTemplates[i].fLower = 38.;
634 }
635}
636
639UINT4 position,
640UINT4 subBankSize,
641REAL4 Fplus[LAL_NUM_IFO],
642REAL4 Fcross[LAL_NUM_IFO],
643struct coh_PTF_params *params,
644struct bankCohTemplateOverlaps *cohBankOverlaps,
645struct bankComplexTemplateOverlaps *bankOverlaps,
646struct bankDataOverlaps *dataOverlaps,
647struct bankTemplateOverlaps *bankNormOverlaps,
648COMPLEX8VectorSequence *PTFqVec[LAL_NUM_IFO+1],
649REAL8Array *PTFM[LAL_NUM_IFO+1],
650INT4 timeOffsetPoints[LAL_NUM_IFO],
651gsl_matrix **Bankeigenvecs,
652gsl_vector **Bankeigenvals,
653UINT4 detectorNum,
654UINT4 vecLength,
655UINT4 vecLengthTwo
656)
657{
658 /* WARNING: THIS FUNCTION IS NON-SPIN ONLY. DO NOT ATTEMPT TO RUN WITH
659 PTF TEMPLATES IN SPIN MODE! */
660 UINT4 ui,uj,uk,halfNumPoints;
661 gsl_matrix *rotReOverlaps;
662 gsl_matrix *rotImOverlaps;
663 UINT4 snglDetMode = 1;
664 if (detectorNum == LAL_NUM_IFO)
665 {
666 snglDetMode = 0;
667 }
668
669 REAL4 *SNRu1,*SNRu2;
670 REAL4 BankVetoTemp[2*vecLengthTwo];
671 REAL4 BankVeto=0;
672 REAL4 normFac,overlapNorm,bankOverRe,bankOverIm;
673 REAL4 *TjwithS1,*TjwithS2;
674 SNRu1 = LALCalloc(vecLengthTwo,sizeof(REAL4));
675 SNRu2 = LALCalloc(vecLengthTwo,sizeof(REAL4));
676 TjwithS1 = LALCalloc(vecLengthTwo,sizeof(REAL4));
677 TjwithS2 = LALCalloc(vecLengthTwo,sizeof(REAL4));
678
679 /* Begin by calculating the components of the SNR */
680 if (snglDetMode)
681 {
682 SNRu1[0] = crealf(PTFqVec[detectorNum]->data[position+timeOffsetPoints[detectorNum]]);
683 SNRu1[0] = SNRu1[0] / pow(PTFM[detectorNum]->data[0],0.5);
684 SNRu2[0] = cimagf(PTFqVec[detectorNum]->data[position+timeOffsetPoints[detectorNum]]);
685 SNRu2[0] = SNRu2[0] / pow(PTFM[detectorNum]->data[0],0.5);
686 }
687 else
688 {
689 coh_PTF_calculate_rotated_vectors(params,PTFqVec,SNRu1,SNRu2,Fplus,Fcross,
690 timeOffsetPoints,Bankeigenvecs[subBankSize],Bankeigenvals[subBankSize],
691 numPoints,position,vecLength,vecLengthTwo,LAL_NUM_IFO);
692 }
693
694 /* The normalization factors are already calculated, they are the eigenvalues*/
695 halfNumPoints = params->numAnalPoints;
696
697 for ( ui = 0 ; ui < subBankSize ; ui++ )
698 {
699 if (snglDetMode)
700 {
701 TjwithS1[0] = crealf(dataOverlaps[ui].PTFqVec[detectorNum]->data[position \
702 - params->analStartPointBuf + timeOffsetPoints[detectorNum]]);
703 TjwithS1[0] = TjwithS1[0] / \
704 pow(bankNormOverlaps[ui].PTFM[detectorNum]->data[0],0.5);
705 TjwithS2[0] = cimagf(dataOverlaps[ui].PTFqVec[detectorNum]->data[position \
706 - params->analStartPointBuf + timeOffsetPoints[detectorNum]]);
707 TjwithS2[0] = TjwithS2[0] / \
708 pow(bankNormOverlaps[ui].PTFM[detectorNum]->data[0],0.5);
709 overlapNorm = PTFM[detectorNum]->data[0];
710 overlapNorm *= bankNormOverlaps[ui].PTFM[detectorNum]->data[0];
711 overlapNorm = pow(overlapNorm,0.5);
712 bankOverRe = crealf(bankOverlaps[ui].PTFM[detectorNum]->data[0]);
713 bankOverIm = cimagf(bankOverlaps[ui].PTFM[detectorNum]->data[0]);
714 bankOverRe = bankOverRe/overlapNorm;
715 bankOverIm = bankOverIm/overlapNorm;
716 for (uj = 0; uj < 2 * vecLengthTwo; uj++)
717 {
718 // Some stupidity here. vecLengthTwo must = 1 to be in this block
719 normFac = 0;
720 if (uj == 0)
721 BankVetoTemp[uj] = TjwithS1[0];
722 else
723 BankVetoTemp[uj] = TjwithS2[0];
724 for (uk = 0; uk < 2*vecLengthTwo; uk++)
725 {
726 if (uj == 0 && uk == 0)
727 {
728 BankVetoTemp[uj] -= bankOverRe*SNRu1[0];
729 normFac += pow(bankOverRe,2);
730 }
731 if (uj == 0 && uk == vecLengthTwo )
732 {
733 BankVetoTemp[uj] -= bankOverIm*SNRu2[0];
734 normFac += pow(bankOverIm,2);
735 }
736 if (uj == vecLengthTwo && uk == 0 )
737 {
738 BankVetoTemp[uj] += bankOverIm*SNRu1[0];
739 normFac += pow(bankOverIm,2);
740 }
741 if (uj == vecLengthTwo && uk == vecLengthTwo )
742 {
743 BankVetoTemp[uj]-=bankOverRe*SNRu2[0];
744 normFac += pow(bankOverRe,2);
745 }
746 }
747 BankVeto+=pow(BankVetoTemp[uj],2)/(1-normFac);
748
749 }
750
751 }
752 else
753 {
754 rotReOverlaps = cohBankOverlaps[ui].rotReOverlaps;
755 rotImOverlaps = cohBankOverlaps[ui].rotImOverlaps;
756 /* Calculate the components of subBank template with data */
757
759 TjwithS1,TjwithS2,Fplus,Fcross,timeOffsetPoints,Bankeigenvecs[ui],
760 Bankeigenvals[ui],halfNumPoints,position-params->analStartPointBuf,
761 vecLength,vecLengthTwo,LAL_NUM_IFO);
762 for (uj = 0; uj < 2*vecLengthTwo; uj++)
763 {
764 normFac = 0;
765 if (uj < vecLengthTwo)
766 BankVetoTemp[uj] = TjwithS1[uj];
767 else
768 BankVetoTemp[uj] = TjwithS2[uj-vecLengthTwo];
769 for (uk = 0; uk < 2*vecLengthTwo; uk++)
770 {
771 if (uj < vecLengthTwo && uk < vecLengthTwo)
772 {
773 BankVetoTemp[uj] -= gsl_matrix_get(rotReOverlaps,uk,uj)*SNRu1[uk];
774 normFac += pow(gsl_matrix_get(rotReOverlaps,uk,uj),2);
775 }
776 if (uj < vecLengthTwo && uk >= vecLengthTwo )
777 {
778 BankVetoTemp[uj] -= SNRu2[uk-vecLengthTwo] * gsl_matrix_get(
779 rotImOverlaps, uk-vecLengthTwo,uj);
780 normFac += pow(gsl_matrix_get(rotImOverlaps,uk-vecLengthTwo,uj),2);
781 }
782 if (uj >= vecLengthTwo && uk < vecLengthTwo )
783 {
784 BankVetoTemp[uj] += SNRu1[uk] * gsl_matrix_get(
785 rotImOverlaps,uk,uj-vecLengthTwo);
786 normFac += pow(gsl_matrix_get(rotImOverlaps,uk,uj-vecLengthTwo),2);
787 }
788 if (uj >= vecLengthTwo && uk >= vecLengthTwo )
789 {
790 BankVetoTemp[uj]-= SNRu2[uk-vecLengthTwo] * gsl_matrix_get(
791 rotReOverlaps,uk-vecLengthTwo,uj-vecLengthTwo);
792 normFac += pow(gsl_matrix_get(rotReOverlaps,
793 uk-vecLengthTwo,uj-vecLengthTwo),2);
794 }
795 }
796 BankVeto+=pow(BankVetoTemp[uj],2)/(1-normFac);
797
798 }
799 }
800 }
801
802 LALFree(SNRu1);
803 LALFree(SNRu2);
804 LALFree(TjwithS1);
805 LALFree(TjwithS2);
806
807 return BankVeto;
808}
809
810/* FIXME: Consider merging function with bank_veto calculation?? */
813UINT4 position,
814REAL4 Fplus[LAL_NUM_IFO],
815REAL4 Fcross[LAL_NUM_IFO],
816struct coh_PTF_params *params,
817struct bankCohTemplateOverlaps *cohAutoOverlaps,
818struct bankComplexTemplateOverlaps *autoTempOverlaps,
819COMPLEX8VectorSequence *PTFqVec[LAL_NUM_IFO+1],
820REAL8Array *PTFM[LAL_NUM_IFO+1],
821INT4 timeOffsetPoints[LAL_NUM_IFO],
822gsl_matrix *Autoeigenvecs,
823gsl_vector *Autoeigenvals,
824UINT4 detectorNum,
825UINT4 vecLength,
826UINT4 vecLengthTwo
827)
828{
829 /* WARNING: THIS FUNCTION IS NON-SPIN ONLY. DO NOT ATTEMPT TO RUN WITH
830 PTF TEMPLATES IN SPIN MODE! */
831 UINT4 ui,uj,uk;
832 gsl_matrix *rotReOverlaps;
833 gsl_matrix *rotImOverlaps;
834 UINT4 timeStepPoints = 0;
835 timeStepPoints = params->autoVetoTimeStep*params->sampleRate;
836
837 UINT4 snglDetMode = 1;
838 if (detectorNum == LAL_NUM_IFO)
839 {
840 snglDetMode = 0;
841 }
842
843 REAL4 *SNRu1,*SNRu2;
844 REAL4 AutoVetoTemp[2*vecLengthTwo];
845 REAL4 AutoVeto=0;
846 REAL4 normFac,autoOverRe,autoOverIm;
847 REAL4 *TjwithS1,*TjwithS2;
848 SNRu1 = LALCalloc(vecLengthTwo,sizeof(REAL4));
849 SNRu2 = LALCalloc(vecLengthTwo,sizeof(REAL4));
850 TjwithS1 = LALCalloc(vecLengthTwo,sizeof(REAL4));
851 TjwithS2 = LALCalloc(vecLengthTwo,sizeof(REAL4));
852
853 /* Begin by calculating the components of the SNR */
854 if (snglDetMode)
855 {
856 SNRu1[0] = crealf(PTFqVec[detectorNum]->data[position+timeOffsetPoints[detectorNum]]);
857 SNRu1[0] = SNRu1[0] / pow(PTFM[detectorNum]->data[0],0.5);
858 SNRu2[0] = cimagf(PTFqVec[detectorNum]->data[position+timeOffsetPoints[detectorNum]]);
859 SNRu2[0] = SNRu2[0] / pow(PTFM[detectorNum]->data[0],0.5);
860 }
861 else
862 {
863 coh_PTF_calculate_rotated_vectors(params,PTFqVec,SNRu1,SNRu2,Fplus,Fcross,
864 timeOffsetPoints,Autoeigenvecs,Autoeigenvals,
865 numPoints,position,vecLength,vecLengthTwo,LAL_NUM_IFO);
866 }
867
868 for ( ui = 0 ; ui < params->numAutoPoints ; ui++ )
869 {
870 if (snglDetMode)
871 {
872 TjwithS1[0] = crealf(PTFqVec[detectorNum]->data[position \
873 - ((ui+1) * timeStepPoints)+timeOffsetPoints[detectorNum]]);
874 TjwithS1[0] = TjwithS1[0] / pow(PTFM[detectorNum]->data[0],0.5);
875 TjwithS2[0] = cimagf(PTFqVec[detectorNum]->data[position \
876 - ((ui+1) * timeStepPoints)+timeOffsetPoints[detectorNum]]);
877 TjwithS2[0] = TjwithS2[0] / pow(PTFM[detectorNum]->data[0],0.5);
878 autoOverRe = crealf(autoTempOverlaps[ui].PTFM[detectorNum]->data[0]);
879 autoOverIm = cimagf(autoTempOverlaps[ui].PTFM[detectorNum]->data[0]);
880 autoOverRe = autoOverRe / PTFM[detectorNum]->data[0];
881 autoOverIm = autoOverIm / PTFM[detectorNum]->data[0];
882 for (uj = 0; uj < 2*vecLengthTwo; uj++)
883 {
884 normFac = 0;
885 if (uj == 0)
886 AutoVetoTemp[uj] = TjwithS1[0];
887 else
888 AutoVetoTemp[uj] = TjwithS2[0];
889 for (uk = 0; uk < 2*vecLengthTwo; uk++)
890 {
891 if (uj == 0 && uk == 0)
892 {
893 AutoVetoTemp[uj] -= autoOverRe*SNRu1[0];
894 normFac += pow(autoOverRe,2);
895 }
896 if (uj == 0 && uk == 1 )
897 {
898 AutoVetoTemp[uj] += autoOverIm*SNRu2[0];
899 normFac += pow(autoOverIm,2);
900 }
901 if (uj == 1 && uk == 0 )
902 {
903 AutoVetoTemp[uj] -= autoOverIm*SNRu1[0];
904 normFac += pow(autoOverIm,2);
905 }
906 if (uj == 1 && uk == 1 )
907 {
908 AutoVetoTemp[uj] -= autoOverRe*SNRu2[0];
909 normFac += pow(autoOverRe,2);
910 }
911 }
912 AutoVeto+=pow(AutoVetoTemp[uj],2)/(1-normFac);
913
914 }
915
916 }
917 else
918 {
919 rotReOverlaps = cohAutoOverlaps[ui].rotReOverlaps;
920 rotImOverlaps = cohAutoOverlaps[ui].rotImOverlaps;
921 /* Calculate the components of subBank template with data */
922
924 TjwithS2,Fplus,Fcross,timeOffsetPoints,Autoeigenvecs,
925 Autoeigenvals,numPoints,position-((ui+1) * timeStepPoints),vecLength,
926 vecLengthTwo,LAL_NUM_IFO);
927 for (uj = 0; uj < 2*vecLengthTwo; uj++)
928 {
929 normFac = 0;
930 if (uj < vecLengthTwo)
931 AutoVetoTemp[uj] = TjwithS1[uj];
932 else
933 AutoVetoTemp[uj] = TjwithS2[uj-vecLengthTwo];
934 for (uk = 0; uk < 2*vecLengthTwo; uk++)
935 {
936 if (uj < vecLengthTwo && uk < vecLengthTwo)
937 {
938 AutoVetoTemp[uj] -= gsl_matrix_get(rotReOverlaps,uk,uj)*SNRu1[uk];
939 normFac += pow(gsl_matrix_get(rotReOverlaps,uk,uj),2);
940 }
941 if (uj < vecLengthTwo && uk >= vecLengthTwo )
942 {
943 AutoVetoTemp[uj] += SNRu2[uk-vecLengthTwo] * gsl_matrix_get(
944 rotImOverlaps,uk-vecLengthTwo,uj);
945 normFac += pow(gsl_matrix_get(rotImOverlaps,uk-vecLengthTwo,uj),2);
946 }
947 if (uj >= vecLengthTwo && uk < vecLengthTwo )
948 {
949 AutoVetoTemp[uj] -= SNRu1[uk] * gsl_matrix_get(
950 rotImOverlaps,uk,uj-vecLengthTwo);
951 normFac += pow(gsl_matrix_get(rotImOverlaps,uk,uj-vecLengthTwo),2);
952 }
953 if (uj >= vecLengthTwo && uk >= vecLengthTwo )
954 {
955 AutoVetoTemp[uj]-= SNRu2[uk-vecLengthTwo] * gsl_matrix_get(
956 rotReOverlaps,uk-vecLengthTwo,uj-vecLengthTwo);
957 normFac += pow(gsl_matrix_get(rotReOverlaps,
958 uk-vecLengthTwo,uj-vecLengthTwo),2);
959 }
960 }
961 AutoVeto+=pow(AutoVetoTemp[uj],2)/(1-normFac);
962 }
963 }
964 }
965
966 LALFree(SNRu1);
967 LALFree(SNRu2);
968 LALFree(TjwithS1);
969 LALFree(TjwithS2);
970
971 return AutoVeto;
972}
973
975 struct coh_PTF_params *params,
976 struct bankTemplateOverlaps *bankNormOverlaps,
977 FindChirpTemplate *bankFcTmplts,
978 struct bankComplexTemplateOverlaps *bankOverlaps,
979 struct bankDataOverlaps *dataOverlaps,
980 struct bankComplexTemplateOverlaps *autoTempOverlaps
981)
982{
983 UINT4 ui,ifoNumber;
984
985 if ( bankNormOverlaps )
986 {
987 for ( ui = 0 ; ui < params->BVsubBankSize ; ui++ )
988 {
989 for( ifoNumber = 0; ifoNumber < LAL_NUM_IFO; ifoNumber++)
990 {
991 if ( bankNormOverlaps[ui].PTFM[ifoNumber] )
992 {
993 XLALDestroyREAL8Array(bankNormOverlaps[ui].PTFM[ifoNumber]);
994 }
995 }
996 }
997 LALFree(bankNormOverlaps);
998 }
999
1000 if ( bankFcTmplts )
1001 {
1002 for ( ui = 0 ; ui < params->BVsubBankSize ; ui++ )
1003 {
1004 if ( bankFcTmplts[ui].PTFQtilde )
1005 XLALDestroyCOMPLEX8VectorSequence( bankFcTmplts[ui].PTFQtilde );
1006 }
1007 LALFree( bankFcTmplts );
1008 }
1009
1010 if (dataOverlaps)
1011 {
1012 for (ui = 0 ; ui < params->BVsubBankSize ; ui++)
1013 {
1014 for(ifoNumber = 0; ifoNumber < LAL_NUM_IFO; ifoNumber++)
1015 {
1016 if (dataOverlaps[ui].PTFqVec[ifoNumber])
1018 dataOverlaps[ui].PTFqVec[ifoNumber]);
1019 }
1020 }
1021 LALFree(dataOverlaps);
1022 }
1023 if (bankOverlaps)
1024 {
1025 for (ui = 0 ; ui < params->BVsubBankSize ; ui++)
1026 {
1027 for(ifoNumber = 0; ifoNumber < LAL_NUM_IFO; ifoNumber++)
1028 {
1029 if (bankOverlaps[ui].PTFM[ifoNumber])
1030 XLALDestroyCOMPLEX8Array(bankOverlaps[ui].PTFM[ifoNumber]);
1031 }
1032 }
1033 LALFree(bankOverlaps);
1034 }
1035
1036 if (autoTempOverlaps)
1037 {
1038 for (ui = 0; ui < params->numAutoPoints; ui++)
1039 {
1040 for(ifoNumber = 0; ifoNumber < LAL_NUM_IFO; ifoNumber++)
1041 {
1042 if (params->haveTrig[ifoNumber])
1043 {
1044 if (autoTempOverlaps[ui].PTFM[ifoNumber])
1045 {
1046 XLALDestroyCOMPLEX8Array(autoTempOverlaps[ui].PTFM[ifoNumber]);
1047 }
1048 }
1049 }
1050 }
1051 LALFree(autoTempOverlaps);
1052 }
1053
1054}
1055
1056
1058 struct coh_PTF_params *params,
1059 struct bankComplexTemplateOverlaps bankOverlaps,
1060 struct bankCohTemplateOverlaps cohBankOverlaps,
1061 REAL4 Fplus[LAL_NUM_IFO],
1062 REAL4 Fcross[LAL_NUM_IFO],
1063 gsl_matrix *eigenvecs,
1064 gsl_vector *eigenvals,
1065 gsl_matrix *Bankeigenvecs,
1066 gsl_vector *Bankeigenvals,
1067 UINT4 vecLength,
1068 UINT4 vecLengthTwo
1069)
1070{
1071 /* THIS FUNCTION IS NON-SPIN ONLY! DO NOT TRY TO RUN WITH PTF IN SPIN MODE */
1072
1073 UINT4 uk,uj,ul;
1074 gsl_matrix *rotReOverlaps = cohBankOverlaps.rotReOverlaps;
1075 gsl_matrix *rotImOverlaps = cohBankOverlaps.rotImOverlaps;
1076
1077 gsl_matrix *reOverlaps = gsl_matrix_alloc(vecLengthTwo,vecLengthTwo);
1078 gsl_matrix *imOverlaps = gsl_matrix_alloc(vecLengthTwo,vecLengthTwo);
1079 gsl_matrix *tempM = gsl_matrix_alloc(vecLengthTwo,vecLengthTwo);
1080 REAL4 reOverlapsA[vecLengthTwo*vecLengthTwo];
1081 REAL4 imOverlapsA[vecLengthTwo*vecLengthTwo];
1082 REAL4 fone,ftwo;
1083
1084 /* First step would be to create a matrix of overlaps in non rotated frame*/
1085 for (uj = 0; uj < vecLengthTwo; uj++)
1086 {
1087 for (uk = 0 ; uk < vecLengthTwo; uk++)
1088 {
1089 reOverlapsA[uj*vecLengthTwo + uk] = 0;
1090 imOverlapsA[uj*vecLengthTwo + uk] = 0;
1091 }
1092 }
1093
1094 for (ul = 0; ul < LAL_NUM_IFO; ul++)
1095 {
1096 if ( params->haveTrig[ul] )
1097 {
1098 for (uj = 0; uj < vecLengthTwo; uj++)
1099 {
1100 if (params->faceOnStatistic)
1101 {
1102 for (uk = 0 ; uk < vecLengthTwo; uk++)
1103 {
1104 /* For face-on vecLengthTwo = 1 and this is a bit of a silly loop*/
1105 reOverlapsA[uj*vecLengthTwo + uk] += (Fplus[ul]*Fplus[ul] + Fcross[ul] * Fcross[ul])*crealf(bankOverlaps.PTFM[ul]->data[0]);
1106 if (params->faceOnStatistic == 1)
1107 {
1108 imOverlapsA[uj*vecLengthTwo + uk] += -(Fplus[ul]*Fplus[ul] + Fcross[ul] * Fcross[ul])*cimagf(bankOverlaps.PTFM[ul]->data[0]);
1109 }
1110 else if (params->faceOnStatistic == 2)
1111 {
1112 imOverlapsA[uj*vecLengthTwo + uk] += (Fplus[ul]*Fplus[ul] + Fcross[ul] * Fcross[ul])*cimagf(bankOverlaps.PTFM[ul]->data[0]);
1113 }
1114 else
1115 {
1116 fprintf(stderr,"Shit, I shouldn't be here! Face-on stat is broken");
1117 }
1118 }
1119 }
1120 else
1121 {
1122 if (uj < vecLength)
1123 fone = Fplus[ul];
1124 else
1125 fone = Fcross[ul];
1126 for (uk = 0 ; uk < vecLengthTwo; uk++)
1127 {
1128 if (uk < vecLength)
1129 ftwo = Fplus[ul];
1130 else
1131 ftwo = Fcross[ul];
1132 reOverlapsA[uj*vecLengthTwo + uk] +=
1133 fone * ftwo * crealf(bankOverlaps.PTFM[ul]->data[0]);
1134 imOverlapsA[uj*vecLengthTwo + uk] +=
1135 fone * ftwo * cimagf(bankOverlaps.PTFM[ul]->data[0]);
1136 }
1137 }
1138 }
1139 }
1140 }
1141 for (uj = 0; uj < vecLengthTwo; uj++)
1142 {
1143 for (uk = 0; uk < vecLengthTwo; uk++)
1144 {
1145 gsl_matrix_set(reOverlaps,uj,uk,reOverlapsA[uj*vecLengthTwo+uk]);
1146 gsl_matrix_set(imOverlaps,uj,uk,imOverlapsA[uj*vecLengthTwo+uk]);
1147 }
1148 }
1149
1150 /* And rotate by both set of eigenvectors */
1151
1152 gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1,reOverlaps,eigenvecs,0.,tempM);
1153 gsl_blas_dgemm(CblasTrans, CblasNoTrans, 1,Bankeigenvecs,tempM,0.,rotReOverlaps);
1154
1155 gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1,imOverlaps,eigenvecs,0.,tempM);
1156 gsl_blas_dgemm(CblasTrans, CblasNoTrans, 1,Bankeigenvecs,tempM,0.,rotImOverlaps);
1157
1158 for (uj=0; uj<vecLengthTwo; uj++)
1159 {
1160 for (uk=0; uk<vecLengthTwo; uk++ )
1161 {
1162 gsl_matrix_set(rotReOverlaps,uj,uk,gsl_matrix_get(rotReOverlaps,uj,uk)/(sqrt(gsl_vector_get(eigenvals,uk))*sqrt(gsl_vector_get(Bankeigenvals,uj))));
1163 gsl_matrix_set(rotImOverlaps,uj,uk,gsl_matrix_get(rotImOverlaps,uj,uk)/(sqrt(gsl_vector_get(eigenvals,uk))*sqrt(gsl_vector_get(Bankeigenvals,uj))));
1164 }
1165 }
1166
1167 gsl_matrix_free(reOverlaps);
1168 gsl_matrix_free(imOverlaps);
1169 gsl_matrix_free(tempM);
1170
1171}
1172
1174 struct coh_PTF_params *params,
1175 FindChirpTemplate *fcTmplt,
1176 REAL4FrequencySeries *invspec[LAL_NUM_IFO+1],
1177 REAL8Array *PTFM[LAL_NUM_IFO+1],
1178 REAL4 Fplus[LAL_NUM_IFO],
1179 REAL4 Fcross[LAL_NUM_IFO],
1180 REAL4 *frequencyRangesPlus,
1181 REAL4 *frequencyRangesCross,
1182 gsl_matrix *eigenvecs,
1183 UINT4 detectorNum,
1184 UINT4 singlePolFlag
1185)
1186{
1187 /* THIS FUNCTION IS NON-SPIN ONLY! DO NOT TRY TO RUN WITH PTF IN SPIN MODE */
1188 UINT4 i,k,kmin,kmax,len,freqBinPlus,freqBinCross,numFreqBins;
1189 REAL4 SNRtempPlus,SNRtempCross,SNRmaxPlus,SNRmaxCross;
1190 REAL8 f_min, deltaF, fFinal;
1191 /* Set to REAL8 for consistency with sigma squared calculation */
1192 REAL8 v1,v2,overlapCont;
1193 COMPLEX8 *PTFQtilde = NULL;
1196
1197 PTFQtilde = fcTmplt->PTFQtilde->data;
1198 len = 0;
1199 deltaF = 0;
1200 for ( k = 0; k < LAL_NUM_IFO; k++)
1201 {
1202 if ( params->haveTrig[k] )
1203 {
1204 len = invspec[k]->data->length;
1205 deltaF = invspec[k]->deltaF;
1206 break;
1207 }
1208 }
1209 /* This is explicit as I want f_min of template lower than f_min of filter*/
1210 /* Note that these frequencies are not just hardcoded here, if you change*/
1211 /* these values you will need to change them in other places as well */
1212 f_min = params->lowFilterFrequency;
1213 kmin = f_min / deltaF > 1 ? f_min / deltaF : 1;
1214 fFinal = params->highFilterFrequency;
1215 kmax = fFinal / deltaF < (len - 1) ? fFinal / deltaF : (len - 1);
1216
1217 numFreqBins = params->numChiSquareBins;
1218
1219 v1 = 0;
1220 v2 = 0;
1221 if (detectorNum == LAL_NUM_IFO)
1222 {
1223 /* If only one polarization the value of a2 and b2 is irrelevant! */
1224 if ( singlePolFlag )
1225 {
1226 for( k = 0; k < LAL_NUM_IFO; k++)
1227 {
1228 if ( params->haveTrig[k] )
1229 {
1230 a2[k] = 1;
1231 b2[k] = 1;
1232 }
1233 }
1234 }
1235 else if (params->faceOnStatistic)
1236 {
1237 for( k = 0; k < LAL_NUM_IFO; k++)
1238 {
1239 if ( params->haveTrig[k] )
1240 {
1241 a2[k] = pow(Fplus[k]*Fplus[k] + Fcross[k] * Fcross[k],0.5);
1242 b2[k] = a2[k];
1243 }
1244 }
1245 }
1246 else
1247 {
1248 for( k = 0; k < LAL_NUM_IFO; k++)
1249 {
1250 if ( params->haveTrig[k] )
1251 {
1252 a2[k] = Fplus[k]*gsl_matrix_get(eigenvecs,0,0) + Fcross[k]*gsl_matrix_get(eigenvecs,1,0);
1253 b2[k] = Fplus[k]*gsl_matrix_get(eigenvecs,0,1) + Fcross[k]*gsl_matrix_get(eigenvecs,1,1);
1254 }
1255 }
1256 }
1257 for( k = 0; k < LAL_NUM_IFO; k++)
1258 {
1259 if ( params->haveTrig[k] )
1260 {
1261 v1 += a2[k]*a2[k]*PTFM[k]->data[0];
1262 v2 += b2[k]*b2[k]*PTFM[k]->data[0];
1263 }
1264 }
1265 }
1266 else
1267 {
1268 v1 = PTFM[detectorNum]->data[0];
1269 v2 = PTFM[detectorNum]->data[0];
1270 }
1271
1272 SNRmaxPlus = v1;
1273 if (SNRmaxPlus < 0) SNRmaxPlus = -SNRmaxPlus;
1274 SNRmaxCross = v2;
1275 if (SNRmaxCross < 0) SNRmaxCross = -SNRmaxCross;
1276
1277 v1 = 0;
1278 v2 = 0;
1279
1280 freqBinPlus = 1;
1281 freqBinCross = 1;
1282 SNRtempPlus = 0;
1283 SNRtempCross = 0;
1284 for ( i = kmin; i < kmax ; ++i )
1285 {
1286 if (detectorNum == LAL_NUM_IFO)
1287 {
1288 for( k = 0; k < LAL_NUM_IFO; k++)
1289 {
1290 if ( params->haveTrig[k] )
1291 {
1292 overlapCont = (crealf(PTFQtilde[i]) * crealf(PTFQtilde[i]) +
1293 cimagf(PTFQtilde[i]) * cimagf(PTFQtilde[i]) )* invspec[k]->data->data[i] ;
1294 v1 += a2[k] * a2[k] * overlapCont;
1295 v2 += b2[k] * b2[k] * overlapCont;
1296 }
1297 }
1298 }
1299 else
1300 {
1301 overlapCont = ( crealf(PTFQtilde[i]) * crealf(PTFQtilde[i]) +
1302 cimagf(PTFQtilde[i]) * cimagf(PTFQtilde[i]) ) *
1303 invspec[detectorNum]->data->data[i] ;
1304 v1 += overlapCont;
1305 v2 = v1;
1306 }
1307 /* Calculate SNR */
1308 SNRtempPlus = v1 * 4 * deltaF;
1309 if (SNRtempPlus < 0) SNRtempPlus = -SNRtempPlus;
1310 SNRtempCross = v2 * 4 * deltaF;
1311 if (SNRtempCross < 0) SNRtempCross = -SNRtempCross;
1312 /* Compare to max SNR */
1313 if (SNRtempPlus > SNRmaxPlus * ((REAL4)freqBinPlus/(REAL4)numFreqBins))
1314 {
1315 if (freqBinPlus < numFreqBins)
1316 {
1317 /* Record the frequency */
1318 frequencyRangesPlus[freqBinPlus-1] = (i)*deltaF;
1319 freqBinPlus+=1;
1320 }
1321 }
1322 if (SNRtempCross > SNRmaxCross * ((REAL4)freqBinCross/(REAL4)numFreqBins))
1323 {
1324 if (freqBinCross < numFreqBins)
1325 {
1326 /* Record the frequency */
1327 frequencyRangesCross[freqBinCross-1] = (i)*deltaF;
1328 freqBinCross+=1;
1329 }
1330 }
1331 }
1332 /* Final frequency bins should be infinite */
1333 frequencyRangesPlus[freqBinPlus-1] = kmax * deltaF;
1334 frequencyRangesCross[freqBinCross-1] = kmax * deltaF;
1335}
1336
1338 struct coh_PTF_params *params,
1339 FindChirpTemplate *fcTmplt,
1340 REAL4FrequencySeries *invspec[LAL_NUM_IFO+1],
1341 REAL8Array *PTFM[LAL_NUM_IFO+1],
1342 REAL4 Fplus[LAL_NUM_IFO],
1343 REAL4 Fcross[LAL_NUM_IFO],
1344 REAL4 *frequencyRangesPlus,
1345 REAL4 *frequencyRangesCross,
1346 REAL4 *powerBinsPlus,
1347 REAL4 *powerBinsCross,
1348 REAL4 **overlapCont,
1349 gsl_matrix *eigenvecs,
1350 UINT4 detectorNum,
1351 UINT4 singlePolFlag
1352)
1353{
1354 /* THIS FUNCTION IS NON-SPIN ONLY! DO NOT TRY TO RUN WITH PTF IN SPIN MODE */
1355 UINT4 i,k,kmin,kmax,len,freqBinPlus,freqBinCross,numFreqBins;
1356 REAL4 v1,v2,SNRtempPlus,SNRtempCross,SNRmaxPlus,SNRmaxCross;
1357 REAL4 SNRplusLast,SNRcrossLast,currOverlapContPlus;
1358 /* FIXME: Change to REAL8 for consistency with PTFM */
1359 REAL8 tmpOverlapCont;
1360 REAL4 currOverlapContCross;
1361 REAL8 f_min, deltaF, fFinal;
1362 COMPLEX8 *PTFQtilde = NULL;
1365
1366 PTFQtilde = fcTmplt->PTFQtilde->data;
1367 len = 0;
1368 deltaF = 0;
1369 tmpOverlapCont = 0;
1370
1371 for ( k = 0; k < LAL_NUM_IFO; k++)
1372 {
1373 if ( params->haveTrig[k] )
1374 {
1375 len = invspec[k]->data->length;
1376 deltaF = invspec[k]->deltaF;
1377 break;
1378 }
1379 }
1380 /* This is explicit as I want f_min of template lower than f_min of filter*/
1381 /* Note that these frequencies are not just hardcoded here, if you change*/
1382 /* these values you will need to change them in other places as well */
1383 f_min = params->lowFilterFrequency;
1384 kmin = f_min / deltaF > 1 ? f_min / deltaF : 1;
1385 fFinal = params->highFilterFrequency;
1386 kmax = fFinal / deltaF < (len - 1) ? fFinal / deltaF : (len - 1);
1387
1388 numFreqBins = params->numChiSquareBins;
1389
1390 v1 = 0;
1391 v2 = 0;
1392 if (detectorNum == LAL_NUM_IFO)
1393 {
1394 /* If only one polarization the value of a2 and b2 is irrelevant! */
1395 if ( singlePolFlag )
1396 {
1397 for( k = 0; k < LAL_NUM_IFO; k++)
1398 {
1399 if ( params->haveTrig[k] )
1400 {
1401 a2[k] = 1;
1402 b2[k] = 1;
1403 }
1404 }
1405 }
1406 else if (params->faceOnStatistic)
1407 {
1408 for( k = 0; k < LAL_NUM_IFO; k++)
1409 {
1410 if ( params->haveTrig[k] )
1411 {
1412 a2[k] = pow(Fplus[k]*Fplus[k] + Fcross[k] * Fcross[k],0.5);
1413 b2[k] = a2[k];
1414 }
1415 }
1416 }
1417 else
1418 {
1419 for( k = 0; k < LAL_NUM_IFO; k++)
1420 {
1421 if ( params->haveTrig[k] )
1422 {
1423 a2[k] = Fplus[k]*gsl_matrix_get(eigenvecs,0,0) + Fcross[k]*gsl_matrix_get(eigenvecs,1,0);
1424 b2[k] = Fplus[k]*gsl_matrix_get(eigenvecs,0,1) + Fcross[k]*gsl_matrix_get(eigenvecs,1,1);
1425 }
1426 }
1427 }
1428 for( k = 0; k < LAL_NUM_IFO; k++)
1429 {
1430 if ( params->haveTrig[k] )
1431 {
1432 v1 += a2[k]*a2[k]*PTFM[k]->data[0];
1433 v2 += b2[k]*b2[k]*PTFM[k]->data[0];
1434 }
1435 }
1436 }
1437 else
1438 {
1439 v1 = PTFM[detectorNum]->data[0];
1440 v2 = PTFM[detectorNum]->data[0];
1441 }
1442
1443 SNRmaxPlus = v1;
1444 SNRmaxCross = v2;
1445 if (SNRmaxPlus < 0) SNRmaxPlus = -SNRmaxPlus;
1446 if (SNRmaxCross < 0) SNRmaxCross = -SNRmaxCross;
1447
1448 v1 = 0;
1449 v2 = 0;
1450
1451 freqBinPlus = 0;
1452 freqBinCross = 0;
1453 SNRtempPlus = 0;
1454 SNRtempCross = 0;
1455 SNRplusLast = 0.;
1456 SNRcrossLast = 0.;
1457
1458 for( k = 0; k < LAL_NUM_IFO; k++)
1459 {
1460 if ( params->haveTrig[k] )
1461 {
1462 if (! overlapCont[k] && ((detectorNum == LAL_NUM_IFO)||(detectorNum==k)) )
1463 {
1464 overlapCont[k] = LALCalloc(1, 2*params->numChiSquareBins*sizeof(REAL4));
1465 tmpOverlapCont = 0;
1466 freqBinPlus = 0;
1467 freqBinCross = 0;
1468 for ( i = kmin; i < kmax ; ++i )
1469 {
1470 tmpOverlapCont += (crealf(PTFQtilde[i]) * crealf(PTFQtilde[i]) + \
1471 cimagf(PTFQtilde[i]) * cimagf(PTFQtilde[i]) ) * \
1472 invspec[k]->data->data[i] ;
1473 if (i * deltaF > frequencyRangesPlus[freqBinPlus] && \
1474 freqBinPlus < (numFreqBins-1))
1475 {
1476 (overlapCont[k])[freqBinPlus] = tmpOverlapCont;
1477 freqBinPlus++;
1478 }
1479 if (i * deltaF > frequencyRangesCross[freqBinCross] \
1480 && freqBinCross < (numFreqBins-1))
1481 {
1482 (overlapCont[k])[freqBinCross+params->numChiSquareBins] = tmpOverlapCont;
1483 freqBinCross++;
1484 }
1485 } /* End loop over frequency */
1486 if (freqBinPlus == (numFreqBins-1))
1487 {
1488 (overlapCont[k])[freqBinPlus] = tmpOverlapCont;
1489 }
1490 if (freqBinCross == (numFreqBins-1))
1491 {
1492 (overlapCont[k])[params->numChiSquareBins + freqBinCross] = tmpOverlapCont;
1493 }
1494 } /* End if data has not yet been calculated */
1495 } /* End if ifo active */
1496 } /* End loop over ifos */
1497
1498 for ( i = 0; i < params->numChiSquareBins; ++i )
1499 {
1500 v1 = v2 = 0;
1501 if (detectorNum == LAL_NUM_IFO)
1502 {
1503 for( k = 0; k < LAL_NUM_IFO; k++)
1504 {
1505 if ( params->haveTrig[k] )
1506 {
1507 currOverlapContPlus = (overlapCont[k])[i];
1508 currOverlapContCross = (overlapCont[k])[i+params->numChiSquareBins];
1509 v1 += a2[k] * a2[k] * currOverlapContPlus * 4 * deltaF;
1510 v2 += b2[k] * b2[k] * currOverlapContCross * 4 * deltaF;
1511 }
1512 }
1513 }
1514 else
1515 {
1516 currOverlapContPlus = (overlapCont[detectorNum])[i];
1517 v1 = currOverlapContPlus * 4 * deltaF;
1518 v2 = v1;
1519 }
1520
1521 /* FIXME: How can these be negative?? Why is this check here??? */
1522 SNRtempPlus = v1;
1523 if (SNRtempPlus < 0) SNRtempPlus = -SNRtempPlus;
1524 SNRtempCross = v2 * 4 * deltaF;
1525 if (SNRtempCross < 0) SNRtempCross = -SNRtempCross;
1526
1527 powerBinsPlus[i] = SNRtempPlus/SNRmaxPlus - SNRplusLast;
1528 SNRplusLast = SNRtempPlus/SNRmaxPlus;
1529
1530 powerBinsCross[i] = SNRtempCross/SNRmaxCross - SNRcrossLast;
1531 SNRcrossLast = SNRtempCross/SNRmaxCross;
1532 }
1533
1534 /* Ensure that the power Bins add to 1. This should already be true but
1535 numerical counting errors can have a small effect here.*/
1536 SNRplusLast = 0;
1537 SNRcrossLast = 0;
1538 for ( i = 0 ; i < (numFreqBins); i++)
1539 {
1540 SNRplusLast += powerBinsPlus[i];
1541 SNRcrossLast += powerBinsCross[i];
1542 }
1543 for ( i = 0 ; i < (numFreqBins); i++)
1544 {
1545 powerBinsPlus[i] = powerBinsPlus[i]/SNRplusLast;
1546 powerBinsCross[i] = powerBinsCross[i]/SNRcrossLast;
1547 }
1548
1549}
1550
1552struct coh_PTF_params *params,
1553UINT4 position,
1554struct bankDataOverlaps *chisqOverlaps,
1555COMPLEX8VectorSequence *PTFqVec[LAL_NUM_IFO+1],
1556REAL8Array *PTFM[LAL_NUM_IFO+1],
1557REAL4 Fplus[LAL_NUM_IFO],
1558REAL4 Fcross[LAL_NUM_IFO],
1559INT4 timeOffsetPoints[LAL_NUM_IFO],
1560gsl_matrix *eigenvecs,
1561gsl_vector *eigenvals,
1562REAL4 *powerBinsPlus,
1563REAL4 *powerBinsCross,
1564UINT4 detectorNum,
1565UINT4 vecLength,
1566UINT4 vecLengthTwo
1567)
1568{
1569 /* THIS FUNCTION IS NON-SPIN ONLY! DO NOT TRY TO RUN WITH PTF IN SPIN MODE */
1570 UINT4 i,halfNumPoints,numPoints;
1571 REAL4 *v1Plus,*v2Plus,*v1full,*v2full;
1572 REAL4 *v1Cross,*v2Cross;
1573 REAL4 chiSq,SNRtemp,SNRexp;
1574 UINT4 numChiSquareBins = params->numChiSquareBins;
1575
1576 v1Plus = LALCalloc(vecLengthTwo,sizeof(REAL4));
1577 v2Plus = LALCalloc(vecLengthTwo,sizeof(REAL4));
1578 v1Cross = LALCalloc(vecLengthTwo,sizeof(REAL4));
1579 v2Cross = LALCalloc(vecLengthTwo,sizeof(REAL4));
1580
1581 v1full = LALCalloc(vecLengthTwo,sizeof(REAL4));
1582 v2full = LALCalloc(vecLengthTwo,sizeof(REAL4));
1583
1584 numPoints = params->numTimePoints;
1585 halfNumPoints = params->numAnalPointsBuf;
1586
1587 chiSq = 0;
1588 SNRexp = 0;
1589
1590 if (detectorNum == LAL_NUM_IFO)
1591 {
1592 coh_PTF_calculate_rotated_vectors(params,PTFqVec,v1full,v2full,Fplus,Fcross,
1593 timeOffsetPoints,eigenvecs,eigenvals,numPoints,
1594 position,vecLength,vecLengthTwo,LAL_NUM_IFO);
1595 }
1596 else
1597 {
1598 v1full[0] = crealf(PTFqVec[detectorNum]->data[position+timeOffsetPoints[detectorNum]]);
1599 v1full[0] = v1full[0]/pow(PTFM[detectorNum]->data[0],0.5);
1600 v2full[0] = cimagf(PTFqVec[detectorNum]->data[position+timeOffsetPoints[detectorNum]]);
1601 v2full[0] = v2full[0]/pow(PTFM[detectorNum]->data[0],0.5);
1602 }
1603
1604 for (i = 0; i < vecLengthTwo; i++)
1605 {
1606 SNRexp += v1full[i]*v1full[i];
1607 SNRexp += v2full[i]*v2full[i];
1608 }
1609 SNRexp = pow(SNRexp,0.5);
1610
1611 for (i = 0; i < numChiSquareBins; i++ )
1612 {
1613 if (detectorNum == LAL_NUM_IFO)
1614 {
1615 /* calculate SNR in this frequency bin */
1616 coh_PTF_calculate_rotated_vectors(params,chisqOverlaps[i].PTFqVec,v1Plus,
1617 v2Plus,Fplus,Fcross,timeOffsetPoints,eigenvecs,eigenvals,
1618 halfNumPoints,position-params->analStartPointBuf,vecLength,
1619 vecLengthTwo,LAL_NUM_IFO);
1620
1622 chisqOverlaps[i+numChiSquareBins].PTFqVec,v1Cross,
1623 v2Cross,Fplus,Fcross,timeOffsetPoints,eigenvecs,eigenvals,
1624 halfNumPoints,position-params->analStartPointBuf,vecLength,
1625 vecLengthTwo,LAL_NUM_IFO);
1626
1627 SNRtemp= pow((v1Plus[0] - v1full[0]*powerBinsPlus[i]),2)/powerBinsPlus[i];
1628 SNRtemp+= pow((v2Plus[0] - v2full[0]*powerBinsPlus[i]),2)/powerBinsPlus[i];
1629 if (vecLengthTwo == 2)
1630 {
1631 SNRtemp+= pow((v1Cross[1]-v1full[1]*powerBinsCross[i]),2)/powerBinsCross[i];
1632 SNRtemp+= pow((v2Cross[1]-v2full[1]*powerBinsCross[i]),2)/powerBinsCross[i];
1633 }
1634 chiSq += SNRtemp;
1635 }
1636 else
1637 {
1638 v1Plus[0] = crealf(chisqOverlaps[i].PTFqVec[detectorNum]->data[position-params->analStartPointBuf+timeOffsetPoints[detectorNum]]);
1639 v1Plus[0] = v1Plus[0]/pow(PTFM[detectorNum]->data[0],0.5);
1640 v2Plus[0] = cimagf(chisqOverlaps[i].PTFqVec[detectorNum]->data[position-params->analStartPointBuf+timeOffsetPoints[detectorNum]]);
1641 v2Plus[0] = v2Plus[0]/pow(PTFM[detectorNum]->data[0],0.5);
1642 SNRtemp = pow((v1Plus[0] - v1full[0]*powerBinsPlus[i]),2)/powerBinsPlus[i];
1643 SNRtemp += pow((v2Plus[0] - v2full[0]*powerBinsCross[i]),2)/powerBinsCross[i];
1644 chiSq += SNRtemp;
1645 }
1646 }
1647 LALFree(v1Plus);
1648 LALFree(v2Plus);
1649 LALFree(v1Cross);
1650 LALFree(v2Cross);
1651 LALFree(v1full);
1652 LALFree(v2full);
1653 return chiSq;
1654}
int InspiralTmpltBankFromLIGOLw(InspiralTemplate **bankHead, const CHAR *fileName, INT4 startTmplt, INT4 stopTmplt)
int j
int k
#define LALCalloc(m, n)
#define LALFree(p)
const double b2
LAL_NUM_IFO
#define fprintf
int verbose
Definition: chirplen.c:77
void coh_PTF_complex_template_overlaps(struct coh_PTF_params *params, FindChirpTemplate *fcTmplt1, FindChirpTemplate *fcTmplt2, REAL4FrequencySeries *invspec, UINT4 spinBank, COMPLEX8Array *PTFM)
void coh_PTF_calculate_rotated_vectors(struct coh_PTF_params *params, COMPLEX8VectorSequence **PTFqVec, REAL4 *u1, REAL4 *u2, REAL4 *Fplus, REAL4 *Fcross, INT4 *timeOffsetPoints, gsl_matrix *eigenvecs, gsl_vector *eigenvals, UINT4 numPoints, UINT4 position, UINT4 vecLength, UINT4 vecLengthTwo, UINT4 detectorNum)
void coh_PTF_template(FindChirpTemplate *fcTmplt, InspiralTemplate *InspTmplt, FindChirpTmpltParams *params)
void coh_PTF_template_overlaps(struct coh_PTF_params *params, FindChirpTemplate *fcTmplt1, FindChirpTemplate *fcTmplt2, REAL4FrequencySeries *invspec, UINT4 spinBank, REAL8Array *PTFM)
void coh_PTF_auto_veto_overlaps(struct coh_PTF_params *params, FindChirpTemplate *fcTmplt, struct bankComplexTemplateOverlaps *autoTempOverlaps, REAL4FrequencySeries *invspec, COMPLEX8FFTPlan *invBankPlan, UINT4 spinBank, UINT4 numAutoPoints, UINT4 timeStepPoints, UINT4 ifoNumber)
void coh_PTF_calculate_bmatrix(struct coh_PTF_params *params, gsl_matrix *eigenvecs, gsl_vector *eigenvals, REAL4 Fplus[LAL_NUM_IFO], REAL4 Fpcross[LAL_NUM_IFO], REAL8Array *PTFM[LAL_NUM_IFO+1], UINT4 vecLength, UINT4 vecLengthTwo, UINT4 PTFMlen)
long int timeval_subtract(struct timeval *t1)
void coh_PTF_bank_filters(struct coh_PTF_params *params, FindChirpTemplate *fcTmplt, UINT4 spinBank, COMPLEX8FrequencySeries *sgmnt, COMPLEX8FFTPlan *invBankPlan, COMPLEX8VectorSequence *PTFqVec, COMPLEX8VectorSequence *PTFBankqVec, REAL8 f_min, REAL8 fFinal)
void coh_PTF_chi_square_sngl_setup(struct coh_PTF_params *params, REAL4 **frequencyRangesPlus, REAL4 **frequencyRangesCross, REAL4 **powerBinsPlus, REAL4 **powerBinsCross, REAL4 **overlapCont, struct bankDataOverlaps **chisqSnglOverlapsP, FindChirpTemplate *fcTmplt, REAL4FrequencySeries **invspec, RingDataSegments **segments, REAL8Array **PTFM, COMPLEX8FFTPlan *invPlan, INT4 segmentNumber)
UINT4 coh_PTF_read_sub_bank(struct coh_PTF_params *params, InspiralTemplate **PTFBankTemplates)
void coh_PTF_calculate_bank_veto_template_filters(struct coh_PTF_params *params, FindChirpTemplate *bankFcTmplts, FindChirpTemplate *fcTmplt, REAL4FrequencySeries **invspec, struct bankComplexTemplateOverlaps *bankOverlaps)
REAL4 coh_PTF_calculate_bank_veto(UINT4 numPoints, UINT4 position, UINT4 subBankSize, REAL4 Fplus[LAL_NUM_IFO], REAL4 Fcross[LAL_NUM_IFO], struct coh_PTF_params *params, struct bankCohTemplateOverlaps *cohBankOverlaps, struct bankComplexTemplateOverlaps *bankOverlaps, struct bankDataOverlaps *dataOverlaps, struct bankTemplateOverlaps *bankNormOverlaps, COMPLEX8VectorSequence *PTFqVec[LAL_NUM_IFO+1], REAL8Array *PTFM[LAL_NUM_IFO+1], INT4 timeOffsetPoints[LAL_NUM_IFO], gsl_matrix **Bankeigenvecs, gsl_vector **Bankeigenvals, UINT4 detectorNum, UINT4 vecLength, UINT4 vecLengthTwo)
void coh_PTF_calculate_standard_chisq_power_bins(struct coh_PTF_params *params, FindChirpTemplate *fcTmplt, REAL4FrequencySeries *invspec[LAL_NUM_IFO+1], REAL8Array *PTFM[LAL_NUM_IFO+1], REAL4 Fplus[LAL_NUM_IFO], REAL4 Fcross[LAL_NUM_IFO], REAL4 *frequencyRangesPlus, REAL4 *frequencyRangesCross, REAL4 *powerBinsPlus, REAL4 *powerBinsCross, REAL4 **overlapCont, gsl_matrix *eigenvecs, UINT4 detectorNum, UINT4 singlePolFlag)
REAL4 coh_PTF_calculate_chi_square(struct coh_PTF_params *params, UINT4 position, struct bankDataOverlaps *chisqOverlaps, COMPLEX8VectorSequence *PTFqVec[LAL_NUM_IFO+1], REAL8Array *PTFM[LAL_NUM_IFO+1], REAL4 Fplus[LAL_NUM_IFO], REAL4 Fcross[LAL_NUM_IFO], INT4 timeOffsetPoints[LAL_NUM_IFO], gsl_matrix *eigenvecs, gsl_vector *eigenvals, REAL4 *powerBinsPlus, REAL4 *powerBinsCross, UINT4 detectorNum, UINT4 vecLength, UINT4 vecLengthTwo)
void coh_PTF_bank_veto_coh_setup(struct coh_PTF_params *params, gsl_matrix **Bankeigenvecs, gsl_vector **Bankeigenvals, struct bankCohTemplateOverlaps **bankCohOverlapsP, struct bankComplexTemplateOverlaps *bankOverlaps, REAL4 *Fplus, REAL4 *Fcross, REAL8Array **PTFM, struct bankTemplateOverlaps *bankNormOverlaps, UINT4 csVecLength, UINT4 csVecLengthTwo, UINT4 vecLength)
void coh_PTF_auto_veto_coh_setup(struct coh_PTF_params *params, gsl_matrix **AutoeigenvecsP, gsl_vector **AutoeigenvalsP, struct bankCohTemplateOverlaps **autoCohOverlapsP, struct bankComplexTemplateOverlaps *autoTempOverlaps, REAL4 *Fplus, REAL4 *Fcross, REAL8Array **PTFM, UINT4 csVecLength, UINT4 csVecLengthTwo, UINT4 vecLength)
void coh_PTF_bank_veto_segment_setup(struct coh_PTF_params *params, struct bankDataOverlaps *dataOverlaps, FindChirpTemplate *bankFcTmplts, RingDataSegments **segments, COMPLEX8VectorSequence **PTFqVec, COMPLEX8FFTPlan *invplan, INT4 segmentNum, struct timeval startTime)
void coh_PTF_calculate_coherent_bank_overlaps(struct coh_PTF_params *params, struct bankComplexTemplateOverlaps bankOverlaps, struct bankCohTemplateOverlaps cohBankOverlaps, REAL4 Fplus[LAL_NUM_IFO], REAL4 Fcross[LAL_NUM_IFO], gsl_matrix *eigenvecs, gsl_vector *eigenvals, gsl_matrix *Bankeigenvecs, gsl_vector *Bankeigenvals, UINT4 vecLength, UINT4 vecLengthTwo)
UINT4 coh_PTF_initialize_bank_veto(struct coh_PTF_params *params, struct bankTemplateOverlaps **bankNormOverlapsP, struct bankComplexTemplateOverlaps **bankOverlapsP, struct bankDataOverlaps **dataOverlapsP, FindChirpTemplate **bankFcTmpltsP, FindChirpTemplate *fcTmplt, FindChirpTmpltParams *fcTmpltParams, REAL4FrequencySeries **invspec, struct timeval startTime)
REAL4 coh_PTF_calculate_auto_veto(UINT4 numPoints, UINT4 position, REAL4 Fplus[LAL_NUM_IFO], REAL4 Fcross[LAL_NUM_IFO], struct coh_PTF_params *params, struct bankCohTemplateOverlaps *cohAutoOverlaps, struct bankComplexTemplateOverlaps *autoTempOverlaps, COMPLEX8VectorSequence *PTFqVec[LAL_NUM_IFO+1], REAL8Array *PTFM[LAL_NUM_IFO+1], INT4 timeOffsetPoints[LAL_NUM_IFO], gsl_matrix *Autoeigenvecs, gsl_vector *Autoeigenvals, UINT4 detectorNum, UINT4 vecLength, UINT4 vecLengthTwo)
UINT4 coh_PTF_initialize_auto_veto(struct coh_PTF_params *params, struct bankComplexTemplateOverlaps **autoTempOverlapsP, struct timeval startTime)
void coh_PTF_chi_square_coh_setup(struct coh_PTF_params *params, gsl_matrix **AutoeigenvecsP, gsl_vector **AutoeigenvalsP, REAL4 **frequencyRangesPlus, REAL4 **frequencyRangesCross, REAL4 **powerBinsPlus, REAL4 **powerBinsCross, REAL4 **overlapCont, struct bankDataOverlaps **chisqOverlapsP, FindChirpTemplate *fcTmplt, REAL4FrequencySeries **invspec, RingDataSegments **segments, REAL4 *Fplus, REAL4 *Fcross, REAL8Array **PTFM, COMPLEX8FFTPlan *invPlan, INT4 segmentNumber, UINT4 csVecLength, UINT4 csVecLengthTwo, UINT4 vecLength)
void coh_PTF_initialise_sub_bank(struct coh_PTF_params *params, InspiralTemplate *PTFBankTemplates, FindChirpTemplate *bankFcTmplts, UINT4 subBankSize, UINT4 numPoints)
void coh_PTF_calculate_auto_veto_template_filters(struct coh_PTF_params *params, FindChirpTemplate *fcTmplt, struct bankComplexTemplateOverlaps *autoTempOverlaps, REAL4FrequencySeries **invspec, COMPLEX8FFTPlan *invplan, UINT4 timeStepPoints)
void coh_PTF_free_veto_memory(struct coh_PTF_params *params, struct bankTemplateOverlaps *bankNormOverlaps, FindChirpTemplate *bankFcTmplts, struct bankComplexTemplateOverlaps *bankOverlaps, struct bankDataOverlaps *dataOverlaps, struct bankComplexTemplateOverlaps *autoTempOverlaps)
void coh_PTF_calculate_standard_chisq_freq_ranges(struct coh_PTF_params *params, FindChirpTemplate *fcTmplt, REAL4FrequencySeries *invspec[LAL_NUM_IFO+1], REAL8Array *PTFM[LAL_NUM_IFO+1], REAL4 Fplus[LAL_NUM_IFO], REAL4 Fcross[LAL_NUM_IFO], REAL4 *frequencyRangesPlus, REAL4 *frequencyRangesCross, gsl_matrix *eigenvecs, UINT4 detectorNum, UINT4 singlePolFlag)
const double a2
sigmaKerr data[0]
COMPLEX8Array * XLALCreateCOMPLEX8ArrayL(UINT4,...)
void XLALDestroyREAL8Array(REAL8Array *)
REAL8Array * XLALCreateREAL8ArrayL(UINT4,...)
void XLALDestroyCOMPLEX8Array(COMPLEX8Array *)
COMPLEX8VectorSequence * XLALCreateCOMPLEX8VectorSequence(UINT4 length, UINT4 veclen)
void XLALDestroyCOMPLEX8VectorSequence(COMPLEX8VectorSequence *vecseq)
double REAL8
uint32_t UINT4
float complex COMPLEX8
int32_t INT4
float REAL4
FindChirpPTF
LAL_PNORDER_TWO
int i
Definition: inspinj.c:596
REAL8 mass1
Definition: inspinj.c:576
fHigh
int deltaF
float
kmin
kmax
ul
int startTime
REAL4 fLow
Definition: randombank.c:83
COMPLEX8 * data
COMPLEX8 * data
This structure contains a frequency domain template used as input to the FindChirpFilter() routine.
COMPLEX8Vector * data
Vector of length containing the frequency template data ; For a template generated in the frequency ...
COMPLEX8VectorSequence * PTFQtilde
UNDOCUMENTED.
This structure contains the parameters for generation of templates by the various template generation...
Approximant approximant
LALPNOrder order
struct tagInspiralTemplate * next
REAL8 * data
gsl_matrix * rotReOverlaps
Definition: coh_PTF.h:256
gsl_matrix * rotImOverlaps
Definition: coh_PTF.h:257
COMPLEX8Array * PTFM[LAL_NUM_IFO]
Definition: coh_PTF.h:247
COMPLEX8VectorSequence * PTFqVec[LAL_NUM_IFO+1]
Definition: coh_PTF.h:252
REAL8Array * PTFM[LAL_NUM_IFO+1]
Definition: coh_PTF.h:243
INT4 numPoints
Definition: tmpltbank.c:399
double f_min