EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
CbmRichRingFitterEllipseMinuit.cxx
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file CbmRichRingFitterEllipseMinuit.cxx
1 
9 
10 using std::endl;
11 using std::cout;
12 
14 {
15 
16 }
17 
19 {
20 
21 }
22 
24  CbmRichRingLight *ring)
25 {
26  int nofHits = ring->GetNofHits();
27 
28  if (nofHits <= 5) {
29  ring->SetXYABP(-1.,-1.,-1., -1., -1.);
30  ring->SetRadius(-1.);
31  return;
32  }
33 
34  vector<double> hitX;
35  vector<double> hitY;
36  hitX.clear();
37  hitY.clear();
38  for(int i = 0; i < nofHits; i++) {
39  hitX.push_back(ring->GetHit(i).fX);
40  hitY.push_back(ring->GetHit(i).fY);
41  }
42 
43  vector<double> fpar = DoFit(hitX, hitY);
44 
45  TransformToRichRing(ring, fpar);
46 
47  CalcChi2(ring);
48 }
49 
51  CbmRichRingLight* ring,
52  const vector<double>& fpar)
53 {
54  // calculate center of the ellipse
55  double xc = (fpar[0] + fpar[2])/2.;
56  double yc = (fpar[1] + fpar[3])/2.;
57  // calculate length of b axes
58  double p1 = (fpar[0] - fpar[2])*(fpar[0] - fpar[2]) + (fpar[1] - fpar[3])*(fpar[1] - fpar[3]);
59  if (p1 < 0.){
60  ring->SetXYABP(-1.,-1.,-1., -1., -1.);
61  ring->SetRadius(-1.);
62  return;
63  }
64 
65  double c = sqrt ( p1 ) / 2.;
66  double p2 = fpar[4]*fpar[4] - c*c;
67  if (p2 < 0.){
68  ring->SetXYABP(-1.,-1.,-1., -1., -1.);
69  ring->SetRadius(-1.);
70  return;
71  }
72  double b = sqrt ( p2 );
73  // calculate angle
74  double p3 = fpar[2] - fpar[0];
75  if (p3 == 0.){
76  ring->SetXYABP(-1.,-1.,-1., -1., -1.);
77  ring->SetRadius(-1.);
78  return;
79  }
80  double k = (fpar[3] - fpar[1]) / (fpar[2] - fpar[0]);
81  double ang = atan(k);
82 
83  ring->SetXYABP(xc, yc, fpar[4], b, ang);
84  ring->SetRadius((b + fpar[4])/2.);
85 }
86 
88  const vector<double>& x,
89  const vector<double>& y)
90 {
91  FCNEllipse *theFCN = new FCNEllipse(x, y);
92 
93  // create initial starting values for parameters
94  double xf1 = 0.;
95  double yf1 = 0.;
96  for(int i = 0; i < x.size(); i++) {
97  xf1 += x[i];
98  yf1 += y[i];
99  }
100  double a = 5.;
101  xf1 = xf1 / x.size() - a;
102  yf1 = yf1 / x.size();
103  double xf2 = xf1 + a;
104  double yf2 = yf1;
105 
106  TFitterMinuit theMinuit;
107  theMinuit.SetPrintLevel(-1);
108  theMinuit.SetMinuitFCN(theFCN);
109  theMinuit.SetParameter(0, "xf1", xf1, 0.1, 1., -1.);
110  theMinuit.SetParameter(1, "yf1", yf1, 0.1, 1., -1.);
111  theMinuit.SetParameter(2, "xf2", xf2, 0.1, 1., -1.);
112  theMinuit.SetParameter(3, "yf2", yf2, 0.1, 1., -1.);
113  theMinuit.SetParameter(4, "a", a, 0.1, 1., -1.);
114  theMinuit.CreateMinimizer();
115  theMinuit.Minimize();
116  vector<double> fpar;
117  fpar.clear();
118  for (int i = 0; i < 5; i++){
119  fpar.push_back(theMinuit.GetParameter(i));
120  }
121  return fpar;
122 }