StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
StSvtHybridStat.cc
1  /***************************************************************************
2  *
3  * $Id: StSvtHybridStat.cc,v 1.4 2003/09/02 17:59:06 perev Exp $
4  *
5  * Author: Marcelo Munhoz
6  ***************************************************************************
7  *
8  * Description: SVT Hybrid Pixel Statistic class
9  *
10  ***************************************************************************
11  *
12  * $Log: StSvtHybridStat.cc,v $
13  * Revision 1.4 2003/09/02 17:59:06 perev
14  * gcc 3.2 updates + WarnOff
15  *
16  * Revision 1.3 2000/11/30 20:39:12 caines
17  * Changed to allow us of database
18  *
19  * Revision 1.1.1.1 2000/03/10 14:26:21 munhoz
20  * SVT Class Library
21  *
22  **************************************************************************/
24 // //
25 // Used to calculate the statistics (mean and RMS) of pixel quantities. //
26 // For instance, it can be used to calculate the pedestals of a hybrid. //
27 // //
29 
30 #include <math.h>
31 #include "StSvtHybridPixels.hh"
32 #include "StSvtHybridStat.hh"
33 
34 ClassImp(StSvtHybridStat)
35 
36 StSvtHybridStat::StSvtHybridStat(int barrel, int ladder, int wafer, int hybrid) :
37  StSvtHybridObject(barrel, ladder, wafer, hybrid)
38 {
39  // The same as StSvtHybrid. Initialize the statiscal momenta
40 
41  m0 = new StSvtHybridPixels(barrel, ladder, wafer, hybrid);
42  m1 = new StSvtHybridPixels(barrel, ladder, wafer, hybrid);
43  m2 = new StSvtHybridPixels(barrel, ladder, wafer, hybrid);
44 }
45 
46 StSvtHybridStat::~StSvtHybridStat()
47 {
48  delete m0;
49  delete m1;
50  delete m2;
51 }
52 
53 StSvtHybridStat& StSvtHybridStat::operator = (const StSvtHybridStat& h)
54 {
55  m0 = h.m0;
56  m1 = h.m1;
57  m2 = h.m2;
58  return *this;
59 }
60 
61 StSvtHybridStat* StSvtHybridStat::addStat(StSvtHybridStat* h)
62 {
63  float x0, x1, x2;
64 
65  for (int i=0;i<m0->getTotalNumberOfPixels();i++) {
66  x0 = m0->At(i) + h->get0thMom()->At(i);
67  x1 = m1->At(i) + h->get1stMom()->At(i);
68  x2 = m2->At(i) + h->get2ndMom()->At(i);
69 
70  m0->AddAt(x0,i);
71  m1->AddAt(x1,i);
72  m2->AddAt(x2,i);
73  }
74 
75  return this;
76 }
77 
78 void StSvtHybridStat::setMoms(StSvtHybridPixels* h1, StSvtHybridPixels* h2, int weight)
79 {
80  for (int i=0;i<m0->getTotalNumberOfPixels();i++)
81  m0->AddAt(weight,i);
82 
83  m1 = h1;
84  m2 = h2;
85 }
86 
87 void StSvtHybridStat::setMoms(float* x1, float* x2, int weight)
88 {
89  for (int i=0;i<m0->getTotalNumberOfPixels();i++)
90  m0->AddAt(weight,i);
91 
92  m1->Set(m1->getTotalNumberOfPixels(),x1);
93  m2->Set(m2->getTotalNumberOfPixels(),x2);
94 }
95 
96 float StSvtHybridStat::getMean(int anode, int time)
97 {
98  // Returns the mean value for pixel (anode,time)
99 
100  int index = m0->getPixelIndex(anode,time);
101  int n = (int)m0->At(index);
102  int sum = (int)m1->At(index);
103 
104  float mean;
105 
106  if (n)
107  mean = (float)sum/(float)n;
108  else
109  return 0;
110 
111  return mean;
112 }
113 
114 float StSvtHybridStat::getRMS(int anode, int time)
115 {
116  // Returns the RMS for pixel (anode,time)
117 
118  int index = m0->getPixelIndex(anode,time);
119  int n = (int)m0->At(index);
120  int sum = (int)m1->At(index);
121  int sumSQ = (int)m2->At(index);
122 
123  float mean;
124  float meanSQ;
125 
126  if (n) {
127  mean = (float)sum/(float)n;
128  meanSQ = (float)sumSQ/(float)n;
129  }
130  else
131  return 0;
132 
133  float rms = ::sqrt(meanSQ - mean*mean);
134 
135  return rms;
136 }
137 
138 void StSvtHybridStat::fillMom(int x, int anode, int time)
139 {
140  // Fills the 0th, 1st and 2nd order momenta of pixel (anode,time) with the value x
141 
142  int previousValue;
143  int index = m0->getPixelIndex(anode,time);
144 
145  previousValue = (int)m0->At(index);
146  m0->AddAt(1+previousValue,index);
147 
148  previousValue = (int)m1->At(index);
149  m1->AddAt(x+previousValue,index);
150 
151  previousValue = (int)m2->At(index);
152  m2->AddAt(x*x+previousValue,index);
153 }
154 
155 void StSvtHybridStat::fillMomAllPixels(int x)
156 {
157  for (int anode=1;anode<=m0->getNumberOfAnodes();anode++) {
158  for (int time=0;time<m0->getNumberOfTimeBins();time++) {
159  fillMom(x,anode,time);
160  }
161  }
162 }
163 
164 void StSvtHybridStat::reset()
165 {
166  if (m0)
167  m0->reset();
168  if (m1)
169  m1->reset();
170  if (m2)
171  m2->reset();
172 }