Diana Software
QVectorC.hh
Go to the documentation of this file.
1 
8 #ifndef __QVECTORC_HH_
9 #define __QVECTORC_HH_
10 
11 #include <gsl/gsl_vector.h>
12 #include <gsl/gsl_vector_complex_double.h>
13 #include <iostream>
14 #include <string>
15 #include "QObject.hh"
16 #include "QVector.hh"
17 #include "QComplex.hh"
18 
20 
21 //class QVector;
22 //class QComplex;
23 class QMatrixC;
24 
25 class QVectorC : public QObject {
26 public:
30  QVectorC();
35  explicit QVectorC(const UInt_t size);
40  QVectorC(const QVectorC& orig);
46  QVectorC(const QVector& re, const QVector& im);
53  explicit QVectorC(const QVector& vec);
60  // QVectorC(const QVectorC& orig, UInt_t size, UInt_t ioff = 0);
67  // QVectorC(const QMatrix& mat);
71  ~QVectorC();
75  void Clear() {Resize(0);};
76 
77  void SetArray(const double* re, const double* im, UInt_t size);
82  inline UInt_t Size() const {return fSize/2;};
87  void Initialize(const double re = 0,const double im =0);
88  void Initialize(const QComplex val);
94  QComplex operator[](const UInt_t i);
95  QComplex operator()(const UInt_t i){ return operator[](i); }
103  const QComplex operator[] (const UInt_t i) const;
104  const QComplex operator() (const UInt_t i) const { return operator[](i); }
109  const QVectorC& operator = (const QVectorC& orig);
110  QVector& Re();
111  QVector& Im();
112 
113  const QVector& Re() const;
114  const QVector& Im() const;
115 
116  QVector GetMagnitudes() const;
118  QVector GetPhase() const;
119 
120  inline QVector GetModulus() const {return GetMagnitudes();};
121  inline QVector GetModulusSquare() const {return GetMagnitudesSquare();};
129  // const QVectorC& Mult(const QVectorC& other);
130  QVectorC Mult(const QVectorC& other) const;
131 
139  const QVectorC& MultIn(const QVectorC& other);
147  QVectorC Mult(const QVector& other) const;
155  // const QVectorC& Div(const QVectorC& other);
156  QVectorC Div(const QVectorC& other) const;
157 
165  // const QVectorC& Div(const QVectorC& other);
166  const QVectorC& DivIn(const QVectorC& other);
167 
175  QVectorC Div(const QVector &other) const;
176 
183  const QVectorC& Rebin(const int rebin,bool sum=false);
184 
190  const QVectorC& Shift(const int nstep);
198  const QVectorC& ShiftReal(const double fstep);
202  QVectorC operator-() const;
208  const QVectorC& operator*=(const double t);
214  const QVectorC& operator*=(const QComplex& t);
220  const QVectorC& operator/=(const double v);
226  const QVectorC& operator/=(const QComplex& t);
237  const QVectorC& operator-=(const QComplex& t);
238 
239  const QVectorC& operator+=(const QVectorC&v);
245  const QVectorC& operator-=(const QVectorC&v);
251  QComplex operator*(const QVectorC& other) const;
257  QVectorC operator*(const double t) const;
263  QMatrixC operator*(const QMatrixC&) const;
269  QVectorC operator+(const QVectorC& other) const;
275  QVectorC operator-(const QVectorC& other) const;
281  QVectorC operator/(const double t) const;
282 
289  QMatrixC H() const;
290 
291  QVectorC &Conjugate();
292  QVectorC Conj() const;
293 
294  /*
295  * @brief multiplication by complex number @param t @return
296  * the same object modified
297  */
298  QVectorC operator*(const QComplex& t) const;
304  QVectorC operator/(const QComplex& t) const;
305 
306  void Resize(const UInt_t newsize);
313  void Append(const QComplex& val);
314  void Append(const double re,const double im=0);
315  void Append(const QVectorC& vec);
319  void SetRe(const QVector& re);
323  void SetIm(const QVector& im);
329  double Norma() const;
330 
332  QComplex Sum(UInt_t nelem, UInt_t first = 0) const;
334  QComplex Sum() const { return Sum(Size(),0); }
335 
341  // double GetRMS(UInt_t nelem, UInt_t first = 0) const;
345  // double GetMedian() const;
349  // double GetMedianAbsoluteDeviation() const;
353  // inline double GetMax() const {return gsl_vector_max(fMathVec);}
357  // inline double GetMin() const {return gsl_vector_min(fMathVec);}
361  // int GetMaxIndex(UInt_t nelem, UInt_t first) const;
365  // int GetMinIndex(UInt_t nelem, UInt_t first) const;
369  // inline UInt_t GetMaxIndex() const {return gsl_vector_max_index(fMathVec);}
373  // inline UInt_t GetMinIndex() const {return gsl_vector_min_index(fMathVec);}
377  // double* GetArray() const;
384  // const double* GetConstArray() const {return fMathVec ? fMathVec->data : NULL;}
396  // void SetArray(const double *orig, UInt_t size);
400  // void Consolidate();
404  // std::string sqlString() const;
405 
409  QVector SingleVector() const;
410 
416  QVector &InterleavedVector() const;
417 
424  QVectorC GetSubVector(UInt_t N,UInt_t start=0,UInt_t stride=1);
431  const QVectorC GetSubVector(UInt_t N,UInt_t start=0,UInt_t stride=1) const;
432 
433  void Print(const char *opts="") const;
434 
435 protected:
441  QVectorC(gsl_complex *data,const UInt_t size,const UInt_t Stride);
442 
444  QVectorC(const QVectorC& orig,const bool dataOwner);
445 
446  static void ArrayCopy(const gsl_complex* orig,const UInt_t origStride,
447  gsl_complex *dest,const UInt_t destStride,
448  const UInt_t size);
449 
451  mutable gsl_vector_complex* fMathVec;
452 
454  Int_t fSize;
455 
456  UInt_t fAllocSize;
457 
458  // @brief data stride
459  Int_t fStride;
460 
462  double *fData;//[fSize]
463 
465  bool fDataOwner;
466 
468  mutable QVector *fRe;
470  mutable QVector *fIm;
471 
473  mutable QVector *fInterleaved;
474 
475  // void SetMathRange(UInt_t start, UInt_t size);
476 
477 private:
478  void SetMathVector() const;
479  void SetParts() const;
480  void InitCopy(const QVectorC& orig,const bool copyData);
481 
482  friend class QVectorCView;
483  friend class QVectorCConstView;
484  friend class QMatrixC;
485  friend class QMatrixCArray;
486  friend class QRealComplexFFTW3;
487  friend class QFFTWRealComplexPlan;
488 
489  QObjectDef(QVectorC,1);
490 };
491 
492 // operations other than member functions
493 // formatted printout
494 
496 Diana::QVectorC operator*(double t, const Diana::QVectorC&v);
497 
498 std::ostream& operator<<(std::ostream&s,const Diana::QVectorC& v);
502 const Diana::QVector Re(const Diana::QVectorC &Z);
506 const Diana::QVector Im(const Diana::QVectorC &Z);
507 
508 #endif
int N
Definition: CheckOF.C:24
QVector vec(3)
#define Q_END_NAMESPACE
Definition: QDiana.hh:22
#define Q_BEGIN_NAMESPACE
Definition: QDiana.hh:20
#define QObjectDef(clazz, id)
Definition: QObject.hh:47
std::ostream & operator<<(std::ostream &s, const Diana::QVectorC &v)
Definition: QVectorC.cc:724
const Diana::QVector Im(const Diana::QVectorC &Z)
Get the imag part of the vector.
Definition: QVectorC.cc:739
const Diana::QVector Re(const Diana::QVectorC &Z)
Get the real part of the vector.
Definition: QVectorC.cc:737
Q_END_NAMESPACE Diana::QVectorC operator*(double t, const Diana::QVectorC &v)
Definition: QVectorC.cc:731
Interface to FFTW's FFT plans.
Definition: QFFTWPlan.hh:33
An array of complex matrices that have been laid out in memory.
Interface for complex matrices in Diana analysis.
Definition: QMatrixC.hh:27
base class for objects handled by QEvent and QGlobalDataManager.
Definition: QObject.hh:76
virtual void Print() const
print content on screen
Definition: QObject.hh:163
Real to complex FFT using FFTW3.
QVectorCView for const QVectorC.
Definition: QVectorCView.hh:52
subview of an existing QVectorC, useful to operate on a QVectorC slice
Definition: QVectorCView.hh:18
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
QVector GetModulus() const
Definition: QVectorC.hh:120
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)
Definition: QVectorC.hh:95
QComplex operator[](const UInt_t i)
retrieve an element
Definition: QVectorC.cc:272
QVector GetMagnitudes() const
Definition: QVectorC.cc:337
QVector GetModulusSquare() const
Definition: QVectorC.hh:121
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
void Clear()
clear the vector
Definition: QVectorC.hh:75
Interface for vectors in Diana analysis.
Definition: QVector.hh:30