StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
StSvtClusterMatrix.cc
1 #include <Stiostream.h>
2 #include "StSvtClusterMatrix.hh"
3 
4 StSvtClusterMatrix::StSvtClusterMatrix(){
5 
6 mCluRow = 0;
7 mCluCol = 0;
8 mData = NULL;
9 
10 }
11 
12 StSvtClusterMatrix::StSvtClusterMatrix(int mRow, int mCol){
13 
14  //initialize matrix
15 
16 mCluRow = mRow;
17 mCluCol = mCol;
18 
19 if ( MatrixAlloc(mRow, mCol) )
20  {
21 
22  exit(-1);
23  }
24 }
25 
26 StSvtClusterMatrix::StSvtClusterMatrix(const StSvtClusterMatrix& cluster){
27  //copy constructor
28 
29 mCluRow = cluster.mCluRow;
30 mCluCol = cluster.mCluCol;
31 
32 MatrixAlloc(mCluRow, mCluCol ); //allocate memory
33 
34  for( int i=0; i<mCluRow; i++)
35  for( int j=0; j<mCluCol; j++)
36  {
37  mData[i][j] = cluster.mData[i][j] ;
38  }
39 
40 }
41 
42 StSvtClusterMatrix::~StSvtClusterMatrix(){
43  //delete the data
44 
45 if(mData != NULL)
46  MatrixDeAlloc(); //free the memory
47  }
48 
49 int StSvtClusterMatrix::Rows() const
50 {
51 
52 return mCluRow;
53 
54 }
55 
56 int StSvtClusterMatrix::Columns() const
57 {
58 
59 return mCluCol;
60 
61 }
62 
63 
64 //AA
65 double& StSvtClusterMatrix::operator ()( int row, int col)
66 {//returns the value stored at nrow and col
67  return mData[row][col];
68 }
69 
70 
71 
72 int StSvtClusterMatrix::SetDimension(int mRow, int mCol)
73 { //set the dimension and allocates the memory of the matrix
74 
75  if(mCol == 0) //if default column: square matrix
76  mCol = mRow;
77 
78  StSvtClusterMatrix temp(mRow, mCol);
79 
80  for(int i=0; i<mCluRow; i++)
81  for(int j=0; j<mCluCol; j++)
82  temp(i,j) = mData[i][j]; //copy the existing data
83 
84  //delete the existing data;
85  MatrixDeAlloc();
86 
87  MatrixAlloc(mRow,mCol);
88 
89  mCluRow = mRow;
90  mCluCol = mCol;
91 
92  for(int i=0; i<mCluRow; i++)
93  for(int j=0; j<mCluCol; j++)
94  mData[i][j] = temp.mData[i][j]; //copy the existing data
95 
96  return 0; //could be used to return the success
97  // or failure of allocation
98 }
99 
100 void StSvtClusterMatrix::GetDimension(int& mRow, int& mCol) const
101 { //report the dimension of the matrix
102  mRow = mCluRow;
103  mCol = mCluCol;
104 }
105 
106 istream& operator>>(istream& s, StSvtClusterMatrix& cluster)
107 { //read matrix from a stream
108 
109  for(int i=0; i<cluster.mCluRow; i++ )
110  for(int j=0; j<cluster.mCluCol; j++ )
111  s>>cluster(i,j);
112 
113  return s;
114 }
115 
116 //private methods
117 int StSvtClusterMatrix::MatrixAlloc( int mRow, int mCol)
118 {
119  try //test for exceptions
120  {
121  mData = new double*[mRow]; //allocate memory for rows
122  for(int j=0; j<mRow; j++)
123  mData[j] = new double[mCol];
124  }
125  catch (double*)
126  { // ENTER THIS BLOCK ONLY IF xalloc IS THROWN.
127  return -1;
128  }
129  return 0;
130 }
131 
132 int StSvtClusterMatrix::MatrixDeAlloc()
133 { //null matrix
134  for (int i=0; i<mCluRow; i++)
135  delete[] mData[i]; // STEP 1: DELETE THE COLUMNS
136 
137 
138  delete[] mData; // STEP 2: DELETE THE ROWS
139 
140 
141  return 0;
142 }