12 #include <klm/bklm/modules/bklmTracking/BKLMTrackingModule.h>
15 #include <klm/bklm/geometry/GeometryPar.h>
16 #include <klm/bklm/modules/bklmTracking/BKLMTrackFinder.h>
19 #include <framework/dataobjects/EventMetaData.h>
20 #include <framework/datastore/StoreObjPtr.h>
21 #include <framework/logging/Logger.h>
25 using namespace Belle2::bklm;
26 using namespace CLHEP;
38 m_runTotalEventsWithTracks(0)
40 for (
int i = 0; i < 8; ++i) {
41 m_total[0][i] =
nullptr;
42 m_total[1][i] =
nullptr;
43 m_pass[0][i] =
nullptr;
44 m_pass[1][i] =
nullptr;
45 m_effiVsLayer[0][i] =
nullptr;
46 m_effiVsLayer[1][i] =
nullptr;
48 setDescription(
"Perform standard-alone straight line tracking for BKLM");
49 addParam(
"MatchToRecoTrack", m_MatchToRecoTrack,
"[bool], whether match BKLMTrack to RecoTrack; (default is false)",
false);
50 addParam(
"MaxAngleRequired", m_maxAngleRequired,
51 "[degree], match BKLMTrack to RecoTrack; angle between them is required to be smaller than (default 10)",
double(10.0));
52 addParam(
"fitGlobalBKLMTrack", m_globalFit,
53 "[bool], do the BKLMTrack fitting in global system (multi-sectors track) or local system (sector by sector) (default is false, local sys.)",
55 addParam(
"StudyEffiMode", m_studyEffi,
"[bool], run in efficieny study mode (default is false)",
false);
56 addParam(
"outputName", m_outPath ,
"[string], output file name containing efficiencies plots ",
string(
"bklmEffi.root"));
59 BKLMTrackingModule::~BKLMTrackingModule()
64 void BKLMTrackingModule::initialize()
68 m_storeTracks.registerInDataStore();
69 m_storeTracks.registerRelationTo(hits2D);
70 m_storeTracks.registerRelationTo(recoTracks);
71 recoHitInformation.registerRelationTo(hits2D);
72 hits2D.registerRelationTo(recoTracks);
75 B2INFO(
"BKLMTrackingModule:: this module is running in efficiency study mode!");
77 m_file =
new TFile(m_outPath.c_str(),
"recreate");
79 std::string labelFB[2] = {
"BB",
"BF"};
85 m_totalYX =
new TH2F(
"totalYX",
" denominator Y vs. X", gNbin, gmin, gmax, gNbin, gmin, gmax);
86 m_passYX =
new TH2F(
"passYX",
" numerator Y vs. X", gNbin, gmin, gmax, gNbin, gmin, gmax);
87 m_totalYZ =
new TH2F(
"totalYZ",
" denominator Y vs. Z", gNbin, gmin, gmax, gNbin, gmin, gmax);
88 m_passYZ =
new TH2F(
"passYZ",
" numerator Y vs. Z", gNbin, gmin, gmax, gNbin, gmin, gmax);
89 m_effiYX =
new TH2F(
"effiYX",
" effi. Y vs. X", gNbin, gmin, gmax, gNbin, gmin, gmax);
90 m_effiYZ =
new TH2F(
"effiYZ",
" effi. Y vs. X", gNbin, gmin, gmax, gNbin, gmin, gmax);
91 m_effiYX->GetXaxis()->SetTitle(
"x (cm)");
92 m_effiYX->GetYaxis()->SetTitle(
"y (cm)");
93 m_effiYZ->GetXaxis()->SetTitle(
"z (cm)");
94 m_effiYZ->GetYaxis()->SetTitle(
"y (cm)");
95 for (
int iF = 0; iF < 2; iF++) {
96 for (
int iS = 0; iS < 8; iS++) {
97 hname.Form(
"effi_%s%i", labelFB[iF].c_str(), iS);
98 m_effiVsLayer[iF][iS] =
new TEfficiency(hname, hname, Nbin, 0, 16);
99 hname.Form(
"total_%s%i", labelFB[iF].c_str(), iS);
100 m_total[iF][iS] =
new TH1F(hname, hname, Nbin, 0, 16);
101 hname.Form(
"pass_%s%i", labelFB[iF].c_str(), iS);
102 m_pass[iF][iS] =
new TH1F(hname, hname, Nbin, 0, 16);
108 void BKLMTrackingModule::beginRun()
111 m_runNumber.push_back((
int)eventMetaData->getRun());
112 m_runTotalEvents = 0;
113 m_runTotalEventsWithTracks = 0;
116 void BKLMTrackingModule::event()
118 m_storeTracks.clear();
119 bool thereIsATrack =
false;
122 runTracking(0, -1, -1, -1);
123 if (m_storeTracks.getEntries() > 0)
124 thereIsATrack =
true;
126 for (
int iSection = 0; iSection < 2; iSection++) {
127 for (
int iSector = 0; iSector < 8; iSector++) {
128 for (
int iLayer = 0; iLayer < 15; iLayer++) {
129 runTracking(1, iSection, iSector , iLayer);
130 if (m_storeTracks.getEntries() > 0)
131 thereIsATrack =
true;
132 generateEffi(iSection, iSector, iLayer);
134 m_storeTracks.clear();
142 m_runTotalEventsWithTracks++;
145 void BKLMTrackingModule::runTracking(
int mode,
int iSection,
int iSector,
int iLayer)
147 m_storeTracks.clear();
157 if (hits2D.getEntries() < 1)
return;
159 for (
int j = 0; j < hits2D.getEntries(); j++) {
160 hits2D[j]->isOnStaTrack(
false);
164 for (
int hi = 0; hi < hits2D.getEntries() - 1; ++hi) {
166 if (mode == 1 && isLayerUnderStudy(iSection, iSector, iLayer, hits2D[hi]))
continue;
167 if (mode == 1 && !isSectorUnderStudy(iSection, iSector, hits2D[hi]))
continue;
168 if (hits2D[hi]->isOnStaTrack())
continue;
169 if (hits2D[hi]->isOutOfTime())
continue;
170 for (
int hj = hi + 1; hj < hits2D.getEntries(); ++hj) {
172 if (hits2D[hj]->isOnStaTrack()) {
continue; }
173 if (hits2D[hj]->isOutOfTime())
continue;
174 if (!m_globalFit && !sameSector(hits2D[hi], hits2D[hj])) {
continue; }
175 if (sameSector(hits2D[hi], hits2D[hj]) && abs(hits2D[hi]->getLayer() - hits2D[hj]->getLayer()) < 3) {
continue;}
177 std::list<BKLMHit2d*> sectorHitList;
181 std::list<BKLMHit2d*> seed;
182 seed.push_back(hits2D[hi]);
183 seed.push_back(hits2D[hj]);
185 for (
int ho = 0; ho < hits2D.getEntries(); ++ho) {
187 if (ho == hi || ho == hj)
continue;
188 if (mode == 1 && isLayerUnderStudy(iSection, iSector, iLayer, hits2D[hj]))
continue;
189 if (mode == 1 && !isSectorUnderStudy(iSection, iSector, hits2D[hj]))
continue;
190 if (hits2D[ho]->isOnStaTrack())
continue;
191 if (!m_globalFit && !sameSector(hits2D[ho], hits2D[hi]))
continue;
193 if (hits2D[ho]->isOutOfTime())
continue;
194 sectorHitList.push_back(hits2D[ho]);
200 if (sectorHitList.size() < 2 || sectorHitList.size() > 60)
continue;
202 std::list<BKLMHit2d*> m_hits;
203 if (m_finder->
filter(seed, sectorHitList, m_hits)) {
204 BKLMTrack* m_track = m_storeTracks.appendNew();
213 std::list<BKLMHit2d*>::iterator j;
214 m_hits.sort(sortByLayer);
215 for (j = m_hits.begin(); j != m_hits.end(); ++j) {
216 (*j)->isOnStaTrack(
true);
225 if (m_MatchToRecoTrack) {
226 if (findClosestRecoTrack(m_track, closestTrack)) {
228 for (j = m_hits.begin(); j != m_hits.end(); ++j) {
230 closestTrack->
addBKLMHit((*j), sortingParameter, RecoHitInformation::OriginTrackFinder::c_LocalTrackFinder);
244 void BKLMTrackingModule::endRun()
246 m_totalEvents.push_back(m_runTotalEvents);
247 m_totalEventsWithTracks.push_back(m_runTotalEventsWithTracks);
250 void BKLMTrackingModule::terminate()
252 for (
long unsigned int i = 0; i < m_runNumber.size(); i++) {
253 float ratio = (float)m_totalEventsWithTracks.at(i) / (float)m_totalEvents.at(i);
254 B2INFO(
"BKLMTrackingModule:: run " << m_runNumber.at(i) <<
" --> " << ratio * 100 <<
"% of events has 1+ BKLMTracks");
258 for (
int iF = 0; iF < 2; iF++) {
259 for (
int iS = 0; iS < 8; iS++) {
260 m_effiVsLayer[iF][iS]->Write();
261 m_total[iF][iS]->Write();
262 m_pass[iF][iS]->Write();
266 for (
int i = 0; i < m_totalYX->GetNbinsX(); i++) {
267 for (
int j = 0; j < m_totalYX->GetNbinsY(); j++) {
268 float num = m_passYX->GetBinContent(i + 1, j + 1);
269 float denom = m_totalYX->GetBinContent(i + 1, j + 1);
271 m_effiYX->SetBinContent(i + 1, j + 1, num / denom);
272 m_effiYX->SetBinError(i + 1, j + 1, sqrt(num * (denom - num) / (denom * denom * denom)));
274 m_effiYX->SetBinContent(i + 1, j + 1, 0);
275 m_effiYX->SetBinError(i + 1, j + 1, 0);
278 num = m_passYZ->GetBinContent(i + 1, j + 1);
279 denom = m_totalYZ->GetBinContent(i + 1, j + 1);
281 m_effiYZ->SetBinContent(i + 1, j + 1, num / denom);
282 m_effiYZ->SetBinError(i + 1, j + 1, sqrt(num * (denom - num) / (denom * denom * denom)));
284 m_effiYZ->SetBinContent(i + 1, j + 1, 0);
285 m_effiYZ->SetBinError(i + 1, j + 1, 0);
313 if (bklmHits.
size() < 1) { B2INFO(
"BKLMTrackingModule::something is wrong! there is BKLMTrack but no bklmHits");
return false;}
314 if (recoTracks.getEntries() < 1) { B2INFO(
"BKLMTrackingModule::there is no recoTrack");
return false;}
315 double oldDistance = INFINITY;
316 double oldAngle = INFINITY;
317 closestTrack =
nullptr;
319 TVector3 firstBKLMHitPosition(0, 0, 0);
322 firstBKLMHitPosition = bklmHits[0]->getGlobalPosition();
325 TVector3 pos(0, 0, 0);
326 TVector3 mom(0, 0, 0);
332 state.getPosMomCov(pos, mom, cov);
333 if (mom.Y() * pos.Y() < 0)
334 { state = track.getMeasuredStateOnPlaneFromFirstHit(); }
336 const TVector3& distanceVec = firstBKLMHitPosition - pos;
337 state.extrapolateToPoint(firstBKLMHitPosition);
338 double newDistance = distanceVec.Mag2();
343 double angle = trkVec.Angle(mom);
346 if (newDistance < oldDistance) {
347 oldDistance = newDistance;
348 closestTrack = &track;
366 if (oldAngle > m_maxAngleRequired)
return false;
371 void BKLMTrackingModule::generateEffi(
int iSection,
int iSector,
int iLayer)
374 set<int> m_pointUsed;
376 if (m_storeTracks.getEntries() < 1)
return;
378 for (
int it = 0; it < m_storeTracks.getEntries(); it++) {
385 for (
const BKLMHit2d& hit2D : relatedHit2D) {
386 if (hit2D.getLayer() > iLayer + 1) cnt1 ++;
387 if (hit2D.getLayer() < iLayer + 1) cnt2 ++;
390 if (iLayer != 0 && cnt2 < 1)
return;
391 if (iLayer != 14 && cnt1 < 1)
return;
392 m_GeoPar = GeometryPar::instance();
393 const bklm::Module* module = m_GeoPar->findModule(iSection, iSector + 1, iLayer + 1);
394 int minPhiStrip = module->getPhiStripMin();
395 int maxPhiStrip = module->getPhiStripMax();
396 int minZStrip = module->getZStripMin();
397 int maxZStrip = module->getZStripMax();
399 CLHEP::Hep3Vector local = module->getLocalPosition(minPhiStrip, minZStrip);
400 CLHEP::Hep3Vector local2 = module->getLocalPosition(maxPhiStrip, maxZStrip);
401 float minLocalY, maxLocalY;
402 float minLocalZ, maxLocalZ;
403 if (local[1] > local2[1]) { maxLocalY = local[1]; minLocalY = local2[1]; }
else { maxLocalY = local2[1]; minLocalY = local[1];}
404 if (local[2] > local2[2]) { maxLocalZ = local[2]; minLocalZ = local2[2]; }
else { maxLocalZ = local2[2]; minLocalZ = local[2];}
406 TVectorD trkPar = m_storeTracks[it]->getLocalTrackParam();
410 float reflocalX = fabs(m_GeoPar->getActiveMiddleRadius(iSection, iSector + 1,
411 iLayer + 1) - m_GeoPar->getActiveMiddleRadius(iSection, iSector + 1, 1));
414 float reflocalY = trkPar[0] + trkPar[1] * reflocalX;
415 float reflocalZ = trkPar[2] + trkPar[3] * reflocalX;
420 Hep3Vector reflocal(reflocalX, reflocalY, reflocalZ);
422 Hep3Vector global(0, 0, 0);
423 module = m_GeoPar->findModule(iSection, iSector + 1, iLayer + 1);
424 global = module->localToGlobal(reflocal);
426 float localY = module->globalToLocal(global)[1];
427 float localZ = module->globalToLocal(global)[2];
431 if (localY > minLocalY && localY < maxLocalY && localZ > minLocalZ && localZ < maxLocalZ) {
433 bool m_iffound =
false;
434 m_total[iSection][iSector]->Fill(iLayer + 1);
435 m_totalYX->Fill(global[0], global[1]);
436 m_totalYZ->Fill(global[2], global[1]);
438 for (
int he = 0; he < hits2D.getEntries(); ++he) {
439 if (!isLayerUnderStudy(iSection, iSector, iLayer, hits2D[he]))
continue;
440 if (hits2D[he]->isOutOfTime())
continue;
442 if (m_pointUsed.find(he) != m_pointUsed.end())
continue;
445 float distance = distanceToHit(m_storeTracks[it], hits2D[he], error, sigma);
447 if (distance < 10 && sigma < 5) { m_iffound =
true; }
449 m_pointUsed.insert(he);
453 m_pass[iSection][iSector]->Fill(iLayer + 1);
454 m_passYX->Fill(global[0], global[1]);
455 m_passYZ->Fill(global[2], global[1]);
460 m_effiVsLayer[iSection][iSector]->Fill(m_iffound, iLayer + 1);
480 bool BKLMTrackingModule::isLayerUnderStudy(
int section,
int iSector,
int iLayer,
BKLMHit2d* hit)
482 if (hit->getSection() == section && hit->getSector() == iSector + 1 && hit->getLayer() == iLayer + 1)
return true;
486 bool BKLMTrackingModule::isSectorUnderStudy(
int section,
int iSector,
BKLMHit2d* hit)
488 if (hit->getSection() == section && hit->getSector() == iSector + 1)
return true;
497 double x, y, z, dy, dz;
502 TVectorD m_SectorPar = track->getLocalTrackParam();
504 m_GeoPar = GeometryPar::instance();
505 const Belle2::bklm::Module* refMod = m_GeoPar->findModule(hit->getSection(), hit->getSector(), 1);
506 const Belle2::bklm::Module* corMod = m_GeoPar->findModule(hit->getSection(), hit->getSector(), hit->getLayer());
508 CLHEP::Hep3Vector globalPos(hit->getGlobalPosition()[0], hit->getGlobalPosition()[1], hit->getGlobalPosition()[2]);
513 y = m_SectorPar[ 0 ] + x * m_SectorPar[ 1 ];
514 z = m_SectorPar[ 2 ] + x * m_SectorPar[ 3 ];
519 double distance = sqrt(dy * dy + dz * dz);
525 error = sqrt(pow(hit_localPhiErr, 2) +
526 pow(hit_localZErr, 2));
529 sigma = distance / error;