diff --git a/macro/mcbm/mcbm_reco_event.C b/macro/mcbm/mcbm_reco_event.C index 7913e8e1aa31793116a770f63b5ff2496f82f673..69e233ce10b5477a458de8e39cdda3dee58485c9 100644 --- a/macro/mcbm/mcbm_reco_event.C +++ b/macro/mcbm/mcbm_reco_event.C @@ -25,7 +25,7 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch // ----- Environment -------------------------------------------------- - TString myName = "mcbm_reco"; // this macro's name for screen output + TString myName = "mcbm_reco"; // this macro's name for screen output TString srcDir = gSystem->Getenv("VMCWORKDIR"); // top source directory // ------------------------------------------------------------------------ @@ -60,20 +60,16 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch // - TRD digitisation parameters if (setup->GetGeoTag(ECbmModuleId::kTrd, geoTag)) { - TObjString* trdFile = - new TObjString(srcDir + "/parameters/trd/trd_" + geoTag + ".digi.par"); + TObjString* trdFile = new TObjString(srcDir + "/parameters/trd/trd_" + geoTag + ".digi.par"); parFileList->Add(trdFile); - std::cout << "-I- " << myName << ": Using parameter file " - << trdFile->GetString() << std::endl; + std::cout << "-I- " << myName << ": Using parameter file " << trdFile->GetString() << std::endl; } // - TOF digitisation parameters if (setup->GetGeoTag(ECbmModuleId::kTof, geoTag)) { - TObjString* tofBdfFile = - new TObjString(srcDir + "/parameters/tof/tof_" + geoTag + ".digibdf.par"); + TObjString* tofBdfFile = new TObjString(srcDir + "/parameters/tof/tof_" + geoTag + ".digibdf.par"); parFileList->Add(tofBdfFile); - std::cout << "-I- " << myName << ": Using parameter file " - << tofBdfFile->GetString() << std::endl; + std::cout << "-I- " << myName << ": Using parameter file " << tofBdfFile->GetString() << std::endl; } // ------------------------------------------------------------------------ @@ -94,8 +90,7 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch // ----- Input file --------------------------------------------------- std::cout << std::endl; - std::cout << "-I- " << myName << ": Using input file " << rawFile - << std::endl; + std::cout << "-I- " << myName << ": Using input file " << rawFile << std::endl; // ------------------------------------------------------------------------ @@ -103,6 +98,7 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch FairRunAna* run = new FairRunAna(); FairFileSource* inputSource = new FairFileSource(rawFile); + run->SetSource(inputSource); run->SetOutputFile(recFile); @@ -111,7 +107,6 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch if (hasFairMonitor) FairMonitor::GetMonitor()->EnableMonitor(kTRUE); // ------------------------------------------------------------------------ - // ----- Logger settings ---------------------------------------------- FairLogger::GetLogger()->SetLogScreenLevel(logLevel.Data()); FairLogger::GetLogger()->SetLogVerbosityLevel(logVerbosity.Data()); @@ -121,17 +116,14 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch // ----- Local reconstruction in MVD ---------------------------------- if (setup->IsActive(ECbmModuleId::kMvd)) { - CbmMvdClusterfinder* mvdCluster = - new CbmMvdClusterfinder("MVD Cluster Finder", 0, 0); + CbmMvdClusterfinder* mvdCluster = new CbmMvdClusterfinder("MVD Cluster Finder", 0, 0); run->AddTask(mvdCluster); - std::cout << "-I- " << myName << ": Added task " << mvdCluster->GetName() - << std::endl; + std::cout << "-I- " << myName << ": Added task " << mvdCluster->GetName() << std::endl; CbmMvdHitfinder* mvdHit = new CbmMvdHitfinder("MVD Hit Finder", 0, 0); mvdHit->UseClusterfinder(kTRUE); run->AddTask(mvdHit); - std::cout << "-I- " << myName << ": Added task " << mvdHit->GetName() - << std::endl; + std::cout << "-I- " << myName << ": Added task " << mvdHit->GetName() << std::endl; } // ------------------------------------------------------------------------ @@ -159,13 +151,12 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch if (muchFlag) { std::cout << geoTag << std::endl; - parFile = - parFile + "/parameters/much/much_" + geoTag + "_digi_sector.root"; + parFile = parFile + "/parameters/much/much_" + geoTag + "_digi_sector.root"; std::cout << "Using parameter file " << parFile << std::endl; - } else { + } + else { std::cout << geoTag(0, 4) << std::endl; - parFile = - parFile + "/parameters/much/much_" + geoTag(0, 4) + "_digi_sector.root"; + parFile = parFile + "/parameters/much/much_" + geoTag(0, 4) + "_digi_sector.root"; std::cout << "Using parameter file " << parFile << std::endl; } @@ -173,8 +164,7 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch // --- Hit finder for GEMs FairTask* muchHitGem = new CbmMuchFindHitsGem(parFile.Data(), muchFlag); run->AddTask(muchHitGem); - std::cout << "-I- " << myName << ": Added task " << muchHitGem->GetName() - << FairLogger::endl; + std::cout << "-I- " << myName << ": Added task " << muchHitGem->GetName() << FairLogger::endl; } // ------------------------------------------------------------------------ @@ -182,21 +172,19 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch // ----- Local reconstruction in TRD ---------------------------------- if (setup->IsActive(ECbmModuleId::kTrd)) { - Double_t triggerThreshold = 0.5e-6; // SIS100 - Bool_t triangularPads = false; // Bucharest triangular pad-plane layout + Double_t triggerThreshold = 0.5e-6; // SIS100 + Bool_t triangularPads = false; // Bucharest triangular pad-plane layout CbmTrdClusterFinder* trdCluster = new CbmTrdClusterFinder(); trdCluster->SetNeighbourEnable(true); trdCluster->SetMinimumChargeTH(triggerThreshold); trdCluster->SetNeighbourEnable(false); trdCluster->SetRowMerger(true); run->AddTask(trdCluster); - std::cout << "-I- " << myName << ": Added task " << trdCluster->GetName() - << std::endl; + std::cout << "-I- " << myName << ": Added task " << trdCluster->GetName() << std::endl; CbmTrdHitProducer* trdHit = new CbmTrdHitProducer(); run->AddTask(trdHit); - std::cout << "-I- " << myName << ": Added task " << trdHit->GetName() - << std::endl; + std::cout << "-I- " << myName << ": Added task " << trdHit->GetName() << std::endl; } // --------------------------------------------------------------------------- // TOF defaults @@ -214,27 +202,21 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch if (setup->IsActive(ECbmModuleId::kTof)) { switch (iTofCluMode) { case 1: { - CbmTofEventClusterizer* tofCluster = - new CbmTofEventClusterizer("TOF Event Clusterizer", 0, 1); + CbmTofEventClusterizer* tofCluster = new CbmTofEventClusterizer("TOF Event Clusterizer", 0, 1); tofCluster->SetCalMode(calMode); tofCluster->SetCalSel(calSel); - tofCluster->SetCaldXdYMax(3.); // geometrical matching window in cm - tofCluster->SetCalCluMulMax( - 5.); // Max Counter Cluster Multiplicity for filling calib histos - tofCluster->SetCalRpc(calSm); // select detector for calibration update - tofCluster->SetTRefId( - RefSel); // reference trigger for offset calculation - tofCluster->SetTotMax(20.); // Tot upper limit for walk corection - tofCluster->SetTotMin( - 0.01); //(12000.); // Tot lower limit for walk correction - tofCluster->SetTotPreRange( - 5.); // effective lower Tot limit in ns from peak position - tofCluster->SetTotMean(5.); // Tot calibration target value in ns - tofCluster->SetMaxTimeDist(1.0); // default cluster range in ns - tofCluster->SetDelTofMax( - 5.); // acceptance range for cluster distance in ns (!) - tofCluster->SetSel2MulMax(3); // limit Multiplicity in 2nd selector + tofCluster->SetCaldXdYMax(3.); // geometrical matching window in cm + tofCluster->SetCalCluMulMax(5.); // Max Counter Cluster Multiplicity for filling calib histos + tofCluster->SetCalRpc(calSm); // select detector for calibration update + tofCluster->SetTRefId(RefSel); // reference trigger for offset calculation + tofCluster->SetTotMax(20.); // Tot upper limit for walk corection + tofCluster->SetTotMin(0.01); //(12000.); // Tot lower limit for walk correction + tofCluster->SetTotPreRange(5.); // effective lower Tot limit in ns from peak position + tofCluster->SetTotMean(5.); // Tot calibration target value in ns + tofCluster->SetMaxTimeDist(1.0); // default cluster range in ns + tofCluster->SetDelTofMax(5.); // acceptance range for cluster distance in ns (!) + tofCluster->SetSel2MulMax(3); // limit Multiplicity in 2nd selector tofCluster->SetChannelDeadtime(dDeadtime); // artificial deadtime in ns tofCluster->SetEnableAvWalk(kFALSE); //tofCluster->SetEnableMatchPosScaling(kFALSE); // turn off projection to nominal target @@ -244,17 +226,14 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch tofCluster->SetTRefDifMax(2.0); // in ns tofCluster->PosYMaxScal(0.75); //in % of length run->AddTask(tofCluster); - std::cout << "-I- " << myName << ": Added task " - << tofCluster->GetName() << std::endl; + std::cout << "-I- " << myName << ": Added task " << tofCluster->GetName() << std::endl; } break; default: { - CbmTofSimpClusterizer* tofCluster = - new CbmTofSimpClusterizer("TOF Simple Clusterizer", 0); + CbmTofSimpClusterizer* tofCluster = new CbmTofSimpClusterizer("TOF Simple Clusterizer", 0); tofCluster->SetOutputBranchPersistent("TofHit", kTRUE); tofCluster->SetOutputBranchPersistent("TofDigiMatch", kTRUE); run->AddTask(tofCluster); - std::cout << "-I- " << myName << ": Added task " - << tofCluster->GetName() << std::endl; + std::cout << "-I- " << myName << ": Added task " << tofCluster->GetName() << std::endl; } } } @@ -275,35 +254,28 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch CbmTofTrackFinder* tofTrackFinder = new CbmTofTrackFinderNN(); tofTrackFinder->SetMaxTofTimeDifference(0.2); // in ns/cm tofTrackFinder->SetTxLIM(0.3); // max slope dx/dz - tofTrackFinder->SetTyLIM(0.3); // max dev from mean slope dy/dz - tofTrackFinder->SetTyMean(0.); // mean slope dy/dz + tofTrackFinder->SetTyLIM(0.3); // max dev from mean slope dy/dz + tofTrackFinder->SetTyMean(0.); // mean slope dy/dz CbmTofTrackFitter* tofTrackFitter = new CbmTofTrackFitterKF(0, 211); TFitter* MyFit = new TFitter(1); // initialize Minuit tofTrackFinder->SetFitter(tofTrackFitter); - CbmTofFindTracks* tofFindTracks = - new CbmTofFindTracks("TOF Track Finder"); + CbmTofFindTracks* tofFindTracks = new CbmTofFindTracks("TOF Track Finder"); tofFindTracks->UseFinder(tofTrackFinder); tofFindTracks->UseFitter(tofTrackFitter); - tofFindTracks->SetCorMode( - iGenCor); // valid options: 0,1,2,3,4,5,6, 10 - 19 - tofFindTracks->SetTtTarg( - 0.041); // target value for inverse velocity, > 0.033 ns/cm! + tofFindTracks->SetCorMode(iGenCor); // valid options: 0,1,2,3,4,5,6, 10 - 19 + tofFindTracks->SetTtTarg(0.041); // target value for inverse velocity, > 0.033 ns/cm! //tofFindTracks->SetTtTarg(0.035); // target value for inverse velocity, > 0.033 ns/cm! - tofFindTracks->SetCalParFileName( - cTrkFile); // Tracker parameter value file name - tofFindTracks->SetBeamCounter(5, 0, 0); // default beam counter - tofFindTracks->SetStationMaxHMul( - 30); // Max Hit Multiplicity in any used station - - tofFindTracks->SetT0MAX(dScalFac); // in ns - tofFindTracks->SetSIGT(0.08); // default in ns - tofFindTracks->SetSIGX(0.3); // default in cm - tofFindTracks->SetSIGY(0.45); // default in cm - tofFindTracks->SetSIGZ(0.05); // default in cm - tofFindTracks->SetUseSigCalib( - kFALSE); // ignore resolutions in CalPar file - tofTrackFinder->SetSIGLIM(dChi2Lim2 - * 2.); // matching window in multiples of chi2 + tofFindTracks->SetCalParFileName(cTrkFile); // Tracker parameter value file name + tofFindTracks->SetBeamCounter(5, 0, 0); // default beam counter + tofFindTracks->SetStationMaxHMul(30); // Max Hit Multiplicity in any used station + + tofFindTracks->SetT0MAX(dScalFac); // in ns + tofFindTracks->SetSIGT(0.08); // default in ns + tofFindTracks->SetSIGX(0.3); // default in cm + tofFindTracks->SetSIGY(0.45); // default in cm + tofFindTracks->SetSIGZ(0.05); // default in cm + tofFindTracks->SetUseSigCalib(kFALSE); // ignore resolutions in CalPar file + tofTrackFinder->SetSIGLIM(dChi2Lim2 * 2.); // matching window in multiples of chi2 tofTrackFinder->SetChiMaxAccept(dChi2Lim2); // max tracklet chi2 Int_t iMinNofHits = -1; @@ -316,7 +288,7 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch tofFindTracks->SetStation(0, 5, 0, 0); // Diamond break; case 1: // for calibration mode of full setup - iMinNofHits = 3; + iMinNofHits = 3; // iNStations = 39; iNStations = 26; iNReqStations = 3; @@ -369,18 +341,86 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch tofFindTracks->SetNStations(iNStations); tofFindTracks->SetNReqStations(iNReqStations); tofFindTracks->PrintSetup(); - run->AddTask(tofFindTracks); + // run->AddTask(tofFindTracks); } break; default: { - CbmBinnedTrackerTask* trackerTask = - new CbmBinnedTrackerTask(kTRUE, beamWidthX, beamWidthY); + CbmBinnedTrackerTask* trackerTask = new CbmBinnedTrackerTask(kTRUE, beamWidthX, beamWidthY); trackerTask->SetUse(ECbmModuleId::kTrd, kFALSE); - run->AddTask(trackerTask); + // run->AddTask(trackerTask); } } // ------------------------------------------------------------------------ + // ------------------------------------------------------------------------ + // -------- L1 CA Track Finder --------------------------------------- + + CbmKF* kalman = new CbmKF(); + run->AddTask(kalman); + CbmL1* l1 = new CbmL1(); + + l1->SetmCBMmode(1); + l1->SetUseHitErrors(1); + + // --- Material budget file names + TString mvdGeoTag; + if (setup->GetGeoTag(ECbmModuleId::kMvd, mvdGeoTag)) { + TString parFile = gSystem->Getenv("VMCWORKDIR"); + parFile = parFile + "/parameters/mvd/mvd_matbudget_" + mvdGeoTag + ".root"; + std::cout << "Using material budget file " << parFile << std::endl; + l1->SetMvdMaterialBudgetFileName(parFile.Data()); + } + TString stsGeoTag; + if (setup->GetGeoTag(ECbmModuleId::kSts, stsGeoTag)) { + TString parFile = gSystem->Getenv("VMCWORKDIR"); + parFile = parFile + "/parameters/sts/sts_matbudget_v19a.root"; + std::cout << "Using material budget file " << parFile << std::endl; + l1->SetStsMaterialBudgetFileName(parFile.Data()); + } + + TString muchGeoTag; + if (setup->GetGeoTag(ECbmModuleId::kMuch, muchGeoTag)) { + + // --- Parameter file name + TString geoTag; + setup->GetGeoTag(ECbmModuleId::kMuch, geoTag); + Int_t muchFlag = 0; + if (geoTag.Contains("mcbm")) muchFlag = 1; + + TString parFile = gSystem->Getenv("VMCWORKDIR"); + parFile = parFile + "/parameters/much/much_" + geoTag(0, 4) + "_digi_sector.root"; + std::cout << "L1: Using parameter file " << parFile << std::endl; + l1->SetMuchPar(parFile); + + TString parFile2 = gSystem->Getenv("VMCWORKDIR"); + parFile2 = parFile2 + "/parameters/much/much_matbudget_v20a_mcbm.root "; + std::cout << "Using material budget file " << parFile2 << std::endl; + l1->SetMuchMaterialBudgetFileName(parFile2.Data()); + } + + TString trdGeoTag; + if (setup->GetGeoTag(ECbmModuleId::kTrd, trdGeoTag)) { + TString parFile = gSystem->Getenv("VMCWORKDIR"); + parFile = parFile + "/parameters/trd/trd_matbudget_v20a_mcbm.root"; + std::cout << "Using material budget file " << parFile << std::endl; + l1->SetTrdMaterialBudgetFileName(parFile.Data()); + } + + TString tofGeoTag; + if (setup->GetGeoTag(ECbmModuleId::kTof, tofGeoTag)) { + TString parFile = gSystem->Getenv("VMCWORKDIR"); + parFile = parFile + "/parameters/tof/tof_matbudget_v20f_mcbm.root"; + std::cout << "Using material budget file " << parFile << std::endl; + l1->SetTofMaterialBudgetFileName(parFile.Data()); + } + + run->AddTask(l1); + + CbmStsTrackFinder* stsTrackFinder = new CbmL1StsTrackFinder(); + FairTask* stsFindTracks = new CbmStsFindTracksEvents(stsTrackFinder); + run->AddTask(stsFindTracks); + + // ----- Parameter database -------------------------------------------- std::cout << std::endl << std::endl; std::cout << "-I- " << myName << ": Set runtime DB" << std::endl; @@ -423,8 +463,7 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch std::cout << "Macro finished successfully." << std::endl; std::cout << "Output file is " << recFile << std::endl; std::cout << "Parameter file is " << parFile << std::endl; - std::cout << "Real time " << rtime << " s, CPU time " << ctime << " s" - << std::endl; + std::cout << "Real time " << rtime << " s, CPU time " << ctime << " s" << std::endl; std::cout << std::endl; std::cout << " Test passed" << std::endl; std::cout << " All ok " << std::endl; diff --git a/reco/L1/CbmL1.cxx b/reco/L1/CbmL1.cxx index e579a0976dfa4c65cd8a29ac375d28e853507c7f..da21d553b2f1d36bda24fedb96efd408f20a82e3 100644 --- a/reco/L1/CbmL1.cxx +++ b/reco/L1/CbmL1.cxx @@ -374,14 +374,14 @@ InitStatus CbmL1::Init() fUseTOF = 0; if (fmCBMmode) { - fUseMUCH = 1; + fUseMUCH = 0; fUseTRD = 1; fUseTOF = 1; } if (fGlobalMode) { - fUseMUCH = 1; + fUseMUCH = 0; fUseTRD = 1; fUseTOF = 1; } @@ -515,7 +515,7 @@ InitStatus CbmL1::Init() } else { fTofPoints = mcManager->InitBranch("TofPoint"); - fTofHitDigiMatches = static_cast<TClonesArray*>(fManger->GetObject("TofHitCalDigiMatch")); + fTofHitDigiMatches = static_cast<TClonesArray*>(fManger->GetObject("TofHitMatch")); } } else { @@ -625,7 +625,7 @@ InitStatus CbmL1::Init() } } - if (fUseTOF) NTOFStation = fTofDigiBdfPar->GetNbTrackingStations(); + if (fUseTOF) NTOFStation = 3;//fTofDigiBdfPar->GetNbTrackingStations(); for (int i = 0; i < (maxTofStation + 1); i++) Z_pos[i] = Z_pos[i] / NHits[i]; @@ -835,12 +835,9 @@ InitStatus CbmL1::Init() geo.push_back(4); - if (ist == (NMvdStations + NStsStations + NTrdStations + NMuchStations + 0)) geo.push_back(245); - if (ist == (NMvdStations + NStsStations + NTrdStations + NMuchStations + 1)) geo.push_back(249); - if (ist == (NMvdStations + NStsStations + NTrdStations + NMuchStations + 2)) geo.push_back(261); - if (ist == (NMvdStations + NStsStations + NTrdStations + NMuchStations + 3)) geo.push_back(266); - if (ist == (NMvdStations + NStsStations + NTrdStations + NMuchStations + 4)) geo.push_back(278); - if (ist == (NMvdStations + NStsStations + NTrdStations + NMuchStations + 5)) geo.push_back(283); + if (ist == (NMvdStations + NStsStations + NTrdStations + NMuchStations + 0)) geo.push_back(247); + if (ist == (NMvdStations + NStsStations + NTrdStations + NMuchStations + 1)) geo.push_back(264); + if (ist == (NMvdStations + NStsStations + NTrdStations + NMuchStations + 2)) geo.push_back(280); geo.push_back(10); /// TODO: add Tof width dz geo.push_back(0); diff --git a/reco/L1/CbmL1ReadEvent.cxx b/reco/L1/CbmL1ReadEvent.cxx index 7277979e65d07282eac19c5d8213cc0564b71b64..8ee4c014f6da20c5d3c5e635ee1ac56b6e6c4e36 100644 --- a/reco/L1/CbmL1ReadEvent.cxx +++ b/reco/L1/CbmL1ReadEvent.cxx @@ -259,14 +259,22 @@ void CbmL1::ReadEvent(L1AlgoInputData* fData_, float& TsStart, float& TsLength, if (fTofPoints) { for (int j = 0; j < fTofHits->GetEntriesFast(); j++) { + + CbmLink* link = 0; CbmTofHit* mh = L1_DYNAMIC_CAST<CbmTofHit*>(fTofHits->At(j)); + + if( 0x00202806 == mh->GetAddress() || 0x00002806 == mh->GetAddress() ) { + ToFPointsMatch.push_back(link); + continue; + } CbmMatch* matchHitMatch = L1_DYNAMIC_CAST<CbmMatch*>(fTofHitDigiMatches->At(j)); if (matchHitMatch->GetNofLinks() > 0) { - CbmLink* link = (CbmLink*) &matchHitMatch->GetLink(0); + link = (CbmLink*) &matchHitMatch->GetLink(0); + CbmTofPoint* pt = (CbmTofPoint*) fTofPoints->Get(link->GetFile(), link->GetEntry(), link->GetIndex()); for (int iLink = 1; iLink < matchHitMatch->GetNofLinks(); iLink++) { @@ -298,6 +306,8 @@ void CbmL1::ReadEvent(L1AlgoInputData* fData_, float& TsStart, float& TsLength, CbmL1MCPoint MC; MC.event = iEvent; + + if (ToFPointsMatch[iMC]==0) continue; int eventNr = ToFPointsMatch[iMC]->GetEntry(); @@ -463,6 +473,7 @@ void CbmL1::ReadEvent(L1AlgoInputData* fData_, float& TsStart, float& TsLength, if (fVerbose >= 10) cout << "ReadEvent: mvd hits are gotten." << endl; + Int_t nEntSts = 0; if (listStsHits) { @@ -590,6 +601,8 @@ void CbmL1::ReadEvent(L1AlgoInputData* fData_, float& TsStart, float& TsLength, } // for j } // if listStsHits + + if (fMuchPixelHits) { @@ -605,6 +618,7 @@ void CbmL1::ReadEvent(L1AlgoInputData* fData_, float& TsStart, float& TsLength, th.ExtIndex = j; th.Det = 2; + th.id = j + nMvdHits + nStsHits; Int_t stationNumber = CbmMuchGeoScheme::GetStationIndex(mh->GetAddress()); @@ -708,6 +722,8 @@ void CbmL1::ReadEvent(L1AlgoInputData* fData_, float& TsStart, float& TsLength, CbmTrdHit* mh = L1_DYNAMIC_CAST<CbmTrdHit*>(listTrdHits->At(j)); th.ExtIndex = j; th.Det = 3; + + th.id = j + nMvdHits + nStsHits + nMuchHits; th.iStation = NMvdStations + mh->GetPlaneId() + NStsStations + NMuchStations; @@ -797,14 +813,30 @@ void CbmL1::ReadEvent(L1AlgoInputData* fData_, float& TsStart, float& TsLength, TmpHit th; CbmTofHit* mh = L1_DYNAMIC_CAST<CbmTofHit*>(fTofHits->At(j)); + + + th.ExtIndex = j; th.Det = 4; - - th.iStation = fTofDigiBdfPar->GetTrackingStation(mh) + NMvdStations + NStsStations + NMuchStations + NTrdStations; + + th.id = j + nMvdHits + nStsHits + nMuchHits + nTrdHits; + + if( 0x00202806 == mh->GetAddress() || 0x00002806 == mh->GetAddress() ) continue; + + int sttof = -1; + + if (fTofDigiBdfPar->GetTrackingStation(mh)==0) sttof = 0; + if (fTofDigiBdfPar->GetTrackingStation(mh)==1) sttof = 0; + if (fTofDigiBdfPar->GetTrackingStation(mh)==2) sttof = 1; + if (fTofDigiBdfPar->GetTrackingStation(mh)==3) sttof = 1; + if (fTofDigiBdfPar->GetTrackingStation(mh)==4) sttof = 2; + if (fTofDigiBdfPar->GetTrackingStation(mh)==5) sttof = 2; + + th.iStation = sttof + NMvdStations + NStsStations + NMuchStations + NTrdStations; th.time = mh->GetTime(); - th.t_er = 5; //mh->GetTimeError(); + th.t_er = mh->GetTimeError(); th.dx = mh->GetDx(); th.dy = mh->GetDy(); @@ -837,7 +869,7 @@ void CbmL1::ReadEvent(L1AlgoInputData* fData_, float& TsStart, float& TsLength, if (fPerformance) { - // if (ToFPointsMatch[j]!=0) + if (ToFPointsMatch[j]==0) continue; // th.iMC = j+nMvdPoints+nStsPoints+nTrdPoints+nMuchPoints; @@ -874,10 +906,13 @@ void CbmL1::ReadEvent(L1AlgoInputData* fData_, float& TsStart, float& TsLength, } // if listTofHits if (fVerbose >= 10) cout << "ReadEvent: sts hits are gotten." << endl; + + // sort hits int nHits = nMvdHits + nStsHits + nMuchHits + nTrdHits + nTofHits; + sort(tmpHits.begin(), tmpHits.end(), TmpHit::Compare); // save strips in L1Algo @@ -1029,12 +1064,12 @@ void CbmL1::ReadEvent(L1AlgoInputData* fData_, float& TsStart, float& TsLength, vHitMCRef.push_back(th.iMC); } - for (int i = 0; i < NStation; i++) { if (fData_->StsHitsStartIndex[i] == static_cast<THitI>(-1)) fData_->StsHitsStartIndex[i] = fData_->StsHitsStopIndex[i]; } + if (fVerbose >= 10) cout << "ReadEvent: mvd and sts are saved." << endl; diff --git a/reco/L1/L1Algo/L1CATrackFinder.cxx b/reco/L1/L1Algo/L1CATrackFinder.cxx index e31c98fd5f4a75a79cdd5af06113eb2bbabe7069..1c66d74ac59b214b0ff4854bc10d2a03eaf0a605 100644 --- a/reco/L1/L1Algo/L1CATrackFinder.cxx +++ b/reco/L1/L1Algo/L1CATrackFinder.cxx @@ -75,7 +75,7 @@ inline void L1Algo::f10( // input // output fvec* u_front_l, fvec* u_back_l, fvec* zPos_l, THitI* hitsl, fvec* HitTime_l, fvec* HitTimeEr, // comment unused parameters, FU, 18.01.21 - fvec* /*Event_l*/, fvec* /*d_x*/, fvec* /*d_y*/, fvec* /*d_xy*/, fvec* d_u, fvec* d_v) + fvec* Event_l, fvec* /*d_x*/, fvec* /*d_y*/, fvec* /*d_xy*/, fvec* d_u, fvec* d_v) { const Tindex& end_lh = start_lh + n1_l; @@ -161,10 +161,10 @@ inline void L1Algo::f11( /// input 1st stage of singlet search fvec& u = u_front_l[i1_V]; fvec& v = u_back_l[i1_V]; fvec xl, yl; // left(1-st) hit coor - fvec zl = zPos_l[i1_V]; - fvec& time = HitTime_l[i1_V]; - fvec& timeEr = HitTimeEr[i1_V]; - const fvec dzli = 1. / (zl - targZ); + fvec zl = zPos_l[i1_V]; + fvec& time = HitTime_l[i1_V]; + fvec& timeEr = HitTimeEr[i1_V]; + const fvec dzli = 1. / (zl - targZ); fvec dx1, dy1, dxy1 = 0; @@ -224,6 +224,7 @@ inline void L1Algo::f11( /// input 1st stage of singlet search if ((isec == kAllSecIter) || (isec == kAllSecEIter) || (isec == kAllSecJumpIter)) T.NDF = 0; T.tx = tx; T.ty = ty; + T.t = time; T.qp = 0.; T.C20 = T.C21 = 0; @@ -231,10 +232,10 @@ inline void L1Algo::f11( /// input 1st stage of singlet search T.C40 = T.C41 = T.C42 = T.C43 = 0; T.C50 = T.C51 = T.C52 = T.C53 = T.C54 = 0; T.C22 = T.C33 = MaxSlope * MaxSlope / 9.; - T.C44 = MaxInvMom / 3. * MaxInvMom / 3.; - T.C55 = timeEr * timeEr; + if (fGlobal || fmCBMmode) T.C22 = T.C33 = 10; + T.C44 = MaxInvMom / 3. * MaxInvMom / 3.; + T.C55 = timeEr * timeEr; - T.t = time; // #define BEGIN_FROM_TARGET #ifndef BEGIN_FROM_TARGET // the best now @@ -277,6 +278,7 @@ inline void L1Algo::f11( /// input 1st stage of singlet search } } + else //add the target @@ -352,16 +354,17 @@ inline void L1Algo::f11( /// input 1st stage of singlet search #endif - FilterTime(T, time, timeEr); #ifdef USE_RL_TABLE - fit.L1AddMaterial(T, fRadThick[istal].GetRadThick(T.x, T.y), MaxInvMom, 1); + if (!fmCBMmode) fit.L1AddMaterial(T, fRadThick[istal].GetRadThick(T.x, T.y), MaxInvMom, 1); + if (fGlobal || fmCBMmode) + fit.L1AddThickMaterial(T, fRadThick[istal].GetRadThick(T.x, T.y), MaxInvMom, 1, stal.materialInfo.thick, 1); #else fit.L1AddMaterial(T, stal.materialInfo, MaxInvMom, 1); #endif if ((istam >= NMvdStations) && (istal <= NMvdStations - 1)) { fit.L1AddPipeMaterial(T, MaxInvMom, 1); } - fvec dz = zstam - T.z; + fvec dz = zstam - zl; L1ExtrapolateTime(T, dz); if (fGlobal || fmCBMmode) @@ -411,6 +414,7 @@ inline void L1Algo::f20( // input const float& timeError = T1.C55[i1_4]; const float& time = T1.t[i1_4]; + L1HitAreaTime areaTime(vGridTime[&stam - vStations], T1.x[i1_4] * iz, T1.y[i1_4] * iz, (sqrt(Pick_m22 * (T1.C00 + stam.XYInfo.C00)) + MaxDZ * fabs(T1.tx))[i1_4] * iz, (sqrt(Pick_m22 * (T1.C11 + stam.XYInfo.C11)) + MaxDZ * fabs(T1.ty))[i1_4] * iz, time, @@ -433,17 +437,17 @@ inline void L1Algo::f20( // input // check y-boundaries if (fabs(time - hitm.time) > sqrt(timeError + hitm.timeEr * hitm.timeEr) * 5) continue; - if (fabs(time - hitm.time) > 100) continue; + if (fabs(time - hitm.time) > 30) continue; #ifdef USE_EVENT_NUMBER if ((Event[i1_V][i1_4] != hitm.n)) continue; #endif // - check whether hit belong to the window ( track position +\- errors ) - - const fscal zm = hitm.Z(); - L1TrackPar T1_new = T1; - fvec dz = fvec(zm) - T1.z; + const fscal zm = hitm.Z(); + // L1TrackPar T1_new = T1; + // fvec dz = fvec(zm) - T1.z; + // L1ExtrapolateTime(T1, dz); - L1ExtrapolateTime(T1_new, dz); // if (fabs(T1_new.t[i1_4]-hitm.time)>sqrt(T1_new.C55[i1_4]+hitm.timeEr*hitm.timeEr)*4) continue; // if (fabs(T1_new.t[i1_4]-hitm.time)>sqrt(2.9*2.9)*5) continue; @@ -484,6 +488,7 @@ inline void L1Algo::f20( // input } const fscal dX = xm[i1_4] - x[i1_4]; + if (dX * dX > dx_est2) continue; // check chi2 @@ -491,6 +496,7 @@ inline void L1Algo::f20( // input L1ExtrapolateC10Line(T1, zm, C10); fvec chi2 = T1.chi2; + L1UMeasurementInfo info = stam.frontInfo; if (fUseHitErrors) info.sigma2 = hitm.dU() * hitm.dU(); @@ -500,7 +506,7 @@ inline void L1Algo::f20( // input if (isec != TRACKS_FROM_TRIPLETS_ITERATION) #endif if (chi2[i1_4] > DOUBLET_CHI2_CUT) continue; - // T1.t[i1_4] = hitm.time; + T1.t[i1_4] = hitm.time; #ifdef USE_EVENT_NUMBER T1.n[i1_4] = hitm.n; @@ -512,7 +518,8 @@ inline void L1Algo::f20( // input L1FilterChi2(info, x, y, C00, C10, C11, chi2, hitm.V()); - FilterTime(T1_new, hitm.time, hitm.timeEr); + // FilterTime(T1, hitm.time, hitm.timeEr); + #ifdef DO_NOT_SELECT_TRIPLETS if (isec != TRACKS_FROM_TRIPLETS_ITERATION) @@ -635,6 +642,7 @@ inline void L1Algo::f30( // input // add middle hit L1ExtrapolateLine(T2, zPos_2); + L1UMeasurementInfo info = stam.frontInfo; if (fUseHitErrors) info.sigma2 = du2 * du2; @@ -647,6 +655,7 @@ inline void L1Algo::f30( // input else L1Filter(T2, info, u_front_2); + info = stam.backInfo; if (fUseHitErrors) info.sigma2 = dv2 * dv2; @@ -658,10 +667,13 @@ inline void L1Algo::f30( // input else L1Filter(T2, info, u_back_2); - FilterTime(T2, timeM, timeMEr); + FilterTime(T2, timeM, timeMEr); #ifdef USE_RL_TABLE - fit.L1AddMaterial(T2, fRadThick[istam].GetRadThick(T2.x, T2.y), T2.qp, 1); + if (!fmCBMmode) fit.L1AddMaterial(T2, fRadThick[istam].GetRadThick(T2.x, T2.y), T2.qp, 1); + + if (fGlobal || fmCBMmode) + fit.L1AddThickMaterial(T2, fRadThick[istam].GetRadThick(T2.x, T2.y), T2.qp, 1, stam.materialInfo.thick, 1); #else fit.L1AddMaterial(T2, stam.materialInfo, T2.qp, 1); #endif @@ -669,6 +681,7 @@ inline void L1Algo::f30( // input fvec dz2 = star.z - T2.z; L1ExtrapolateTime(T2, dz2); + // extrapolate to the right hit station if (fGlobal || fmCBMmode) @@ -683,10 +696,10 @@ inline void L1Algo::f30( // input // ---- Find the triplets(right hit). Reformat data in the portion of triplets. ---- for (Tindex i2_4 = 0; i2_4 < n2_4; ++i2_4) { - if (T2.C00[i2_4] < 0 || T2.C11[i2_4] < 0 || T2.C22[i2_4] < 0 || T2.C33[i2_4] < 0 || T2.C44[i2_4] < 0 - || T2.C55[i2_4] < 0) - continue; - if (T2.C00[i2_4] < 0 || T2.C11[i2_4] < 0 || T2.C22[i2_4] < 0 || T2.C33[i2_4] < 0) continue; + if (!fGlobal || !fmCBMmode) + if (T2.C44[i2_4] < 0) continue; + if (T2.C00[i2_4] < 0 || T2.C11[i2_4] < 0 || T2.C22[i2_4] < 0 || T2.C33[i2_4] < 0 || T2.C55[i2_4] < 0) continue; + const fvec Pick_r22 = (TRIPLET_CHI2_CUT - T2.chi2); const float& timeError = T2.C55[i2_4]; @@ -703,6 +716,7 @@ inline void L1Algo::f30( // input (sqrt(Pick_r22 * (T2.C11 + stam.XYInfo.C11)) + MaxDZ * fabs(T2.ty))[i2_4] * iz, time, sqrt(timeError) * 5); + THitI irh = 0; int irh1 = -1; while (true) { @@ -730,14 +744,17 @@ inline void L1Algo::f30( // input StripsToCoor(hitr.U(), hitr.V(), xr, yr, star); - fvec dz3 = zr - T2.z; - L1ExtrapolateTime(T2, dz3); + L1TrackPar T_cur = T2; + + + fvec dz3 = zr - T_cur.z; + L1ExtrapolateTime(T_cur, dz3); + + L1ExtrapolateLine(T_cur, zr); + if (fabs(T_cur.t[i2_4] - hitr.time) > sqrt(T_cur.C55[i2_4] + hitr.timeEr) * 5) continue; + if (fabs(T_cur.t[i2_4] - hitr.time) > 30) continue; - if (fabs(T2.t[i2_4] - hitr.time) > sqrt(T2.C55[i2_4] + hitr.timeEr) * 5) continue; - if (fabs(T2.t[i2_4] - hitr.time) > 100) continue; - // - // if (fabs(T2.t[i2_4]-hitr.time)>sqrt(2.9*2.9)*5) continue; // - check whether hit belong to the window ( track position +\- errors ) - // check lower boundary @@ -764,8 +781,10 @@ inline void L1Algo::f30( // input if (dY2 > dy_est2) continue; // if (yr > y_plus_new [i2_4] ) continue; // check x-boundaries fvec x, C00; + L1ExtrapolateXC00Line(T2, zr, x, C00); + fscal dx_est2 = (Pick_r22[i2_4] * (fabs(C00[i2_4] + star.XYInfo.C00[i2_4]))); if (fUseHitErrors) { @@ -775,6 +794,7 @@ inline void L1Algo::f30( // input } const fscal dX = xr[i2_4] - x[i2_4]; + if (dX * dX > dx_est2) continue; // check chi2 // not effective fvec C10; @@ -792,18 +812,15 @@ inline void L1Algo::f30( // input L1FilterChi2(info, x, y, C00, C10, C11, chi2, hitr.V()); - L1TrackPar T = T2; + FilterTime(T_cur, hitr.time, hitr.timeEr); + - FilterTime(T, hitr.time, hitr.timeEr); #ifdef DO_NOT_SELECT_TRIPLETS if (isec != TRACKS_FROM_TRIPLETS_ITERATION) #endif - if (fGlobal || fmCBMmode) - if (chi2[i2_4] > TRIPLET_CHI2_CUT || C00[i2_4] < 0 || C11[i2_4] < 0) continue; - else if (chi2[i2_4] > TRIPLET_CHI2_CUT || C00[i2_4] < 0 || C11[i2_4] < 0 || T.C55[i2_4] < 0) - continue; // chi2_triplet < CHI2_CUT - + if (chi2[i2_4] > TRIPLET_CHI2_CUT || C00[i2_4] < 0 || C11[i2_4] < 0 || T_cur.C55[i2_4] < 0) + continue; // chi2_triplet < CHI2_CUT // pack triplet L1TrackPar& T3 = T_3[n3_V]; @@ -825,6 +842,7 @@ inline void L1Algo::f30( // input timeER[n3_V][n3_4] = hitr.timeEr; n3++; + n3_V = n3 / fvecLen; n3_4 = n3 % fvecLen; @@ -863,12 +881,13 @@ inline void L1Algo::f31( // input nsL1::vector<L1TrackPar>::TSimd& T_3) { for (Tindex i3_V = 0; i3_V < n3_V; ++i3_V) { - fvec dz = z_Pos[i3_V] - T_3[i3_V].z; + fvec dz = z_Pos[i3_V] - T_3[i3_V].z; L1ExtrapolateTime(T_3[i3_V], dz); L1ExtrapolateLine(T_3[i3_V], z_Pos[i3_V]); + L1UMeasurementInfo info = star.frontInfo; if (fUseHitErrors) info.sigma2 = du_[i3_V] * du_[i3_V]; @@ -895,7 +914,7 @@ inline void L1Algo::f31( // input else L1Filter(T_3[i3_V], info, u_back_[i3_V]); - FilterTime(T_3[i3_V], timeR[i3_V], timeER[i3_V]); + // FilterTime(T_3[i3_V], timeR[i3_V], timeER[i3_V]); } } @@ -1708,7 +1727,7 @@ void L1Algo::CATrackFinder() for (int iS = 0; iS < NStations; ++iS) { - vGridTime[iS].BuildBins(-1, 1, -0.6, 0.6, starttime, lasttime, xStep, yStep, (lasttime - starttime + 1) / 30); + vGridTime[iS].BuildBins(-1, 1, -0.6, 0.6, starttime, lasttime, xStep, yStep, (lasttime - starttime + 1)); vGridTime[iS].StoreHits(StsHitsUnusedStopIndex[iS] - StsHitsUnusedStartIndex[iS], &((*vStsHits)[StsHitsUnusedStartIndex[iS]]), iS, *this, StsHitsUnusedStartIndex[iS], @@ -1730,8 +1749,9 @@ void L1Algo::CATrackFinder() #ifdef _OPENMP #pragma omp parallel for schedule(dynamic, 5) #endif - for (THitI ih = StsHitsStartIndex[ista]; ih < StsHitsStopIndex[ista]; ++ih) + for (THitI ih = StsHitsStartIndex[ista]; ih < StsHitsStopIndex[ista]; ++ih) { CreateHitPoint(vStsDontUsedHits_Buf[ih], ista, vStsDontUsedHitsxy_B[ih]); + } } #ifdef COUNTERS @@ -1750,7 +1770,7 @@ void L1Algo::CATrackFinder() for (isec = 0; isec < fNFindIterations; ++isec) // all finder { if (fmCBMmode) - if (isec != 0) continue; + if (isec > 1) continue; n_g1.assign(n_g1.size(), Portion); @@ -1816,7 +1836,7 @@ void L1Algo::CATrackFinder() // if ( (isec == kFastPrimIter) ) // PickNeighbour = 0.5; // TODO understand why works with 0.2 - MaxInvMom = 1.0 / 0.5; // max considered q/p + if (fmCBMmode) MaxInvMom = 1.5 / 0.1; // max considered q/p if ((isec == kAllPrimJumpIter) || (isec == kAllSecIter) || (isec == kAllSecJumpIter)) MaxInvMom = 1.0 / 0.1; if ((isec == kAllPrimIter) || (isec == kAllPrimEIter) || (isec == kAllSecEIter)) MaxInvMom = 1. / 0.05; @@ -2078,9 +2098,6 @@ void L1Algo::CATrackFinder() unsigned char curr_L = 1; int ndf = 1; - vStripToTrack.assign(vStripToTrack.size(), -1); - vStripToTrackB.assign(vStripToTrackB.size(), -1); - // collect consequtive: the longest tracks, shorter, more shorter and so on for (int ilev = NStations - 3; ilev >= min_level; ilev--) { @@ -2092,9 +2109,13 @@ void L1Algo::CATrackFinder() const unsigned char min_best_l = (ilev > min_level) ? ilev + 2 : min_level + 3; // loose maximum + for (int i = 0; i < fNThreads; ++i) numberCandidateThread[i] = 0; + vStripToTrack.assign(vStripToTrack.size(), -1); + vStripToTrackB.assign(vStripToTrackB.size(), -1); + for (int istaF = FIRSTCASTATION; istaF <= NStations - 3 - ilev; ++istaF) { #ifdef _OPENMP @@ -2116,7 +2137,7 @@ void L1Algo::CATrackFinder() continue; - // ghost supression !!! +// ghost supression !!! #ifndef FIND_GAPED_TRACKS if (/*(isec == kFastPrimIter) ||*/ (isec == kAllPrimIter) || (isec == kAllPrimEIter) || (isec == kAllSecIter) || (isec == kAllSecEIter) || (isec == kAllSecJumpIter)) { @@ -2162,7 +2183,7 @@ void L1Algo::CATrackFinder() CAFindTrack(istaF, best_tr, best_L, best_chi2, &first_trip, (curr_tr), curr_L, curr_chi2, min_best_l, new_tr); /// reqursive func to build a tree of possible track-candidates and choose the best - // if ( best_L < min_best_l ) continue; + // if ( best_L < min_best_l ) continue; if (best_L < ilev + 2) continue; // lose maximum one hit if (best_L < min_level + 3) continue; // should find all hits for min_level @@ -2171,15 +2192,15 @@ void L1Algo::CATrackFinder() best_chi2 = best_chi2 / ndf; //normalize #ifndef TRACKS_FROM_TRIPLETS - if (fGhostSuppression) { - if (best_L == 3) { - // if( isec == kAllSecIter ) continue; // too /*short*/ secondary track - if (((isec == kAllSecIter) || (isec == kAllSecEIter) || (isec == kAllSecJumpIter)) && (istaF != 0)) - continue; // too /*short*/ non-MAPS track - if ((isec != kAllSecIter) && (isec != kAllSecEIter) && (isec != kAllSecJumpIter) && (best_chi2 > 5.0)) - continue; - } - } +// if (fGhostSuppression) { +// if (best_L == 3) { +// // if( isec == kAllSecIter ) continue; // too /*short*/ secondary track +// if (((isec == kAllSecIter) || (isec == kAllSecEIter) || (isec == kAllSecJumpIter)) && (istaF != 0)) +// continue; // too /*short*/ non-MAPS track +// if ((isec != kAllSecIter) && (isec != kAllSecEIter) && (isec != kAllSecJumpIter) && (best_chi2 > 5.0)) +// continue; +// } +// } #endif best_tr.Set(istaF, best_L, best_chi2, first_trip.GetQpOrig()); L1Branch& tr = CandidatesTrack[thread_num][numberCandidateThread[thread_num]]; @@ -2195,7 +2216,6 @@ void L1Algo::CATrackFinder() #ifdef _OPENMP omp_set_lock(&hitToBestTrackB[h.b]); #endif - int& strip1 = (vStripToTrackB)[h.b]; if (strip1 != -1) { @@ -2248,9 +2268,7 @@ void L1Algo::CATrackFinder() #endif } } - if (check) numberCandidateThread[thread_num]++; - } // itrip } } @@ -2283,7 +2301,10 @@ void L1Algo::CATrackFinder() } } - if (tr.NHits < 3) check = 0; + if (fmCBMmode) + if (tr.NHits <= 3) check = 0; + else if (tr.NHits < 3) + check = 0; if (check) { #ifdef EXTEND_TRACKS @@ -2583,7 +2604,7 @@ inline void L1Algo::CAFindTrack(int ista, L1Branch& best_tr, unsigned char& best } //if( curr_L < min_best_l - 1 ) return; // suppouse that only one hit can be added by extender - if (curr_chi2 > TRACK_CHI2_CUT * (curr_L * 2 - 5)) return; + if (curr_chi2 > TRACK_CHI2_CUT * (curr_L * 2 - 4.0)) return; if (fmCBMmode) if (curr_chi2 > TRACK_CHI2_CUT * (curr_L * 2 - 5.0)) return; @@ -2636,10 +2657,10 @@ inline void L1Algo::CAFindTrack(int ista, L1Branch& best_tr, unsigned char& best if ((new_trip.GetMHit() != curr_trip->GetRHit())) continue; if ((new_trip.GetLHit() != curr_trip->GetMHit())) continue; - const fscal qp1 = curr_trip->GetQp(); - const fscal qp2 = new_trip.GetQp(); - fscal dqp = fabs(qp1 - qp2); - fscal Cqp = curr_trip->Cqp; + const fscal qp1 = curr_trip->GetQp(); + const fscal qp2 = new_trip.GetQp(); + fscal dqp = fabs(qp1 - qp2); + fscal Cqp = curr_trip->Cqp; Cqp += new_trip.Cqp; if (!fmCBMmode) @@ -2659,8 +2680,8 @@ inline void L1Algo::CAFindTrack(int ista, L1Branch& best_tr, unsigned char& best Cty += new_trip.Cty; if (fGlobal || fmCBMmode) { - if (dty > PickNeighbour * Cty) continue; - if (dtx > PickNeighbour * Ctx) continue; + if (dty > 6 * Cty) continue; + if (dtx > 7 * Ctx) continue; }