10 #include <mdst/calibration/BeamParametersFitter.h>
13 #include <framework/database/Database.h>
14 #include <framework/database/DBImportObjPtr.h>
15 #include <framework/database/DBStore.h>
16 #include <framework/gearbox/Const.h>
17 #include <framework/logging/Logger.h>
20 #include <TLorentzVector.h>
27 static double s_InvariantMass;
30 static double s_InvariantMassError;
33 static TVector3 s_BoostVector;
36 static TMatrixDSym s_BoostVectorInverseCovariance(3);
39 static TVector3 s_DirectionHER;
42 static TVector3 s_DirectionLER;
45 static double s_AngleError;
50 static TLorentzVector getMomentum(
double energy,
double thetaX,
double thetaY,
53 const double pz = std::sqrt(energy * energy -
55 const double sx = sin(thetaX);
56 const double cx = cos(thetaX);
57 const double sy = sin(thetaY);
58 const double cy = cos(thetaY);
59 const double px = sy * cx * pz;
60 const double py = -sx * pz;
61 TLorentzVector result(px, py, cx * cy * pz, energy);
67 static void fcn(
int& npar,
double* grad,
double& fval,
double* par,
int iflag)
72 TLorentzVector pHER, pLER;
73 pHER = getMomentum(par[0], par[1], par[2],
false);
74 pLER = getMomentum(par[3], par[4], par[5],
true);
75 TLorentzVector pBeam = pHER + pLER;
76 TVector3 beamBoost = pBeam.BoostVector();
77 TVectorD boostDifference(3);
78 boostDifference[0] = beamBoost.X() - s_BoostVector.X();
79 boostDifference[1] = beamBoost.Y() - s_BoostVector.Y();
80 boostDifference[2] = beamBoost.Z() - s_BoostVector.Z();
81 double boostChi2 = s_BoostVectorInverseCovariance.Similarity(boostDifference);
82 double invariantMass = pBeam.M();
83 double massChi2 = pow((invariantMass - s_InvariantMass) /
84 s_InvariantMassError, 2);
85 double angleHER = pHER.Vect().Angle(s_DirectionHER);
86 double angleLER = pLER.Vect().Angle(s_DirectionLER);
87 double angleChi2 = pow(angleHER / s_AngleError, 2) +
88 pow(angleLER / s_AngleError, 2);
89 fval = boostChi2 + massChi2 + angleChi2;
190 double herMomentum, herThetaX, herThetaY;
191 double lerMomentum, lerThetaX, lerThetaY;
194 if (s_BoostVectorInverseCovariance.Determinant() == 0) {
195 B2WARNING(
"Determinant of boost covariance matrix is 0, "
196 "using generic inverse covariance matrix for fit.");
198 s_BoostVectorInverseCovariance[0][1] = 0;
199 s_BoostVectorInverseCovariance[0][2] = 0;
200 s_BoostVectorInverseCovariance[1][0] = 0;
202 s_BoostVectorInverseCovariance[1][2] = 0;
203 s_BoostVectorInverseCovariance[2][0] = 0;
204 s_BoostVectorInverseCovariance[2][1] = 0;
207 s_BoostVectorInverseCovariance.Invert();
211 if (s_InvariantMassError == 0) {
212 B2WARNING(
"Invariant-mass errror is 0, using generic error for fit.");
215 s_DirectionHER.SetX(0);
216 s_DirectionHER.SetY(0);
217 s_DirectionHER.SetZ(1);
219 s_DirectionLER.SetX(0);
220 s_DirectionLER.SetY(0);
221 s_DirectionLER.SetZ(1);
226 minuit.SetPrintLevel(-1);
228 minuit.mnparm(0,
"PHER_E", 7, 0.01, 0, 0, minuitResult);
229 minuit.mnparm(1,
"PHER_TX", 0, 0.01, 0, 0, minuitResult);
230 minuit.mnparm(2,
"PHER_TY", 0, 0.01, 0, 0, minuitResult);
231 minuit.mnparm(3,
"PLER_E", 4, 0.01, 0, 0, minuitResult);
232 minuit.mnparm(4,
"PLER_TX", 0, 0.01, 0, 0, minuitResult);
233 minuit.mnparm(5,
"PLER_TY", 0, 0.01, 0, 0, minuitResult);
234 minuit.mncomd(
"FIX 2 3 5 6", minuitResult);
235 minuit.mncomd(
"MIGRAD 10000", minuitResult);
236 minuit.mncomd(
"RELEASE 2 3 5 6", minuitResult);
237 minuit.mncomd(
"MIGRAD 10000", minuitResult);
239 minuit.GetParameter(0, herMomentum, error);
240 minuit.GetParameter(1, herThetaX, error);
241 minuit.GetParameter(2, herThetaY, error);
242 minuit.GetParameter(3, lerMomentum, error);
243 minuit.GetParameter(4, lerThetaX, error);
244 minuit.GetParameter(5, lerThetaY, error);
246 TLorentzVector pHER = getMomentum(herMomentum, herThetaX, herThetaY,
false);
247 TLorentzVector pLER = getMomentum(lerMomentum, lerThetaX, lerThetaY,
true);
248 TLorentzVector pBeam = pHER + pLER;
249 double fittedInvariantMass = pBeam.M();
250 B2RESULT(
"Initial invariant mass: " << s_InvariantMass <<
251 "; fitted invariant mass: " << fittedInvariantMass);
252 double cosThetaX = cos(herThetaX);
253 double sinThetaX = sin(herThetaX);
254 double cosThetaY = cos(herThetaY);
255 double sinThetaY = sin(herThetaY);
257 (pBeam.E() - pHER.E() / pHER.Vect().Mag() *
258 (pBeam.Px() * cosThetaX * sinThetaY - pBeam.Py() * sinThetaX +
259 pBeam.Pz() * cosThetaX * cosThetaY)) / fittedInvariantMass;
260 cosThetaX = cos(lerThetaX);
261 sinThetaX = sin(lerThetaX);
262 cosThetaY = cos(lerThetaY + M_PI);
263 sinThetaY = sin(lerThetaY + M_PI);
265 (pBeam.E() - pLER.E() / pLER.Vect().Mag() *
266 (pBeam.Px() * cosThetaX * sinThetaY - pBeam.Py() * sinThetaX +
267 pBeam.Pz() * cosThetaX * cosThetaY)) / fittedInvariantMass;
269 double k = sqrt(sigmaInvariantMass * sigmaInvariantMass /
270 (pow(herPartial * pHER.E(), 2) +
271 pow(lerPartial * pLER.E(), 2)));
272 double herSpread = k * pHER.E();
273 double lerSpread = k * pLER.E();
274 B2INFO(
"Invariant mass spread: " << sigmaInvariantMass);
275 B2RESULT(
"HER energy spread: " << herSpread <<
276 "; LER energy spread: " << lerSpread);
280 TMatrixDSym covariance(3);
281 for (
int i = 0; i < 3; ++i) {
282 for (
int j = 0; j < 3; ++j)
283 covariance[i][j] = 0;
285 covariance[0][0] = herSpread * herSpread;
287 covariance[0][0] = lerSpread * lerSpread;
292 double covarianceXX,
double covarianceYY)
296 TMatrixDSym beamSize =
m_BeamSpot->getSizeCovMatrix();
297 double xScale, yScale;
298 if (covarianceXX < 0)
301 xScale = sqrt(covarianceXX / beamSize[0][0]);
302 if (covarianceYY < 0)
305 yScale = sqrt(covarianceYY / beamSize[1][1]);
306 for (
int i = 0; i < 3; ++i) {
307 beamSize[0][i] *= xScale;
308 beamSize[i][0] *= xScale;
309 beamSize[1][i] *= yScale;
310 beamSize[i][1] *= yScale;
void fit()
Perform the fit.
double m_AngleLER
LER angle.
BeamParameters m_BeamParameters
Beam parameters.
void setupDatabase()
Setup database.
double m_InvariantMassError
Invariant-mass error (use only if error is 0).
DBObjPtr< CollisionBoostVector > m_CollisionBoostVector
Collision boost vector.
double m_AngleHER
HER angle.
bool m_Verbose
Whether to be verbose (print Minuit output).
void importBeamParameters()
Import beam parameters.
DBObjPtr< CollisionInvariantMass > m_CollisionInvariantMass
Collision invariant mass.
IntervalOfValidity m_IntervalOfValidity
Interval of validity.
DBObjPtr< BeamSpot > m_BeamSpot
Beam spot.
double m_BoostError
Boost error (use only if inverse error matrix is not available).
double m_AngleError
Angle error.
void fillVertexData(double covarianceXX, double covarianceYY)
Fill beam spot (vertex) data.
void setHER(double energy, double angleX, double angleY, const std::vector< double > &cov)
Set the HER FourVector and error matrix from beam energy, angle and covariance entries.
void setLER(double energy, double angleX, double angleY, const std::vector< double > &cov)
Set the LER FourVector and error matrix from beam energy, angle and covariance entries.
void setCovLER(const TMatrixDSym &cov)
Set the covariance matrix for LER (E, theta_x, theta_y) where E is the energy, theta_x is the horizon...
void setVertex(const TVector3 &vertex, const std::vector< double > &cov)
Set the vertex position and error matrix.
void setCovHER(const TMatrixDSym &cov)
Set the covariance matrix for HER (E, theta_x, theta_y) where E is the energy, theta_x is the horizon...
void setCovVertex(const TMatrixDSym &cov)
Set the covariance matrix of the vertex position.
static const double electronMass
electron mass
bool import(const IntervalOfValidity &iov)
Import the object to database.
Class for importing a single object to the database.
void construct(Args &&... params)
Construct an object of type T in this DBImportObjPtr using the provided constructor arguments.
Singleton class to cache database objects.
static DataStore & Instance()
Instance of singleton Store.
void setInitializeActive(bool active)
Setter for m_initializeActive.
int getRunLow() const
Getter for lowest run number.
int getExperimentLow() const
Getter for lowest experiment number.
bool registerInDataStore(DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut)
Register the object/array in the DataStore.
Type-safe access to single objects in the data store.
bool isValid() const
Check whether the object was created.
bool construct(Args &&... params)
Construct an object of type T in this StoreObjPtr, using the provided constructor arguments.
static DBStore & Instance()
Instance of a singleton DBStore.
void updateEvent()
Updates all intra-run dependent objects.
void update()
Updates all objects that are outside their interval of validity.
Abstract base class for different kinds of events.