12 #include <gear/TPCParameters.h> 13 #include <gear/BField.h> 14 #include <gearimpl/Vector3D.h> 17 #include <EVENT/LCEvent.h> 18 #include <IMPL/LCCollectionVec.h> 19 #include <UTIL/BitField64.h> 20 #include <UTIL/ILDConf.h> 21 #include <IMPL/TrackerHitImpl.h> 22 #include <IMPL/TrackImpl.h> 23 #include <IMPL/LCFlagImpl.h> 24 #include <Exceptions.h> 38 RowTripletBasedTrackFinderProcessor::RowTripletBasedTrackFinderProcessor() :
39 Processor(
"RowTripletBasedTrackFinderProcessor") {
41 _description =
"RowTripletBasedTrackFinderProcessor is intended to ...";
43 registerInputCollection(LCIO::TRACKERHIT,
"InputHits",
"Name of the input Hit Collection",
_inputColName,
string(
"TPCHits"));
45 registerOutputCollection(LCIO::TRACK,
"OutputTracks",
"Name of the output Track Collection",
_outputColName,
46 string(
"TripletTracks"));
48 registerOptionalParameter(
"BFieldScaleFactor",
"Scales magnetic field (map), use 1.0 (default) for field ON or 0.0 for field OFF",
51 registerOptionalParameter(
"TripletPreSelectionDistCut",
"Coarse cut on XY and Z residuals for triplet preselection",
_distCut,
54 registerOptionalParameter(
"TripletDefinitionChi2Cut",
"Chi2 cut for triplet definition on XY and Z residuals",
_trpCut,
57 registerOptionalParameter(
"TripletPositionMatchingChi2Cut",
"Chi2 cut for triplet position matching in XY and Z",
_posCut,
60 registerOptionalParameter(
"TripletDirectionMatchingChi2Cut",
"Chi2 cut for triplet direction matching in XY and Z",
_dirCut,
63 registerOptionalParameter(
"SegmentMatchingChi2Cut",
"Chi2/Ndf cut for segment matching (Ndf=4 for B off, 5 for B on)",
_segCut,
66 registerOptionalParameter(
"UnusedHitMatchingChi2Cut",
"Chi2 cut for matching unused hits in XY and Z",
_unusedCut,
double(20.0));
68 registerOptionalParameter(
"UnusedHitMaxGapCut",
"Maximal (row) gap for matching unused hits in XY and Z",
_maxGap,
int(4));
70 registerOptionalParameter(
"EncodedModuleID",
"Module ID encoded in CellID0",
_encodedModuleID,
bool(
true));
72 registerOptionalParameter(
"ReferencePointAtPca",
"Use PCA as reference point, else 1. hit",
_refAtPCA,
bool(
false));
77 m_out(DEBUG) <<
" init() called " << endl;
79 const gear::TPCParameters& tpcParameters = Global::GEAR->getTPCParameters();
80 bool cartesian = (tpcParameters.getCoordinateType() == PadRowLayout2D::CARTESIAN);
81 const std::vector<TPCModule*> moduleVector = tpcParameters.getModules();
82 m_out(DEBUG) <<
" Number of modules: " << moduleVector.size() << endl;
83 for (std::vector<TPCModule*>::const_iterator itMod = moduleVector.begin(); itMod != moduleVector.end(); ++itMod) {
84 int module = (*itMod)->getModuleID();
85 m_out(DEBUG) <<
" module " << module <<
" with " << (*itMod)->getNRows() <<
" rows" << endl;
86 for (std::vector<TPCModule*>::const_iterator itMod2 = itMod; itMod2 != moduleVector.end(); ++itMod2) {
89 m_out(DEBUG) <<
" neighbour " << (*itMod2)->getModuleID() << endl;
95 _Xcenter = tpcParameters.getDoubleVal(
"TPC_cylinder_centre_c0");
96 _Ycenter = tpcParameters.getDoubleVal(
"TPC_cylinder_centre_c1");
105 std::clock_t start1 = std::clock();
107 m_out(DEBUG) <<
"Event Number: " << evt->getEventNumber() << endl;
110 LCCollection* inputCol = 0;
112 LCCollectionVec* outputCol =
new LCCollectionVec(LCIO::TRACK);
113 LCFlagImpl trkFlag(0);
114 trkFlag.setBit(LCIO::TRBIT_HITS);
115 outputCol->setFlag(trkFlag.getFlag());
120 }
catch (DataNotAvailableException &e) {
126 Vector3D bfield = marlin::Global::GEAR->getBField().at(theTPCCenter);
130 m_out(DEBUG) <<
"BField(GEAR) is OFF" << std::endl;
132 m_out(DEBUG) <<
"BField(GEAR) is ON" << std::endl;
140 UTIL::BitField64 encoder(lcio::ILDCellID0::encoder_string);
141 int nInput = inputCol->getNumberOfElements();
142 m_out(DEBUG) <<
"Event " << evt->getEventNumber() <<
" in run " << evt->getRunNumber() <<
", number of input hits: " << nInput
144 for (
int iInput = 0; iInput < nInput; iInput++) {
145 TrackerHit* Hit =
dynamic_cast<TrackerHit*
>(inputCol->getElementAt(iInput));
146 encoder.setValue(Hit->getCellID0());
149 encoder[ILDCellID0::module] :
150 Global::GEAR->getTPCParameters().getNearestModule(Hit->getPosition()[0], Hit->getPosition()[1]).getModuleID();
151 int row = encoder[ILDCellID0::layer];
153 hitData[mod][row].push_back(someHit);
160 rowHitMapType::iterator itRow1, itRow2, itRow3;
161 for (modHitMapType::iterator itMod = hitData.begin(); itMod != hitData.end(); ++itMod) {
162 const int module = itMod->first;
166 const int numRows = modData.rbegin()->first - modData.begin()->first + 1;
168 m_out(DEBUG) <<
" module " << module <<
" with " << endl;
169 m_out(DEBUG) <<
" " << modData.size() <<
" rows " << endl;
172 for (
int row = modData.begin()->first + step; row <= modData.rbegin()->first - step; ++row) {
174 if ((itRow1 = modData.find(row - step)) == modData.end())
continue;
175 if ((itRow2 = modData.find(row)) == modData.end())
continue;
176 if ((itRow3 = modData.find(row + step)) == modData.end())
continue;
178 for (hitListType::iterator itHit1 = itRow1->second.begin(); itHit1 != itRow1->second.end(); ++itHit1) {
179 for (hitListType::iterator itHit3 = itRow3->second.begin(); itHit3 != itRow3->second.end(); ++itHit3) {
181 for (hitListType::iterator itHit2 = itRow2->second.begin(); itHit2 != itRow2->second.end(); ++itHit2) {
187 m_out(DEBUG) <<
" " << triplets.size() <<
" triplets " << endl;
194 for (trpListType::iterator itTrp1 = triplets.begin(); itTrp1 != triplets.end(); ++itTrp1) {
195 trpEquiClass.
addIndex(itTrp1 - triplets.begin());
196 for (trpListType::iterator itTrp2 = itTrp1; itTrp2 != triplets.end(); ++itTrp2) {
197 if ((*itTrp2)->getRow() - (*itTrp1)->getRow() > 2)
break;
200 trpEquiClass.
addMatch(make_pair(itTrp1 - triplets.begin(), itTrp2 - triplets.begin()));
204 std::map<int, std::vector<int> > trpClasses = trpEquiClass.
getClasses();
206 std::multimap<int, int> rowInfo;
207 int row, nRows, firstRow, lastRow;
208 for (std::map<
int, std::vector<int> >::iterator itC = trpClasses.begin(); itC != trpClasses.end(); ++itC) {
209 nRows = firstRow = lastRow = 0;
210 for (std::vector<int>::iterator itInd = itC->second.begin(); itInd != itC->second.end(); ++itInd) {
211 row = triplets[*itInd]->getRow();
213 firstRow = lastRow = row;
215 }
else if (row > lastRow) {
220 if (nRows > 1) rowInfo.insert(make_pair(nRows * numRows + lastRow - firstRow, itC->first));
223 for (std::multimap<int, int>::reverse_iterator rit = rowInfo.rbegin(); rit != rowInfo.rend(); ++rit) {
225 for (std::vector<int>::iterator itInd = trpClasses[rit->second].begin(); itInd != trpClasses[rit->second].end(); ++itInd)
226 matchingTriplets.push_back(triplets[*itInd]);
228 if (simpleSegment->
getNdf() < 0)
229 delete simpleSegment;
231 segments.push_back(simpleSegment);
233 m_out(DEBUG) <<
" " << segments.size() <<
" segments " << endl;
235 for (trpListType::iterator itTrp = triplets.begin(); itTrp != triplets.end(); ++itTrp) {
243 for (segListType::iterator itSeg1 = segments.begin(); itSeg1 != segments.end(); ++itSeg1) {
244 segEquiClass.
addIndex(itSeg1 - segments.begin());
245 for (segListType::iterator itSeg2 = itSeg1; itSeg2 != segments.end(); ++itSeg2) {
247 if ((*itSeg1)->match(*itSeg2,
_segCut, step))
248 segEquiClass.
addMatch(make_pair(itSeg1 - segments.begin(), itSeg2 - segments.begin()));
252 std::map<int, std::vector<int> > segClasses = segEquiClass.
getClasses();
253 for (std::map<
int, std::vector<int> >::iterator itC = segClasses.begin(); itC != segClasses.end(); ++itC) {
256 for (std::vector<int>::iterator itInd = itC->second.begin(); itInd != itC->second.end(); ++itInd)
257 matchingSegments.push_back(segments[*itInd]);
258 segData[module].push_back(
new rb_Segment(matchingSegments));
261 for (segListType::iterator itSeg = segments.begin(); itSeg != segments.end(); ++itSeg) {
267 for (segListType::iterator itSeg = segData[module].begin(); itSeg != segData[module].end(); ++itSeg) {
268 map<int, int> rowMap;
269 (*itSeg)->fillRowMap(rowMap);
270 int centerRow = ((*itSeg)->getFirstRow() + (*itSeg)->getLastRow()) / 2;
272 for (
int row = centerRow + 1; row <= modData.rbegin()->first; ++row) {
273 if (row > (*itSeg)->getLastRow() +
_maxGap)
break;
274 if (rowMap.count(row) > 0)
continue;
276 (*itSeg)->match(modData[row], hits,
_unusedCut);
278 if (hits.size() == 1) (*itSeg)->addHit(hits[0]);
281 for (
int row = centerRow; row >= modData.begin()->first; --row) {
282 if (row < (*itSeg)->getFirstRow() -
_maxGap)
break;
283 if (rowMap.count(row) > 0)
continue;
285 (*itSeg)->match(modData[row], hits,
_unusedCut);
287 if (hits.size() == 1) (*itSeg)->addHit(hits[0]);
293 std::vector<std::pair<int, int> > segIndex;
296 for (modSegMapType::iterator itMod = segData.begin(); itMod != segData.end(); ++itMod) {
298 for (segListType::iterator itSeg = segments.begin(); itSeg != segments.end(); ++itSeg) {
299 (*itSeg)->setId(segIndex.size());
300 segIndex.push_back(make_pair(itMod->first, itSeg - segments.begin()));
301 segEquiClass.
addIndex((*itSeg)->getId());
305 for (modSegMapType::iterator itMod = segData.begin(); itMod != segData.end(); ++itMod) {
308 for (std::vector<int>::iterator itN = neighbours.begin(); itN != neighbours.end(); ++itN) {
310 for (segListType::iterator itSeg1 = segments1.begin(); itSeg1 != segments1.end(); ++itSeg1) {
311 for (segListType::iterator itSeg2 = segments2.begin(); itSeg2 != segments2.end(); ++itSeg2) {
313 if ((*itSeg1)->match(*itSeg2,
_segCut, step)) segEquiClass.
addMatch(make_pair((*itSeg1)->getId(), (*itSeg2)->getId()));
319 std::map<int, std::vector<int> > segClasses = segEquiClass.
getClasses();
321 for (std::map<
int, std::vector<int> >::iterator itC = segClasses.begin(); itC != segClasses.end(); ++itC) {
324 for (std::vector<int>::iterator itInd = itC->second.begin(); itInd != itC->second.end(); ++itInd) {
325 std::pair<int, int> index = segIndex[*itInd];
326 matchingSegments.push_back(segData[index.first][index.second]);
328 trackCandidates.push_back(
new rb_Segment(matchingSegments));
330 m_out(DEBUG) <<
" found " << trackCandidates.size() <<
" track candidates " << endl;
333 for (segListType::iterator itSeg = trackCandidates.begin(); itSeg != trackCandidates.end(); ++itSeg) {
335 TrackImpl* theTrack =
new TrackImpl();
340 hits.front()->getPos(posFirst);
342 double refPos[] = { 0., 0., 0. };
344 refPos[0] = posFirst[0];
345 refPos[1] = posFirst[1];
346 refPos[2] = posFirst[2];
349 for (
int i = 0; i < 3; ++i)
350 refPoint[i] = refPos[i];
352 TVectorD parameters(5);
353 TMatrixDSym covariance(5);
354 (*itSeg)->getLCIOStateAtRefPoint(refPos, parameters, covariance);
356 theTrack->setOmega(parameters[2]);
357 theTrack->setTanLambda(parameters[4]);
358 theTrack->setPhi(parameters[1]);
359 theTrack->setD0(parameters[0]);
360 theTrack->setZ0(parameters[3]);
361 theTrack->setChi2((*itSeg)->getChi2());
362 theTrack->setNdf((*itSeg)->getNdf());
363 theTrack->setReferencePoint(refPoint);
369 float rInner = sqrt(pow(posFirst[0], 2) + pow(posFirst[1], 2));
370 theTrack->setRadiusOfInnermostHit(rInner);
372 float compressedCovariance[15];
374 for (
int i = 0; i < 5; ++i)
375 for (
int j = 0; j <= i; ++j)
376 compressedCovariance[ind++] = covariance[i][j];
377 theTrack->setCovMatrix(compressedCovariance);
379 for (hitListType::iterator itH = hits.begin(); itH != hits.end(); ++itH) {
380 TrackerHit* Hit =
dynamic_cast<TrackerHit*
>(inputCol->getElementAt((*itH)->getHitNum()));
381 theTrack->addHit(Hit);
384 m_out(DEBUG) <<
" +++ the found track has a chi^2 value of " << theTrack->getChi2() <<
" for ndf = " << theTrack->getNdf()
385 <<
" and the parameters [omega, tanLambda, phi0, d0, z0] = [" << theTrack->getOmega() <<
"," << theTrack->getTanLambda()
386 <<
"," << theTrack->getPhi() <<
"," << theTrack->getD0() <<
"," << theTrack->getZ0() <<
"] at the reference position [" 387 << refPoint[0] <<
"," << refPoint[1] <<
"," << refPoint[2] <<
"]." << endl;
389 outputCol->addElement(theTrack);
392 m_out(DEBUG) <<
"RowTripletBasedTrackFinder ... done!" << endl;
394 if (!outputCol->empty()) {
398 m_out(DEBUG) << ((std::clock() - start1) / (
double) CLOCKS_PER_SEC) <<
" sec" << endl;
401 for (modHitMapType::iterator itMod = hitData.begin(); itMod != hitData.end(); ++itMod) {
402 for (rowHitMapType::iterator itRow = itMod->second.begin(); itRow != itMod->second.end(); ++itRow) {
403 for (hitListType::iterator itH = itRow->second.begin(); itH != itRow->second.end(); ++itH) {
409 for (modSegMapType::iterator itMod = segData.begin(); itMod != segData.end(); ++itMod) {
410 for (segListType::iterator itSeg = itMod->second.begin(); itSeg != itMod->second.end(); ++itSeg) {
415 for (segListType::iterator itSeg = trackCandidates.begin(); itSeg != trackCandidates.end(); ++itSeg) {
418 trackCandidates.clear();
441 if (mod1 == mod2)
return false;
443 const std::vector<double> modExtend = mod1->getModuleExtent();
444 const double xm1 = 0.5 * (modExtend[1] + modExtend[0]), xs1 = 0.5 * (modExtend[1] - modExtend[0]);
445 const double ym1 = 0.5 * (modExtend[3] + modExtend[2]), ys1 = 0.5 * (modExtend[3] - modExtend[2]);
446 const std::vector<double> modExtend2 = mod2->getModuleExtent();
447 const double xm2 = 0.5 * (modExtend2[1] + modExtend2[0]), xs2 = 0.5 * (modExtend2[1] - modExtend2[0]);
448 const double ym2 = 0.5 * (modExtend2[3] + modExtend2[2]), ys2 = 0.5 * (modExtend2[3] - modExtend2[2]);
449 const double dx = xm2 - xm1, dy = ym2 - ym1;
450 return (pow(dx * dx + dy * dy, 2) / (pow((xs1 + xs2) * dx, 2) + pow((ys1 + ys2) * dy, 2)) < 2.);
460 rb_Hit::rb_Hit(
const int iHit,
const int mod,
const int row,
const TrackerHit& aHit) :
461 _hitNum(iHit), _hitModule(mod), _hitRow(row), _hitX(aHit.getPosition()[0]), _hitY(aHit.getPosition()[1]), _hitZ(
462 aHit.getPosition()[2]), _hitPhiMeas(_calcPhiMeas(aHit)), _hitVarXY(_getVarXY(aHit.getCovMatrix())), _hitVarR(
463 _getVarR(aHit.getCovMatrix())), _hitVarZ(_getVarZ(aHit.getCovMatrix())), _used(false), _cosb(1.) {
478 const gear::TPCModule &module = Global::GEAR->getTPCParameters().getModule(
_hitModule);
480 if (module.getLocalPadLayout().getCoordinateType() == gear::PadRowLayout2D::POLAR) {
481 Vector2D correction = module.getOffset();
482 phi = atan2(aHit.getPosition()[0] - correction[0], correction[1] - aHit.getPosition()[1]);
485 phi = module.getAngle();
499 return (var > 0.) ? var : 1.;
519 return (covMatrix[5] > 0.) ? covMatrix[5] : 1.;
609 double rb_Hit::getDistXY(
const double x,
const double y,
const double ex,
const double ey)
const {
627 double pos1[3], pos2[3], dx, dy, dz, ds, dr;
635 _cosPhi = cos(_phiMeas);
636 _sinPhi = sin(_phiMeas);
638 _xav = 0.5 * (pos1[0] + pos2[0]);
639 _yav = 0.5 * (pos1[1] + pos2[1]);
640 _zav = 0.5 * (pos1[2] + pos2[2]);
642 dx = pos2[0] - pos1[0];
643 dy = pos2[1] - pos1[1];
644 dz = pos2[2] - pos1[2];
645 ds = sqrt(dx * dx + dy * dy);
646 dr = dx * _sinPhi - dy * _cosPhi;
648 _phi = atan2(dy, dx);
657 _der2XY = (1. - cosb2) / cosb2;
658 _der2Z = _tanl * _tanl / cosb2;
673 const double dz = hit->
getDistZ(_zav);
675 if (abs(dz) > distCut)
return false;
676 const double dxy = hit->
getDistXY(_xav, _yav, _cosPhi, _sinPhi);
678 if (abs(dxy) > distCut)
return false;
679 const double chi2xy = dxy * dxy / (hit->
getVarXY(_der2XY) + 0.25 * _varXY);
680 const double chi2z = dz * dz / (hit->
getVarZ(_der2Z) + 0.25 * _varZ);
682 return (chi2xy < chi2Cut and chi2z < chi2Cut);
699 double& cosb,
double& varXY,
double& varZ)
const {
728 _hit[0] = doublet.
getHit(0);
730 _hit[2] = doublet.
getHit(1);
732 double sumVarXY, sumVarZ;
733 doublet.
getParameters(_posX, _posY, _posZ, _phiMeas, _phi, _tanl, _length,
_cosb, sumVarXY, sumVarZ);
735 _varXY[0] = 0.25 * sumVarXY;
736 _varXY[1] = sumVarXY / (_length * _length);
737 _varZ[0] = 0.25 * sumVarZ;
738 _varZ[1] = sumVarZ / (_length * _length);
743 return _hit[1]->getRow();
776 return _varXY[0] + _varXY[1] * ds * ds;
789 return _varZ[0] + _varZ[1] * ds * ds;
833 if (rowDiff == 0)
return false;
835 const double dphi = trp->
getPhi() - _phi;
836 const double dtanl = trp->
getTanl() - _tanl;
837 const double varXYDir = this->getVarXYDir() + trp->
getVarXYDir();
838 const double varZDir = this->getVarZDir() + trp->
getVarZDir();
840 if (dphi * dphi / varXYDir > dirCut or dtanl * dtanl / varZDir > dirCut)
return false;
842 double midPos1[3], midPos2[3], ds1, ds2;
843 const double xav = 0.5 * (_posX + trp->
getX());
844 const double yav = 0.5 * (_posY + trp->
getY());
845 this->getPosCloseTo(xav, yav, midPos1, ds1);
848 const double dxy = (midPos2[0] - midPos1[0]) * cos(phiMeas) + (midPos2[1] - midPos1[1]) * sin(phiMeas);
849 const double dz = midPos2[2] - midPos1[2];
850 const double varXYPos = this->getVarXYPos(ds1) + trp->
getVarXYPos(ds2);
851 const double varZPos = this->getVarZPos(ds1) + trp->
getVarZPos(ds2);
852 const double chi2xy = dxy * dxy / varXYPos;
853 const double chi2z = dz * dz / varZPos;
855 return (chi2xy < posCut and chi2z < posCut);
866 const double ex = cos(_phi);
867 const double ey = sin(_phi);
868 ds = (xref - _posX) * ex + (yref - _posY) * ey;
869 position[0] = _posX + ds * ex;
870 position[1] = _posY + ds * ey;
871 position[2] = _posZ + _tanl * ds;
891 _segId(0), _hitList(), _bzc(Bzc), _npar((Bzc != 0.) ? 5 : 4), _parameters(_npar), _covariance(_npar) {
893 for (trpListType::iterator itTrp = triplets.begin(); itTrp != triplets.end(); ++itTrp) {
894 for (
int i = 0; i < 3; ++i) {
895 rb_Hit* iHit = (*itTrp)->getHit(i);
898 rowList[iHit->
getRow()].push_back(iHit);
899 iHit->
setUsed((*itTrp)->getCosBeta());
904 for (rowHitMapType::iterator itRow = rowList.begin(); itRow != rowList.end(); ++itRow) {
905 if (itRow->second.size() == 1)
_hitList.push_back(itRow->second[0]);
921 for (hitListType::iterator itHit = hits.begin(); itHit != hits.end(); ++itHit) {
925 rowList[iHit->
getRow()].push_back(iHit);
929 for (rowHitMapType::iterator itRow = rowList.begin(); itRow != rowList.end(); ++itRow) {
930 if (itRow->second.size() <= maxHitsPerRow)
931 for (hitListType::iterator itHit = itRow->second.begin(); itHit != itRow->second.end(); ++itHit) {
950 if (segments.size() > 1) {
953 for (segListType::iterator itSeg = segments.begin(); itSeg != segments.end(); ++itSeg) {
955 for (hitListType::iterator itH = hits.begin(); itH != hits.end(); ++itH)
956 rowList[(*itH)->getRow()].push_back(*itH);
959 for (rowHitMapType::iterator itRow = rowList.begin(); itRow != rowList.end(); ++itRow) {
960 if (itRow->second.size() == 1)
_hitList.push_back(itRow->second[0]);
964 double oldRef[3], oldPar[5];
968 for (segListType::iterator itSeg = segments.begin(); itSeg != segments.end(); ++itSeg) {
969 (*itSeg)->getPar(oldPar);
970 (*itSeg)->getRefPoint(oldRef);
972 TVectorD newPar(
_npar);
973 TMatrixDSym cov((*itSeg)->getCov()), newCov(
_npar);
976 if (itSeg == segments.begin()) {
984 TMatrixDSym weight2(newCov);
986 TMatrixDSym combCov(weight1 + weight2);
988 TVectorD combPar(combCov * (weight1 *
_parameters + weight2 * newPar));
990 _chi2 += weight1.Similarity(resPrev);
991 TVectorD resCurr(newPar - combPar);
992 _chi2 += weight2.Similarity(resCurr);
997 _ndf += (*itSeg)->getNdf();
998 _chi2 += (*itSeg)->getChi2();
1006 seg->getRefPoint(refPoint);
1007 _refX = refPoint[0];
1008 _refY = refPoint[1];
1009 _refZ = refPoint[2];
1012 _ndf = seg->getNdf();
1013 _chi2 = seg->getChi2();
1038 position[0] =
_refX;
1039 position[1] =
_refY;
1040 position[2] =
_refZ;
1059 for (
int i = 0; i <
_npar; ++i)
1108 if (max(f1, f2) <= min(l1, l2) - trpStepSize)
return false;
1110 if (min(abs(l1 - f2), abs(l2 - f1)) > (l1 + l2 - f1 - f2) / 2)
return false;
1112 double refPoint1[3], refPoint2[3], par1[5], par2[5];
1120 const double xav = 0.5 * (refPoint1[0] + refPoint2[0]);
1121 const double yav = 0.5 * (refPoint1[1] + refPoint2[1]);
1122 const double zav = 0.5 * (refPoint1[2] + refPoint2[2]);
1126 hlx1.
getStateAt(xav, yav, zav, cov1, newPar1, newCov1);
1127 hlx2.
getStateAt(xav, yav, zav, cov2, newPar2, newCov2);
1128 TVectorD diffPar(newPar1 - newPar2);
1129 TMatrixDSym diffPrec(newCov1 + newCov2);
1132 double chi2 = diffPrec.Similarity(diffPar);
1134 return (chi2 < chi2Cut *
_npar);
1147 double refPoint[3], par[5], pos[3], phiMeas, xyPos, zPos, sArc, phi, lambda;
1156 const double cosb2 = pow(sin(phiMeas - phi), 2);
1157 const double der2XY = (1. - cosb2) / cosb2;
1158 const double der2Z = pow(tan(lambda), 2) / cosb2;
1159 TVectorD newPar(
_npar);
1162 pos[0] += xyPos * cos(phiMeas);
1163 pos[1] += xyPos * sin(phiMeas);
1165 hlx.
getStateAt(pos[0], pos[1], pos[2], cov, newPar, newCov);
1166 double chi2xy = xyPos * xyPos / (newCov[
_npar - 3][
_npar - 3] / (cosb2) + hit->
getVarXY(der2XY));
1167 double chi2z = zPos * zPos / (newCov[
_npar - 1][
_npar - 1] + hit->
getVarZ(der2Z));
1169 return (chi2xy < chi2Cut and chi2z < chi2Cut);
1179 for (hitListType::iterator itHit = hits.begin(); itHit != hits.end(); ++itHit) {
1180 if ((*itHit)->getUsed())
continue;
1181 if (this->
match(*itHit, chi2Cut)) matchingHits.push_back(*itHit);
1195 double refPoint[3], par[5];
1199 TVectorD tmpPar(
_npar);
1202 hlx.
getStateAt(refPos[0], refPos[1], refPos[2], cov, tmpPar, tmpCov);
1204 newPar = hlx2LCIO * tmpPar;
1205 newCov = tmpCov.Similarity(hlx2LCIO);
1210 double pos1[3], pos2[3];
1213 _refX = 0.5 * (pos1[0] + pos2[0]);
1214 _refY = 0.5 * (pos1[1] + pos2[1]);
1215 _refZ = 0.5 * (pos1[2] + pos2[2]);
1220 unsigned int nHit =
_hitList.size();
1233 double pos[3], sArc, chi2XY, chi2ZS, cosb2, der2XY, derZ, phi, dzds;
1234 double parameters[] = { 0., 0., 0., 0., 0. };
1235 int nParXY, nPointXY, nPointZS, nParZS;
1238 for (hitListType::iterator itH =
_hitList.begin(); itH !=
_hitList.end(); ++itH) {
1239 xyPreFit.
addPoint((*itH)->getX(), (*itH)->getY(), 1.0);
1241 nParXY = xyPreFit.
fit(chi2XY, nPointXY);
1243 for (
int i = 0; i < nParXY; ++i)
1249 for (hitListType::iterator itH =
_hitList.begin(); itH !=
_hitList.end(); ++itH) {
1250 (*itH)->getPos(pos);
1252 phi = parameters[0] * sArc + parameters[1];
1253 cosb2 = pow(sin(phi - (*itH)->getPhiMeas()), 2);
1254 der2XY = (1. - cosb2) / cosb2;
1255 xyFit.
addPoint(pos[0], pos[1], 1.0 / ((*itH)->getVarXY(der2XY) * cosb2));
1257 nParXY = xyFit.
fit(chi2XY, nPointXY);
1260 for (
int i = 0; i < nParXY; ++i)
1266 for (hitListType::iterator itH =
_hitList.begin(); itH !=
_hitList.end(); ++itH) {
1267 (*itH)->getPos(pos);
1269 zsPreFit.
addPoint(sArc, pos[2] - _refZ, 1.0);
1271 nParZS = zsPreFit.
fit(chi2ZS, nPointZS);
1276 for (hitListType::iterator itH =
_hitList.begin(); itH !=
_hitList.end(); ++itH) {
1277 (*itH)->getPos(pos);
1279 phi = parameters[0] * sArc + parameters[1];
1280 cosb2 = pow(sin(phi - (*itH)->getPhiMeas()), 2);
1281 derZ = dzds * dzds / cosb2;
1282 zsFit.
addPoint(sArc, pos[2] - _refZ, 1.0 / (*itH)->getVarZ(derZ));
1284 nParZS = zsFit.
fit(chi2ZS, nPointZS);
1289 _chi2 = chi2XY + chi2ZS;
1298 for (hitListType::const_iterator itH =
_hitList.begin(); itH !=
_hitList.end(); ++itH)
1299 rowMap[(*itH)->getRow()] = 1;
1309 const int row = hit->
getRow();
1310 if (row >
_hitList.back()->getRow())
1313 for (hitListType::iterator itH =
_hitList.begin(); itH !=
_hitList.end(); ++itH)
1314 if ((*itH)->getRow() > row) {
1324 _index(), _matches() {
1352 for (std::vector<std::pair<int, int> >::iterator it =
_matches.begin(); it !=
_matches.end(); ++it) {
1356 int i2 = it->second;
1359 if (i1 != i2)
_index[i1] = i2;
1362 for (std::map<int, int>::iterator it =
_index.begin(); it !=
_index.end(); ++it) {
1367 std::map<int, std::vector<int> > classes;
1368 for (std::map<int, int>::iterator it =
_index.begin(); it !=
_index.end(); ++it) {
1369 classes[it->second].push_back(it->first);
double _getVarXY(FloatVec)
Get variance in XY measurement direction (from float vector).
int fit(double &, int &)
Perform fit.
int getNdf() const
Get number of degrees of freedom (of segment fit).
const int _hitRow
row number
bool _encodedModuleID
Module ID is encoded in CellID0.
int getLastRow() const
Get first last number.
double _segCut
Chi2/Ndf cut for segment matching (Ndf=4 for B off, 5 for B on)
double getCosBeta() const
Get cos(beta).
double getX() const
Get X coordinate.
const double _hitZ
Z position.
double _getVarZ(FloatVec)
Get variance in Z measurement direction (from float vector).
double getVarZDir() const
Get Z variance (direction: tan(lambda)).
double getVarXY(const double=0.) const
Get XY variance.
void setUsed(const double)
Set use flag.
const double _hitVarR
variance in radial direction
bool match(rb_Hit *, const double, const double) const
Match doublet with third hit.
std::map< int, std::vector< int > > _modNeighbours
neighbour modules
double getCosBeta() const
Get cos(beta).
void getPar(double *) const
Get (all five helix) parameters from segment fit.
int getMod() const
Get module number.
void getPos(double *) const
Get position.
void setId(int)
Set segment ID.
int _npar
number of parameters (5: helix, 4: line)
std::vector< rb_Triplet * > trpListType
const TVectorD & getPar() const
Get parameter vector.
std::map< int, segListType > modSegMapType
double getVarZ(const double=0.) const
Get Z variance.
TMatrixDSym getCov() const
Get covariance matrix.
double _chi2
chi2 from segment fit
double getPhiMeas() const
Get XY measurement direction.
virtual void check(EVENT::LCEvent *evt)
bool match(rb_Segment *, const double, const int) const
Match segment with other segment.
std::map< int, std::vector< int > > getClasses()
Get equivalence classes.
double _refY
Y of reference point.
double _posCut
Chi2 cut for triplet position matching in XY and Z.
double getY() const
Get Y coordinate.
bool getExpectedPlanePos(const double *, const double, double &, double &, double &, double &, double &) const
Get expected position (and direction) in plane.
double getVarXYPos(const double=0.) const
Get XY variance (position).
void getPos(double *) const
Get position.
const TMatrixDSym & getCov() const
Get covariance matrix.
RowTripletBasedTrackFinderProcessor aRowTripletBasedTrackFinderProcessor
const double _hitX
X position.
void addPoint(double, double, double)
Add point.
double getPhi() const
Get direction in XY.
void fillRowMap(std::map< int, int > &) const
Fill row map.
const double _hitY
Y position.
const int _hitModule
module number
double getVarXYDir() const
Get XY variance (direction: phi).
void getStateAt(const double, const double, const double, TMatrixDSym &, TVectorD &, TMatrixDSym &)
Get state (parameters, covariance matrix) at point.
double getX() const
Get X coordinate.
double _trpCut
Chi2 cut for triplet definition on XY and Z residuals.
void addIndex(int)
Add index.
bool areNeighbourModules(gear::TPCModule *, gear::TPCModule *, bool)
Check if modules are neighbours.
double _bzc
magnetic field strength (Bz*c)
void fitSegment(double)
Fit segment from hits.
double _Bzc
magnetic field strength (Bz*c)
std::string _outputColName
Name of the output collection.
TMatrixDSym _covariance
covariance matrix
rb_Segment(double, trpListType)
Construct row based segment from (unused hits of) triplets.
int fit(double &, int &)
Perform fit.
const hitListType & getHitList() const
Get list of hits.
double _unusedCut
Chi2 cut for matching unused hits in XY and Z.
std::string _inputColName
Name of the input collection.
double _Ycenter
TPC center, Y coordinate.
double _distCut
Coarse cut on XY and Z residuals for triplet preselection.
int getRow() const
Get row number.
virtual void processRunHeader(EVENT::LCRunHeader *run)
double _dirCut
Chi2 cut for triplet direction matching in XY and Z.
int _ndf
number of degrees of freedom of segment fit
virtual void init()
Initialize processor.
void calcRefPoint()
Calculate reference point (from first and last hit).
bool _refAtPCA
Use Pca as reference point (else 1. hit)
const int _hitNum
input hit collection index
double getPhiMeas() const
Get XY measurement direction (average of outer hits).
double getDistZ(const double) const
Get distance to point in Z.
std::vector< rb_Segment * > segListType
std::vector< rb_Hit * > hitListType
double getTanl() const
Get slope in ZS.
std::vector< std::pair< int, int > > _matches
list of matches
int _maxGap
Cut for (row) distance to segment for matching unused hits in XY and Z.
int getRow() const
Get row number (of center hit).
TVectorD _parameters
parameter vector
double getDistXY(const double, const double, const double, const double) const
Get distance to point in XY (along direction)
void getLCIOStateAtRefPoint(const double *, TVectorD &, TMatrixDSym &) const
Get segment state at reference point.
TVectorD getPar() const
Get parameters vector.
const double _hitPhiMeas
measurement direction in XY (tangential to row)
double getZ() const
Get Z coordinate.
void addPoint(double, double, double)
Add point.
double _Xcenter
TPC center, X coordinate.
double _getVarR(FloatVec)
Get variance in radial direction (from float vector).
double _refZ
Z of reference point.
double getZ() const
Get Z coordinate.
rb_Triplet(rb_Doublet &, rb_Hit *)
Construct row based triplet.
std::map< int, int > _index
index list
double getBzc() const
Get Bz*c.
std::map< int, rowHitMapType > modHitMapType
int getHitNum() const
Get index to input hit collection.
bool getUsed() const
Get use flag.
void getParameters(double &, double &, double &, double &, double &, double &, double &, double &, double &, double &) const
Get parameters.
double _bfieldScaleFactor
scale factor for magnetic field (default: 1.0)
TMatrixDSym getCov() const
Get covariance matrix.
hitListType _hitList
pointers to hits
double getY() const
Get Y coordinate.
double getArcLengthXY(const double *) const
Get (2D) arc length for given point.
void addHit(rb_Hit *)
Add (unused) hit to segment.
double _refX
X of reference point.
rb_Doublet(rb_Hit *, rb_Hit *)
Construct row based doublet.
void getRefPoint(double *) const
Get reference point.
int getFirstRow() const
Get first row number.
rb_Hit * getHit(const int) const
Get hit.
TMatrixD helixToLCIOJacobian() const
Get transformation from helix to LCIO track parameters (at reference point)
virtual void processEvent(EVENT::LCEvent *evt)
Process event.
double getChi2() const
Get chi2 from segment fit.
std::map< int, hitListType > rowHitMapType
TVectorD getPar() const
Get parameters vector.
int getId() const
Get segment ID.
simpleEquiClasses()
Construct simple equivalence class.
rb_Hit * getHit(const int) const
Get hit.
rb_Hit(const int iHit, const int mod, const int row, const EVENT::TrackerHit &aHit)
Construct row based hit.
double _calcPhiMeas(const EVENT::TrackerHit &aHit)
Calculate measurement direction (in XY).
Track finder based on triplets of rows.
double getVarZPos(const double=0.) const
Get Z variance (position).
const double _hitVarZ
variance for Z measurement
bool match(rb_Triplet *, const double, const double) const
Match triplet with other triplet.
void addMatch(std::pair< int, int >)
Add match.
const double _hitVarXY
variance for XY measurement
void getPosCloseTo(const double, const double, double *, double &) const
Get position close to reference point.