Commit c649d98b authored by Sergey Gorbunov's avatar Sergey Gorbunov
Browse files

L1: clean up the reading of the MC data

parent eae56b23
......@@ -46,7 +46,11 @@ ${CBMROOT_SOURCE_DIR}/reco/KF
${CBMROOT_SOURCE_DIR}/reco/KF/KFQA
${CBMROOT_SOURCE_DIR}/reco/KF/Interface
${CBMROOT_SOURCE_DIR}/run
${CBMROOT_SOURCE_DIR}/sim/transport/steer
${CBMROOT_SOURCE_DIR}/sim/transport/geosetup
${CBMDATA_DIR}
${CBMDATA_DIR}/base
${CBMDETECTORBASE_DIR}/sts
......@@ -212,15 +216,27 @@ ELSE (SSE_FOUND)
"-O3")
ENDIF (SSE_FOUND)
set(LINKDEF L1LinkDef.h)
Set(LINKDEF L1LinkDef.h)
Set(LIBRARY_NAME L1)
Set(DEPENDENCIES
KF
Base
CbmBase
CbmData
# CbmSimSteer
# CbmGeoSetup
CbmMuchBase
CbmTrdBase
CbmStsBase
CbmRecoBase
CbmRecoSts
boost_regex
)
if (OPENMP_FOUND AND APPLE)
Set(DEPENDENCIES
KF CbmMuchBase CbmTrdBase CbmStsBase CbmRecoBase CbmBase CbmData CbmRecoSts Base boost_regex ${OpenMP_CXX_LIBRARIES}
)
else()
Set(DEPENDENCIES
KF CbmMuchBase CbmTrdBase CbmStsBase CbmRecoBase CbmBase CbmData CbmRecoSts Base boost_regex
Set(DEPENDENCIES ${DEPENDENCIES} ${OpenMP_CXX_LIBRARIES}
)
endif()
......
......@@ -29,6 +29,8 @@
#include "CbmMuchStation.h"
#include "CbmMvdDetector.h"
#include "CbmMvdStationPar.h"
// TODO: include of CbmSetup.h creates problems on Mac
// #include "CbmSetup.h"
#include "CbmStsFindTracks.h"
#include "CbmStsParSetModule.h"
#include "CbmStsParSetSensor.h"
......@@ -174,6 +176,10 @@ InitStatus CbmL1::Init()
fUseMVD = 1;
CbmStsFindTracks* FindTask = L1_DYNAMIC_CAST<CbmStsFindTracks*>(Run->GetTask("STSFindTracks"));
if (FindTask) fUseMVD = FindTask->MvdUsage();
// TODO: include of CbmSetup.h creates problems on Mac
// if (!CbmSetup::Instance()->IsActive(ECbmModuleId::kMvd)) { fUseMVD = false; }
// N Mvd stations is read from the KF material
if (CbmKF::Instance()->vMvdMaterial.size() == 0) { fUseMVD = false; }
}
fHistoDir = gROOT->mkdir("L1");
......@@ -207,6 +213,11 @@ InitStatus CbmL1::Init()
fMCTracks = 0;
listMvdHitMatches = 0;
fTrdHitMatches = 0;
listMuchHitMatches = 0;
fTofHitDigiMatches = 0;
listStsClusters = 0;
listStsDigi.clear();
vFileEvent.clear();
......@@ -263,8 +274,6 @@ InitStatus CbmL1::Init()
fTofHits = 0;
}
else {
fTofHits = (TClonesArray*) fManger->GetObject("TofHit");
}
......@@ -273,29 +282,21 @@ InitStatus CbmL1::Init()
if (NULL == mcManager) LOG(fatal) << GetName() << ": No CbmMCDataManager!";
fStsPoints = mcManager->InitBranch("StsPoint");
fMvdPoints = mcManager->InitBranch("MvdPoint");
fMCTracks = mcManager->InitBranch("MCTrack");
fMCTracks = mcManager->InitBranch("MCTrack");
if (NULL == fStsPoints) LOG(fatal) << GetName() << ": No StsPoint data!";
if (NULL == fMCTracks) LOG(fatal) << GetName() << ": No MCTrack data!";
listStsPts = L1_DYNAMIC_CAST<TClonesArray*>(fManger->GetObject("StsPoint"));
if (fTimesliceMode) {
fEventList = (CbmMCEventList*) fManger->GetObject("MCEventList.");
if (NULL == fEventList) LOG(fatal) << GetName() << ": No MCEventList data!";
}
if (!fUseMVD) {
listMvdPts = 0;
listMvdHitMatches = 0;
}
else {
listMvdPts = L1_DYNAMIC_CAST<TClonesArray*>(fManger->GetObject("MvdPoint"));
if (fUseMVD) {
fMvdPoints = mcManager->InitBranch("MvdPoint");
listMvdDigiMatches = L1_DYNAMIC_CAST<TClonesArray*>(fManger->GetObject("MvdDigiMatch"));
listMvdHitMatches = L1_DYNAMIC_CAST<TClonesArray*>(fManger->GetObject("MvdHitMatch"));
if (!listMvdHitMatches && listMvdPts)
LOG(error) << "No listMvdHitMatches provided, performance is not done correctly";
if (!listMvdHitMatches) { LOG(error) << "No listMvdHitMatches provided, performance is not done correctly"; }
}
if (!fUseTRD) {
......@@ -331,15 +332,6 @@ InitStatus CbmL1::Init()
}
}
else {
listMvdPts = 0;
listMvdHitMatches = 0;
fTrdPoints = 0;
fTrdHitMatches = 0;
fTrdPoints = 0;
fMuchPoints = 0;
listMuchHitMatches = 0;
fTofPoints = 0;
fTofHitDigiMatches = 0;
}
if (!fUseMVD) { listMvdHits = 0; }
else {
......@@ -1219,27 +1211,6 @@ void CbmL1::Reconstruct(CbmEvent* event)
#endif
}
for (L1Vector<CbmL1MCTrack>::iterator i = vMCTracks.begin(); i != vMCTracks.end(); ++i) {
CbmL1MCTrack& MC = *i;
if (!MC.IsReconstructable()) continue;
if (!(MC.ID >= 0)) continue;
if (MC.StsHits.size() < 4) continue;
L1Vector<int> hitIndices("hitIndices", algo->NStations, -1);
for (unsigned int iH = 0; iH < MC.StsHits.size(); iH++) {
const int hitI = MC.StsHits[iH];
CbmL1Hit& hit = const_cast<CbmL1Hit&>(vStsHits[hitI]);
hit.event = MC.iEvent;
// const int iStation = vMCPoints[hit.mcPointIds[0]].iStation;
// hitIndices[iStation] = hitI;
}
}
if (fVerbose > 1) { cout << "L1 Track finder..." << endl; }
algo->CATrackFinder();
// IdealTrackFinder();
......@@ -1430,24 +1401,6 @@ void CbmL1::Reconstruct(CbmEvent* event)
#endif
}
for (L1Vector<CbmL1MCTrack>::iterator i = vMCTracks.begin(); i != vMCTracks.end(); ++i) {
CbmL1MCTrack& MC = *i;
if (!MC.IsReconstructable()) continue;
if (!(MC.ID >= 0)) continue;
if (MC.StsHits.size() < 4) continue;
L1Vector<int> hitIndices("CbmL1::hitIndices", algo->NStations, -1);
for (unsigned int iH = 0; iH < MC.StsHits.size(); iH++) {
const int hitI = MC.StsHits[iH];
CbmL1Hit& hit = const_cast<CbmL1Hit&>(vStsHits[hitI]);
hit.event = MC.iEvent;
}
}
// output performance
if (fPerformance) {
if (fVerbose > 1) { cout << "Performance..." << endl; }
......
......@@ -282,20 +282,18 @@ private:
CbmMCDataArray* fMvdPoints {nullptr};
CbmMCDataArray* fMCTracks {nullptr};
TClonesArray* listStsPts {nullptr}; // Sts MC points
TClonesArray* listStsDigiMatch {nullptr};
TClonesArray* listStsClusters {nullptr};
TClonesArray* listStsHits {nullptr};
TClonesArray* listStsHitMatch {nullptr};
TClonesArray* listStsClusterMatch {nullptr};
TClonesArray* listMvdPts {nullptr}; // Mvd MC points
TClonesArray* listMvdHits {nullptr};
TClonesArray* listMvdDigiMatches {nullptr};
TClonesArray* listMvdHitMatches {nullptr};
//MuCh
int nMuchPoints {0};
CbmMCDataArray* fMuchPoints {nullptr};
TClonesArray* listMuchHitMatches {nullptr}; // Output CbmMatch array
TClonesArray* fDigiMatchesMuch {nullptr};
......
......@@ -25,8 +25,6 @@ struct CbmL1Hit {
int f = 0; // front strip index
int b = 0; // back strip index
int ID = 0; // TODO: check if this ID is redundant
int file = 0; // TODO: ??
int event = 0; // TODO: ??
L1Vector<int> mcPointIds {"CbmL1Hit::mcPointIds"}; // indices of CbmL1MCPoint in L1->vMCPoints array
};
......
......@@ -1806,8 +1806,6 @@ void CbmL1::InputPerformance()
// std::map<unsigned int, unsigned int> stripFToNMCMap,stripBToNMCMap;
map<unsigned int, unsigned int>::iterator it;
Int_t nMC = -1;
if (listStsPts) { nMC = listStsPts->GetEntriesFast(); }
if (listStsHits && listStsHitMatch) {
for (unsigned int iH = 0; iH < vStsHits.size(); iH++) {
......@@ -1904,37 +1902,24 @@ void CbmL1::InputPerformance()
CbmMvdHit* sh = L1_DYNAMIC_CAST<CbmMvdHit*>(listMvdHits->At(j));
CbmMatch* hm = L1_DYNAMIC_CAST<CbmMatch*>(listMvdHitMatches->At(j));
int iMC = -1;
// float mcWeight = -1.f;
// for(int iDigiLink=0; iDigiLink<hm->GetNofLinks(); iDigiLink++)
// {
// if( hm->GetLink(iDigiLink).GetWeight() > mcWeight)
// {
// mcWeight = hm->GetLink(iDigiLink).GetWeight();
// iMC = hm->GetLink(iDigiLink).GetIndex();
// }
// }
if (hm->GetNofLinks() > 0) iMC = hm->GetLink(0).GetIndex();
CbmMvdPoint* pt = nullptr;
{
float mcWeight = -1.f;
for (int iLink = 0; iLink < hm->GetNofLinks(); iLink++) {
const CbmLink& link = hm->GetLink(iLink);
if (link.GetWeight() < mcWeight) continue;
mcWeight = link.GetWeight();
pt = dynamic_cast<CbmMvdPoint*>(fMvdPoints->Get(&link));
}
}
if (!pt) continue;
if (iMC < 0) continue;
// hit pulls and residuals
TVector3 hitPos, mcPos, hitErr;
sh->Position(hitPos);
sh->PositionError(hitErr);
CbmMvdPoint* pt = 0;
nMC = listMvdPts->GetEntriesFast();
if (iMC >= 0 && iMC < nMC) pt = L1_DYNAMIC_CAST<CbmMvdPoint*>(listMvdPts->At(iMC));
if (!pt) {
// cout << " No MC points! " << "iMC=" << iMC << endl;
continue;
}
mcPos.SetX((pt->GetX() + pt->GetXOut()) / 2.);
mcPos.SetY((pt->GetY() + pt->GetYOut()) / 2.);
mcPos.SetZ(hitPos.Z());
......
......@@ -69,10 +69,10 @@ struct TmpHit { // used for sort Hits before writing in the normal arrays
double dx, dy, dxy;
double du, dv;
int iMC; // index of MCPoint in the vMCPoints array
double time, dt;
double time = 0., dt = 1.e10;
int Det;
int id;
int track;
static bool Compare(const TmpHit& a, const TmpHit& b)
{
return (a.iStation < b.iStation) || ((a.iStation == b.iStation) && (a.y < b.y));
......@@ -130,8 +130,13 @@ void CbmL1::ReadEvent(L1AlgoInputData* fData_, float& TsStart, float& TsLength,
fData_->StsHitsStopIndex[i] = 0;
}
//Int_t nMvdPoints = 0;
nMvdPoints = 0;
nMvdPoints = 0;
int nStsPoints = 0;
int nTrdPoints = 0;
int nMuchPoints = 0;
int nTofPoints = 0;
// get MVD hits
Int_t nMvdHits = 0;
Int_t nMuchHits = 0;
......@@ -140,11 +145,6 @@ void CbmL1::ReadEvent(L1AlgoInputData* fData_, float& TsStart, float& TsLength,
// get STS hits
int nStsHits = 0;
int nStsPoints = 0;
int nTrdPoints = 0;
nMuchPoints = 0;
int nTofPoints = 0;
L1Vector<CbmLink*> ToFPointsMatch("CbmL1ReadEvent::ToFPointsMatch");
if (fPerformance) {
......@@ -159,93 +159,74 @@ void CbmL1::ReadEvent(L1AlgoInputData* fData_, float& TsStart, float& TsLength,
Int_t iEvent = set_it->second;
if (fMvdPoints && listMvdPts) {
if (fMvdPoints) {
Int_t nMvdPointsInEvent = fMvdPoints->Size(iFile, iEvent);
for (Int_t iMC = 0; iMC < nMvdPointsInEvent; iMC++) {
CbmL1MCPoint MC;
MC.event = iEvent;
if (!ReadMCPoint(&MC, iMC, iFile, iEvent, 1)) {
MC.iStation = -1;
L1Station* sta = algo->vStations;
for (Int_t iSt = 0; iSt < NStsStations; iSt++) {
MC.iStation = (MC.z > sta[iSt].z[0] - 1) ? iSt : MC.iStation;
if (MC.z > sta[iSt].z[0] - 1) { MC.iStation = iSt; }
}
assert(MC.iStation >= 0);
Double_t dtrck = dFEI(iFile, iEvent, MC.ID);
DFEI2I::iterator trk_it = dFEI2vMCTracks.find(dtrck);
if (trk_it == dFEI2vMCTracks.end()) continue;
Int_t IND_Track = trk_it->second;
vMCTracks[IND_Track].Points.push_back_no_warning(vMCPoints.size());
assert(trk_it != dFEI2vMCTracks.end());
MC.ID = trk_it->second;
// vMCTracks[MC.ID].Points.push_back(vMCPoints.size());
vMCTracks[MC.ID].Points.push_back_no_warning(vMCPoints.size());
dFEI2vMCPoints.insert(DFEI2I::value_type(dFEI(iFile, iEvent, iMC), vMCPoints.size()));
vMCPoints.push_back(MC);
vMCPoints_in_Time_Slice.push_back(0);
dFEI2vMCPoints.insert(DFEI2I::value_type(dFEI(iFile, iEvent, iMC), vMCPoints.size() - 1));
nMvdPoints++;
}
}
}
Int_t nMC = fStsPoints->Size(iFile, iEvent);
for (Int_t iMC = 0; iMC < nMC; iMC++) {
CbmL1MCPoint MC;
MC.event = iEvent;
if (!ReadMCPoint(&MC, iMC, iFile, iEvent, 0)) {
MC.iStation = -1;
L1Station* sta = algo->vStations + NMvdStations;
for (Int_t iSt = 0; iSt < NStsStations; iSt++)
MC.iStation = (MC.z > sta[iSt].z[0] - 2.5) ? (NMvdStations + iSt) : MC.iStation;
Double_t dtrck = dFEI(iFile, iEvent, MC.ID);
DFEI2I::iterator trk_it = dFEI2vMCTracks.find(dtrck);
if (trk_it == dFEI2vMCTracks.end()) continue;
Int_t IND_Track = trk_it->second;
vMCTracks[IND_Track].Points.push_back_no_warning(vMCPoints.size());
MC.ID = trk_it->second;
vMCPoints.push_back(MC);
vMCPoints_in_Time_Slice.push_back(0);
dFEI2vMCPoints.insert(DFEI2I::value_type(dFEI(iFile, iEvent, iMC + nMvdPoints), vMCPoints.size() - 1));
nStsPoints++;
if (fStsPoints) {
Int_t nMC = fStsPoints->Size(iFile, iEvent);
for (Int_t iMC = 0; iMC < nMC; iMC++) {
CbmL1MCPoint MC;
if (!ReadMCPoint(&MC, iMC, iFile, iEvent, 0)) {
MC.iStation = -1;
L1Station* sta = algo->vStations + NMvdStations;
for (Int_t iSt = 0; iSt < NStsStations; iSt++) {
if (MC.z > sta[iSt].z[0] - 2.5) { MC.iStation = NMvdStations + iSt; }
}
assert(MC.iStation >= 0);
Double_t dtrck = dFEI(iFile, iEvent, MC.ID);
DFEI2I::iterator trk_it = dFEI2vMCTracks.find(dtrck);
assert(trk_it != dFEI2vMCTracks.end());
MC.ID = trk_it->second;
vMCTracks[MC.ID].Points.push_back_no_warning(vMCPoints.size());
dFEI2vMCPoints.insert(DFEI2I::value_type(dFEI(iFile, iEvent, iMC + nMvdPoints), vMCPoints.size()));
vMCPoints.push_back(MC);
vMCPoints_in_Time_Slice.push_back(0);
nStsPoints++;
}
}
}
if (fMuchPoints) {
for (Int_t iMC = 0; iMC < fMuchPoints->Size(iFile, iEvent); iMC++) {
Int_t nMC = fMuchPoints->Size(iFile, iEvent);
for (Int_t iMC = 0; iMC < nMC; iMC++) {
CbmL1MCPoint MC;
MC.event = iEvent;
if (!ReadMCPoint(&MC, iMC, iFile, iEvent, 2)) {
MC.iStation = -1;
L1Station* sta = algo->vStations + NMvdStations + NStsStations;
for (Int_t iSt = 0; iSt < NMuchStations; iSt++)
MC.iStation = (MC.z > sta[iSt].z[0] - 2.5) ? (NMvdStations + NStsStations + iSt) : MC.iStation;
for (Int_t iSt = 0; iSt < NMuchStations; iSt++) {
if (MC.z > sta[iSt].z[0] - 2.5) { MC.iStation = NMvdStations + NStsStations + iSt; }
}
assert(MC.iStation >= 0);
Double_t dtrck = dFEI(iFile, iEvent, MC.ID);
DFEI2I::iterator trk_it = dFEI2vMCTracks.find(dtrck);
if (trk_it == dFEI2vMCTracks.end()) continue;
Int_t IND_Track = trk_it->second;
vMCTracks[IND_Track].Points.push_back_no_warning(vMCPoints.size());
assert(trk_it != dFEI2vMCTracks.end());
MC.ID = trk_it->second;
vMCTracks[MC.ID].Points.push_back_no_warning(vMCPoints.size());
dFEI2vMCPoints.insert(
DFEI2I::value_type(dFEI(iFile, iEvent, iMC + nMvdPoints + nStsPoints), vMCPoints.size()));
vMCPoints.push_back(MC);
vMCPoints_in_Time_Slice.push_back(0);
dFEI2vMCPoints.insert(
DFEI2I::value_type(dFEI(iFile, iEvent, iMC + nMvdPoints + nStsPoints), vMCPoints.size() - 1));
nMuchPoints++;
}
}
......@@ -255,32 +236,22 @@ void CbmL1::ReadEvent(L1AlgoInputData* fData_, float& TsStart, float& TsLength,
if (fTrdPoints)
for (Int_t iMC = 0; iMC < fTrdPoints->Size(iFile, iEvent); iMC++) {
CbmL1MCPoint MC;
MC.event = iEvent;
if (!ReadMCPoint(&MC, iMC, iFile, iEvent, 3)) {
MC.iStation = -1;
L1Station* sta = algo->vStations + NMvdStations + NStsStations + NMuchStations;
for (Int_t iSt = 0; iSt < NTrdStations; iSt++)
MC.iStation =
(MC.z > sta[iSt].z[0] - 4.0) ? (NMvdStations + NStsStations + NMuchStations + iSt) : MC.iStation;
for (Int_t iSt = 0; iSt < NTrdStations; iSt++) {
if (MC.z > sta[iSt].z[0] - 4.0) { MC.iStation = NMvdStations + NStsStations + NMuchStations + iSt; }
}
assert(MC.iStation >= 0);
Double_t dtrck = dFEI(iFile, iEvent, MC.ID);
DFEI2I::iterator trk_it = dFEI2vMCTracks.find(dtrck);
if (trk_it == dFEI2vMCTracks.end()) continue;
Int_t IND_Track = trk_it->second;
vMCTracks[IND_Track].Points.push_back_no_warning(vMCPoints.size());
assert(trk_it != dFEI2vMCTracks.end());
MC.ID = trk_it->second;
vMCTracks[MC.ID].Points.push_back_no_warning(vMCPoints.size());
dFEI2vMCPoints.insert(
DFEI2I::value_type(dFEI(iFile, iEvent, iMC + nMvdPoints + nStsPoints + nMuchPoints), vMCPoints.size()));
vMCPoints.push_back(MC);
vMCPoints_in_Time_Slice.push_back(0);
dFEI2vMCPoints.insert(DFEI2I::value_type(dFEI(iFile, iEvent, iMC + nMvdPoints + nStsPoints + nMuchPoints),
vMCPoints.size() - 1));
nTrdPoints++;
}
}
......@@ -288,6 +259,8 @@ void CbmL1::ReadEvent(L1AlgoInputData* fData_, float& TsStart, float& TsLength,
ToFPointsMatch.clear();
if (fTofPoints) {
// TOF data arrays also contain fake beam-counter data. Select the real TOF points here.
for (int j = 0; j < fTofHits->GetEntriesFast(); j++) {
CbmLink* link = 0;
......@@ -333,9 +306,6 @@ void CbmL1::ReadEvent(L1AlgoInputData* fData_, float& TsStart, float& TsLength,
for (UInt_t iMC = 0; iMC < ToFPointsMatch.size(); iMC++) {
CbmL1MCPoint MC;
MC.event = iEvent;
if (ToFPointsMatch[iMC] == 0) continue;
......@@ -343,6 +313,8 @@ void CbmL1::ReadEvent(L1AlgoInputData* fData_, float& TsStart, float& TsLength,
if (eventNr != iEvent) continue;
CbmL1MCPoint MC;
if (!ReadMCPoint(&MC, ToFPointsMatch[iMC]->GetIndex(), ToFPointsMatch[iMC]->GetFile(),
ToFPointsMatch[iMC]->GetEntry(), 4)) {
......@@ -399,12 +371,6 @@ void CbmL1::ReadEvent(L1AlgoInputData* fData_, float& TsStart, float& TsLength,
if (listMvdHits) {
// if(listMvdPts)
// {
// isUsedMvdPoint.resize(nMC);
// for(int iMc=0; iMc<nMC; iMc++) isUsedMvdPoint[iMc]=0;
// }
int firstDetStrip = NStrips;
for (int j = 0; j < listMvdHits->GetEntriesFast(); j++) {
......@@ -437,17 +403,14 @@ void CbmL1::ReadEvent(L1AlgoInputData* fData_, float& TsStart, float& TsLength,
th.u_front = th.x * st.frontInfo.cos_phi[0] + th.y * st.frontInfo.sin_phi[0];
th.u_back = th.x * st.backInfo.cos_phi[0] + th.y * st.backInfo.sin_phi[0];
}
th.Det = 0;
th.iMC = -1;
int iMC = -1;
th.Det = 0;
th.iMC = -1;
if (fPerformance) {
if (listMvdHitMatches) {
CbmMatch* mvdHitMatch = L1_DYNAMIC_CAST<CbmMatch*>(listMvdHitMatches->At(j));
if (mvdHitMatch->GetNofLinks() > 0)
if (mvdHitMatch->GetLink(0).GetIndex() < nMvdPoints) {
iMC = mvdHitMatch->GetLink(0).GetIndex();
th.iMC = iMC;
// th.track = iMC;
th.iMC = mvdHitMatch->GetLink(0).GetIndex();
#ifdef MVDIDEALHITS
//TODO
#endif
......@@ -898,6 +861,10 @@ void CbmL1::ReadEvent(L1AlgoInputData* fData_, float& TsStart, float& TsLength,
if (fVerbose >= 10) cout << "ReadEvent: sts hits are gotten." << endl;
if (fVerbose > 1) {
LOG(info) << "L1 ReadEvent: nhits mvd " << nMvdHits << " sts " << nStsHits << " much " << nMuchHits << " trd "
<< nTrdHits << " tof " << nTofHits << endl;
}
// sort hits
int nHits = nMvdHits + nStsHits + nMuchHits + nTrdHits + nTofHits;
......@@ -1307,35 +1274,34 @@ void CbmL1::HitMatch()
Float_t bestWeight = 0.f;
Float_t totalWeight = 0.f;
for (Int_t iLink = 0; iLink < stsHitMatch.GetNofLinks(); iLink++) {
Int_t iFile = stsHitMatch.GetLink(iLink).GetFile();
Int_t iEvent = stsHitMatch.GetLink(iLink).GetEntry();
Int_t iIndex = stsHitMatch.GetLink(iLink).GetIndex();
const CbmLink& link = stsHitMatch.GetLink(iLink);
Int_t iFile = link.GetFile();
Int_t iEvent = link.GetEntry();
Int_t iIndex = link.GetIndex();
if (!fTimesliceMode) {
iFile = vFileEvent.begin()->first;
iEvent = vFileEvent.begin()->second;
}
Double_t dtrck = dFEI(iFile, iEvent, nMvdPoints + iIndex);
DFEI2I::iterator trk_it = dFEI2vMCPoints.find(dtrck);
Double_t dpnt = dFEI(iFile, iEvent, nMvdPoints + iIndex);
DFEI2I::iterator pnt_it = dFEI2vMCPoints.find(dpnt);
if (trk_it == dFEI2vMCPoints.end()) continue;
assert(pnt_it != dFEI2vMCPoints.end());
totalWeight += stsHitMatch.GetLink(iLink).GetWeight();
if (stsHitMatch.GetLink(iLink).GetWeight() > bestWeight) {
bestWeight = stsHitMatch.GetLink(iLink).GetWeight();
iP = trk_it->second;
totalWeight += link.GetWeight();
if (link.GetWeight() > bestWeight) {
bestWeight = link.GetWeight();
iP = pnt_it->second;
}
}
} //mach cluster
if (iP >= 0) {
hit.event = vMCPoints[iP].event;
hit.mcPointIds.push_back_no_warning(iP);
vMCPoints[iP].hitIds.push_back_no_warning(iH);
}
else {