11 #include <ecl/modules/eclClusterProperties/ECLClusterPropertiesModule.h>
12 #include <ecl/geometry/ECLGeometryPar.h>
29 setDescription(
"This module calculates some properties of ECL clusters.");
30 setPropertyFlags(c_ParallelProcessingCertified);
32 addParam(
"trackClusterRelationName", m_trackClusterRelationName,
"Name of relation array between tracks and ECL clusters",
33 std::string(
"AngularDistance"));
42 m_tracks.isRequired();
43 m_eclShowers.isRequired();
44 m_eclClusters.isRequired();
45 m_eclCalDigits.isRequired();
46 m_extHits.isRequired();
51 for (
auto& shower : m_eclShowers) {
53 double dist = computeTrkMinDistance(shower, m_tracks);
54 shower.setMinTrkDistance(dist);
56 if (cluster !=
nullptr) {
57 cluster->setMinTrkDistance(
float(dist));
62 if (cluster->isTrack()) {
64 computeDepth(shower, lTrk, lShower);
65 B2DEBUG(29,
"shower depth: ltrk = " << lTrk <<
" lShower = " << lShower);
66 shower.setTrkDepth(lTrk);
67 shower.setShowerDepth(lShower);
68 cluster->setdeltaL(lTrk);
76 double minDist(10000);
81 for (
const auto& track : tracks) {
82 TVector3 trkpos(0, 0, 0);
83 for (
const auto& extHit : track.getRelationsTo<
ExtHit>()) {
84 if (abs(extHit.getPdgCode()) != pdgCode)
continue;
85 if ((extHit.getDetectorID() != Const::EDetector::ECL))
continue;
86 if (extHit.getCopyID() == -1)
continue;
87 trkpos = extHit.getPosition();
88 double distance = (cryCenter - trkpos).Mag();
89 if (distance < minDist) minDist = distance;
92 if (minDist > 9999) minDist = -1;
101 TVector3 avgDir(0, 0, 0), showerCenter, trkpos, trkdir;
105 for (
unsigned int iRel = 0; iRel < relatedDigitsPairs.size(); iRel++) {
106 const auto aECLCalDigit = relatedDigitsPairs.object(iRel);
107 const auto weight = relatedDigitsPairs.weight(iRel);
108 double energy = weight * aECLCalDigit->getEnergy();
109 int cellid = aECLCalDigit->getCellId();
110 TVector3 cvec = geometry->GetCrystalVec(cellid - 1);
111 avgDir += energy * cvec;
114 if (cluster ==
nullptr)
return;
115 const Track* selectedTrk =
nullptr;
117 for (
const auto& track : cluster->getRelationsFrom<
Track>(
"", m_trackClusterRelationName)) {
120 if (fit != 0) cp = fit->getMomentum().Mag();
122 selectedTrk = &track;
126 if (selectedTrk ==
nullptr)
return;
129 if ((extHit.getDetectorID() != Const::EDetector::ECL))
continue;
130 if (extHit.getStatus() != EXT_ENTER)
continue;
131 if (extHit.getCopyID() == -1)
continue;
132 trkpos = extHit.getPosition();
133 trkdir = extHit.getMomentum().Unit();
138 TVector3 w0 = showerCenter - trkpos;
139 double costh = avgDir.Unit() * trkdir;
140 double sin2th = 1 - costh * costh;
141 lShower = costh * (w0 * trkdir) - w0 * avgDir.Unit();
144 lTrk = w0 * trkdir - costh * (w0 * avgDir.Unit());