Diana Software
QVectorC.cc
Go to the documentation of this file.
1 /*
2 *
3 * Class QVectorC
4 *
5 */
6 
7 #include "QVectorC.hh"
8 #include "QMatrixC.hh"
9 #include "QError.hh"
10 #include <math.h>
11 #include <sstream>
12 #include <gsl/gsl_blas.h>
13 #include <gsl/gsl_statistics_double.h>
14 #include <gsl/gsl_sort_vector.h>
15 #include <gsl/gsl_vector_complex_double.h>
16 #include <gsl/gsl_complex_math.h>
17 
18 #ifdef _HAVE_FFTW3_
19 #include <fftw3.h>
20 #endif
21 
22 QObjectImp(Diana::QVectorC);
23 
25 
26 
27 void QVectorC::ArrayCopy(const gsl_complex* orig,const UInt_t origStride,
28  gsl_complex *dest,const UInt_t destStride,
29  const UInt_t size)
30 {
31 //TODO: find faster copy
32  if(size > 0 && orig && dest) {
33  if(origStride == 1 && destStride == 1)
34  memcpy(dest,orig,sizeof(gsl_complex)*size);
35  else
36  for(UInt_t i =0; i < size; i++) {
37  dest[i*destStride] = orig[i*origStride];
38  }
39  }
40 }
42 {
43  fDataOwner = true;
44  fData=0;
45  fSize = 0;
46  fMathVec = 0;
47  fStride = 1;
48  fAllocSize = 0;
49  fRe=NULL;
50  fIm=NULL;
51  fInterleaved=NULL;
52 }
53 
54 QVectorC::QVectorC(const UInt_t size)
55 {
56  fDataOwner = true;
57  fData = QVector::ArrayAlloc(size*2);
58  fAllocSize = size*2;
59  fSize = size*2;
60  fMathVec = 0;
61  fStride = 1;
62  fRe=NULL;
63  fIm=NULL;
64  fInterleaved=NULL;
65 }
67 {
68  InitCopy(in,true);
69 }
71 {
72  fSize=(vec.Size());
73  fAllocSize=fSize;
74  fDataOwner = true;
75  fData = QVector::ArrayAlloc(fSize);
76  fMathVec = NULL;
77  fStride = 1;
78  for (UInt_t i=0; i<Size(); i++) {
79  fData[2*i] = vec[i];
80  fData[2*i+1]= vec[Size()+i];
81  }
82  fRe=NULL;
83  fIm=NULL;
84  fInterleaved=NULL;
85 }
86 QVectorC::QVectorC(const QVector& re, const QVector& im)
87 {
88 
89  if(re.Size()==im.Size())
90  {
91  fSize=re.fSize*2;
92  fAllocSize=fSize;
93  fData = QVector::ArrayAlloc(fSize);
94  fStride=1;
95  for (UInt_t i=0; i<Size(); i++)
96  {
97  fData[2*i]=re[i];
98  fData[2*i+1]=im[i];
99  }
100  fDataOwner = true;
101  fMathVec = NULL;
102  fRe=NULL;
103  fIm=NULL;
104  fInterleaved=NULL;
105  }else{
106  DianaThrow( QError(QERR_SIZE_NOT_MATCH,__FILE__,__LINE__,"You are trying to define a QVectorC with different sizes QVectors") )
107  }
108 }
109 
110 QVectorC::QVectorC(const QVectorC& orig,const bool dataOwner)
111 {
112  InitCopy(orig,dataOwner);
113 }
114 QVectorC::QVectorC(gsl_complex *data,const UInt_t size,const UInt_t stride){
115  fData=(double *)data;
116  fDataOwner = false;
117  fStride=stride;
118  fSize = 2*size;
119  fAllocSize = (UInt_t)(2*size*stride);// should never been used
120  fMathVec = NULL;
121  fRe=NULL;
122  fIm=NULL;
123  fInterleaved=NULL;
124 }
125 void QVectorC::InitCopy(const QVectorC& orig,const bool dataOwner)
126 {
127  fDataOwner = dataOwner;
128  if(fDataOwner) {
129  fStride=1;
130  fData = 0;
131  fSize = 0;
132  fAllocSize = 0;
133  if(orig.fSize!=0 && orig.fData ) {
134  fSize = orig.fSize;
135  fData = QVector::ArrayAlloc(fSize);
136  fAllocSize = fSize;
137  // This copies complex numbers, so we need fSize/2
138  ArrayCopy((gsl_complex *)orig.fData,orig.fStride,
139  (gsl_complex *)fData,1,fSize/2);
140  }
141  }
142  else {
143  fStride=orig.fStride;
144  fData = orig.fData;
145  fSize = orig.fSize;
146  fAllocSize = orig.fAllocSize;
147  }
148  fMathVec=NULL;
149  fRe=NULL;
150  fIm=NULL;
151  fInterleaved=NULL;
152 }
154 {
155  if(fDataOwner) {
156  if(fData) QVector::ArrayFree(fData);
157  }
158  if(fMathVec) {
159  free(fMathVec);
160  }
161  if(fRe) {
162  delete fRe;
163  }
164  if(fIm) {
165  delete fIm;
166  }
167  if(fInterleaved){
168  delete fInterleaved;
169  }
170  fSize=0;
171  fAllocSize=0;
172  fData=NULL;
173  fMathVec=NULL;
174  fRe=NULL;
175  fIm=NULL;
176  fInterleaved=NULL;
177 }
178 
179 void QVectorC::Resize(const UInt_t newSize)
180 {
181  if(fDataOwner) {
182  if(newSize*2 > fAllocSize) {
183  if(fData) QVector::ArrayFree(fData);
184  fAllocSize=newSize*2;
185  fData = QVector::ArrayAlloc(fAllocSize);
186  }
187  fSize = newSize*2;
188  }
189  else if(newSize != Size() ) {
190  DianaThrow( QError(QERR_SIZE_NOT_MATCH,__FILE__,__LINE__,"Not data owner, are you trying to resize a QVectorC get from a QVectorC(Const)View?") );
191  }
192  if(fMathVec) free(fMathVec);
193  fMathVec = NULL;
194  if(fRe) {
195  delete fRe;
196  }
197  if(fIm) {
198  delete fIm;
199  }
200  if(fInterleaved) {
201  delete fInterleaved;
202  }
203  fRe=NULL;
204  fIm=NULL;
205  fInterleaved=NULL;
206 }
207 
208 void QVectorC::SetArray(const double* re, const double* im,const UInt_t size)
209 {
210  Resize(size);
211  for(UInt_t i=0;i<size;i++){
212  fData[i*2*fStride]=re[i];
213  fData[i*2*fStride+1]=im[i];
214  }
215 }
216 void QVectorC::Initialize(const double re, const double im)
217 {
218  for(UInt_t i=0;i<Size();i++) {
219  fData[2*i*fStride]=re;
220  fData[2*i*fStride+1]=im;
221  }
222 }
224  QVectorC::Initialize(val.Re(),val.Im());
225 }
226 
227 const QVectorC& QVectorC::Rebin(const int rebin,bool sum) {
228  int newSize = Size()/rebin;
229  double norm = (sum ? 1. : 1./rebin);
230  for(int i=0;i<newSize;i++){
231  (*this)[i]=norm*(*this)[rebin*i];
232  for(int j=1;j<rebin;j++){
233  (*this)[i]+=norm*(*this)[rebin*i+j];
234  }
235  }
236  Resize(newSize);
237  return *this;
238 }
239 
240 const QVectorC& QVectorC::Shift(const int nstep)
241 {
242  bool gtz = nstep > 0 ? true : false;
243  if(nstep == 0 || Size() == 0) return *this;
244  unsigned int unstep = abs(nstep) % Size();
245  QVectorC rest(unstep);
246  if(gtz) {
247  for(unsigned int i = 0; i < unstep; i++) rest[i] = (*this)[Size() - unstep + i];
248  for(int i = Size() - unstep - 1; i >= 0 ; i--) (*this)[i + unstep] = (*this)[i];
249  for(unsigned int i = 0; i < unstep; i++) (*this)[i] = rest[i];
250  } else {
251  for(unsigned int i = 0; i < unstep; i++) rest[i] = (*this)[i];
252  for(unsigned int i = unstep; i < Size(); i++) (*this)[i - unstep] = (*this)[i];
253  for(unsigned int i = 0; i < unstep; i++) (*this)[i + Size() - unstep] = rest[i];
254  }
255  return *this;
256 }
257 
258 const QVectorC& QVectorC::ShiftReal(const double fstep)
259 {
260  int nstep = (int) ceil(fstep);
261  Shift(nstep);
262  double fracs = nstep - fstep;
263  Diana::QComplex zero = (*this)[0];
264  for(int i = 0; i < (int)Size() - 1; i++) {
265  (*this)[i] = (*this)[i]*(1.-fracs) + fracs*(*this)[i+1];
266  }
267  (*this)[Size()-1] = (*this)[Size()-1]*(1.-fracs) + fracs*zero;
268 
269  return *this;
270 }
271 
273 {
274  if(i < Size() ) {
275  return (fData+i*2*fStride);
276  }
277  std::stringstream stream;
278  stream<<"Size: "<<Size()<<" Index: "<<i;
279  DianaThrow( QError(QERR_OUT_OF_RANGE,__FILE__,__LINE__,stream.str()) )
280  return Q_DOUBLE_DEFAULT;
281 }
282 
283 const QComplex QVectorC::operator[](UInt_t i) const
284 {
285  if(i < Size() ) {
286  return (fData+i*2*fStride);
287  }
288  std::stringstream stream;
289  stream<<"Size: "<<Size()<<" Index: "<<i;
290  DianaThrow( QError(QERR_OUT_OF_RANGE,__FILE__,__LINE__,stream.str()) );
291  return Q_DOUBLE_DEFAULT;
292 }
293 
295 {
296  Resize( orig.Size() );
297  ArrayCopy((gsl_complex *)orig.fData,orig.fStride,
298  (gsl_complex *)fData,fStride,fSize/2);
299  return *this;
300 }
302 {
303  QMatrixC tmp(Size(),1);
304  tmp.SetCol(0,*this);
305  tmp *= matrix;
306  return tmp;
307  }
309 {
310  SetParts();
311  return *fRe;
312 }
314 {
315  SetParts();
316  return *fIm;
317 }
318 const QVector& QVectorC::Re() const
319 {
320  SetParts();
321  return *fRe;
322 }
323 const QVector& QVectorC::Im() const
324 {
325  SetParts();
326  return *fIm;
327 }
329 {
330  QVector res(Size());
331  for(UInt_t i = 0; i < Size(); i++) {
332  res[i] = operator[](i).GetPhase();
333  }
334  return res;
335 }
336 
338 {
339  QVector res(Size());
340  for(UInt_t i=0;i<Size();i++){
341  res[i]=sqrt( fData[i*2*fStride]*fData[i*2*fStride] + fData[i*2*fStride+1]*fData[i*2*fStride+1] );
342  }
343  return res;
344 }
346 {
347  QVector res(Size());
348  for(UInt_t i=0;i<Size();i++) {
349  res[i]=fData[i*2*fStride]*fData[i*2*fStride] + fData[i*2*fStride+1]*fData[i*2*fStride+1];
350  }
351  return res;
352 }
353 
355 {
356  QVectorC tmp(*this);
357  tmp*=(-1.);
358  return tmp;
359 }
361 {
362  //solo con le gsl 1.14
363  QVectorC tmp(*this);
364  // tmp.Initialize();
365  if(b.Size()==Size()){
366  b.SetMathVector();
367  tmp.SetMathVector();
368  gsl_vector_complex_mul(tmp.fMathVec, b.fMathVec);
369  }else{
370  DianaThrow( QError(QERR_SIZE_NOT_MATCH,__FILE__,__LINE__,"You are trying to use QVectorC::Mult with different sizes QVectorCs") );
371  }
372  return tmp;
373 }
375 {
376  if(b.Size()==Size()){
377  SetMathVector();
378  b.SetMathVector();
379  gsl_vector_complex_mul(fMathVec, b.fMathVec);
380  }else{
381  DianaThrow( QError(QERR_SIZE_NOT_MATCH,__FILE__,__LINE__,"You are trying to use QVectorC::Mult with different sizes QVectorCs") );
382  }
383  return *this;
384 }
385 
387 {
388  //solo con le gsl 1.14
389  QVectorC tmp(*this);
390  //TODO: is there a good gsl method for this?
391  if(b.Size()==Size()){
392  for (UInt_t i=0; i<Size(); i++){
393  tmp[i]*=b[i];
394  }
395  //SetMathVector();
396  //tmp.SetMathVector();
397  //gsl_vector_complex_mul(tmp.fMathVec, b.fMathVec);
398  }else{
399  DianaThrow( QError(QERR_SIZE_NOT_MATCH,__FILE__,__LINE__,"You are trying to use QVectorC::Mult with different sizes QVectorCs") );
400  }
401  return tmp;
402 }
404 {
405  QVectorC tmp(*this);
406  if(b.fSize==fSize) {
407  b.SetMathVector();
408  tmp.SetMathVector();
409  gsl_vector_complex_div(tmp.fMathVec, b.fMathVec);
410  }else{
411  DianaThrow( QError(QERR_SIZE_NOT_MATCH,__FILE__,__LINE__,"You are trying to use QVectorC::Div with of different sizes QVectorCs"));
412  }
413  return tmp;
414 }
415 
417 {
418  if(b.fSize==fSize) {
419  SetMathVector();
420  b.SetMathVector();
421  gsl_vector_complex_div(fMathVec, b.fMathVec);
422  }else{
423  DianaThrow( QError(QERR_SIZE_NOT_MATCH,__FILE__,__LINE__,"You are trying to use QVectorC::Div with of different sizes QVectorCs"));
424  }
425  return *this;
426 }
428 {
429  QVectorC tmp(*this);
430  //TODO: is there a good gsl method for this?
431  if(b.Size()==(UInt_t)Size()) {
432  for (UInt_t i=0;i<Size(); i++) {
433  tmp[i]/=b[i];
434  }
435 // SetMathVector();
436 // tmp.SetMathVector();
437 // gsl_vector_complex_div(tmp.fMathVec, b.fMathVec);
438  }else{
439  DianaThrow( QError(QERR_SIZE_NOT_MATCH,__FILE__,__LINE__,"You are trying to use QVectorC::Div with of different sizes QVectorCs"));
440  }
441  return tmp;
442 }
443 
444 const QVectorC& QVectorC::operator/=(const double t)
445 {
446  return operator*=(1./t);
447 }
448 
449 const QVectorC& QVectorC::operator*=(const double t)
450 {
451  SetMathVector();
452  gsl_complex scale = gsl_complex_rect(t,0);
453  gsl_vector_complex_scale(fMathVec, scale);
454  return *this;
455 }
456 
458 {
459  if(b.fSize==fSize) {
460 // for (UInt_t i=0; i<Size(); i++){
461 // fData[2*i*fStride]+=b.fData[2*i*b.fStride];
462 // fData[2*i*fStride+1]+=b.fData[2*i*b.fStride+1];
463 // }
464  b.SetMathVector();
465  SetMathVector();
466  gsl_vector_complex_add(fMathVec, b.fMathVec);
467  }else{
468  DianaThrow( QError(QERR_SIZE_NOT_MATCH,__FILE__,__LINE__,"You are trying to use QVectorC::operator+= with different sizes QVectorCs?"));
469  }
470  return *this;
471 }
472 
474 {
475  operator+=(other*(-1));
476  return *this;
477 }
478 
480 {
481  gsl_complex res;
482  other.SetMathVector();
483  SetMathVector();
484  gsl_blas_zdotu(fMathVec,other.fMathVec,&res);
485  return QComplex(res);
486 }
487 
488 QVectorC QVectorC::operator*(const double t) const
489 {
490  QVectorC tmp(*this);
491  tmp*=t;
492  return tmp;
493 }
494 
495 QVectorC QVectorC::operator/(const double t) const
496 {
497  QVectorC tmp(*this);
498  tmp/=t;
499  return tmp;
500 }
501 
503 {
504  QVectorC tmp(*this);
505  tmp+=other;
506  return tmp;
507 }
508 
510 {
511  QVectorC tmp(*this);
512  tmp-=other;
513  return tmp;
514 }
515 
517 {
518  SetMathVector();
519  gsl_vector_complex_scale(fMathVec, t.Get_gsl_complex());
520 // for(UInt_t i=0;i<Size();i++){
521 // operator[](i)*=t;
522 // }
523  return *this;
524 }
526 {
527  gsl_complex sub = gsl_complex_mul_real(t.Get_gsl_complex(), -1);
528  SetMathVector();
529  gsl_vector_complex_add_constant(fMathVec, sub);
530 // for(UInt_t i=0;i<Size();i++){
531 // operator[](i)-=t;
532 // }
533  return *this;
534 }
535 
537 {
538  SetMathVector();
539  gsl_complex inv = gsl_complex_inverse(t.Get_gsl_complex());
540  gsl_vector_complex_scale(fMathVec, inv);
541 // for(UInt_t i=0;i<Size();i++) {
542 // operator[](i)/=t;
543 // }
544  return *this;
545 }
547 {
548  QVectorC tmp(*this);
549  tmp*=t;
550  return tmp;
551 }
552 
554 {
555  QVectorC tmp(*this);
556  tmp/=t;
557  return tmp;
558 }
560 {
561  QMatrixC tmp(1,Size());
562  tmp.SetRow(0,Conj());
563  return tmp;
564 }
566 {
567  //TODO: Is there a gls function for this?
568  for(UInt_t i=0;i<Size();i++)
569  fData[i*2*fStride+1]*=-1;
570  return *this;
571 }
573 {
574  QVectorC tmp(*this);
575  tmp.Conjugate();
576  return tmp;
577 }
578 
579 void QVectorC::Append(const QComplex& val)
580 {
581  if(fDataOwner){
582  double* temp = QVector::ArrayAlloc((Size()+1)*2);
583  ArrayCopy((gsl_complex *)fData,fStride,(gsl_complex *)temp,1,Size());
584  if(fData) QVector::ArrayFree(fData);
585  fSize=(Size()+1)*2;
586  fAllocSize = fSize;;
587  fStride=1;//check
588  temp[fSize-2]=val.Re();
589  temp[fSize-1]=val.Im();
590  fData=temp;
591  fStride=1;
592  if(fMathVec) free(fMathVec);
593  fMathVec = NULL;
594  }
595  else {
596  DianaThrow( QError(QERR_SIZE_NOT_MATCH,__FILE__,__LINE__,
597  "Not data owner, you are trying to resize a "
598  "QVectorC using Append"));
599  }
600 }
601 void QVectorC::Append(const double re,const double im)
602 {
603  QComplex val(re,im);
604  Append(val);
605  return;
606 }
608 {
609  for(UInt_t i=0;i<vec.Size();i++) {
610  QComplex val=vec[i];
611  Append(val);
612  }
613  return;
614 }
615 void QVectorC::SetRe(const QVector& re)
616 {
617  if(re.Size()== Size() ){
618  for (UInt_t i=0;i<Size(); i++) {
619  fData[2*i*fStride]=re[i];
620  }
621  return;
622  }
623  std::stringstream msg;
624  msg<<"You are trying to use QVectorC::SetRe with a wrong size QVector: ("
625  <<re.Size()<<") instead of ("<<Size()<<")"<<std::endl;
626  DianaThrow( QError(QERR_SIZE_NOT_MATCH,__FILE__,__LINE__,msg.str()));
627 }
628 void QVectorC::SetIm(const QVector& im)
629 {
630  if(im.Size()==Size() ) {
631  for (UInt_t i=0; i <Size(); i++) {
632  fData[2*i*fStride+1]=im[i];
633  }
634  return;
635  }
636  std::stringstream msg;
637  msg<<"You are trying to use QVectorC::SetIm with a wrong size QVector: ("
638  <<im.Size()<<") instead of ("<<Size()<<")"<<std::endl;
639  DianaThrow( QError(QERR_SIZE_NOT_MATCH,__FILE__,__LINE__,msg.str()))
640 }
641 double QVectorC::Norma() const
642 {
643  SetMathVector();
644  return gsl_blas_dznrm2(fMathVec);
645 }
646 QVector QVectorC::SingleVector() const
647 {
648  QVector res(fSize);
649  for (UInt_t i=0;i<Size();i++) {
650  res[i]=fData[2*i*fStride];
651  res[i+Size()]=fData[2*i*fStride+1];
652  }
653  return res;
654 }
655 QVector &QVectorC::InterleavedVector() const
656 {
657  if(fStride!=1)
658  DianaThrow(QError(QERR_SIZE_NOT_MATCH,__FILE__,__LINE__,
659  "Can not interleave QVectorC if Stride !=1!"));
660  if(fInterleaved==NULL)
661  fInterleaved=new QVector(fData,fSize,1);
662  return *fInterleaved;
663 }
664 QVectorC QVectorC::GetSubVector(UInt_t N,UInt_t start,UInt_t stride){
665  if(start+N > Size())
666  DianaThrow(QError(QERR_SIZE_NOT_MATCH,__FILE__,__LINE__,
667  "QVectorC: Sub-vector would overrun parent vector!"));
668  stride = (stride < 1 ? 1 : stride);
669  QVectorC ret((gsl_complex *)fData+start,N,fStride*stride);
670  return ret;
671 }
672 const QVectorC QVectorC::GetSubVector(UInt_t N,UInt_t start,UInt_t stride)
673  const {
674  if(start+N > Size())
675  DianaThrow(QError(QERR_SIZE_NOT_MATCH,__FILE__,__LINE__,
676  "QVectorC: Sub-vector would overrun parent vector!"));
677  stride = (stride < 1 ? 1 : stride);
678  QVectorC ret((gsl_complex *)fData+start,N,fStride*stride);
679  return ret;
680 }
681 
682 QComplex QVectorC::Sum(const UInt_t nelem,const UInt_t first) const
683 {
684  QComplex sum(0,0);
685  UInt_t last = first + nelem;
686  for(UInt_t i = first; i < last; i++) sum += this->operator[](i);
687  return sum;
688 }
689 
690 
691 void QVectorC::SetMathVector() const
692 {
693  if(!fMathVec) {
694  fMathVec = (gsl_vector_complex*) malloc(sizeof(gsl_vector_complex));
695  fMathVec->size = Size();
696  fMathVec->stride = fStride;
697  fMathVec->data = fData;
698  fMathVec->block = 0;
699  fMathVec->owner = 0;
700  }
701 }
702 void QVectorC::SetParts() const
703 {
704  if(!fRe) fRe = new QVector(fData,Size(),fStride*2);
705  if(!fIm) fIm = new QVector(fData+1,Size(),fStride*2);
706 }
707 void QVectorC::Print(const char *opts) const {
708 
709  std::cout << "fSize " << Size() << std::endl;
710  std::cout << "fStride " << fStride << std::endl;
711  std::cout << "fData " << fData << std::endl;
712  std::cout << "fData ";
713  for(UInt_t i=0;i<Size();i++)
714  std::cout << (*this)[i].Re() << " " << (*this)[i].Im() << " ";
715  std::cout << std::endl;
716 
717 }
719 
720 /********************************************
721  NON MEMBER FUNCTIONS
722  *********************************************/
723 
724 std::ostream& operator<<(std::ostream&s,const Diana::QVectorC &vec)
725 {
726  for (UInt_t i = 0; i <(UInt_t) vec.Size(); i++) s<<vec[i]<<" ";
727  s<<std::endl;
728  return s;
729 }
730 
731 Diana::QVectorC operator*(double t, const Diana::QVectorC &v)
732 {
733  Diana::QVectorC tmp(v);
734  tmp*=t;
735  return tmp;
736 }
737 const Diana::QVector Re(const Diana::QVectorC &Z) { return Z.Re(); }
738 
739 const Diana::QVector Im(const Diana::QVectorC &Z) { return Z.Im(); }
740 
int N
Definition: CheckOF.C:24
QVector b
Definition: CheckOF.C:21
QVector vec(3)
#define DianaThrow(obj)
Definition: QDianaDebug.hh:26
#define Q_DOUBLE_DEFAULT
Definition: QDiana.hh:24
#define Q_END_NAMESPACE
Definition: QDiana.hh:22
#define Q_BEGIN_NAMESPACE
Definition: QDiana.hh:20
@ QERR_SIZE_NOT_MATCH
Definition: QError.hh:31
@ QERR_OUT_OF_RANGE
Definition: QError.hh:28
const Diana::QVector Im(const Diana::QVectorC &Z)
Get the imag part of the vector.
Definition: QVectorC.cc:739
Diana::QVectorC operator*(double t, const Diana::QVectorC &v)
Definition: QVectorC.cc:731
QObjectImp(Diana::QVectorC)
const Diana::QVector Re(const Diana::QVectorC &Z)
Get the real part of the vector.
Definition: QVectorC.cc:737
Q_END_NAMESPACE std::ostream & operator<<(std::ostream &s, const Diana::QVectorC &vec)
Definition: QVectorC.cc:724
Diana::QVector abs(const Diana::QVector &v)
Definition: QVector.cc:811
double Im() const
Definition: QComplex.cc:73
double GetPhase() const
Definition: QComplex.cc:96
gsl_complex Get_gsl_complex() const
Definition: QComplex.cc:223
double Re() const
Definition: QComplex.cc:72
error class with error type and description
Definition: QError.hh:115
Interface for complex matrices in Diana analysis.
Definition: QMatrixC.hh:27
void SetRow(const UInt_t nrow, const QVectorC &vec)
set row to specific vectors
Definition: QMatrixC.cc:212
void SetCol(const UInt_t ncol, const QVectorC &vec)
set column to specific vector
Definition: QMatrixC.cc:200
virtual void Print() const
print content on screen
Definition: QObject.hh:163
Interface for complex vectors in Diana analysis.
Definition: QVectorC.hh:25
void SetArray(const double *re, const double *im, UInt_t size)
Definition: QVectorC.cc:208
QVector GetPhase() const
Definition: QVectorC.cc:328
const QVectorC & DivIn(const QVectorC &other)
division element by element by the given vector
Definition: QVectorC.cc:416
QVector GetMagnitudesSquare() const
Definition: QVectorC.cc:345
QVector & Im()
Definition: QVectorC.cc:313
QVectorC operator+(const QVectorC &other) const
sum vector
Definition: QVectorC.cc:502
const QVectorC & ShiftReal(const double fstep)
Cyclic shift of vector by a real number, first shift by the integer part of fstep then linear interpo...
Definition: QVectorC.cc:258
const QVectorC & operator+=(const QVectorC &v)
Definition: QVectorC.cc:457
QVectorC operator-() const
revert sign to all components
Definition: QVectorC.cc:354
QMatrixC H() const
transpose conjugate
Definition: QVectorC.cc:559
const QVectorC & operator*=(const double t)
multiplication by scalar
Definition: QVectorC.cc:449
QVectorC()
default constructor
Definition: QVectorC.cc:41
QVectorC & Conjugate()
Definition: QVectorC.cc:565
QVectorC operator/(const double t) const
divide by scalar
Definition: QVectorC.cc:495
void Resize(const UInt_t newsize)
Definition: QVectorC.cc:179
const QVectorC & Shift(const int nstep)
Cyclic shift of vector.
Definition: QVectorC.cc:240
void Initialize(const double re=0, const double im=0)
initialize elements (default to 0)
Definition: QVectorC.cc:216
QComplex operator*(const QVectorC &other) const
complex conjugate scalar product (v^H * u)
Definition: QVectorC.cc:479
QVectorC Conj() const
Definition: QVectorC.cc:572
void SetRe(const QVector &re)
Set real part.
Definition: QVectorC.cc:615
const QVectorC & operator=(const QVectorC &orig)
copy the content of another vector
Definition: QVectorC.cc:294
QVectorC Mult(const QVectorC &other) const
multiplication element by element
Definition: QVectorC.cc:360
QVector & Re()
Definition: QVectorC.cc:308
UInt_t Size() const
size of QVector
Definition: QVectorC.hh:82
QVectorC Div(const QVectorC &other) const
multiplication element by element
Definition: QVectorC.cc:403
~QVectorC()
copy only some of the elements
Definition: QVectorC.cc:153
void SetIm(const QVector &im)
Set imag part.
Definition: QVectorC.cc:628
void Append(const QComplex &val)
append
Definition: QVectorC.cc:579
const QVectorC & MultIn(const QVectorC &other)
multiplication element by element by the given vector
Definition: QVectorC.cc:374
const QVectorC & operator/=(const double v)
divide by scalar
Definition: QVectorC.cc:444
QComplex operator[](const UInt_t i)
retrieve an element
Definition: QVectorC.cc:272
QVector GetMagnitudes() const
Definition: QVectorC.cc:337
const QVectorC & operator-=(const QComplex &t)
add a QVectorC
Definition: QVectorC.cc:525
const QVectorC & Rebin(const int rebin, bool sum=false)
Rebin the vector.
Definition: QVectorC.cc:227
Interface for vectors in Diana analysis.
Definition: QVector.hh:30
UInt_t Size() const
size of QVector
Definition: QVector.hh:54
UInt_t fSize
size of the array
Definition: QVector.hh:436
static void ArrayFree(double *array)
Definition: QVector.cc:72
void SetMathVector() const
Definition: QVector.cc:207
static double * ArrayAlloc(const UInt_t size)
Definition: QVector.cc:32
gsl_vector * fMathVec
temporary gsl_vector to use the gsl library
Definition: QVector.hh:447