00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include "TkrRecon/GFparticle.h"
00018
00019
00020
00021
00022
00023
00024 GFtrack::GFtrack(SiCluster::view axis,
00025 double sigmaCut,
00026 double energy,
00027 int ist,
00028 const Ray& testRay,
00029 bool run)
00030 : GFbase(sigmaCut,energy,ist,testRay),
00031 m_axis(axis), m_status(EMPTY),
00032 m_qbest(-1e6), m_gaps(0), m_istGaps(0), m_lstLayer(0), m_noisyHits(0),
00033 m_istNoisyHits(0)
00034
00035 {
00036 ini();
00037 if (run == true) {
00038 doit();
00039 fit();
00040 if (empty()) clear();
00041 }
00042 }
00043
00044
00045 void GFtrack::flagAllHits(int iflag)
00046
00047 {
00048 for(unsigned int i=0; i<kplanelist.size(); i++) {
00049 GFtutor::_DATA->flagHit(m_axis, kplanelist[i].getIDHit(), iflag);
00050 }
00051 }
00052
00053
00054 void GFtrack::unFlagAllHits()
00055
00056 {
00057 for (unsigned i=0; i<kplanelist.size(); i++) {
00058 GFtutor::_DATA->unflagHit(m_axis, kplanelist[i].getIDHit());
00059 }
00060 }
00061
00062 bool GFtrack::empty() const
00063
00064 {
00065 bool empty = GFdata::empty();
00066 if (firstLayer() < 0) empty = true;
00067 if (numDataPoints() < GFcontrol::minSegmentHits) empty = true;
00068 if (chiSquare() < 0.) empty = true;
00069 return empty;
00070 }
00071
00072
00073 bool GFtrack::accept() const
00074
00075 {
00076 bool valid = false;
00077 if (empty()) return valid;
00078
00079 if (chiSquare() > GFcontrol::maxChiSq) return valid;
00080 if (Q() < GFcontrol::minQ) return valid;
00081 int idhit;
00082 double sigma;
00083 if (GFtutor::CUT_veto) {
00084 if (veto(idhit,sigma)) return valid;
00085 }
00086
00087 valid = true;
00088 return valid;
00089 }
00090
00091 void GFtrack::clear()
00092
00093 {
00094
00095 KalTrack::clear();
00096
00097 m_lstGaps = 0;
00098 m_runChiSquare = 0.;
00099 m_gaps = 0;
00100 m_istGaps = 0;
00101 m_lstLayer = 0;
00102 m_noisyHits = 0;
00103 m_istNoisyHits = 0;
00104
00105 m_status = EMPTY;
00106
00107 if (_mGFsegment) _mGFsegment->clear();
00108
00109 m_qbest = -1e6;
00110 GFdata::ini();
00111 setAlive();
00112
00113 }
00114
00115
00116 void GFtrack::writeOut(MsgStream& log) const
00117
00118 {
00119
00120 int axis = getAxis();
00121 int status = m_status;
00122 log << MSG::DEBUG << " --- GFtrack::writeOut --- " << endreq;
00123 log << MSG::DEBUG << " axis = " << axis << endreq;
00124 log << MSG::DEBUG << " Qbest = " << Qbest() << endreq;
00125 log << MSG::DEBUG << " last Layer = " << lastLayer() << endreq;
00126 log << MSG::DEBUG << " num Hits = " << numDataPoints() << endreq;
00127 log << MSG::DEBUG << " num Gaps = " << numGaps() << endreq;
00128 log << MSG::DEBUG << " num First Gaps = " << numFirstGaps() << endreq;
00129 log << MSG::DEBUG << " num Noise = " << numNoise() << endreq;
00130 log << MSG::DEBUG << " num First Noise= " << numFirstNoise() << endreq;
00131 log << MSG::DEBUG << " last Status = " << status << endreq;
00132
00133
00134
00135
00136
00137
00138 }
00139
00140
00141 void GFtrack::draw(gui::DisplayRep& v)
00142
00143 {
00144 KalTrack::drawChiSq(v,m_axis,KalHit::SMOOTH);
00145 KalTrack::drawTrack(v,m_axis,KalHit::SMOOTH);
00146 }
00147
00148 bool GFtrack::veto(int& idhit, double& sigma) const
00149
00150 {
00151
00152 bool veto = false;
00153
00154 int klayer = firstKPlane().getIDPlane() -1;
00155 if (klayer < 0) return veto;
00156 _mGFsegment->previous(klayer);
00157
00158 if (_mGFsegment->status() == FOUND) {
00159 idhit = _mGFsegment->indexhit();
00160 sigma = _mGFsegment->getKPlane().getSigma(KalHit::PRED);
00161 if (sigma < GFcontrol::sigmaVeto) veto = true;
00162 }
00163
00164 return veto;
00165 }
00166
00167
00168
00169
00170
00171
00172 void GFtrack::ini()
00173
00174 {
00175 m_status = EMPTY;
00176
00177 m_gaps = 0;
00178 m_istGaps = 0;
00179 m_runChiSquare = 0.;
00180 m_lstGaps = 0;
00181 m_noisyHits = 0;
00182 m_istNoisyHits = 0;
00183 m_lstLayer = 0;
00184
00185 KalTrack::clear();
00186
00187 _mGFsegment = 0;
00188 _mGFsegment = new GFsegment(this);
00189
00190 m_qbest = -1e6;
00191 GFdata::ini();
00192 setAlive();
00193
00194 }
00195
00196
00197 void GFtrack::step(int kplane)
00198
00199 {
00200 if (!alive()) return;
00201
00202 m_status = EMPTY;
00203
00204 if (kplane > GFtutor::numPlanes()-1) return;
00205
00206 if (numDataPoints() == 0)
00207 {
00208 _mGFsegment->best(kplane);
00209 }
00210 else
00211 {
00212 _mGFsegment->next(kplane);
00213 }
00214
00215 m_status = _mGFsegment->status();
00216
00217 if (m_status == FOUND)
00218 {
00219 double segChiSquare = _mGFsegment->chiSquare();
00220 double maxChiSquare = numDataPoints() * 10. * m_runChiSquare;
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230 if (numDataPoints() < 4 || segChiSquare < 1. || segChiSquare < maxChiSquare)
00231 {
00232 kplanelist.push_back(_mGFsegment->getKPlane());
00233 if (numDataPoints() > 2) m_runChiSquare += segChiSquare;
00234 }
00235 else
00236 {
00237 setStatus(EMPTY);
00238 }
00239 }
00240
00241 }
00242
00243
00244 void GFtrack::anastep(int kplane)
00245
00246 {
00247 if (!alive()) return;
00248
00249 contability(kplane);
00250 if (end()) {
00251 kill();
00252 }
00253 }
00254
00255
00256 void GFtrack::contability(int kplane)
00257
00258 {
00259 if (!alive()) return;
00260
00261 if (m_status != FOUND) {
00262 m_lstGaps++;
00263 if (numDataPoints()>0 && numDataPoints()<3) m_istGaps++;
00264 }
00265
00266
00267 if (m_status == EMPTY) m_gaps++;
00268
00269 if (m_status == FOUND && numDataPoints() > 0) {
00270 m_lstGaps =0;
00271
00272 m_lstLayer = lastKPlane().getIDPlane();
00273 int indexHit = lastKPlane().getIDHit();
00274
00275
00276
00277
00278
00279 }
00280
00281
00282
00283 }
00284
00285
00286 void GFtrack::fit()
00287
00288 {
00289
00290 GFdata::ini();
00291
00292 if (kplanelist.size()< 3) {
00293 KalTrack::clear();
00294 return;
00295 }
00296
00297
00298
00299
00300 KalTrack::doFit();
00301
00302
00303 loadGFdata();
00304 }
00305
00306 void GFtrack::loadGFdata()
00307
00308 {
00309
00310
00311
00312
00313 double x0,y0,z0;
00314 double slopex,slopey;
00315 x0=y0=z0=0.;
00316 slopex=slopey=0.;
00317 z0=kplanelist[0].getZPlane();
00318 if (m_axis == SiCluster::X) {
00319 x0=position(0.);
00320 slopex=slope();
00321 } else {
00322 y0=position(0.);
00323 slopey=slope();
00324 }
00325 m_vertex = Point(x0,y0,z0);
00326 double factor = -1.;
00327 m_direction = Vector(factor*slopex,factor*slopey,factor).unit();
00328 m_RCenergy = KalEnergy();
00329 m_quality = computeQuality();
00330 m_firstLayer = kplanelist[0].getIDPlane();
00331 m_nhits = numDataPoints();
00332 m_itower = kplanelist[0].getIDTower();
00333
00334 }
00335
00336
00337 double GFtrack::computeQuality() const
00338
00339 {
00340 double quality = 0.;
00341 quality = 27./(9.+chiSquare()) + 15./(5.+chiSquareSegment()) +
00342 2.*(numDataPoints()-3.) - numGaps() - 5.*numFirstGaps();
00343
00344 return quality;
00345 }
00346
00347 bool GFtrack::end() const
00348
00349 {
00350 bool end = !alive();
00351 if (m_lstGaps >= GFcontrol::maxConsecutiveGaps) end = true;
00352 return end;
00353 }
00354
00355
00356 void GFtrack::kill()
00357
00358 {
00359 if (m_status == EMPTY) {
00360 m_gaps+=(-m_lstGaps);
00361 m_lstGaps = 0;
00362 }
00363 m_status = EMPTY;
00364
00365 m_alive = false;
00366
00367 }
00368
00369 void GFtrack::setAlive()
00370
00371 {
00372 m_alive = true;
00373 }
00374
00375 void GFtrack::setIniEnergy(double ene)
00376
00377 {
00378 m_iniEnergy = ene;
00379 KalTrack::setIniEnergy(ene);
00380 }
00381
00382
00383 KalPlane GFtrack::firstKPlane() const
00384
00385 {
00386 if (kplanelist.size() == 0) {
00387 std::cout << "ERROR GFtrack::thisKPlane " << endreq;
00388 return originalKPlane();
00389 }
00390 return kplanelist.front();
00391 }
00392
00393
00394 KalPlane GFtrack::lastKPlane() const
00395
00396 {
00397 if (kplanelist.size() == 0) {
00398 return originalKPlane();
00399 }
00400 return kplanelist.back();
00401 }
00402
00403 KalPlane GFtrack::previousKPlane() const
00404
00405 {
00406 if (kplanelist.size() <= 1) {
00407
00408 return originalKPlane();
00409 }
00410 int iprevious = kplanelist.size()-2;
00411 if (iprevious == -1) return originalKPlane();
00412 return kplanelist[iprevious];
00413 }
00414
00415 KalPlane GFtrack::originalKPlane() const
00416
00417 {
00418
00419 Ray testRay(m_inVertex,m_inDirection);
00420
00421 double x0=testRay.position(0.).x();
00422 double y0=testRay.position(0.).y();
00423 double z0=testRay.position(0.).z();
00424
00425 double dirX=testRay.direction().x();
00426 double dirY=testRay.direction().y();
00427 double dirZ=testRay.direction().z();
00428
00429 double x = 0.;
00430 double x_orth = 0.;
00431 m_axis == SiCluster::X? x = x0: x=y0;
00432 m_axis == SiCluster::X? x_orth = y0: x_orth = x0;
00433
00434 double slope=0.;
00435 double slope_orth=0.;
00436 if (dirZ != 0.) {
00437 slope = (m_axis == SiCluster::X? dirX/dirZ: dirY/dirZ);
00438 slope_orth = (m_axis == SiCluster::X? dirY/dirZ: dirX/dirZ);
00439 }
00440
00441 KalPar porth(x_orth, slope_orth);
00442
00443 KalPar pfit(x,slope);
00444
00445
00446
00447
00448 double sigma2Slope = GFcontrol::iniErrorSlope * GFcontrol::iniErrorSlope;
00449 double sigma2Position = GFcontrol::iniErrorPosition * GFcontrol::iniErrorPosition;
00450 KalMatrix covfit(sigma2Position,sigma2Slope,0.);
00451
00452 KalHit hitfit(KalHit::FIT, pfit, covfit);
00453
00454 KalPlane kp(-1,m_iniLayer-1,m_iniEnergy, z0, porth, hitfit);
00455
00456 return kp;
00457 }
00458
00459
00460 void GFtrack::removeStep(int iplane)
00461
00462 {
00463 if (iplane == -1) iplane = numDataPoints()-1;
00464
00465
00466 if (iplane == numDataPoints()-1) {
00467 kplanelist.pop_back();
00468 } else {
00469
00470 }
00471
00472 setStatus(EMPTY);
00473 }
00474
00475
00476 double GFtrack::doQbest()
00477
00478 {
00479 double qbest = -1e6;
00480 if (numDataPoints()<3) return qbest;
00481 KalTrack::doFit();
00482 loadGFdata();
00483
00484 m_qbest = Q();
00485 GFdata::ini();
00486 return m_qbest;
00487 }
00488
00489
00490 void GFtrack::associateOrthStep(const GFtrack* _GFtrk, KalHit::TYPE typ)
00491
00492 {
00493
00494 if (numDataPoints() >=1 && _GFtrk->numDataPoints() >=1 && m_status == FOUND) {
00495
00496 KalPar XPar = _GFtrk->lastKPlane().getHit(typ).getPar();
00497
00498 double dz = kplanelist.back().getZPlane()-
00499 _GFtrk->kplanelist.back().getZPlane();
00500 double x0 = XPar.getPosition()+dz*XPar.getSlope();
00501 KalPar OrthPar(x0,XPar.getSlope());
00502
00503 kplanelist.back().setOrthPar(OrthPar);
00504 }
00505 }
00506
00507
00508 void GFtrack::associateOrthGFtrack(const GFtrack* _GFtrk, bool fix, KalHit::TYPE typ)
00509
00510 {
00511 if (numDataPoints() == 0 || _GFtrk->numDataPoints() == 0) return;
00512
00513 double XLIMIT = -91.;
00514 double SLOPENULL = 0.;
00515 int mplanes = _GFtrk->numDataPoints();
00516 for ( int iplane = 0; iplane < numDataPoints(); iplane++) {
00517 int idplane = kplanelist[iplane].getIDPlane();
00518 int jplane = -1;
00519 int jdplane = 0;
00520 do {
00521 jplane++;
00522 jdplane = _GFtrk->kplanelist[jplane].getIDPlane();
00523 } while (jdplane <= idplane && jplane+1 < mplanes-1);
00524 if (jdplane > idplane && jplane > 0) jplane--;
00525
00526
00527 KalPar Ypar = _GFtrk->kplanelist[jplane].getHit(typ).getPar();
00528 double dz = kplanelist[iplane].getZPlane()
00529 - _GFtrk->kplanelist[jplane].getZPlane();
00530 double x0 = Ypar.getPosition()+dz*Ypar.getSlope();
00531 double slope0 = Ypar.getSlope();
00532 if (!fix) {
00533 x0 = XLIMIT;
00534 slope0 = SLOPENULL;
00535 }
00536 KalPar OrthPar(x0,slope0);
00537
00538 kplanelist[iplane].setOrthPar(OrthPar);
00539 }
00540 }
00541
00542
00543
00544
00545
00546
00547 GFparticle::GFparticle(double sigmaCut,
00548 double energy,
00549 int ist,
00550 const Ray& testRay,
00551 bool run) : GFbase(sigmaCut,energy,ist,testRay)
00552
00553 {
00554 ini();
00555 if (run == true) {
00556 doit();
00557 fit();
00558 if (empty()) clear();
00559 }
00560 }
00561
00562
00563 void GFparticle::flagAllHits(int iflag)
00564
00565 {
00566 _mXGFtrack->flagAllHits(iflag);
00567 _mYGFtrack->flagAllHits(iflag);
00568 }
00569
00570
00571 void GFparticle::unFlagAllHits()
00572
00573 {
00574 _mXGFtrack->unFlagAllHits();
00575 _mYGFtrack->unFlagAllHits();
00576 }
00577
00578 bool GFparticle::empty() const
00579
00580 {
00581 bool empty = GFdata::empty();
00582 if (empty) return empty;
00583 empty = _mXGFtrack->empty() || _mYGFtrack->empty();
00584 return empty;
00585 }
00586
00587
00588 bool GFparticle::accept() const
00589
00590 {
00591 bool valid = false;
00592 if (empty()) return valid;
00593
00594 if (Q() < GFcontrol::minQ) return valid;
00595
00596 if (GFtutor::CUT_veto) {
00597 int idhitX = -1;
00598 double sigmaX = -1.;
00599 int idhitY = -1;
00600 double sigmaY = -1.;
00601 if (_mXGFtrack->veto(idhitX,sigmaX) &&
00602 _mYGFtrack->veto(idhitY,sigmaY)) return valid;
00603 }
00604
00605 valid = true;
00606 return valid;
00607 }
00608
00609 void GFparticle::clear()
00610
00611 {
00612 _mXGFtrack->clear();
00613 _mYGFtrack->clear();
00614
00615 m_gaps = 0;
00616 m_istGaps= 0;
00617 m_noisyHits = 0;
00618 m_istNoisyHits = 0;
00619 m_lstLayer = 0;
00620
00621 m_status = EMPTY;
00622 m_associate = true;
00623 m_conflictPattern = false;
00624
00625 m_qbest = -1e6;
00626 GFdata::ini();
00627 setAlive();
00628
00629 }
00630
00631
00632 void GFparticle::writeOut(MsgStream& log) const
00633
00634 {
00635
00636 int status = m_status;
00637 log << MSG::DEBUG << " --- GFparticle::writeOut --- " << endreq;
00638 log << MSG::DEBUG << " Qbest = " << Qbest() << endreq;
00639 log << MSG::DEBUG << " last Layer = " << lastLayer() << endreq;
00640 log << MSG::DEBUG << " num Gaps = " << numGaps() << endreq;
00641 log << MSG::DEBUG << " num First Gaps = " << numFirstGaps() << endreq;
00642 log << MSG::DEBUG << " num Noise = " << numNoise() << endreq;
00643 log << MSG::DEBUG << " num First Noise= " << numFirstNoise() << endreq;
00644 log << MSG::DEBUG << " last Status = " << status << endreq;
00645
00646 GFdata::writeOut(log);
00647
00648 log << MSG::DEBUG << " --> X - GFtrack : " << endreq;
00649 _mXGFtrack->writeOut(log);
00650 log << MSG::DEBUG << " --> Y - GFtrack : " << endreq;
00651 _mYGFtrack->writeOut(log);
00652 }
00653
00654
00655 void GFparticle::draw(gui::DisplayRep& v)
00656
00657 {
00658 v.setColor("black");
00659 _mXGFtrack->draw(v);
00660 _mYGFtrack->draw(v);
00661 }
00662
00663
00664
00665
00666
00667 void GFparticle::ini()
00668
00669 {
00670 m_gaps = 0;
00671 m_istGaps= 0;
00672 m_noisyHits = 0;
00673 m_istNoisyHits = 0;
00674 m_lstLayer = 0;
00675
00676 m_status = EMPTY;
00677 m_associate = true;
00678 m_conflictPattern = false;
00679
00680 Ray testRay(m_inVertex,m_inDirection);
00681 _mXGFtrack = new GFtrack(SiCluster::X, m_sigmaCut,
00682 m_iniEnergy, m_iniLayer, testRay, false);
00683
00684 _mYGFtrack = new GFtrack(SiCluster::Y, m_sigmaCut,
00685 m_iniEnergy, m_iniLayer, testRay, false);
00686
00687 m_qbest = -1e6;
00688 GFdata::ini();
00689 setAlive();
00690
00691 }
00692
00693
00694 void GFparticle::step(int kplane)
00695
00696 {
00697
00698 if (!alive()) return;
00699
00700 _mXGFtrack->step(kplane);
00701 _mYGFtrack->step(kplane);
00702
00703 if (m_associate) {
00704 associateStatus();
00705 associateStep();
00706 }
00707 }
00708
00709 void GFparticle::anastep(int kplane)
00710
00711 {
00712 if (!alive()) return;
00713
00714 _mXGFtrack->anastep(kplane);
00715 _mYGFtrack->anastep(kplane);
00716
00717 contability(kplane);
00718
00719 if (m_associate) {
00720 associateAnaStep();
00721 }
00722
00723 if (end()) {
00724 kill();
00725 }
00726 }
00727
00728
00729 void GFparticle::fit()
00730
00731 {
00732 GFdata::ini();
00733
00734 _mXGFtrack->fit();
00735 _mYGFtrack->fit();
00736
00737 if (!_mXGFtrack->empty() && !_mYGFtrack->empty())
00738 loadGFdata();
00739
00740 if (m_associate &&
00741 (!_mXGFtrack->empty() && !_mYGFtrack->empty()))
00742 associateFit();
00743 }
00744
00745
00746 bool GFparticle::end() const
00747
00748 {
00749 bool end = !alive();
00750
00751
00752 if (!_mXGFtrack->alive() || !_mYGFtrack->alive()) end = true;
00753 return end;
00754 }
00755
00756
00757 void GFparticle::kill()
00758
00759 {
00760 m_alive = false;
00761 _mXGFtrack->kill();
00762 _mYGFtrack->kill();
00763
00764 }
00765
00766 void GFparticle::setAlive()
00767
00768 {
00769 m_alive = true;
00770 _mXGFtrack->setAlive();
00771 _mYGFtrack->setAlive();
00772
00773 }
00774
00775
00776
00777 void GFparticle::loadGFdata()
00778
00779 {
00780 int ixlayer = _mXGFtrack->firstLayer();
00781 int iylayer = _mYGFtrack->firstLayer();
00782
00783 m_firstLayer = (ixlayer <= iylayer? ixlayer : iylayer);
00784
00785 int ixtower = _mXGFtrack->tower();
00786
00787 m_itower = ixtower;
00788
00789 m_nhits = _mXGFtrack->nhits() + _mYGFtrack->nhits();
00790
00791 m_quality = _mXGFtrack->Q() + _mYGFtrack->Q();
00792
00793 m_RCenergy = 0.5*(_mXGFtrack->RCenergy() + _mYGFtrack->RCenergy());
00794
00795 Ray XRay = _mXGFtrack->ray();
00796 Ray YRay = _mYGFtrack->ray();
00797 m_vertex=GFbase::doVertex(XRay, YRay);
00798
00799 m_direction = GFbase::doDirection(_mXGFtrack->direction(),_mYGFtrack->direction());
00800 }
00801
00802 void GFparticle::contability(int kplane)
00803
00804 {
00805 if (!alive()) return;
00806 }
00807
00808
00809 void GFparticle::associateStep()
00810
00811 {
00812 bool ok = false;
00813 bool done = false;
00814
00815 ok = GFparticle::sameTower(_mXGFtrack,_mYGFtrack);
00816 if (!ok) done = GFparticle::removeWorseStep(_mXGFtrack,_mYGFtrack);
00817
00818 if (!ok && !done) m_conflictPattern = true;
00819
00820 }
00821
00822
00823 void GFparticle::associateStatus()
00824
00825 {
00826 if (_mXGFtrack->status() == FOUND || _mYGFtrack->status() == FOUND)
00827 m_status = FOUND;
00828 else m_status = EMPTY;
00829 }
00830
00831
00832 void GFparticle::associateAnaStep()
00833
00834 {
00835 _mXGFtrack->associateOrthStep(_mYGFtrack);
00836 _mYGFtrack->associateOrthStep(_mXGFtrack);
00837 }
00838
00839
00840 void GFparticle::associateFit()
00841
00842 {
00843 _mXGFtrack->associateOrthGFtrack(_mYGFtrack, m_associate, KalHit::SMOOTH);
00844 _mYGFtrack->associateOrthGFtrack(_mXGFtrack, m_associate, KalHit::SMOOTH);
00845 }
00846
00847
00848 bool GFparticle::sameTower(const GFtrack* _GFtrack1, const GFtrack* _GFtrack2)
00849
00850 {
00851 bool sametower = true;
00852 int itower1 = 0;
00853
00854 if (_GFtrack1->status() == FOUND && _GFtrack1->numDataPoints() > 0) {
00855 itower1 = _GFtrack1->lastKPlane().getIDTower();
00856 }
00857 int itower2 = 0;
00858
00859 if (_GFtrack2->status() == FOUND && _GFtrack2->numDataPoints() > 0) {
00860 itower2 = _GFtrack2->lastKPlane().getIDTower();
00861 }
00862
00863 if (itower1 >= 10 && itower2 >= 10 && itower1 != itower2) sametower = false;
00864 return sametower;
00865 }
00866
00867 bool GFparticle::removeWorseStep(GFtrack* _GFtrack1, GFtrack* _GFtrack2)
00868
00869 {
00870 bool done = false;
00871
00872
00873
00874
00875 done = true;
00876
00877 int kplane1 = _GFtrack1->previousKPlane().getIDPlane();
00878 int kplane2 = _GFtrack2->previousKPlane().getIDPlane();
00879
00880
00881 if (kplane1 != kplane2) {
00882 if (kplane1 > kplane2) _GFtrack2->removeStep();
00883 else _GFtrack1->removeStep();
00884 return done;
00885 }
00886
00887 int nhits1 = _GFtrack1->numDataPoints();
00888 int nhits2 = _GFtrack2->numDataPoints();
00889
00890 double chi1 = _GFtrack1->lastKPlane().getDeltaChiSq(KalHit::FIT);
00891 double chi2 = _GFtrack2->lastKPlane().getDeltaChiSq(KalHit::FIT);
00892 if (nhits1 < 2 || nhits2 < 2) {
00893 if (_GFtrack1->_mGFsegment->accept() ||
00894 _GFtrack2->_mGFsegment->accept() ) {
00895 if (_GFtrack1->_mGFsegment->accept()) chi1 = _GFtrack1->_mGFsegment->chiGFSq();
00896 else chi1 = 1e6;
00897 if (_GFtrack2->_mGFsegment->accept()) chi2 = _GFtrack2->_mGFsegment->chiGFSq();
00898 else chi2 = 1e6;
00899 }
00900 }
00901
00902 if (chi2 > chi1) _GFtrack2->removeStep();
00903 else if (chi2 < chi1 ) _GFtrack1->removeStep();
00904 else done = false;
00905
00906 return done;
00907 }