Diana Software
QVector.cc
Go to the documentation of this file.
1 /*
2 *
3 * Class QVector
4 *
5 */
6 
7 #include "QVector.hh"
8 #include "QVectorI.hh"
9 #include "QError.hh"
10 #include "QMatrix.hh"
11 #include <math.h>
12 #include <gsl/gsl_blas.h>
13 #include <gsl/gsl_statistics_double.h>
14 #include <gsl/gsl_sort_vector.h>
15 #include <TH1D.h>
16 #include <TGraph.h>
17 #include <TPad.h>
18 #include <sstream>
19 #include <vector>
20 #include <exception>
21 #include <TMath.h>
22 
23 #include "QRealComplexFFT.hh"
24 #ifdef _HAVE_FFTW3_
25 #include <fftw3.h>
26 #endif
27 
28 QObjectImp(Diana::QVector);
29 
31 
32 double* QVector::ArrayAlloc(const UInt_t size)
33 {
34  double* a = 0;
35  if(size > 0) {
36  try{
37 #ifdef _HAVE_FFTW3A_
38  a=(double *)fftw_malloc(size*sizeof(double));
39 #else
40  a = new double[size];
41 #endif
42  }
43  catch(std::exception &e){
44  std::stringstream msg;
45  msg<<"QVector::ArrayAlloc: Attempt to allocate double array of size "
46  << size << " failed!" << std::endl;
47  msg<<"\n\tMessage: " << e.what();
48  a=NULL;
49  }
50  if(a==NULL){
51  std::stringstream msg;
52  msg<<"QVector::ArrayAlloc: Attempt to allocate double array of size "
53  << size << " failed!" << std::endl;
54  DianaThrow(QError(QERR_UNDERFLOW,__FILE__,__LINE__,msg.str().c_str()));
55  }
56  }
57  return a;
58 }
59 
60 void QVector::ArrayCopy(const double* orig,const UInt_t origStride, double* dest,const UInt_t destStride,const UInt_t size)
61 {
62  if(size > 0 && orig && dest) {
63  if(origStride == 1 && destStride == 1)
64  memcpy(dest,orig,sizeof(double)*size);
65  else
66  for(UInt_t i =0; i < size; i++) {
67  dest[i*destStride] = orig[i*origStride];
68  }
69  }
70 }
71 
72 void QVector::ArrayFree(double* array)
73 {
74  if(array){
75 #ifdef _HAVE_FFTW3A_
76  fftw_free(array);
77 #else
78  delete [] array;
79 #endif
80  }
81  array=NULL;
82 }
83 
85  : fDataOwner(true),
86  fSize(0),
87  fAllocSize(0),
88  fStride(1),
89  fData(0),
90  fMathVec(0)
91 {
92  fMathVec=NULL;
93 }
94 
95 QVector::QVector(const UInt_t size)
96  : fDataOwner(true),
97  fSize(0),
98  fAllocSize(0),
99  fStride(1),
100  fData(0),
101  fMathVec(0)
102 
103 {
104  Resize(size);
105  fMathVec=NULL;
106 }
107 
108 
110  : fDataOwner(true),
111  fSize(0),
112  fAllocSize(0),
113  fStride(1),
114  fData(0),
115  fMathVec(0)
116 
117 {
118  Resize(in.Size());
120  fMathVec=NULL;
121 }
122 
123 QVector::QVector(const QVector& orig,const bool dataOwner)
124  : fDataOwner(dataOwner),
125  fSize(0),
126  fAllocSize(0),
127  fStride(1),
128  fData(0),
129  fMathVec(0)
130 
131 {
132  if(dataOwner){
133  Resize(orig.Size());
134  ArrayCopy(orig.fData,orig.fStride,fData,fStride,Size());
135  }
136  else{
137  fData=orig.fData;
138  fStride=orig.fStride;
139  fAllocSize=orig.fAllocSize;
140  fSize=orig.fSize;
141  }
142  fMathVec=NULL;
143 }
144 
145 QVector::QVector(double* vec,const UInt_t size,const UInt_t stride)
146  : fDataOwner(false),
147  fSize(size),
148  fAllocSize(size),
149  fStride(stride),
150  fData(vec),
151  fMathVec(0)
152 
153 {
154  fMathVec = NULL;
155 }
157 {
158  if(fDataOwner && fData) {
159  if(fData) ArrayFree(fData);
160  }
161  if(fMathVec) {
162  free(fMathVec);
163  }
164  fData=NULL;
165  fMathVec=NULL;
166  fSize=0;
167  fAllocSize=0;
168 }
169 
170 void QVector::Resize(const UInt_t newSize){
171  if(fDataOwner) {
172  if(newSize > fAllocSize) {
173  if(fData) ArrayFree(fData);
174  fData = ArrayAlloc(newSize);
175  fAllocSize = newSize;
176  fStride=1;//check
177  }
178  fSize = newSize;
179  } else if(newSize != (UInt_t)fSize) {
180  DianaThrow( QError(QERR_SIZE_NOT_MATCH,__FILE__,__LINE__,
181  "Not data owner, are you trying to resize a "
182  "QVector get from a QVector(Const)View?") );
183  }
184  if(fMathVec) free(fMathVec);
185  fMathVec = NULL;
186 }
187 
188 const QVector& QVector::operator=(const QVector& orig)
189 {
190  Resize(orig.fSize);
192  return *this;
193 }
194 const QVector& QVector::operator=(const QVectorI& orig)
195 {
196  Resize(orig.Size());
197  for(UInt_t i = 0; i < fSize; i++) fData[i*fStride] = orig[i];
198  return *this;
199 }
200 
201 const QVector& QVector::operator=(const std::vector<double>& orig)
202 {
203  Resize(orig.size());
204  for(UInt_t i = 0; i < fSize; i++) fData[i*fStride] = orig[i];
205  return *this;
206 }
208 {
209  if(!fMathVec) {
210  fMathVec = (gsl_vector*) malloc(sizeof(gsl_vector));
211  fMathVec->size = fSize;
212  fMathVec->stride = fStride;
213  fMathVec->data = fData;
214  fMathVec->block = 0;
215  fMathVec->owner = 0;
216  }
217 }
218 void QVector::Initialize(const double val)
219 {
220  for(UInt_t i = 0; i < fSize; i++) fData[i*fStride] = val;
221 }
222 
223 double & QVector::operator[](const UInt_t i)
224 {
225  if(i >= fSize) {
226  std::stringstream stream;
227  stream<<"Size: "<<fSize<<" Index: "<<i;
228  DianaThrow( QError(QERR_OUT_OF_RANGE,__FILE__,__LINE__,stream.str()) );
229  }
230  return fData[i*fStride];
231 }
232 
233 const double &QVector::operator[](const UInt_t i) const
234 {
235  if(i >= fSize) {
236  std::stringstream stream;
237  stream<<"Size: "<<fSize<<" Index: "<<i;
238  DianaThrow( QError(QERR_OUT_OF_RANGE,__FILE__,__LINE__,stream.str()) );
239  }
240  return fData[i*fStride];
241 }
242 
243 
245 {
246  QVector tmp(*this);
247  tmp*=(-1.);
248  return tmp;
249 }
251 {
252  QVector tmp(*this);
253  b.SetMathVector();
254  tmp.SetMathVector();
255  gsl_vector_mul(tmp.fMathVec, b.fMathVec);
256  return tmp;
257 }
259 {
260  QVector tmp(*this);
261  b.SetMathVector();
262  tmp.SetMathVector();
263  gsl_vector_div(tmp.fMathVec, b.fMathVec);
264  return tmp;
265 }
266 
267 const QVector& QVector::operator/=(const double t)
268 {
269  return operator*=(1./t);
270 }
271 
272 const QVector& QVector::operator*=(const double t)
273 {
274  SetMathVector();
275  gsl_vector_scale(fMathVec,t);
276  return *this;
277 }
278 
279 
280 const QVector & QVector::operator+=(const double v)
281 {
282  SetMathVector();
283  gsl_vector_add_constant(fMathVec,v);
284  return *this;
285 }
286 
287 const QVector & QVector::operator-=(const double v)
288 {
289  SetMathVector();
290  gsl_vector_add_constant(fMathVec,-v);
291  return *this;
292 }
293 
294 const QVector& QVector::operator+=(const QVector& other)
295 {
296  other.SetMathVector();
297  SetMathVector();
298  gsl_vector_add(fMathVec,other.fMathVec);
299  return *this;
300 }
301 
302 const QVector& QVector::operator-=(const QVector& other)
303 {
304  other.SetMathVector();
305  SetMathVector();
306  gsl_vector_sub(fMathVec,other.fMathVec);
307  return *this;
308 }
309 
311  v.SetMathVector();
312  SetMathVector();
313  gsl_vector_mul(fMathVec,v.fMathVec);
314  return *this;
315 }
316 
318  v.SetMathVector();
319  SetMathVector();
320  gsl_vector_div(fMathVec,v.fMathVec);
321  return *this;
322 }
323 
324 double QVector::operator*(const QVector& other) const
325 {
326  other.SetMathVector();
327  SetMathVector();
328  double res;
329  gsl_blas_ddot(fMathVec,other.fMathVec,&res);
330  return res;
331 }
332 
333 QVector QVector::operator+(const double t) const
334 {
335  QVector tmp(*this);
336  tmp+=t;
337  return tmp;
338 }
339 
340 QVector QVector::operator-(const double t) const
341 {
342  QVector tmp(*this);
343  tmp-=t;
344  return tmp;
345 }
346 QVector QVector::operator*(const double t) const
347 {
348  QVector tmp(*this);
349  tmp*=t;
350  return tmp;
351 }
352 
353 QVector QVector::operator/(const double t) const
354 {
355  QVector tmp(*this);
356  tmp/=t;
357  return tmp;
358 }
359 
360 QVector QVector::operator+(const QVector& other) const
361 {
362  QVector tmp(*this);
363  tmp+=other;
364  return tmp;
365 }
366 
367 QVector QVector::operator-(const QVector& other) const
368 {
369  QVector tmp(*this);
370  tmp-=other;
371  return tmp;
372 }
373 
375 {
376  QVector output(Size());
377  for(size_t i = 0; i < Size(); i++) {
378  output[i] = operator[](Size()-1-i);
379  }
380  *this = output;
381  return *this;
382 }
383 const QVector& QVector::Rebin(const int rebin,bool sum) {
384  int newSize = Size()/rebin;
385  double norm = (sum ? 1. : 1./rebin);
386  for(int i=0;i<newSize;i++){
387  (*this)[i]=norm*(*this)[rebin*i];
388  for(int j=1;j<rebin;j++){
389  (*this)[i]+=norm*(*this)[rebin*i+j];
390  }
391  }
392  Resize(newSize);
393  return *this;
394 }
395 const QVector& QVector::Shift(const int nstep)
396 {
397  bool gtz = nstep > 0 ? true : false;
398  if(nstep == 0 || Size() == 0) return *this;
399  unsigned int unstep = abs(nstep) % Size();
400  QVector rest(unstep);
401  if(gtz) {
402  for(unsigned int i = 0; i < unstep; i++) rest[i] = (*this)[Size() - unstep + i];
403  for(int i = Size() - unstep - 1; i >= 0 ; i--) (*this)[i + unstep] = (*this)[i];
404  for(unsigned int i = 0; i < unstep; i++) (*this)[i] = rest[i];
405  } else {
406  for(unsigned int i = 0; i < unstep; i++) rest[i] = (*this)[i];
407  for(unsigned int i = unstep; i < Size(); i++) (*this)[i - unstep] = (*this)[i];
408  for(unsigned int i = 0; i < unstep; i++) (*this)[i + Size() - unstep] = rest[i];
409  }
410  return *this;
411 }
412 
413 const QVector& QVector::ShiftReal(const double fstep)
414 {
415  int nstep = (int) ceil(fstep);
416  Shift(nstep);
417  double fracs = nstep - fstep;
418  double zero = (*this)[0];
419  for(int i = 0; i < (int)Size() - 1; i++) {
420  (*this)[i] = (*this)[i]*(1.-fracs) + fracs*(*this)[i+1];
421  }
422  (*this)[Size()-1] = (*this)[Size()-1]*(1.-fracs) + fracs*zero;
423 
424  return *this;
425 }
426 
428  QVector vec(*this);
429  for(UInt_t i=0;i<vec.Size();i++)
430  vec[i]=TMath::Abs(vec[i]);
431  return vec;
432 }
433 
434 const QVector& QVector::Sort(const bool asc)
435 {
436  SetMathVector();
437  gsl_sort_vector(fMathVec);
438  if(!asc) gsl_vector_reverse(fMathVec);
439  return *this;
440 }
441 
443 {
444  for(UInt_t i = Size()-1; i > 0; i--)
445  (*this)[i] = (*this)[i] - (*this)[i-1] ;
446  (*this)[0] = (*this)[1];
447 
448  return *this;
449 }
450 
451 QVector QVector::Derivative2P(const double delta) const
452 {
453  QVector deriv = (*this)/delta;
454  deriv.Differentiate();
455  deriv[0] = deriv[1];
456  return deriv;
457 }
458 
459 QVector QVector::Derivative2PF(const double delta) const
460 {
461  const QVector &me = (*this);
462  QVector result(me.Size());
463  for(UInt_t i = 0; i < me.Size()-1; i ++) {
464  result[i] = (me[i+1]-me[i])/delta;
465  }
466  result[me.Size()-1] = result[me.Size()-2];
467  return result;
468 }
469 QVector QVector::Derivative3P(const double delta) const
470 {
471  const QVector &me = (*this);
472  QVector result(me.Size());
473  result[0] = (-3.*me[0]+4.*me[1]-me[2]) / (2.*delta);
474  for(UInt_t i = 1; i < me.Size()-1; i ++) {
475  result[i] = (me[i+1]-me[i-1]) / (2.*delta);
476  }
477  result[me.Size()-1] = (me[me.Size()-3]-4.*me[me.Size()-2]+3.*me[me.Size()-1]) / (2.*delta);
478  return result;
479 }
480 
481 QVector QVector::Derivative3PB(const double delta) const
482 {
483  const QVector &me = (*this);
484  QVector result(me.Size());
485  result[0] = (-3.*me[0]+4.*me[1]-me[2]) / (2.*delta);
486  result[1] = (me[2]-me[0]) / (2.*delta);
487  for(UInt_t i = 2; i < me.Size(); i ++) {
488  result[i] = (me[i-2]-4.*me[i-1]+3.*me[i]) / (2.*delta);
489  }
490  return result;
491 }
492 
493 QVector QVector::Derivative3PF(const double delta) const
494 {
495  const QVector &me = (*this);
496  QVector result(me.Size());
497  UInt_t i = 0;
498  for(i = 0; i < me.Size()-2; i++) {
499  result[i] = (-3.*me[i]+4.*me[i+1]-me[i+2]) / (2.*delta);
500  }
501  i = me.Size()-2;
502  result[i] = (me[i+1]-me[i-1]) / (2.*delta);
503  i = me.Size()-1;
504  result[i] = (me[i-2]-4.*me[i-1]+3.*me[i]) / (2.*delta);
505  return result;
506 }
507 
508 QVector QVector::Derivative5P(const double delta) const
509 {
510  const QVector &me = (*this);
511  const UInt_t size = me.Size();
512  QVector result(size);
513  result[0] = (-25.*me[0]+48.*me[1]-36.*me[2]+16.*me[3]-3.*me[4]) / (12.*delta);
514  result[1] = (-3.*me[0]-10.*me[1]+18.*me[2]-6.*me[3]+1.*me[4]) / (12.*delta);
515  for(UInt_t i = 2; i < size-2; i++) {
516  result[i] = (me[i-2]-8.*me[i-1]+8.*me[i+1]-me[i+2]) / (12.*delta);
517  }
518  result[size-2] = (3.*me[size-1]+10.*me[size-2]-18.*me[size-3]+6.*me[size-4]-1.*me[size-5]) / (12.*delta);
519  result[size-1] = (25.*me[size-1]-48.*me[size-2]+36.*me[size-3]-16.*me[size-4]+3.*me[size-5]) / (12.*delta);
520 
521  return result;
522 }
523 
524 QVector QVector::Derivative5PB(const double delta) const
525 {
526  const QVector &me = (*this);
527  const UInt_t size = me.Size();
528  QVector result(size);
529  result[0] = (-25.*me[0]+48.*me[1]-36.*me[2]+16.*me[3]-3.*me[4]) / (12.*delta);
530  result[1] = (-3.*me[0]-10.*me[1]+18.*me[2]-6.*me[3]+1.*me[4]) / (12.*delta);
531  for(UInt_t i = 2; i < 4; i++) {
532  result[i] = (me[i-2]-8.*me[i-1]+8.*me[i+1]-me[i+2]) / (12.*delta);
533  }
534  for(UInt_t i = 4; i < size; i++)
535  result[i] = (25.*me[i]-48.*me[i-1]+36.*me[i-2]-16.*me[i-3]+3.*me[i-4]) / (12.*delta);
536 
537  return result;
538 }
539 
540 QVector QVector::DerivativeEulero(const double delta) const
541 {
542 
543  const QVector &me = (*this);
544  const UInt_t size = me.Size();
545  QVector result(size);
546  result[0] = (-3.*me[0]+4.*me[1]-me[2]) / (2.*delta);
547  for(UInt_t i = 1; i < size; i++)
548  result[i] = (me[i]-me[i-1])*2./delta - result[i-1];
549  return result;
550 }
551 
552 
553 const QVector& QVector::Integrate(const double constTerm)
554 {
555  (*this)[0] += constTerm;
556  for(UInt_t i = 1; i < Size(); i++)
557  (*this)[i] += (*this)[i-1];
558  return *this;
559 }
560 
562 {
563  QMatrix tmp(1,Size());
564  tmp.SetRow(0,*this);
565  return tmp;
566 }
567 
568 QMatrix QVector::Reshape(UInt_t n,UInt_t m) {
569 
570  // IMPORANT NOTE: These algorithms do not work if the vector has a non-unity stride!
571 
572  if(n*m != Size())
573  throw QError(QERR_SIZE_NOT_MATCH,__FILE__,__LINE__,
574  Form("Cannot reshape vector of size %ui into matrix of size %uix%ui!",Size(),n,m));
575  if(fStride != 1)
576  throw QError(QERR_SIZE_NOT_MATCH,__FILE__,__LINE__,
577  "Cannot reshape vector with a stride greater than 1!");
578  QMatrix Ret(fData,n,m);
579  return Ret;
580 }
581 
582 const QMatrix QVector::Reshape(UInt_t n,UInt_t m) const {
583 
584 // IMPORANT NOTE: These algorithms do not work if the vector has a non-unity stride!
585 
586  if(n*m != Size())
587  throw QError(QERR_SIZE_NOT_MATCH,__FILE__,__LINE__,
588  Form("Cannot reshape vector of size %ui into matrix of size %uix%ui!",Size(),n,m));
589  if(fStride != 1)
590  throw QError(QERR_SIZE_NOT_MATCH,__FILE__,__LINE__,
591  "Cannot reshape vector with a stride greater than 1!");
592  QMatrix Ret(fData,n,m);
593  return Ret;
594 }
595 
596 
597 void QVector::Append(const double val)
598 {
599  if(fDataOwner) {
600  double* temp = ArrayAlloc(Size()+1);
601  ArrayCopy(fData,fStride,temp,1,Size());
602  if(fData) ArrayFree(fData);
603  // fData = ArrayAlloc(newSize);
604  fSize=Size()+1;
605  fAllocSize = fSize;;
606  fStride=1;//check
607  temp[Size()-1]=val;
608  fData=temp;
609  fStride=1;
610  if(fMathVec) free(fMathVec);
611  fMathVec = NULL;
612  }
613  else {
614  DianaThrow( QError(QERR_SIZE_NOT_MATCH,__FILE__,__LINE__,"Not data owner, you are trying to resize a QVector using Append") );
615  }
616 }
617 
618 double QVector::Norma() const
619 {
620  return sqrt((*this)*(*this));
621 }
622 
623 
624 double QVector::Sum(const UInt_t nelem,const UInt_t first) const
625 {
626  double sum = 0;
627  UInt_t last = first + nelem;
628  for(UInt_t i = first; i < last; i++) sum += this->operator[](i);
629  return sum;
630 }
631 
632 double QVector::GetRMS(const UInt_t nelem,const UInt_t first) const
633 {
634  SetMathVector();
635  double mean = Sum(nelem, first);
636  mean /= nelem;
637  double rms = gsl_stats_variance_m(&(fMathVec->data[first]), 1,nelem, mean);
638  return sqrt(rms);
639 }
640 
641 double QVector::GetMedian() const
642 {
643 
644  SetMathVector();
645  double median = 0;
646  if (Size() > 0) {
647  // make a copy of the gsl vector and sort the copy in place
648  gsl_vector* copy = gsl_vector_alloc(Size());
649  gsl_vector_memcpy(copy, fMathVec);
650  gsl_sort_vector(copy);
651 
652  if (Size() % 2 == 1) { // odd number of elements
653  median = gsl_vector_get(copy, (Size() - 1) / 2);
654  }
655  else { // even number of elements
656  median = ( gsl_vector_get(copy, Size() / 2 - 1)
657  + gsl_vector_get(copy, Size() / 2 ) ) / 2.0;
658  }
659 
660  // free the memory for the copy
661  gsl_vector_free(copy);
662  }
663  return median;
664 }
665 
667 {
668  double mad = -1;
669  if (Size() > 0) {
670  double median = GetMedian();
671  QVector absDeviations(Size());
672  for (unsigned int i = 0; i < Size(); ++i) {
673  absDeviations[i] = fabs(operator[](i) - median);
674  }
675  mad = absDeviations.GetMedian();
676  }
677  return mad;
678 }
679 
680 int QVector::GetMaxIndex(const UInt_t nelem,const UInt_t first) const
681 {
682 
683  SetMathVector();
684  gsl_vector_const_view vectorview = gsl_vector_const_subvector(fMathVec,first,nelem);
685  return gsl_vector_max_index(&(vectorview.vector))+first;
686 }
687 
688 int QVector::GetMinIndex(const UInt_t nelem,const UInt_t first) const
689 {
690 
691  SetMathVector();
692  gsl_vector_const_view vectorview = gsl_vector_const_subvector(fMathVec,first,nelem);
693  return gsl_vector_min_index(&(vectorview.vector))+first;
694 }
695 
696 double* QVector::GetArray() const {
697  double *a = ArrayAlloc(fSize);
699  return a;
700 }
701 QVector QVector::GetSubVector(UInt_t size,UInt_t start,UInt_t stride) {
702  if(start+size > Size())
703  DianaThrow(QError(QERR_SIZE_NOT_MATCH,__FILE__,__LINE__,
704  "Sub vector would exceed beyond original vector!"));
705  stride = (stride < 1 ? 1 : stride);
706  return QVector(fData+fStride*start,size,fStride*stride);
707 }
708 
709 const QVector QVector::GetSubVector(UInt_t size,UInt_t start,UInt_t stride)
710  const {
711  if(start+size > Size())
712  DianaThrow(QError(QERR_SIZE_NOT_MATCH,__FILE__,__LINE__,
713  "Sub vector would exceed beyond original vector!"));
714  stride = (stride < 1 ? 1 : stride);
715  return QVector(fData+fStride*start,size,fStride*stride);
716 }
717 
718 
719 void QVector::SetArray(const double* orig,const UInt_t size)
720 {
721  Resize(size);
722  ArrayCopy(orig,1,fData,fStride,size);
723 }
724 
725 
726 std::string QVector::sqlString() const{
727  std::string s = "";
728  char d[20];
729  if(Size() > 0) {
730  s += "'{";
731  for (UInt_t i=0;i<Size();i++){
732  if(i!=0)s+=std::string(",");
733  // retain 10 significant digis
734  snprintf(d,20,"%.10g",operator[](i));
735  s+=d;
736  }
737  s+=std::string("}'");
738  }
739  else
740  s+="NULL";
741  return s;
742 }
743 
744 void QVector::Draw(Option_t* option)
745 {
746  TH1D* h = new TH1D("Diana::QVector","",fSize,-0.5,double(fSize)-0.5);
747  h->SetDirectory(0);
748  for(UInt_t i = 0; i < fSize; i++)
749  h->SetBinContent(i+1,this->operator[](i));
750  h->SetBit(kCanDelete);
751  h->Draw(option);
752 
753  if(gPad) {
754  gPad->Update();
755  gPad->Modified();
756  }
757 
758 }
759 
760 
761 TGraph* QVector::GetGraph(double samplingFrequency, double scale) const
762 {
763  const QVector& timeline = *this;
764  TGraph* graph = new TGraph(timeline.Size());
765  for(UInt_t i = 0; i < timeline.Size(); i++)
766  {
767  graph->SetPoint(i,double(i)/samplingFrequency,timeline[i]*scale);
768  }
769  return graph;
770 }
771 
772 void QVector::Dump(std::ostream&s) const
773 {
774  s<<"Size: "<<this->Size()<<"; Elements: ";
775  for (UInt_t i = 0; i < this->Size(); i++) s<<this->operator[](i)<<" ";
776  s<<std::endl;
777 }
778 
779 
781 
782 
783 /********************************************
784  NON MEMBER FUNCTIONS
785 *********************************************/
786 
787 Diana::QVector operator+(double t, const Diana::QVector &v){
788  Diana::QVector tmp(v);
789  tmp+=t;
790  return tmp;
791 }
792 
793 Diana::QVector operator-(double t, const Diana::QVector &v){
794  Diana::QVector tmp(v);
795  tmp-=t;
796  return -tmp;
797 }
798 Diana::QVector operator*(double t, const Diana::QVector &v){
799  Diana::QVector tmp(v);
800  tmp*=t;
801  return tmp;
802 }
803 
804 Diana::QVector operator/(double t, const Diana::QVector &v){
805 
806  Diana::QVector tmp(v.Size());
807  tmp.Initialize(t);
808  return tmp.Div(v);
809 }
810 
811 Diana::QVector abs(const Diana::QVector &v){
812  return v.Abs();
813 }
814 
815 Diana::QVector sin(const Diana::QVector &v) {
816  Diana::QVector tmp(v.Size());
817  for(UInt_t i=0;i<v.Size();i++) tmp[i]=sin(v[i]);
818  return tmp;
819 }
820 
821 Diana::QVector cos(const Diana::QVector &v) {
822  Diana::QVector tmp(v.Size());
823  for(UInt_t i=0;i<v.Size();i++) tmp[i]=cos(v[i]);
824  return tmp;
825 }
826 
827 Diana::QVector tan(const Diana::QVector &v) {
828  Diana::QVector tmp(v.Size());
829  for(UInt_t i=0;i<v.Size();i++) tmp[i]=tan(v[i]);
830  return tmp;
831 }
832 
833 Diana::QVector exp(const Diana::QVector &v) {
834  Diana::QVector tmp(v.Size());
835  for(UInt_t i=0;i<v.Size();i++) tmp[i]=exp(v[i]);
836  return tmp;
837 }
838 
839 Diana::QVector log(const Diana::QVector &v) {
840  Diana::QVector tmp(v.Size());
841  for(UInt_t i=0;i<v.Size();i++) tmp[i] = TMath::Log(v[i]);
842  return tmp;
843 }
844 
845 Diana::QVector log10(const Diana::QVector &v) {
846  Diana::QVector tmp(v.Size());
847  for(UInt_t i=0;i<v.Size();i++) tmp[i] = TMath::Log10(v[i]);
848  return tmp;
849 }
850 
851 
852 Diana::QVector pow(const Diana::QVector &v,double p) {
853  Diana::QVector tmp(v.Size());
854  for(UInt_t i=0;i<v.Size();i++) tmp[i]=TMath::Power(v[i],p);
855  return tmp;
856 }
857 
858 Diana::QVector pow(double p,const Diana::QVector &v) {
859  Diana::QVector tmp(v.Size());
860  for(UInt_t i=0;i<v.Size();i++) tmp[i]=TMath::Power(p,v[i]);
861  return tmp;
862 }
863 
864 Diana::QVector pow(const Diana::QVector &u,const Diana::QVector &v) {
865  if(u.Size()!=v.Size())
866  throw QError(QERR_SIZE_NOT_MATCH,__FILE__,__LINE__,
867  "Cannot raise a vector to the power of another vector if the sizes do not match!");
868  Diana::QVector tmp(v.Size());
869  for(UInt_t i=0;i<v.Size();i++) tmp[i]=TMath::Power(u[i],v[i]);
870  return tmp;
871 }
872 
873 
874 double max(const Diana::QVector &v){
875  return v.GetMax();
876 }
877 
878 double min(const Diana::QVector &v){
879  return v.GetMin();
880 }
881 
TF1 a
Definition: CheckOF.C:21
QVector b
Definition: CheckOF.C:21
QVector vec(3)
#define DianaThrow(obj)
Definition: QDianaDebug.hh:26
#define Q_END_NAMESPACE
Definition: QDiana.hh:22
#define Q_BEGIN_NAMESPACE
Definition: QDiana.hh:20
@ QERR_UNDERFLOW
Definition: QError.hh:30
@ QERR_SIZE_NOT_MATCH
Definition: QError.hh:31
@ QERR_OUT_OF_RANGE
Definition: QError.hh:28
Diana::QVector operator/(double t, const Diana::QVector &v)
Definition: QVector.cc:804
Diana::QVector tan(const Diana::QVector &v)
Definition: QVector.cc:827
QObjectImp(Diana::QVector)
Diana::QVector operator-(double t, const Diana::QVector &v)
Definition: QVector.cc:793
Diana::QVector pow(const Diana::QVector &v, double p)
Definition: QVector.cc:852
Diana::QVector log(const Diana::QVector &v)
Definition: QVector.cc:839
Diana::QVector operator*(double t, const Diana::QVector &v)
Definition: QVector.cc:798
Diana::QVector sin(const Diana::QVector &v)
Definition: QVector.cc:815
Diana::QVector abs(const Diana::QVector &v)
Definition: QVector.cc:811
Q_END_NAMESPACE Diana::QVector operator+(double t, const Diana::QVector &v)
Definition: QVector.cc:787
Diana::QVector log10(const Diana::QVector &v)
Definition: QVector.cc:845
double min(const Diana::QVector &v)
Definition: QVector.cc:878
Diana::QVector cos(const Diana::QVector &v)
Definition: QVector.cc:821
Diana::QVector exp(const Diana::QVector &v)
Definition: QVector.cc:833
double max(const Diana::QVector &v)
Definition: QVector.cc:874
error class with error type and description
Definition: QError.hh:115
Interface for matrices in Diana analysis.
Definition: QMatrix.hh:24
void SetRow(UInt_t nrow, const QVector &vec)
set row to specific vectors
Definition: QMatrix.cc:192
Interface for raw daq vectors in Diana.
Definition: QVectorI.hh:19
size_t Size() const
Definition: QVectorI.hh:45
Interface for vectors in Diana analysis.
Definition: QVector.hh:30
const QVector & Rebin(const int rebin, bool sum=false)
Rebin the vector.
Definition: QVector.cc:383
const QVector & operator*=(const double t)
multiplication by scalar
Definition: QVector.cc:272
QVector Derivative3PF(const double delta=1.) const
compute derivative with 3 point interpolation, forward mode
Definition: QVector.cc:493
QVector operator-() const
revert sign to all components
Definition: QVector.cc:244
QVector Div(const QVector &other) const
multiplication element by element
Definition: QVector.cc:258
static void ArrayCopy(const double *orig, const UInt_t origStride, double *dest, const UInt_t destStride, const UInt_t size)
Definition: QVector.cc:60
const QVector & Differentiate()
make vector derivative
Definition: QVector.cc:442
UInt_t Size() const
size of QVector
Definition: QVector.hh:54
QVector operator+(const QVector &other) const
sum vector
Definition: QVector.cc:360
const QVector & operator+=(const double v)
sum scalar to all elements
Definition: QVector.cc:280
virtual ~QVector()
destructor
Definition: QVector.cc:156
QVector DerivativeEulero(const double delta=1.) const
compute derivative with Eulero interpolation, backward mode
Definition: QVector.cc:540
UInt_t fSize
size of the array
Definition: QVector.hh:436
static void ArrayFree(double *array)
Definition: QVector.cc:72
QVector Mult(const QVector &other) const
multiplication element by element
Definition: QVector.cc:250
double GetRMS() const
Get RMS.
Definition: QVector.hh:341
QVector Derivative5P(const double delta=1.) const
compute derivative with 5 point interpolation, symmetric
Definition: QVector.cc:508
void Draw(Option_t *option="")
Draw root.
Definition: QVector.cc:744
double & operator[](const UInt_t i)
retrieve an element
Definition: QVector.cc:223
QVector Derivative2P(const double delta=1.) const
compute derivative with 2 point interpolation, uses Differentiate()
Definition: QVector.cc:451
virtual void Dump(std::ostream &o) const
Dump object to stream.
Definition: QVector.cc:772
void SetMathVector() const
Definition: QVector.cc:207
const bool fDataOwner
if this vector onws its data
Definition: QVector.hh:433
QVector Derivative3PB(const double delta=1.) const
compute derivative with 3 point interpolation, backward mode
Definition: QVector.cc:481
UInt_t fStride
data stride
Definition: QVector.hh:441
Double_t * fData
array
Definition: QVector.hh:444
QMatrix T() const
transpose
Definition: QVector.cc:561
TGraph * GetGraph(double samplingFrequency=1., double scale=1.) const
Get a root TGraph (owned by the caller)
Definition: QVector.cc:761
static double * ArrayAlloc(const UInt_t size)
Definition: QVector.cc:32
const QVector & Reverse()
time reversal of the vector
Definition: QVector.cc:374
QVector GetSubVector(UInt_t size, UInt_t start=0, UInt_t stride=1)
Definition: QVector.cc:701
double * GetArray() const
get an array of doubles, owned by the caller!
Definition: QVector.cc:696
double GetMedian() const
Get median.
Definition: QVector.cc:641
QVector Derivative2PF(const double delta=1.) const
compute derivative with forward 2 point interpolation
Definition: QVector.cc:459
const QVector & ShiftReal(const double fstep)
Cyclic shift of vector by a real number, first shift by the integer part of fstep then linear interpo...
Definition: QVector.cc:413
QVector Abs() const
Return a vector of the absolute values.
Definition: QVector.cc:427
const QVector & Shift(const int nstep)
Cyclic shift of vector.
Definition: QVector.cc:395
void Append(const double val)
append
Definition: QVector.cc:597
QMatrix Reshape(UInt_t n, UInt_t m)
reshape the vector into a matrix
Definition: QVector.cc:568
double Norma() const
norma
Definition: QVector.cc:618
double operator*(const QVector &other) const
scalar product
Definition: QVector.cc:324
void SetArray(const double *orig, const UInt_t size)
get a constant pointer to the content
Definition: QVector.cc:719
QVector()
default constructor
Definition: QVector.cc:84
QVector Derivative5PB(const double delta=1.) const
compute derivative with 5 point interpolation, backward mode
Definition: QVector.cc:524
double GetMedianAbsoluteDeviation() const
Get median absolute deviation.
Definition: QVector.cc:666
const QVector & operator=(const QVector &orig)
copy the content from another QVector
Definition: QVector.cc:188
const QVector & Integrate(const double constTerm=0)
Integrate vector.
Definition: QVector.cc:553
const QVector & Sort(const bool asc=true)
sort this vector
Definition: QVector.cc:434
QVector Derivative3P(const double delta=1.) const
compute derivative with 3 point interpolation, symmetric
Definition: QVector.cc:469
double Sum() const
sum elements
Definition: QVector.hh:319
QVector operator/(double t) const
divide by scalar
Definition: QVector.cc:353
const QVector & operator/=(const double v)
divide by scalar
Definition: QVector.cc:267
void Resize(const UInt_t newsize)
resize a QVector
Definition: QVector.cc:170
std::string sqlString() const
Definition: QVector.cc:726
UInt_t fAllocSize
Definition: QVector.hh:438
const QVector & operator-=(const double v)
subtract scalar to all elements
Definition: QVector.cc:287
void Initialize(const double val=0)
initialize elements (default to 0)
Definition: QVector.cc:218
gsl_vector * fMathVec
temporary gsl_vector to use the gsl library
Definition: QVector.hh:447
UInt_t GetMaxIndex() const
get maximum element index
Definition: QVector.hh:373
UInt_t GetMinIndex() const
get minimum element index
Definition: QVector.hh:378