17 jac[1][0] = -bfac * ds * cosl;
18 jac[3][0] = -0.5 * bfac * ds * ds * cosl;
35 unsigned int nTry = 10000;
36 unsigned int nLayer = 10;
37 unsigned int nTraj = 1;
38 std::cout <<
" Gbltst $Rev: 45 $ " << nTry <<
", " << nLayer << std::endl;
40 TRandom *r =
new TRandom3();
42 clock_t startTime = clock();
44 double sinLambda = 0.3;
45 double cosLambda = sqrt(1.0 - sinLambda * sinLambda);
47 double cosPhi = sqrt(1.0 - sinPhi * sinPhi);
50 TMatrixD uvDirT(3, 2);
51 uvDirT[0][0] = -sinPhi;
52 uvDirT[1][0] = cosPhi;
54 uvDirT[0][1] = -sinLambda * cosPhi;
55 uvDirT[1][1] = -sinLambda * sinPhi;
56 uvDirT[2][1] = cosLambda;
62 measPrec[0] = 1.0 / (measErr[0] * measErr[0]);
63 measPrec[1] = 1.0 / (measErr[1] * measErr[1]);
64 TMatrixDSym measInvCov(2);
66 measInvCov[0][0] = measPrec[0];
67 measInvCov[1][1] = measPrec[1];
73 scatPrec[0] = 1.0 / (scatErr[0] * scatErr[0]);
74 scatPrec[1] = 1.0 / (scatErr[1] * scatErr[1]);
83 TMatrixDSym clCov(5), clSeed(5);
84 unsigned int seedLabel = 0;
94 TMatrixD transMatrix(5, 5);
95 transMatrix.UnitMatrix();
98 double step = 1.5 / cosLambda;
104 for (
unsigned int iTry = 1; iTry <= nTry; ++iTry) {
106 std::vector<std::pair<std::vector<GblPoint>, TMatrixD> > aPointsAndTransList;
107 aPointsAndTransList.reserve(nTraj);
108 std::vector<GblPoint> listOfPoints;
109 listOfPoints.reserve(2 * nLayer);
110 for (
unsigned int iTraj = 0; iTraj < nTraj; ++iTraj) {
114 for (
unsigned int i = 0; i < 5; ++i) {
115 clPar[i] = clErr[i] * r->Gaus();
118 for (
unsigned int i = 0; i < 5; ++i) {
119 clCov[i][i] = 1.0 * (clErr[i] * clErr[i]);
122 TMatrixD addDer(2, 2);
128 std::vector<double> sPoint;
129 TMatrixD jacPointToPoint(5, 5);
130 jacPointToPoint.UnitMatrix();
131 for (
unsigned int iLayer = 0; iLayer < nLayer; ++iLayer) {
134 double sinStereo = (iLayer % 2 == 0) ? 0. : 0.5;
135 double cosStereo = sqrt(1.0 - sinStereo * sinStereo);
138 mDir[0][0] = sinStereo;
139 mDir[0][1] = cosStereo;
142 TMatrixD proL2m = mDir * uvDirT;
146 TVectorD meas = proL2m * clPar.GetSub(3, 4);
148 for (
unsigned int i = 0; i < 2; ++i) {
149 meas[i] += measErr[i] * r->Gaus();
172 listOfPoints.push_back(point);
173 unsigned int iLabel = listOfPoints.size();
175 if (iLabel == seedLabel) {
176 clSeed = clCov.Invert();
180 clPar = jacPointToPoint * clPar;
181 clCov = clCov.Similarity(jacPointToPoint);
183 if (iLayer < nLayer - 1) {
189 listOfPoints.push_back(point);
190 iLabel = listOfPoints.size();
192 if (iLabel == seedLabel) {
193 clSeed = clCov.Invert();
196 for (
unsigned int i = 0; i < 2; ++i) {
197 clPar[i + 1] += scatErr[i] * r->Gaus();
198 clCov[i + 1] += scatErr[i] * scatErr[i];
201 clPar = jacPointToPoint * clPar;
202 clCov = clCov.Similarity(jacPointToPoint);
217 traj.
fit(Chi2, Ndf, lostWeight);
230 LostSum += lostWeight;
232 clock_t endTime = clock();
233 double diff = endTime - startTime;
234 double cps = CLOCKS_PER_SEC;
235 std::cout <<
" Time elapsed " << diff / cps <<
" s" << std::endl;
236 std::cout <<
" Chi2/Ndf = " << Chi2Sum / NdfSum << std::endl;