11 #include <b2bii/modules/B2BIIMdstInput/B2BIIConvertBeamParamsModule.h>
12 #include <belle_legacy/benergy/BeamEnergy.h>
13 #include <belle_legacy/ip/IpProfile.h>
14 #include <belle_legacy/panther/panther.h>
15 #include <belle_legacy/tables/belletdf.h>
17 #include <framework/database/Database.h>
18 #include <framework/database/EventDependency.h>
19 #include <framework/database/IntervalOfValidity.h>
20 #include <framework/dbobjects/BeamParameters.h>
21 #include <framework/utilities/FileSystem.h>
22 #include <mdst/dbobjects/BeamSpot.h>
23 #include <mdst/dbobjects/CollisionBoostVector.h>
24 #include <mdst/dbobjects/CollisionInvariantMass.h>
32 int check_beginrun(
bool) {
return 0; }
39 return TVector3(point.x(), point.y(), point.z());
42 TMatrixDSym CLHEPtoROOT(
const HepSymMatrix& matrix)
44 TMatrixDSym result(matrix.num_col());
45 for (
int i = 0; i < matrix.num_row(); ++i) {
46 for (
int j = 0; j < matrix.num_col(); ++j) {
47 result(i, j) = matrix(i + 1, j + 1);
80 Belle::Belle_runhead_Manager& runMgr = Belle::Belle_runhead_Manager::get_manager();
82 Belle::Belle_runhead& runhead = runMgr[0];
84 runhead.ExpNo(
m_event->getExperiment());
85 runhead.RunNo(
m_event->getRun());
86 B2INFO(
"Obtaining values for exp " <<
m_event->getExperiment() <<
", run " <<
m_event->getRun());
88 Belle::BeamEnergy::flag_database(0);
89 Belle::IpProfile::begin_run();
90 Belle::Ip_profile_general_Manager& ipMgr = Belle::Ip_profile_general_Manager::get_manager();
92 if (!Belle::BeamEnergy::usable()) {
95 B2ERROR(
"No BeamEnergy for exp " <<
m_event->getExperiment() <<
", run " <<
m_event->getRun());
98 file <<
m_event->getExperiment() <<
"," <<
m_event->getRun() << std::endl;
103 const double Eher = Belle::BeamEnergy::E_HER();
104 const double Eler = Belle::BeamEnergy::E_LER();
105 const double crossingAngle = Belle::BeamEnergy::Cross_angle();
106 const double angleLer = M_PI;
107 const double angleHer = crossingAngle;
109 std::vector<double> covariance;
114 beamParams.
setLER(Eler, angleLer, covariance);
115 beamParams.
setHER(Eher, angleHer, covariance);
119 TLorentzVector cms = beamParams.
getLER() + beamParams.
getHER();
120 collisionBoostVector.
setBoost(cms.BoostVector(), TMatrixTSym<double>(3));
122 collisionInvM.
setMass(cms.M(), 0.0 , 0.0);
129 if (!Belle::IpProfile::usable()) {
132 B2ERROR(
"No IpProfile for exp " <<
m_event->getExperiment() <<
", run " <<
m_event->getRun());
134 std::ofstream file(
m_missingIp.c_str(), std::ios::app);
135 file <<
m_event->getExperiment() <<
"," <<
m_event->getRun() << std::endl;
138 std::numeric_limits<double>::quiet_NaN(),
139 std::numeric_limits<double>::quiet_NaN(),
140 std::numeric_limits<double>::quiet_NaN()), covariance);
145 TVector3(std::numeric_limits<double>::quiet_NaN(),
146 std::numeric_limits<double>::quiet_NaN(),
147 std::numeric_limits<double>::quiet_NaN()
148 ), TMatrixTSym<double>(3)
151 B2INFO(
"No IpProfile, created BeamEnergy Payload");
155 int nbins = std::max(ipMgr.count() - 1, 1);
156 B2INFO(
"exp " <<
m_event->getExperiment() <<
", run " <<
m_event->getRun() <<
": " << nbins <<
" IpProfile bins");
159 std::list<BeamParameters> beamparamsList;
160 std::list<BeamSpot> beamspotList;
162 std::unique_ptr<EventDependency> beamparams;
163 std::unique_ptr<EventDependency> beamspots;
165 Belle::Belle_event_Manager& evtMgr = Belle::Belle_event_Manager::get_manager();
166 if (!evtMgr.count()) evtMgr.add();
167 for (
int i = 0; i < nbins; ++i) {
168 int evtNr = i * BIN_EVENTS;
170 Belle::Belle_event& evt = evtMgr[0];
172 evt.ExpNo(
m_event->getExperiment());
175 Belle::IpProfile::set_evtbin_number();
176 B2ASSERT(
"something wrong: " << Belle::IpProfile::EvtBinNo() <<
"!=" << i, Belle::IpProfile::EvtBinNo() == i);
179 HepPoint3D ip = Belle::IpProfile::e_position();
180 HepSymMatrix ipErr = Belle::IpProfile::e_position_err();
184 beamparamsList.emplace_back(beamParams);
187 beamSpot.
setIP(CLHEPtoROOT(ip), CLHEPtoROOT(ipErr));
188 beamspotList.emplace_back(beamSpot);
191 beamparams = std::make_unique<EventDependency>(&beamparamsList.back(),
false);
192 beamspots = std::make_unique<EventDependency>(&beamspotList.back(),
false);
194 beamparams->add(evtNr, &beamparamsList.back());
195 beamspots->add(evtNr, &beamspotList.back());
198 if (beamparamsList.size() < 1) {
199 B2ERROR(
"Something is wrong with exp " <<
m_event->getExperiment() <<
", run " <<
m_event->getRun() <<
": no bins found");
202 if (beamparamsList.size() == 1) {
206 B2INFO(
"Created event independent payload");
211 B2INFO(
"Created event dependent payload with " << beamparamsList.size() <<
" entries");