ROOT logo
#ifndef ALIMATRIXSQ_H
#define ALIMATRIXSQ_H

/**********************************************************************************************/
/*                                                                                            */ 
/* Abstract class for matrix used for                                                         */
/* millepede2 operation.                                                                      */
/* Author: ruben.shahoyan@cern.ch                                                             */
/*                                                                                            */ 
/**********************************************************************************************/

#include <TMatrixDBase.h>
#include <TVectorD.h>

class AliMatrixSq : public TMatrixDBase {
  //
 public:
  AliMatrixSq(): fSymmetric(kFALSE) {}
  AliMatrixSq(const AliMatrixSq &src) : TMatrixDBase(src), fSymmetric(src.fSymmetric) {}
  virtual ~AliMatrixSq() {}
  AliMatrixSq& operator=(const AliMatrixSq &src);
  virtual Int_t   GetSize()                            const {return fNcols;}
  virtual Float_t GetDensity()                         const     = 0;
  //
  virtual void  Clear(Option_t* option="")                       = 0;//{Error("Clear","Dummy");}
  //
  virtual       Double_t      Query(Int_t rown, Int_t coln)     const {return operator()(rown,coln);}
  virtual       Double_t      operator()(Int_t rown, Int_t coln) const = 0;//{Error("(i,j)","Dummy");return 0;}
  virtual       Double_t&     operator()(Int_t rown, Int_t coln) = 0;//{Error("(i,j)","Dummy");return 0;}
  //
  virtual       Double_t      QueryDiag(Int_t rc)               const {return DiagElem(rc);}
  virtual       Double_t      DiagElem(Int_t r)                  const = 0;
  virtual       Double_t&     DiagElem(Int_t r)                  = 0;
  virtual       void          AddToRow(Int_t r, Double_t *valc,Int_t *indc,Int_t n) = 0;
  //
  virtual void  Print(Option_t* option="")           const       = 0;//{Error("Print","Dummy");}
  virtual void  Reset()                                          = 0;
  virtual void  PrintCOO()                           const;          // print in COO format
  //
  virtual void  MultiplyByVec(const Double_t* vecIn, Double_t* vecOut) const;
  virtual void  MultiplyByVec(const TVectorD &vecIn, TVectorD &vecOut) const;
  //
  Bool_t        IsSymmetric()                       const {return fSymmetric;}
  void          SetSymmetric(Bool_t v=kTRUE)              {fSymmetric = v;}
  //
  // ---------------------------------- Dummy methods of MatrixBase
  virtual       const Double_t   *GetMatrixArray  () const {Error("GetMatrixArray","Dummy"); return 0;};
  virtual             Double_t   *GetMatrixArray  ()       {Error("GetMatrixArray","Dummy"); return 0;};
  virtual       const Int_t      *GetRowIndexArray() const {Error("GetRowIndexArray","Dummy"); return 0;};
  virtual             Int_t      *GetRowIndexArray()       {Error("GetRowIndexArray","Dummy"); return 0;};
  virtual       const Int_t      *GetColIndexArray() const {Error("GetColIndexArray","Dummy"); return 0;};
  virtual             Int_t      *GetColIndexArray()       {Error("GetColIndexArray","Dummy"); return 0;};
  virtual             TMatrixDBase &SetRowIndexArray(Int_t *) {Error("SetRowIndexArray","Dummy"); return *this;}
  virtual             TMatrixDBase &SetColIndexArray(Int_t *) {Error("SetColIndexArray","Dummy"); return *this;}
  virtual             TMatrixDBase &GetSub(Int_t,Int_t,Int_t,Int_t,TMatrixDBase &,Option_t *) const {Error("GetSub","Dummy"); return *((TMatrixDBase*)this);}
  virtual             TMatrixDBase &SetSub(Int_t,Int_t,const TMatrixDBase &) {Error("GetSub","Dummy"); return *this;}
  virtual             TMatrixDBase &ResizeTo (Int_t,Int_t,Int_t) {Error("ResizeTo","Dummy"); return *this;}
  virtual             TMatrixDBase &ResizeTo (Int_t,Int_t,Int_t,Int_t,Int_t) {Error("ResizeTo","Dummy"); return *this;}
  //
  virtual void Allocate      (Int_t ,Int_t ,Int_t , Int_t ,Int_t ,Int_t ) 
  {Error("Allocate","Dummy"); return;}
  //
  static Bool_t       IsZero(Double_t x,Double_t thresh=1e-64) {return x>0 ? (x<thresh) : (x>-thresh);}
  //
 protected:
  //
  void    Swap(int &r,int &c) const {int t=r;r=c;c=t;}
  //
 protected:
  //
  Bool_t        fSymmetric;     // is the matrix symmetric? Only lower triangle is filled
  //
  ClassDef(AliMatrixSq,1) //Square Matrix Class
};


