StFms  0.0.0
FMS software in the STAR framework
StFmsTowerCluster.cxx
Go to the documentation of this file.
1 // $Id$
2 //
3 // $Log$
14 
15 #include <cmath>
16 
17 #include "TMath.h"
18 #include "TVector2.h"
19 
20 #include "StEvent/StFmsCluster.h"
21 #include "StEvent/StFmsHit.h"
22 
24 
25 namespace FMSCluster {
27  : mEnergyCutoff(0.5), mCluster(cluster) {
28  Clear();
29 }
30 
32 }
33 
34 void StFmsTowerCluster::Clear(const char* /* option */) {
35  mSigmaX = mSigmaY = mSigmaXY = mChiSquare = -1.;
36  mThetaAxis = -10;
37  for (Int_t i(0); i < kMaxPhotonsPerCluster; ++i) {
38  mPhotons[i].Clear();
39  } // for
40  mTowers.clear();
41 }
42 
44  mEnergyCutoff = Ecoff;
45  Float_t w0, w1, mtmp, mx, my, sigx, sigy, sigXY;
46  w0 = w1 = mtmp = mx = my = sigx = sigy = sigXY = 0;
47  for (Towers::const_iterator i = mTowers.begin(); i != mTowers.end(); ++i) {
48  const StFmsTower* tower = *i;
49  Float_t xxx, yyy;
50  xxx = tower->column() - 0.5;
51  yyy = tower->row() - 0.5;
52  mtmp = log(tower->hit()->energy() + 1. - Ecoff) > 0 ?
53  log(tower->hit()->energy() + 1. - Ecoff) : 0;
54  w1 += mtmp;
55  w0 += tower->hit()->energy();
56  mx += mtmp * xxx;
57  my += mtmp * yyy;
58  sigx += mtmp * xxx * xxx;
59  sigy += mtmp * yyy * yyy;
60  sigXY += mtmp * xxx * yyy;
61  } // for
62  mCluster->setEnergy(w0);
63  if (w1 > 0) {
64  mCluster->setX(mx / w1);
65  mCluster->setY(my / w1);
66  mSigmaX = sqrt(fabs(sigx / w1 - std::pow(mCluster->x(), 2.)));
67  mSigmaY = sqrt(fabs(sigy / w1 - std::pow(mCluster->y(), 2.)));
68  mSigmaXY = sigXY / w1 - mCluster->x() * mCluster->y();
69  } else {
70  mCluster->setX(0.);
71  mCluster->setY(0.);
72  mSigmaX = 0;
73  mSigmaY = 0;
74  mSigmaXY = 0;
75  } // if
76 }
77 
79  Double_t dSigma2, aA, bB;
80  dSigma2 = mSigmaX * mSigmaX - mSigmaY * mSigmaY;
81  aA = sqrt(dSigma2 * dSigma2 + 4.0 * mSigmaXY * mSigmaXY) + dSigma2;
82  bB = 2 * mSigmaXY;
83  if (mSigmaXY < 1e-10) {
84  if (aA < 1e-10) {
85  bB = sqrt(dSigma2 * dSigma2 + 4.0 * mSigmaXY * mSigmaXY) - dSigma2;
86  aA = 2 * mSigmaXY;
87  } // if
88  } // if
89  mThetaAxis = atan2(bB, aA);
90  Double_t myPi = TMath::Pi();
91  while (mThetaAxis > (myPi / 2.0)) {
92  mThetaAxis -= myPi;
93  } // while
94  while (mThetaAxis < -(myPi / 2.0)) {
95  mThetaAxis += myPi;
96  } // while
97  mCluster->setSigmaMin(getSigma(mThetaAxis));
98  mCluster->setSigmaMax(getSigma(mThetaAxis - TMath::Pi() / 2.0));
99 }
100 
101 Double_t StFmsTowerCluster::getSigma(Double_t theta) const {
102  Double_t sigma = 0;
103  // 2-d vector vaxis define the axis
104  TVector2 vaxis(cos(theta), sin(theta));
105  // loop over all towers pointer in cluster
106  float wnew =0;
107  for (Towers::const_iterator i = mTowers.begin(); i != mTowers.end(); ++i) {
108  const StFmsTower* tower = *i;
109  // the 2-d vector from the "center" of cluster to tower
110  // "center" are at 0.5, 1.5, etc! Need shift of 0.5
111  TVector2 v1(tower->column() - 0.5 - mCluster->x(),
112  tower->row() - 0.5 - mCluster->y());
113  // perpendicular distance to the axis = length of the component of vector
114  // "v1" that is norm to "vaxis"
115  Double_t dis = (v1.Norm(vaxis)).Mod();
116  // contribution to sigma
117  float wtmp = log(tower->hit()->energy() + 1. - mEnergyCutoff) > 0 ?
118  log(tower->hit()->energy() + 1. - mEnergyCutoff) : 0;
119  wnew += wtmp;
120  sigma += wtmp * dis * dis;
121  } // for
122  return wnew > 0 ? sqrt(sigma / wnew) : 0;
123 }
124 } // namespace FMSCluster
Float_t mSigmaY
2nd moment in y
Double_t getSigma(Double_t theta) const
std::unique_ptr< StFmsCluster > mCluster
Pointer to StEvent cluster.
Declaration of StFmsCluster, a group of adjacent FMS hits.
Declaration of StFmsTower, a simple FMS tower wrapper.
Int_t column() const
Definition: StFmsTower.h:82
static const int kMaxPhotonsPerCluster
Support 2-photon clusters.
void Clear(const char *optionNotUsed="")
Float_t mEnergyCutoff
Cutoff on towers to use in moment calculations.
StFmsFittedPhoton mPhotons[kMaxPhotonsPerCluster]
Photons in cluster.
StFmsTowerCluster(StFmsCluster *cluster)
Declaration of StFmsTowerCluster, a cluster of FMS towers.
Float_t mSigmaXY
2nd moment in x-y
Float_t mSigmaX
2nd moment in x
const StFmsHit * hit() const
Definition: StFmsTower.h:80
Float_t mChiSquare
Chi-square of the fitting.
Towers mTowers
Towers that make the cluster.
void calculateClusterMoments(Float_t energyCutoff)
Int_t row() const
Definition: StFmsTower.h:84