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