31 #include <b2bii/modules/B2BIIMdstInput/B2BIIFixMdstModule.h>
32 #include "belle_legacy/panther/panther.h"
33 #include "belle_legacy/tables/mdst.h"
34 #include "belle_legacy/tables/belletdf.h"
35 #include "belle_legacy/belleutil/belutil.h"
69 B2INFO(
"%B2BIIFixMdst muid is initialized by basf with"
72 " ==> use value in data file" :
"")
74 << std::endl <<
" UseECL = "
76 << std::endl <<
" ExpNo = " <<
m_expno
78 " ==> use value in data file" :
""));
80 B2INFO(
"%B2BIIFixMdst muid is disabled by user (ExpNo = "
107 B2INFO(
"Reading DB constants for "
108 << ((expmc == 1) ?
"data" :
"MC") <<
", Exp #" << expno
109 <<
", Run #" << run);
132 Belle::Mdst_klm_mu_ex_Manager& muexMgr = Belle::Mdst_klm_mu_ex_Manager::get_manager();
138 if ((
void*)&muexMgr == NULL) {
139 B2ERROR(
"%B2BIIFixMdst muid did not find Belle::Mdst_klm_mu_ex table "
140 <<
"in this event, which implies" << std::endl
141 <<
" that muid_set and muid_dec were not run yet. "
142 <<
"Required order of modules is " << std::endl
143 <<
" ... muid_set muid_dec ... rec2mdst ... B2BIIFixMdst ..."
144 << std::endl <<
" This program is terminated.");
147 Belle::Mdst_ecl_trk_Manager& eclTrkMgr = Belle::Mdst_ecl_trk_Manager::get_manager();
148 Belle::Mdst_ecl_trk_Index eclTrkIdx = eclTrkMgr.index(
"trk");
158 for (std::vector<Belle::Mdst_klm_mu_ex>::iterator iMuex = muexMgr.begin();
159 iMuex < muexMgr.end(); ++iMuex) {
160 Belle::Mdst_charged& chg = iMuex->pMDST_Charged();
161 Belle::Mdst_muid& muid = chg.muid();
162 int ECMaxLyr = (muid.quality() & 0x400000) ? 1 : 0;
170 double px = chg.px();
171 double py = chg.py();
172 double pz = chg.pz();
173 double p = sqrt(px * px + py * py + pz * pz);
174 double muon = iMuex->Muon_likelihood();
175 double pion = iMuex->Pion_likelihood();
176 double kaon = iMuex->Kaon_likelihood();
177 double miss = iMuex->Miss_likelihood();
178 double junk = iMuex->Junk_likelihood();
179 int outcome = iMuex->Outcome();
180 int lyrPasMax = iMuex->Layer_trk_brl() +
181 iMuex->Layer_trk_end() + 1;
182 int lyrPicMax = iMuex->Layer_hit_brl();
183 if (iMuex->Layer_hit_end() != -1) {
184 lyrPicMax = iMuex->Layer_trk_brl() +
185 iMuex->Layer_hit_end() + 1;
187 int lyrDiff = lyrPasMax - lyrPicMax;
188 int lyrExt = iMuex->Layer_trk_brl();
189 if ((outcome == 2) || (outcome == 4)) {
190 lyrExt = iMuex->Layer_trk_end();
191 if ((ECMaxLyr == 1) && (lyrExt > 11)) {
194 int lyrEnd = std::min(iMuex->Layer_hit_end(), 11);
195 lyrPasMax = iMuex->Layer_trk_brl() + lyrExt + 1;
196 lyrPicMax = iMuex->Layer_trk_brl() + lyrEnd + 1;
197 lyrDiff = lyrPasMax - lyrPicMax;
200 int nPoints = iMuex->N_hits() * 2;
201 double rChi2 = 1.0E10;
203 rChi2 = iMuex->Chi_2() / nPoints;
207 muon =
m_muonprob->
prob(ECMaxLyr, outcome, lyrExt, lyrDiff, rChi2);
208 pion =
m_pionprob->
prob(ECMaxLyr, outcome, lyrExt, lyrDiff, rChi2);
209 kaon =
m_kaonprob->
prob(ECMaxLyr, outcome, lyrExt, lyrDiff, rChi2);
210 double denom = muon + pion + kaon;
211 if (denom < 1.0E-10) {
213 muon = pion = kaon = 0.0;
221 Belle::Mdst_trk& trk = chg.trk();
222 std::vector<Belle::Mdst_ecl_trk> eclTrk = point_from(trk.get_ID(), eclTrkIdx);
223 std::vector<Belle::Mdst_ecl_trk>::iterator iEclTrk = eclTrk.begin();
224 if (iEclTrk != eclTrk.end()) {
225 Belle::Mdst_ecl& ecl = iEclTrk->ecl();
227 if (ecl.match() >= 1) {
228 double eEcl = ecl.energy();
229 if ((eEcl > 0.0) && (p > 0.25)) {
233 double denom = muonE + pionE + kaonE;
234 if (denom > 1.0E-10) {
235 if (miss + junk > 0.0) {
250 denom = muon + pion + kaon;
251 if (denom < 1.0E-10) {
253 muon = pion = kaon = 0.0;
265 iMuex->Muon_likelihood(muon);
266 iMuex->Pion_likelihood(pion);
267 iMuex->Kaon_likelihood(kaon);
268 iMuex->Miss_likelihood(miss);
269 iMuex->Junk_likelihood(junk);
270 iMuex->Outcome(outcome);
287 readDB(dbtemplate, expNo);
296 if (expNo == 0)
return;
298 if ((expNo < 5) || ((expNo & 1) == 0)) {
302 char dbname[] =
"muid_xxxx_e000000.dat";
303 std::string pathname =
"";
304 bool tmp = Belle::set_belfnm_verbose(
false);
305 while ((pathname ==
"") && (expNo >= 5)) {
306 std::sprintf(dbname,
"%s%s%s%06d%s",
"muid_", dbtemplate,
307 "_e", expNo,
".dat");
308 pathname = Belle::belfnm(dbname, 0,
"share/belle_legacy/data-files/muid");
311 (void)Belle::set_belfnm_verbose(tmp);
313 if (pathname ==
"") {
314 B2ERROR(
"%MuidProb: Failed to open database file."
315 <<
"Module B2BIIFixMdst muid will do nothing.");
320 std::ifstream probDB;
322 probDB.open(pathname.c_str());
323 probDB.get(ident, 80,
'\n');
324 B2INFO(
"%MuidProb: Reading file " << pathname
325 << std::endl <<
"%MuidProb: " << ident
326 << std::endl <<
"%MuidProb: ");
328 for (
int l = 0; l < 2; l++) {
330 for (
int k = 0; k < 4; k++) {
331 for (
int j = 0; j < 15; j++) {
332 for (
int i = 0; i <
kRange; i++) {
333 probDB >>
fRange[l][k][j][i];
339 for (
int k = 0; k < 4; k++) {
340 for (
int i = 0; i <
kRchisq; i++) {
346 for (
int k = 0; k < 4; k++) {
347 for (
int j = 0; j < 15; j++) {
354 for (
int k = 0; k <
kPTrk; k++) {
355 double probSum = 0.0;
356 for (
int i = 0; i <
kEEcl; i++) {
357 probDB >>
fEEcl[k][i];
358 probSum +=
fEEcl[k][i];
374 double C[],
double D[])
381 C[1] = (Y[1] - Y[0]) / dx;
382 for (
int i = 1; i < n - 1; i++) {
385 C[i + 1] = (Y[i + 1] - Y[i]) / dx;
386 C[i] = C[i + 1] - C[i];
390 C[0] = (C[2] - C[1]) / 6.0;
391 C[n - 1] = -(C[n - 2] - C[n - 3]) / 6.0;
392 for (
int i = 1; i < n; i++) {
393 double temp = dx / B[i - 1];
395 C[i] -= temp * C[i - 1];
397 C[n - 1] /= B[n - 1];
398 for (
int i = n - 2; i >= 0; i--) {
399 C[i] = (C[i] - D[i] * C[i + 1]) / B[i];
401 B[n - 1] = (Y[n - 1] - Y[n - 2]) / dx + (C[n - 2] + C[n - 1] * 2.0) * dx;
402 for (
int i = 0; i < n - 1; i++) {
403 B[i] = (Y[i + 1] - Y[i]) / dx - (C[i + 1] + C[i] * 2.0) * dx;
404 D[i] = (C[i + 1] - C[i]) / dx;
407 C[n - 1] = C[n - 1] * 3.0;
414 int lyr_ext,
int lyr_dif,
double chi2_red)
const
424 return probRange(ECMaxLyr, outcome, lyr_ext, lyr_dif) *
425 probRchisq(ECMaxLyr, outcome, lyr_ext, chi2_red);
441 if (outcome <= 0) {
return 0.0; }
442 if (outcome > 4) {
return 0.0; }
443 if (lyr_ext < 0) {
return 0.0; }
444 if (lyr_ext > 14) {
return 0.0; }
445 if (lyr_dif < 0) {
return 0.0; }
448 return fRange[ECMaxLyr][outcome - 1][lyr_ext][lyr_dif];
455 double chi2_red)
const
469 if (outcome <= 0) {
return 0.0; }
470 if (outcome > 4) {
return 0.0; }
471 if (lyr_ext < 0) {
return 0.0; }
472 if (lyr_ext > 14) {
return 0.0; }
473 if (chi2_red < 0.0) {
return 0.0; }
476 double area =
fRchisqN[ECMaxLyr][outcome - 1][lyr_ext];
483 dx * (
fRchisqD1[ECMaxLyr][outcome - 1][i] +
484 dx * (
fRchisqD2[ECMaxLyr][outcome - 1][i] +
485 dx *
fRchisqD3[ECMaxLyr][outcome - 1][i]));