SND@LHC Software
Loading...
Searching...
No Matches
GblData.cc
Go to the documentation of this file.
1/*
2 * GblData.cpp
3 *
4 * Created on: Aug 18, 2011
5 * Author: kleinwrt
6 */
7
8#include "GblData.h"
9
11namespace gbl {
12
14
19GblData::GblData(unsigned int aLabel, double aValue, double aPrec) :
20 theLabel(aLabel), theValue(aValue), thePrecision(aPrec), theDownWeight(
21 1.), thePrediction(0.), theParameters(), theDerivatives(), globalLabels(), globalDerivatives() {
22
23}
24
27
29
41void GblData::addDerivatives(unsigned int iRow,
42 const std::vector<unsigned int> &labDer, const SMatrix55 &matDer,
43 unsigned int iOff, const TMatrixD &derLocal,
44 const std::vector<int> &labGlobal, const TMatrixD &derGlobal,
45 unsigned int extOff, const TMatrixD &extDer) {
46
47 unsigned int nParMax = 5 + derLocal.GetNcols() + extDer.GetNcols();
48 theParameters.reserve(nParMax); // have to be sorted
49 theDerivatives.reserve(nParMax);
50
51 for (int i = 0; i < derLocal.GetNcols(); ++i) // local derivatives
52 {
53 if (derLocal(iRow - iOff, i)) {
54 theParameters.push_back(i + 1);
55 theDerivatives.push_back(derLocal(iRow - iOff, i));
56 }
57 }
58
59 for (int i = 0; i < extDer.GetNcols(); ++i) // external derivatives
60 {
61 if (extDer(iRow - iOff, i)) {
62 theParameters.push_back(extOff + i + 1);
63 theDerivatives.push_back(extDer(iRow - iOff, i));
64 }
65 }
66
67 for (unsigned int i = 0; i < 5; ++i) // curvature, offset derivatives
68 {
69 if (labDer[i] and matDer(iRow, i)) {
70 theParameters.push_back(labDer[i]);
71 theDerivatives.push_back(matDer(iRow, i));
72 }
73 }
74
75 globalLabels = labGlobal;
76 for (int i = 0; i < derGlobal.GetNcols(); ++i) // global derivatives
77 globalDerivatives.push_back(derGlobal(iRow - iOff, i));
78}
79
81
89void GblData::addDerivatives(unsigned int iRow,
90 const std::vector<unsigned int> &labDer, const SMatrix27 &matDer,
91 unsigned int extOff, const TMatrixD &extDer) {
92
93 unsigned int nParMax = 7 + extDer.GetNcols();
94 theParameters.reserve(nParMax); // have to be sorted
95 theDerivatives.reserve(nParMax);
96
97 for (int i = 0; i < extDer.GetNcols(); ++i) // external derivatives
98 {
99 if (extDer(iRow, i)) {
100 theParameters.push_back(extOff + i + 1);
101 theDerivatives.push_back(extDer(iRow, i));
102 }
103 }
104
105 for (unsigned int i = 0; i < 7; ++i) // curvature, offset derivatives
106 {
107 if (labDer[i] and matDer(iRow, i)) {
108 theParameters.push_back(labDer[i]);
109 theDerivatives.push_back(matDer(iRow, i));
110 }
111 }
112}
113
115
120void GblData::addDerivatives(const std::vector<unsigned int> &index,
121 const std::vector<double> &derivatives) {
122 for (unsigned int i = 0; i < derivatives.size(); ++i) // any derivatives
123 {
124 if (derivatives[i]) {
125 theParameters.push_back(index[i]);
126 theDerivatives.push_back(derivatives[i]);
127 }
128 }
129}
130
132void GblData::setPrediction(const VVector &aVector) {
133
134 thePrediction = 0.;
135 for (unsigned int i = 0; i < theDerivatives.size(); ++i) {
136 thePrediction += theDerivatives[i] * aVector(theParameters[i] - 1);
137 }
138}
139
141
144double GblData::setDownWeighting(unsigned int aMethod) {
145
146 double aWeight = 1.;
147 double scaledResidual = fabs(theValue - thePrediction) * sqrt(thePrecision);
148 if (aMethod == 1) // Tukey
149 {
150 if (scaledResidual < 4.6851) {
151 aWeight = (1.0 - 0.045558 * scaledResidual * scaledResidual);
152 aWeight *= aWeight;
153 } else {
154 aWeight = 0.;
155 }
156 } else if (aMethod == 2) //Huber
157 {
158 if (scaledResidual >= 1.345) {
159 aWeight = 1.345 / scaledResidual;
160 }
161 } else if (aMethod == 3) //Cauchy
162 {
163 aWeight = 1.0 / (1.0 + (scaledResidual * scaledResidual / 5.6877));
164 }
165 theDownWeight = aWeight;
166 return aWeight;
167}
168
170
173double GblData::getChi2() const {
174 double aDiff = theValue - thePrediction;
175 return aDiff * aDiff * thePrecision * theDownWeight;
176}
177
179void GblData::printData() const {
180
181 std::cout << " measurement at label " << theLabel << ": " << theValue
182 << ", " << thePrecision << std::endl;
183 std::cout << " param " << theParameters.size() << ":";
184 for (unsigned int i = 0; i < theParameters.size(); ++i) {
185 std::cout << " " << theParameters[i];
186 }
187 std::cout << std::endl;
188 std::cout << " deriv " << theDerivatives.size() << ":";
189 for (unsigned int i = 0; i < theDerivatives.size(); ++i) {
190 std::cout << " " << theDerivatives[i];
191 }
192 std::cout << std::endl;
193}
194
196
202void GblData::getLocalData(double &aValue, double &aWeight,
203 std::vector<unsigned int>* &indLocal, std::vector<double>* &derLocal) {
204
205 aValue = theValue;
206 aWeight = thePrecision * theDownWeight;
207 indLocal = &theParameters;
208 derLocal = &theDerivatives;
209}
210
212
220void GblData::getAllData(double &aValue, double &aErr,
221 std::vector<unsigned int>* &indLocal, std::vector<double>* &derLocal,
222 std::vector<int>* &labGlobal, std::vector<double>* &derGlobal) {
223 aValue = theValue;
224 aErr = 1.0 / sqrt(thePrecision);
225 indLocal = &theParameters;
226 derLocal = &theDerivatives;
227 labGlobal = &globalLabels;
228 derGlobal = &globalDerivatives;
229}
230
232
239void GblData::getResidual(double &aResidual, double &aVariance,
240 double &aDownWeight, std::vector<unsigned int>* &indLocal,
241 std::vector<double>* &derLocal) {
242 aResidual = theValue - thePrediction;
243 aVariance = 1.0 / thePrecision;
244 aDownWeight = theDownWeight;
245 indLocal = &theParameters;
246 derLocal = &theDerivatives;
247}
248}
ROOT::Math::SMatrix< double, 5, 5 > SMatrix55
Definition GblData.h:23
ROOT::Math::SMatrix< double, 2, 7 > SMatrix27
Definition GblData.h:22
double thePrecision
Precision (1/sigma**2)
Definition GblData.h:66
std::vector< int > globalLabels
Labels for global derivatives.
Definition GblData.h:71
double theDownWeight
Down-weighting factor (0-1)
Definition GblData.h:67
std::vector< double > theDerivatives
List of derivatives for fit.
Definition GblData.h:70
double thePrediction
Prediction from fit.
Definition GblData.h:68
std::vector< unsigned int > theParameters
List of fit parameters (with non zero derivatives)
Definition GblData.h:69
unsigned int theLabel
Label (of measurements point)
Definition GblData.h:64
virtual ~GblData()
Definition GblData.cc:25
void getAllData(double &aValue, double &aErr, std::vector< unsigned int > *&indLocal, std::vector< double > *&derLocal, std::vector< int > *&labGlobal, std::vector< double > *&derGlobal)
Get all Data for MP-II binary record.
Definition GblData.cc:220
void addDerivatives(unsigned int iRow, const std::vector< unsigned int > &labDer, const SMatrix55 &matDer, unsigned int iOff, const TMatrixD &derLocal, const std::vector< int > &labGlobal, const TMatrixD &derGlobal, unsigned int nLocal, const TMatrixD &derTrans)
Add derivatives from measurement.
Definition GblData.cc:41
double getChi2() const
Calculate Chi2 contribution.
Definition GblData.cc:173
void printData() const
Print data block.
Definition GblData.cc:179
GblData(unsigned int aLabel, double aMeas, double aPrec)
Create data block.
Definition GblData.cc:19
void getLocalData(double &aValue, double &aWeight, std::vector< unsigned int > *&indLocal, std::vector< double > *&derLocal)
Get Data for local fit.
Definition GblData.cc:202
void getResidual(double &aResidual, double &aVariance, double &aDownWeight, std::vector< unsigned int > *&indLocal, std::vector< double > *&derLocal)
Get data for residual (and errors).
Definition GblData.cc:239
double theValue
Value (residual)
Definition GblData.h:65
double setDownWeighting(unsigned int aMethod)
Outlier down weighting with M-estimators (by GblTrajectory::fit).
Definition GblData.cc:144
std::vector< double > globalDerivatives
Global derivatives.
Definition GblData.h:72
void setPrediction(const VVector &aVector)
Calculate prediction for data from fit (by GblTrajectory::fit).
Definition GblData.cc:132
Simple Vector based on std::vector<double>
Definition VMatrix.h:22
Namespace for the general broken lines package.