Logo Coherent WaveBurst  
Reference Guide
Logo
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
WDMOverlap.cc
Go to the documentation of this file.
1 #include "WDMOverlap.hh"
2 
3 #include "SymmArray.hh"
4 
5 template <class T>
7 { nRes = 0;
8  layers = 0;
9  catalog = 0;
10 }
11 
12 
13 template <class T>
14 WDMOverlap<T>::WDMOverlap(WDM<T>** wdm0, int nRes, double minOvlp)
15 { // constructor using nRes pointers to WDM objects for which it creates
16  // a catalog containing all the basis function overlap values
17  // above a threshold (minOvlp)
18  int i,j, k;
19  this->nRes = nRes;
20 
21  layers = new int [nRes];
22  WDM<T>* wdm[nRes];
23 
24  for(i=0;i<nRes; ++i){
25  layers[i] = wdm0[i]->m_Layer;
26  wdm[i] = new WDM<T>(layers[i], wdm0[i]->KWDM, wdm0[i]->BetaOrder, 12);
27  }
28 
29  for(i=0;i<nRes-1; ++i)if(layers[i]>layers[i+1]){
30  printf("WDMOverlap::WDMOverlap : layers not ordered properly, exit\n");
31  return;
32  }
33 
34  struct overlaps tmp[10000];
35  SymmArray<double> td1A, td1Q, td2A_even, td2Q_even, td2A_odd, td2Q_odd;
36 
37  int totOvlps = 0;
38  catalog = new (struct ovlArray (**[nRes])[2] );
39  for(i=0; i<nRes; ++i) catalog[i] = new (struct ovlArray (*[i+1])[2]);
40  for(i=0; i<nRes; ++i)for(j=0; j<=i; ++j){
41  catalog[i][j] = new struct ovlArray [layers[i]+1][2];
42 
43  // get step and filter "length" for both resolutions
44  int step1 = wdm[i]->getTDFunction(1, 1, td1A);
45  int last1 = td1A.Last();
46 
47  int step2 = wdm[j]->getTDFunction(1, 1, td2A_odd);
48  int last2 = td2A_odd.Last();
49 
50  int maxN = (last1 + last2 + step1 + 1)/step2 + 1;
51  for(k=0; k<=layers[i]; ++k)for(int l=0; l<2; ++l){ // k freq index (r1)
52  wdm[i]->getTDFunction(k ,l, td1A);
53  wdm[i]->getTDFunctionQ(k ,l, td1Q);
54 
55  int nOvlp = 0;
56  for(int m = 0; m<=layers[j]; ++m){ // loop onver frequency index (r2)
57  wdm[j]->getTDFunction(m, 0, td2A_even);
58  wdm[j]->getTDFunction(m, 1, td2A_odd);
59  wdm[j]->getTDFunctionQ(m, 0, td2Q_even);
60  wdm[j]->getTDFunctionQ(m, 1, td2Q_odd);
61 
62  for(int n = -maxN; n<=maxN; ++n){ // loop over time index
63 
64  int shift = n*step2 - l*step1;
65  int left = -last1;
66  if(shift - last2> left) left = shift - last2;
67  int right = last1;
68  if(shift + last2<right)right = shift + last2;
69  if(left>right)continue;
70 
71  SymmArray<double> *ptd2A, *ptd2Q;
72  if(n&1){
73  ptd2A = &td2A_odd;
74  ptd2Q = &td2Q_odd;
75  }
76  else{
77  ptd2A = &td2A_even;
78  ptd2Q = &td2Q_even;
79  }
80 
81  T ovlpAA = 0, ovlpAQ = 0, ovlpQA = 0, ovlpQQ = 0;
82 
83  for(int q=left; q<=right; ++q){
84  ovlpAA += td1A[q]*(*ptd2A)[q-shift];
85  ovlpQA += td1Q[q]*(*ptd2A)[q-shift];
86  ovlpAQ += td1A[q]*(*ptd2Q)[q-shift];
87  ovlpQQ += td1Q[q]*(*ptd2Q)[q-shift];
88  }
89  /*
90  if(m==0)
91  if(n&1) ovlpAA = ovlpQA = 0;
92  else ovlpAQ = ovlpQQ = 0;
93  if(m==layers[j])
94  if((m+n)&1)ovlpAA = ovlpQA = 0;
95  else ovlpAQ = ovlpQQ = 0;
96  */
97 
98  //if(i==j)ovlpAA = ovlpQQ = 0;
99 
100  if( fabs(ovlpAA)> minOvlp || fabs(ovlpAQ)> minOvlp ||
101  fabs(ovlpQA)> minOvlp || fabs(ovlpQQ)> minOvlp ){
102  tmp[nOvlp].ovlpAA = ovlpAA;
103  //if(k==0 && l==0 && fabs(ovlpAA)>minOvlp)
104  // printf("m = %d , n = %d , ovlp = %lf\n", m,n,ovlpAA);
105  tmp[nOvlp].ovlpAQ = ovlpAQ;
106  tmp[nOvlp].ovlpQA = ovlpQA;
107  tmp[nOvlp].ovlpQQ = ovlpQQ;
108  tmp[nOvlp].index = n*(layers[j]+1) + m;
109  ++nOvlp;
110  }
111  } // end loop over time index (res 2)
112  } // end loop over freq index (res 2)
113  if(nOvlp>10000)printf("ERROR, tmp array too small\n");
114 
115  catalog[i][j][k][l].data = new struct overlaps[nOvlp];
116  for(int n = 0; n<nOvlp; ++n) catalog[i][j][k][l].data[n] = tmp[n];
117  catalog[i][j][k][l].size = nOvlp;
118 
119  totOvlps += nOvlp;
120  } // end double loop over freq index (res 1) and parity
121  } // end double loop over resolution pairs
122  printf("total stored overlaps = %d\n", totOvlps);
123  for(int i=0; i<nRes; ++i)delete wdm[i];
124 }
125 
126 template <class T>
128 { // constructor which reads the catalog from a file
129  read(fn);
130 }
131 
132 template <class T>
134 { // copy constructor
135  nRes = x.nRes;
136  layers = new int[nRes];
137  for(int i=0; i<nRes; ++i)layers[i] = x.layers[i];
138  catalog = new (struct ovlArray (**[nRes])[2] );
139  for(int i=0; i<nRes; ++i){
140  catalog[i] = new (struct ovlArray (*[i+1])[2]);
141  for(int j=0; j<=i; ++j){
142  catalog[i][j] = new struct ovlArray [layers[i]+1][2];
143  for(int k = 0; k<=layers[i]; ++k)for(int l=0; l<2; ++l){
144  ovlArray& oa = catalog[i][j][k][l];
145  ovlArray& xoa = x.catalog[i][j][k][l];
146  oa.size = xoa.size;
147  oa.data = new struct overlaps[oa.size];
148  for(int kk = 0; kk< oa.size ; ++kk)oa.data[kk] = xoa.data[kk];
149  }
150  }
151  }
152 }
153 
154 template <class T>
156 { // destructor
157  deallocate();
158 }
159 
160 template <class T>
161 void WDMOverlap<T>::read(char* fn)
162 { // read the catalog from a file
163  if(nRes)deallocate();
164  FILE*f = fopen(fn, "r");
165  float tmp;
166  fread(&tmp, sizeof(float), 1, f);
167  nRes = (int)tmp;
168  layers = new int[nRes];
169  for(int i=0; i<nRes; ++i){
170  fread(&tmp, sizeof(float), 1, f);
171  printf("layers[%d] = %d\n", i, layers[i] = (int)tmp);
172 
173  }
174 
175  catalog = new (struct ovlArray (**[nRes])[2] );
176  for(int i=0; i<nRes; ++i){
177  catalog[i] = new (struct ovlArray (*[i+1])[2]);
178  for(int j=0; j<=i; ++j){
179  catalog[i][j] = new struct ovlArray [layers[i]+1][2];
180  for(int k = 0; k<=layers[i]; ++k)for(int l=0; l<2; ++l){
181  ovlArray& oa = catalog[i][j][k][l];
182  fread(&tmp, sizeof(float), 1, f);
183  oa.size = (int)tmp;
184  oa.data = new struct overlaps[oa.size];
185  fread(oa.data, sizeof(struct overlaps), oa.size, f);
186  }
187  }
188  }
189  fclose(f);
190 }
191 
192 template <class T>
193 void WDMOverlap<T>::write(char* fn)
194 { // write the catalog to a file
195  FILE* f = fopen(fn, "w");
196  float aux = nRes;
197  fwrite(&aux, sizeof(float), 1, f);
198  for(int i=0; i<nRes; ++i){
199  aux = layers[i];
200  fwrite(&aux, sizeof(float), 1, f);
201  }
202 
203  for(int i=0; i<nRes; ++i)for(int j=0; j<=i; ++j)
204  for(int k = 0; k<=layers[i]; ++k)for(int l=0; l<2; ++l){
205  ovlArray& oa = catalog[i][j][k][l];
206  aux = oa.size;
207  fwrite(&aux, sizeof(float), 1, f);
208  fwrite(oa.data, sizeof(struct overlaps), oa.size, f);
209  }
210  fclose(f);
211 }
212 
213 template <class T>
215 { // release allocated memory
216  if(nRes==0)return;
217  for(int i=0; i<nRes; ++i){
218  for(int j=0; j<=i; ++j){
219  for(int k=0; k<=layers[i]; ++k){
220  delete [] catalog[i][j][k][0].data;
221  delete [] catalog[i][j][k][1].data;
222  }
223  delete [] catalog[i][j];
224  }
225  delete [] catalog[i];
226  }
227  delete [] catalog;
228  delete [] layers;
229  nRes = 0;
230  layers = 0;
231 }
232 
233 
234 
235 template <class T>
236 struct overlaps WDMOverlap<T>::getOverlap(int nLayer1, size_t indx1, int nLayer2, size_t indx2)
237 { // access function that returns all 4 overlap values between two pixels
238 
239  struct overlaps ret={1, 3,3,3,3};
240  int r1, r2;
241  for(r1 = 0; r1<nRes; ++r1)if(nLayer1 == layers[r1]+1)break;
242  for(r2 = 0; r2<nRes; ++r2)if(nLayer2 == layers[r2]+1)break;
243  if(r1==nRes || r2 == nRes)printf("WDMOverlap::getOverlap : resolution not found\n");
244  bool swap = false;
245  if(r1<r2){
246  int aux = r1;
247  r1 = r2;
248  r2 = aux;
249  size_t aux2 = indx1;
250  indx1 = indx2;
251  indx2 = aux2;
252  swap = true;
253  }
254  int time1 = indx1/(layers[r1]+1);
255  int freq1 = indx1%(layers[r1]+1);
256  //int time2 = indx2/(layers[r2]+1);
257  //int freq2 = indx2%(layers[r2]+1);
258 
259  int odd = time1&1;
260  int32_t index = (int32_t)indx2;
261  index -= (time1-odd)*layers[r1]/layers[r2]*(layers[r2]+1);
262 
263  struct ovlArray& vector = catalog[r1][r2][freq1][odd];
264  for(int i=0; i<vector.size; ++i)if(index == vector.data[i].index){
265  ret = vector.data[i];
266  if(swap){
267  float tmp = ret.ovlpAQ;
268  ret.ovlpAQ = ret.ovlpQA;
269  ret.ovlpQA = tmp;
270  }
271  break;
272  }
273  //printf("getOverlap: [%d, %d] -> [%d, %d] ; index = %d {%d}:\n",
274  //freq1, time1, freq2, time2, index, vector.size);
275  return ret;
276 }
277 
278 template <class T>
279 float WDMOverlap<T>::getOverlap(int nLayer1, int quad1, size_t indx1, int nLayer2, int quad2, size_t indx2)
280 { // access function that returns one overlap value between two pixels
281 
282  struct overlaps res = getOverlap(nLayer1, indx1, nLayer2, indx2);
283  if(res.ovlpAA>2)return 0;
284  if(quad1){
285  if(quad2)return res.ovlpQQ;
286  return res.ovlpQA;
287  }
288  if(quad2)return res.ovlpAQ;
289  return res.ovlpAA;
290 }
291 
292 template <class T>
293 void WDMOverlap<T>::getClusterOverlaps(netcluster* pwc, int clIndex, int V, void* q)
294 { // FILL cluster overlap amplitudes
295 
296  vector<int>& pIndex = pwc->cList[clIndex];
297  vector<vector<struct overlaps> >* qq = (vector<vector<struct overlaps> >*)q;
298  for(int j=0; j<V; ++j){
299  netpixel& pix = pwc->pList[pIndex[j]];
300  size_t indx1 = pix.time;
301  int nLay1 = pix.layers;
302 
303  std::vector<struct overlaps> tmp;
304  for(int k = 0; k<V; ++k){
305  netpixel& pix2 = pwc->pList[pIndex[k]];
306  struct overlaps tmpOvlps = getOverlap(nLay1, indx1, (int)pix2.layers, pix2.time);
307  if(tmpOvlps.ovlpAA>2)continue;
308  tmpOvlps.index = k;
309  tmp.push_back(tmpOvlps);
310  }
311  qq->push_back(tmp);
312  }
313 }
314 
315 /*
316 template <class T>
317 void WDMOverlap<T>::PrintSums()
318 { for(int i=0; i<nRes; ++i)for(int j=0; j<=i; ++j)
319  for(int k = 0; k<=layers[i]; ++k)for(int l=0; l<2; ++l){
320  ovlArray& oa = catalog[i][j][k][l];
321  if(oa.size==0)continue;
322  double res = 0;
323  int cntr=0;
324 
325  for(int m=0; m<oa.size; ++m)res += oa.data[m].ovlpAA*oa.data[m].ovlpAA;
326  printf("%3d x %3d - %3d [%d] : AA = %lf", i,j,k,l,res);
327 
328  res = 0;
329  for(int m=0; m<oa.size; ++m)if(fabs(oa.data[m].ovlpAQ)>0.9999e-2){
330  res += oa.data[m].ovlpAQ*oa.data[m].ovlpAQ;
331  if(i==j && l == 0 && oa.data[m].index == k)printf("%f\n", oa.data[m].ovlpAQ);
332  ++cntr;
333  }
334  printf(" AQ = %lf (%d) ", res, cntr);
335 
336  res = 0;
337  for(int m=0; m<oa.size; ++m)res += oa.data[m].ovlpQA*oa.data[m].ovlpQA;
338  printf(" QA = %lf", res);
339 
340  res = 0;
341  for(int m=0; m<oa.size; ++m)res += oa.data[m].ovlpQQ*oa.data[m].ovlpQQ;
342  printf(" QQ = %lf (nPix = %d) \n", res, oa.size);
343 
344  }
345 }
346 */
347 
348 //template class WDMOverlap<float> ;
349 //template class WDMOverlap<double> ;
350 
351 
352 #define CLASS_INSTANTIATION(class_) template class WDMOverlap< class_ >;
353 
354 CLASS_INSTANTIATION(float)
355 CLASS_INSTANTIATION(double)
356 
357 #undef CLASS_INSTANTIATION
double aux
Definition: testWDM_5.C:14
tuple f
Definition: cwb_online.py:91
printf("total live time: non-zero lags = %10.1f \n", liveTot)
double time1
int n
Definition: cwb_net.C:10
struct overlaps getOverlap(int nLay1, size_t indx1, int nLay2, size_t indx2)
param: defines resolution 1 (by number of layers) param: defines pixel 1 at resolution 1 param: defin...
Definition: WDMOverlap.cc:236
netpixel * pix2
cout<< endl;cout<< "ts size = "<< ts.size()<< " ts rate = "<< ts.rate()<< endl;tf.Forward(ts, wdm);int levels=tf.getLevel();cout<< "tf size = "<< tf.size()<< endl;double dF=tf.resolution();double dT=1./(2 *dF);cout<< "rate(hz) : "<< RATE<< "\t layers : "<< nLAYERS<< "\t dF(hz) : "<< dF<< "\t dT(ms) : "<< dT *1000.<< endl;int itime=TIME_PIXEL_INDEX;int ifreq=FREQ_PIXEL_INDEX;int index=(levels+1)*itime+ifreq;double time=itime *dT;double freq=(ifreq >0)?ifreq *dF:dF/4;cout<< endl;cout<< "PIXEL TIME = "<< time<< " sec "<< endl;cout<< "PIXEL FREQ = "<< freq<< " Hz "<< endl;cout<< endl;wavearray< double > x
WDM< double > wdm(nLAYERS, nLAYERS, 6, 10)
netpixel pix(nifo)
netcluster * pwc
Definition: cwb_job_obj.C:20
int layers
virtual ~WDMOverlap()
Definition: WDMOverlap.cc:155
size_t layers
Definition: netpixel.hh:94
int m
Definition: cwb_net.C:10
std::vector< vector_int > cList
Definition: netcluster.hh:379
int j
Definition: cwb_net.C:10
i drho i
int BetaOrder
Definition: WDM.hh:146
float ovlpAA
Definition: WDMOverlap.hh:11
static double r2
Definition: geodesics.cc:8
int * layers
Definition: WDMOverlap.hh:80
i() int(T_cor *100))
std::vector< netpixel > pList
Definition: netcluster.hh:372
void read(char *filename)
param: filename
Definition: WDMOverlap.cc:161
double * tmp
Definition: testWDM_5.C:31
void write(char *filename)
param: filename
Definition: WDMOverlap.cc:193
int KWDM
Definition: WDM.hh:148
int k
size_t time
Definition: netpixel.hh:92
float ovlpQA
Definition: WDMOverlap.hh:11
Definition: WDM.hh:24
size_t Last(int n=0)
Definition: WDM.hh:141
double T
Definition: testWDM_4.C:11
void getClusterOverlaps(netcluster *pwc, int clIndex, int nPix, void *q)
param: pointer to netcluster structure param: which cluster to process param: number of pixels to pro...
Definition: WDMOverlap.cc:293
double fabs(const Complex &x)
Definition: numpy.cc:37
float ovlpAQ
Definition: WDMOverlap.hh:11
struct ovlArray(*** catalog)[2]
Definition: WDMOverlap.hh:78
float ovlpQQ
Definition: WDMOverlap.hh:11
int size
Definition: WDMOverlap.hh:12
int l
Definition: cbc_plots.C:434
int32_t index
Definition: WDMOverlap.hh:11
void deallocate()
Definition: WDMOverlap.cc:214
fclose(ftrig)
int m_Layer
Definition: Wavelet.hh:100
double shift[NIFO_MAX]
struct overlaps * data
Definition: WDMOverlap.hh:12
#define CLASS_INSTANTIATION(class_)
Definition: WDMOverlap.cc:352