14#include "framework/logging/Logger.h"
15#include "boost/iostreams/filter/gzip.hpp"
16#include "boost/iostreams/filtering_streambuf.hpp"
17#include "boost/iostreams/filtering_stream.hpp"
18#include "trg/cdc/NDFinder.h"
25 bool diagonal,
unsigned char minSuperAxial,
unsigned char minSuperStereo,
27 unsigned char minCells,
bool dbscanning,
unsigned short minTotalWeight,
unsigned short minPeakWeight,
unsigned char iterations,
28 unsigned char omegaTrim,
unsigned char phiTrim,
unsigned char thetaTrim,
30 std::string& axialFile, std::string& stereoFile)
52 B2DEBUG(25,
"initialized binnings");
55 B2DEBUG(25,
"initialized HitMod, a map of tsid to (orient, relid, letter).");
59 B2DEBUG(25,
"loaded zero suppressed axial array ");
61 B2DEBUG(25,
"loaded zero suppressed stereo array ");
64 restoreZeros(m_expAxBins, m_compAxBins, *m_parrayAxialExp, *m_pcompAxial);
65 B2DEBUG(25,
"restored expanded axial array (11/32 phi) ");
66 restoreZeros(m_expStBins, m_compStBins, *m_parrayStereoExp, *m_pcompStereo);
67 B2DEBUG(25,
"restored expanded stereo array (11/32 phi) ");
69 B2DEBUG(25,
"squeezed axial array (11/32 phi) --> (7/32 phi): ");
71 B2DEBUG(25,
"squeezed stereo array (11/32 phi) --> (7/32 phi)");
110 m_stBins.hitid = m_nSt;
112 m_stBins.phi = m_nPhiUse;
113 m_compAxBins.hitid = m_nAx;
114 m_compStBins.hitid = m_nSt;
115 m_compAxBins.phi = m_nPhiComp;
116 m_compStBins.phi = m_nPhiComp;
117 m_compAxBins.theta = 1;
118 m_expAxBins.hitid = m_nAx;
119 m_expStBins.hitid = m_nSt;
120 m_expAxBins.phi = m_nPhiExp;
121 m_expStBins.phi = m_nPhiExp;
123 m_fullBins.hitid = m_nTS;
126 m_pc5shapeax = {{ m_nAx, m_nPrio, m_nOmega, m_nPhiUse, m_nTheta }};
127 m_pc5shapest = {{ m_nSt, m_nPrio, m_nOmega, m_nPhiUse, m_nTheta }};
128 m_pc3shape = {{ m_nOmega,
m_nPhiFull, m_nTheta }};
129 m_pc2shapeHitMod = {{ m_nTS, m_nPrio}};
130 m_pc5shapeCompAx = {{ m_nAx, m_nPrio, m_nOmega, m_nPhiComp, 1 }};
131 m_pc5shapeCompSt = {{ m_nSt, m_nPrio, m_nOmega, m_nPhiComp, m_nTheta }};
132 m_pc5shapeExpAx = {{ m_nAx, m_nPrio, m_nOmega, m_nPhiExp, m_nTheta }};
133 m_pc5shapeExpSt = {{ m_nSt, m_nPrio, m_nOmega, m_nPhiExp, m_nTheta }};
136 m_parrayStereo =
new c5array(m_pc5shapest);
137 m_phoughPlane =
new c3array(m_pc3shape);
138 m_parrayHitMod =
new c2array(m_pc2shapeHitMod);
139 m_pcompAxial =
new c5array(m_pc5shapeCompAx);
140 m_pcompStereo =
new c5array(m_pc5shapeCompSt);
141 m_parrayAxialExp =
new c5array(m_pc5shapeExpAx);
142 m_parrayStereoExp =
new c5array(m_pc5shapeExpSt);
144 m_nWires = {160, 160, 192, 224, 256, 288, 320, 352, 384};
146 m_planeShape = {m_nOmega,
m_nPhiFull, m_nTheta};
149 std::vector<float> omegaRange = { -5., 5.};
150 std::vector<float> phiRange = {0., 11.25};
151 std::vector<float> thetaRange = {19., 140.};
152 float ssOmega = (omegaRange[1] - omegaRange[0]) / m_nOmega;
153 float ssPhi = (phiRange[1] - phiRange[0]) / m_nPhiOne;
154 float ssTheta = (thetaRange[1] - thetaRange[0]) / m_nTheta;
155 m_acceptRanges.push_back(omegaRange);
156 m_acceptRanges.push_back(phiRange);
157 m_acceptRanges.push_back(thetaRange);
158 m_slotSizes.push_back(ssOmega);
159 m_slotSizes.push_back(ssPhi);
160 m_slotSizes.push_back(ssTheta);
167 std::vector<c5elem> flatArray;
168 std::ifstream arrayFileGZ(filename, std::ios_base::in | std::ios_base::binary);
169 boost::iostreams::filtering_istream arrayStream;
170 arrayStream.push(boost::iostreams::gzip_decompressor());
171 arrayStream.push(arrayFileGZ);
173 if (arrayFileGZ.is_open()) {
174 while (arrayStream >> uline) {
175 flatArray.push_back(uline);
179 B2ERROR(
"could not open array file: " << filename);
181 B2DEBUG(25,
"loaded array from file " << filename);
182 unsigned long icount = 0;
183 for (c5index ihit = 0; ihit < bins.hitid; ihit++) {
184 for (c5index iprio = 0; iprio < bins.prio; iprio++) {
185 for (c5index iomega = 0; iomega < bins.omega; iomega++) {
186 for (c5index iphi = 0; iphi < bins.phi; iphi++) {
187 for (c5index itheta = 0; itheta < bins.theta; itheta++) {
188 hitsToTracks[ihit][iprio][iomega][iphi][itheta] = flatArray[icount];
201 std::vector<int> modSLs;
202 std::vector<int> toslid;
203 std::vector<int> sloffsets = {0};
204 std::vector<int> modoffsetsAxSt = {0, 0};
205 for (
int isl = 0; isl < m_nSL; isl++) {
206 modSLs.push_back(
m_nWires[isl] / phigeo);
207 for (
int itsrel = 0; itsrel <
m_nWires[isl]; itsrel++) {
208 toslid.push_back(isl);
210 sloffsets.push_back(sloffsets[isl] +
m_nWires[isl]);
211 int last = modoffsetsAxSt[isl];
212 modoffsetsAxSt.push_back(last +
m_nWires[isl] / phigeo);
214 for (
int its = 0; its < m_nTS; its++) {
215 int sl = toslid[its];
216 bool isAxial = (sl % 2 == 0);
217 int idInSL = its - sloffsets[sl];
218 int modSL = modSLs[sl];
219 int modId = idInSL % modSL;
220 int letter = (int) floor(idInSL / modSL);
221 int relId = (int)(modoffsetsAxSt[sl] + modId);
222 hitMod[its][0] = (int)(isAxial);
223 hitMod[its][1] = relId;
224 hitMod[its][2] = letter;
229void NDFinder::squeezeOne(c5array& writeArray, c5array& readArray,
int outparcels,
int inparcels, c5index ihit, c5index iprio,
230 c5index itheta,
c5elem nomega)
232 int outnphi = (int)(12 * outparcels);
233 c5index trafstart = (c5index)((inparcels - outparcels) / 2 * 12);
234 c5index trafend = (c5index)(trafstart + outnphi);
235 for (c5index iomega = 0; iomega < nomega; iomega++) {
236 for (c5index iphi = 0; iphi < outnphi; iphi++) {
237 c5index readPhi = trafstart + iphi;
238 writeArray[ihit][iprio][iomega][iphi][itheta] = readArray[ihit][iprio][iomega][readPhi][itheta];
240 for (c5index iphi = 0; iphi < trafstart; iphi++) {
241 c5index writePhi = (c5index)(outnphi - trafstart + iphi);
242 writeArray[ihit][iprio][iomega][writePhi][itheta] += readArray[ihit][iprio][iomega][iphi][itheta];
244 for (c5index iphi = 0; iphi < trafstart; iphi++) {
245 c5index readPhi = trafend + iphi;
246 writeArray[ihit][iprio][iomega][iphi][itheta] += readArray[ihit][iprio][iomega][readPhi][itheta];
254 for (c5index ihit = 0; ihit < writebins.hitid; ihit++) {
255 for (c5index iprio = 0; iprio < writebins.prio; iprio++) {
256 for (c5index itheta = 0; itheta < writebins.theta; itheta++) {
257 squeezeOne(writeArray, readArray, outparcels, inparcels, ihit, iprio, itheta, writebins.omega);
266 B2DEBUG(25,
"restoreZeros: zerobins.theta " << zerobins.theta <<
", combins.theta " << compbins.theta);
267 for (c5index ihit = 0; ihit < compbins.hitid; ihit++) {
268 for (c5index iprio = 0; iprio < compbins.prio; iprio++) {
269 for (c5index iomega = 0; iomega < compbins.omega; iomega++) {
270 for (c5index itheta = 0; itheta < compbins.theta; itheta++) {
271 c5elem phiStart = compArray[ihit][iprio][iomega][0][itheta];
272 c5elem phiWidth = compArray[ihit][iprio][iomega][1][itheta];
273 for (c5index iphi = 0; iphi < phiWidth; iphi++) {
274 c5elem phiCur = phiStart + iphi;
275 expArray[ihit][iprio][iomega][phiCur][itheta] = compArray[ihit][iprio][iomega][iphi + 2][itheta];
276 if (compbins.theta == 1) {
277 for (c5index jtheta = 1; jtheta < zerobins.theta; jtheta++) {
278 expArray[ihit][iprio][iomega][phiCur][jtheta] = compArray[ihit][iprio][iomega][iphi + 2][itheta];
290 ushort minWeightShow = 1)
293 ushort phiend = bins.phi;
294 bool started =
false;
295 unsigned long phiSlice = 0;
296 for (c3index iphi = 0; iphi < bins.phi; iphi++) {
297 for (c3index itheta = 0; itheta < bins.theta; itheta++) {
298 for (c3index iomega = 0; iomega < bins.omega; iomega++) {
299 phiSlice += hitsToTracks[iomega][iphi][itheta];
302 if (phiSlice == 0 and not started) {
304 }
else if (phiSlice != 0 and not started) {
306 }
else if (phiSlice != 0 and started) {
308 }
else if (phiSlice == 0 and started) {
314 B2DEBUG(25,
"printArray3D, phistart = " << phistart <<
", phiend = " << phiend);
315 auto d3shp = hitsToTracks.shape();
316 B2DEBUG(25,
"printArray shape: " << d3shp[0] <<
", " << d3shp[1] <<
", " << d3shp[2]);
318 if (phiend == phistart) {
322 for (c3index iomega = 0; iomega < bins.omega; iomega += omInc) {
323 for (c3index iphi = phistart; iphi < phiend; iphi += phiInc) {
325 ushort valRed = (ushort)((hitsToTracks[iomega][iphi][itheta]) / divide);
326 if (valRed <= minWeightShow)
331 std::cout <<
"|" << std::endl;
339 c2array& arrayHitMod = *m_parrayHitMod;
346 short letterShort = (short) letter;
350 short DstartShort = (letterShort - 3) %
m_params.
phigeo * m_nPhiOne;
351 if (DstartShort < 0) {DstartShort =
m_nPhiFull + DstartShort;}
354 short DstartComp = (letterShort - 5) %
m_params.
phigeo * m_nPhiOne;
355 if (DstartComp < 0) {DstartComp =
m_nPhiFull + DstartComp;}
361 addC3Comp(hitr, prio, *m_pcompAxial, DstartComp, m_compAxBins);
363 addC3Comp(hitr, prio, *m_pcompStereo, DstartComp, m_compStBins);
369 ushort prio,
const c5array& hitsToTracks,
373 c3array& houghPlane = *m_phoughPlane;
374 for (ushort itheta = 0; itheta < m_nTheta; itheta++) {
375 if (bins.theta > 1) {
378 for (ushort iomega = 0; iomega < m_nOmega; iomega++) {
379 ushort startfield = 0;
381 ushort xstart = hitsToTracks[hitr][prio][iomega][startfield][ntheta];
382 ushort xlen = hitsToTracks[hitr][prio][iomega][lenfield][ntheta];
383 for (ushort iphiz = 0; iphiz < xlen; iphiz++) {
384 ushort iphix = iphiz + 2;
385 ushort iphi = iphiz + xstart;
386 ushort iHoughPhi = (iphi + Dstart) %
m_nPhiFull;
387 houghPlane[iomega][iHoughPhi][itheta] += hitsToTracks[hitr][prio][iomega][iphix][ntheta];
397 for (
unsigned short ihit = 0; ihit <
m_nHits; ihit++) {
401 B2DEBUG(25,
"m_houghPlane, 2");
410 unsigned short nClusters = clusters.size();
411 unsigned short defaultValue = 0;
412 std::vector<unsigned short> hitElem(
m_nHits, defaultValue);
413 std::vector<std::vector<unsigned short>> hitsVsClusters(nClusters, hitElem);
415 for (
unsigned long iclus = 0; iclus < clusters.size(); iclus++) {
417 std::vector<cell_index> entries = cli.
getEntries();
418 cell_index maxid =
getMax(entries);
419 for (
unsigned long ihit = 0; ihit <
m_hitIds.size(); ihit++) {
421 hitsVsClusters[iclus][ihit] = contrib;
424 return hitsVsClusters;
428std::vector<SimpleCluster>
431 std::vector<SimpleCluster> useClusters;
432 if (hitsVsClusters.size() > 0) {
434 for (
unsigned long iclus = 0; iclus < hitsVsClusters.size(); iclus++) {
435 std::vector<std::vector<long>> superLayerNumbers;
437 for (
unsigned long ihit = 0; ihit <
m_hitIds.size(); ihit++) {
438 unsigned short contribution = hitsVsClusters[iclus][ihit];
439 if (contribution > 0) {
440 superLayerNumbers.push_back({
static_cast<long>(ihit), contribution,
m_hitSLIds[ihit],
m_prioTime[ihit]});
444 for (
unsigned short sl = 0; sl < 9; sl++) {
445 std::vector<std::vector<long>> oneSuperLayerContributions;
446 for (
unsigned long nTS = 0; nTS < superLayerNumbers.size(); nTS++) {
447 if (superLayerNumbers[nTS][2] == sl) {
448 oneSuperLayerContributions.push_back({superLayerNumbers[nTS][0], superLayerNumbers[nTS][1], superLayerNumbers[nTS][3]});
452 if (oneSuperLayerContributions.size() == 0) {
456 struct sortingClass {
457 bool operator()(std::vector<long> i, std::vector<long> j) {
return (i[2] < j[2]);}
459 sort(oneSuperLayerContributions.begin(), oneSuperLayerContributions.end(), sortingTimes);
460 long maxHit = oneSuperLayerContributions[0][0];
461 long maxContribution = oneSuperLayerContributions[0][1];
463 for (
size_t index = 0; index < oneSuperLayerContributions.size(); index++) {
465 if (oneSuperLayerContributions[index][1] > maxContribution) {
466 maxContribution = oneSuperLayerContributions[index][1];
467 maxHit = oneSuperLayerContributions[index][0];
470 clusters[iclus].addHit(maxHit, maxContribution,
m_hitOrients[maxHit]);
474 std::vector<unsigned short> clusterHits = clu.
getHits();
475 std::vector<unsigned short> clusterSLNumbers;
476 for (
const auto& element : clusterHits) {
477 clusterSLNumbers.push_back(
m_hitSLIds[element]);
480 std::set<unsigned short> uniqueSLNumbers(clusterSLNumbers.begin(), clusterSLNumbers.end());
481 size_t nSL = uniqueSLNumbers.size();
482 uniqueSLNumbers.insert({0, 2, 4, 6, 8});
483 size_t withAxialSLs = uniqueSLNumbers.size();
484 size_t axialNumber = 5 - (withAxialSLs - nSL);
485 size_t stereoNumber = nSL - axialNumber;
487 useClusters.push_back(clusters[iclus]);
496 c3array& houghPlane = *m_phoughPlane;
497 std::vector<SimpleCluster> allClusters;
498 std::vector<ROOT::Math::XYZVector> houghspace;
503 c3array copiedPlane = houghPlane;
505 std::vector<SimpleCluster> fixedClusters =
m_clusterer.makeClusters();
506 allClusters = fixedClusters;
508 std::vector<SimpleCluster> clusters;
511 clusters.push_back(clu);
514 std::vector<std::vector<unsigned short>> hitsVsClusters =
getHitsVsClusters(clusters);
516 std::vector<SimpleCluster> useClusters =
allHitsToClusters(hitsVsClusters, clusters);
518 for (
unsigned long iclus = 0; iclus < useClusters.size(); iclus++) {
520 std::vector<cell_index> entries = cli.
getEntries();
521 cell_index maxid =
getMax(entries);
522 ushort maxval = houghPlane[maxid[0]][maxid[1]][maxid[2]];
524 std::vector<cellweight> highWeight =
getHighWeight(entries, cutoff);
525 std::vector<std::vector<long int>> flatHW;
526 for (
auto cx : highWeight) {
527 flatHW.push_back({cx.index[0], cx.index[1], cx.index[2], (
unsigned short int)cx.weight});
530 std::vector<double> estimate =
getBinToVal(result);
531 std::vector<double> transformed = transform(estimate);
534 std::vector<ROOT::Math::XYZVector> ndreadout;
587 }
else if (idx == 1) {
588 float phiMod = estVal;
592 return phiMod * TMath::DegToRad();
594 float thetRad = estVal * TMath::DegToRad();
595 return cos(thetRad) / sin(thetRad);
598std::vector<double> NDFinder::transform(std::vector<double> estimate)
600 std::vector<double> transformed;
601 for (
int idx = 0; idx < 3; idx++) {
602 transformed.push_back(
transformVar(estimate[idx], idx));
610 std::vector<double> estimate;
611 for (ushort idim = 0; idim < 3; idim++) {
612 double trafd = m_acceptRanges[idim][0] + (thisAv[idim] + 0.5) * m_slotSizes[idim];
613 estimate.push_back(trafd);
626 axomega += elem.index[0] * elem.weight;
627 axphi += elem.index[1] * elem.weight;
628 axtheta += elem.index[2] * elem.weight;
629 weightSum += elem.weight;
631 axomega /= weightSum;
633 axtheta /= weightSum;
634 std::vector<double> result = {axomega, axphi, axtheta};
641 ushort curWeight = 0;
642 cell_index curMaxIndex = {0, 0, 0};
643 const c3array& houghPlane = *m_phoughPlane;
645 for (
const cell_index& entry : entries) {
646 if (houghPlane[entry[0]][entry[1]][entry[2]] > curWeight) {
647 curWeight = houghPlane[entry[0]][entry[1]][entry[2]];
657 std::vector<cellweight> cellsAndWeight;
658 const c3array& houghPlane = *m_phoughPlane;
659 for (cell_index& entry : entries) {
660 ushort cellWeight = houghPlane[entry[0]][entry[1]][entry[2]];
661 if (cellWeight > cutoff) {
663 curElem.index = entry;
664 curElem.weight = cellWeight;
665 cellsAndWeight.push_back(curElem);
668 return cellsAndWeight;
675 ushort iHoughPhi = peak[1];
677 ushort iphi = iHoughPhi - Dstart;
678 if (Dstart > iHoughPhi && Dstart > 300) {
681 ushort iomega = peak[0];
682 ushort itheta = peak[2];
685 const c2array& arrayHitMod = *m_parrayHitMod;
689 B2ERROR(
"phi overflow: iHoughPhi = " << iHoughPhi <<
", Dstart = " << Dstart <<
", iphi=" << iphi);
691 if (iphi < m_nPhiUse) {
693 contrib = (*m_parrayAxial)[hitr][prio][iomega][iphi][itheta];
695 contrib = (*m_parrayStereo)[hitr][prio][iomega][iphi][itheta];
706 B2DEBUG(25,
"clustererParams minWeight=" << cpa.
minWeight <<
", minPts=" << cpa.
minPts <<
", diagonal=" << cpa.
diagonal);
void setNewPlane(c3array &houghmapPlain)
Next event initialization: set a new hough space for clustering and track finding.
Store track parameters of found tracks.
double cdcTrackRadius(double pt)
Transverse momentum to radius.
Belle2::Clusterizend m_clusterer
Clustering module.
std::vector< SimpleCluster > allHitsToClusters(std::vector< std::vector< unsigned short > > &hitsVsClusters, std::vector< SimpleCluster > &clusters)
Relate all hits in a cluster to the cluster Remove small clusters with less than minsuper related hit...
void initBins()
Initialize the binnings and reserve the arrays.
void initHitModAxSt(c2array &hitMod)
Initialize hit modulo mappings.
c5array * m_parrayAxial
Array pointers to the hit patterns.
void getCM()
NDFinder internal functions for track finding.
void squeezeAll(ndbinning writebins, c5array &writeArray, c5array &readArray, int outparcels, int inparcels)
Loop over all hits and theta bins and squeeze all 2D (omega,phi) planes.
std::vector< unsigned short > m_prioPos
Priority positon within the TS in the current event elements basf2: [0,3] first, left,...
void loadArray(const std::string &filename, ndbinning bins, c5array &hitsToTracks)
Load an NDFinder array of hit representations in track phase space.
void restoreZeros(ndbinning zerobins, ndbinning compbins, c5array &expArray, const c5array &compArray)
Restore non-zero suppressed hit curves.
std::vector< short > m_vecDstart
Phi-start of 7/32 hit representation in full track parameter space.
std::vector< unsigned short > m_hitOrients
Orients TS-Ids of the hits in the current event elements: [0,2335] for 2336 TS in total.
ushort hitContrib(cell_index peak, ushort ihit)
Determine weight contribution of a single hit to a single cell.
void squeezeOne(c5array &writeArray, c5array &readArray, int outparcels, int inparcels, c5index ihit, c5index iprio, c5index itheta, c5elem nomega)
Squeeze phi-axis in a 2D (omega,phi) plane.
std::vector< cellweight > getHighWeight(std::vector< cell_index > entries, float cutoff)
Candidate cells as seed for the clustering.
std::vector< double > getBinToVal(std::vector< double >)
Scale the weighted center to track parameter values.
unsigned short m_nHits
Counter for the number of hits in the current event.
boost::array< c5index, 5 > m_pc5shapeax
NDFinder.
void init(unsigned short minWeight, unsigned char minPts, bool diagonal, unsigned char minSuperAxial, unsigned char minSuperStereo, float thresh, unsigned char minCells, bool dbscanning, unsigned short minTotalWeight, unsigned short minPeakWeight, unsigned char iterations, unsigned char omegaTrim, unsigned char phiTrim, unsigned char thetaTrim, bool verbose, std::string &axialFile, std::string &stereoFile)
initialization
void addC3Comp(ushort hitr, ushort prio, const c5array &hitsToTracks, short Dstart, ndbinning bins)
In place array addition to houghmap Comp: A = A + B.
std::vector< int > m_nWires
Number of first priority wires in each super layer (TS per SL)
ndbinning m_axBins
Binnings in different hit pattern arrays.
clustererParams m_clustererParams
Configuration of the clustering module.
void printParams()
Debug: print configured parameters.
ndparameters m_params
Configuration parameters of the 3DFinder.
std::vector< NDFinderTrack > m_NDFinderTracks
Result: vector of the found tracks.
void addLookup(unsigned short ihit)
Add a single axial or stereo hit to the houghmap.
std::vector< unsigned short > m_hitIds
TS-Ids of the hits in the current event elements: [0,2335] for 2336 TS in total.
unsigned short m_nPhiFull
Default bins.
void reset()
NDFinder reset data structure to process next event.
void findTracks()
main function for track finding
std::vector< std::vector< unsigned short > > getHitsVsClusters(std::vector< SimpleCluster > &clusters)
Create hits to clusters confusion matrix.
std::vector< double > getWeightedMean(std::vector< cellweight >)
Calculate the weighted center of a cluster.
std::vector< long > m_prioTime
Drift time of the priority wire.
float transformVar(float estVal, int idx)
Calculate physical units.
void printArray3D(c3array &hitsToTracks, ndbinning bins, ushort, ushort, ushort, ushort)
Debug Tool: Print part of the houghmap.
cell_index getMax(const std::vector< cell_index > &)
Peak cell in cluster.
bool m_verbose
Print Hough planes and verbose output.
std::vector< unsigned short > m_hitSLIds
SL-Ids of the hits in the current event elements: super layer number in [0,1,...,8].
std::vector< unsigned short > getHits()
Get ids of related hits (indices of the TS StoreArray)
std::vector< cell_index > getEntries()
Get member cells in the cluster.
unsigned short c2elem
TS-Id to 1/32 phi-sector mapping is stored in a 2D array.
unsigned short c5elem
Store hit patterns in a 5D array (hitid, prio, omega, phi, theta)
Abstract base class for different kinds of events.
unsigned char iterations
Clustering: number of iterations for the cluster search in each Hough space.
std::string axialFile
Zero-Suppressed trained hit data.
unsigned short minTotalWeight
Clustering: minimum of the total weight in all cells of the 3d volume.
unsigned char minCells
Minimum number of cells in the track parameter space.
unsigned short phigeo
CDC symmetry: repeat wire pattern 32 times in phi.
unsigned char omegaTrim
Clustering: number of deleted cells in each omega direction from the maximum.
unsigned char minSuperAxial
Clustering options.
bool dbscanning
Clustering method: When true: dbscan, when false: fixed 3d volume.
float thresh
houghspace must have thresh x maxweight of cluster
unsigned short parcelsExp
CDC symmetry: phi range covered by expanded hit data [0 .
unsigned char thetaTrim
Clustering: number of deleted cells in each theta direction from the maximum.
unsigned char minSuperStereo
Required number of stereo super layers.
unsigned short minPeakWeight
Clustering: minimum peak cell weight.
unsigned short parcels
** CDC symmetry: phi range covered by hit data [0 .. phigeo] */
unsigned char phiTrim
Clustering: number of deleted cells in each phi direction from the maximum.
unsigned char iterations
Number of iterations of the cluster searching for each Hough space.
unsigned char minPts
minimum number of neighbours for a cluster core cell
bool diagonal
Consider diagonal adjacent cells as neighbors.
unsigned short minTotalWeight
Cut on the total weight of all cells in the 3d volume.
unsigned short minWeight
minimum weight for a cluster cell
unsigned char omegaTrim
Number of deleted cells in omega in each direction of the maximum.
unsigned char thetaTrim
Number of deleted cells in theta in each direction of the maximum.
unsigned short minPeakWeight
Cut on the peak cell weight.
unsigned char phiTrim
Number of deleted cells in phi in each direction of the maximum.
Default binning in a (7/32) phi-sector.