//___________________________________________________________
inline void AliMatrixSq::MultiplyByVec(const TVectorD &vecIn, TVectorD &vecOut) const
{
  MultiplyByVec(vecIn.GetMatrixArray(), vecOut.GetMatrixArray());
}


#endif
 AliMatrixSq.h:1
 AliMatrixSq.h:2
 AliMatrixSq.h:3
 AliMatrixSq.h:4
 AliMatrixSq.h:5
 AliMatrixSq.h:6
 AliMatrixSq.h:7
 AliMatrixSq.h:8
 AliMatrixSq.h:9
 AliMatrixSq.h:10
 AliMatrixSq.h:11
 AliMatrixSq.h:12
 AliMatrixSq.h:13
 AliMatrixSq.h:14
 AliMatrixSq.h:15
 AliMatrixSq.h:16
 AliMatrixSq.h:17
 AliMatrixSq.h:18
 AliMatrixSq.h:19
 AliMatrixSq.h:20
 AliMatrixSq.h:21
 AliMatrixSq.h:22
 AliMatrixSq.h:23
 AliMatrixSq.h:24
 AliMatrixSq.h:25
 AliMatrixSq.h:26
 AliMatrixSq.h:27
 AliMatrixSq.h:28
 AliMatrixSq.h:29
 AliMatrixSq.h:30
 AliMatrixSq.h:31
 AliMatrixSq.h:32
 AliMatrixSq.h:33
 AliMatrixSq.h:34
 AliMatrixSq.h:35
 AliMatrixSq.h:36
 AliMatrixSq.h:37
 AliMatrixSq.h:38
 AliMatrixSq.h:39
 AliMatrixSq.h:40
 AliMatrixSq.h:41
 AliMatrixSq.h:42
 AliMatrixSq.h:43
 AliMatrixSq.h:44
 AliMatrixSq.h:45
 AliMatrixSq.h:46
 AliMatrixSq.h:47
 AliMatrixSq.h:48
 AliMatrixSq.h:49
 AliMatrixSq.h:50
 AliMatrixSq.h:51
 AliMatrixSq.h:52
 AliMatrixSq.h:53
 AliMatrixSq.h:54
 AliMatrixSq.h:55
 AliMatrixSq.h:56
 AliMatrixSq.h:57
 AliMatrixSq.h:58
 AliMatrixSq.h:59
 AliMatrixSq.h:60
 AliMatrixSq.h:61
 AliMatrixSq.h:62
 AliMatrixSq.h:63
 AliMatrixSq.h:64
 AliMatrixSq.h:65
 AliMatrixSq.h:66
 AliMatrixSq.h:67
 AliMatrixSq.h:68
 AliMatrixSq.h:69
 AliMatrixSq.h:70
 AliMatrixSq.h:71
 AliMatrixSq.h:72
 AliMatrixSq.h:73
 AliMatrixSq.h:74
 AliMatrixSq.h:75
 AliMatrixSq.h:76
 AliMatrixSq.h:77
 AliMatrixSq.h:78
 AliMatrixSq.h:79
 AliMatrixSq.h:80
 AliMatrixSq.h:81
 AliMatrixSq.h:82
 AliMatrixSq.h:83
 AliMatrixSq.h:84