diff --git a/macro/mcbm/L1_histo.root b/macro/mcbm/L1_histo.root new file mode 100644 index 0000000000000000000000000000000000000000..474e834bf6bce8a5ce47fb5de84083db57b043fd Binary files /dev/null and b/macro/mcbm/L1_histo.root differ diff --git a/macro/mcbm/data/.nfs00000003202cb63f00088db8 b/macro/mcbm/data/.nfs00000003202cb63f00088db8 new file mode 100644 index 0000000000000000000000000000000000000000..9078904f5799fde3dcfc5a9cc7bde3bdb8d545ae Binary files /dev/null and b/macro/mcbm/data/.nfs00000003202cb63f00088db8 differ diff --git a/macro/mcbm/data/.nfs00000003202cba1400088de1 b/macro/mcbm/data/.nfs00000003202cba1400088de1 new file mode 100644 index 0000000000000000000000000000000000000000..84a6347e9bd7124f204aefcc93e5018f73e9c281 Binary files /dev/null and b/macro/mcbm/data/.nfs00000003202cba1400088de1 differ diff --git a/macro/mcbm/mcbm_reco_event.C b/macro/mcbm/mcbm_reco_event.C index fd9d84ddbb57fbbcd4dfe284ffb0d0e45e1f89ef..bb86becafa7b8c9da81883135737104aa24ba2f4 100644 --- a/macro/mcbm/mcbm_reco_event.C +++ b/macro/mcbm/mcbm_reco_event.C @@ -359,7 +359,7 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch // ------------------------------------------------------------------------ // -------- L1 CA Track Finder --------------------------------------- - if (setupName == "mcbm_beam_2020_03") { + if (strcmp(setupName, "mcbm_beam_2020_03") == 0) { CbmKF* kalman = new CbmKF(); run->AddTask(kalman); @@ -399,7 +399,7 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch l1->SetMuchPar(parFile); TString parFile2 = gSystem->Getenv("VMCWORKDIR"); - parFile2 = parFile2 + "/parameters/much/much_matbudget_" + geoTag + "_mcbm.root "; + parFile2 = parFile2 + "/parameters/much/much_matbudget_" + geoTag + ".root "; std::cout << "Using material budget file " << parFile2 << std::endl; l1->SetMuchMaterialBudgetFileName(parFile2.Data()); } @@ -407,7 +407,7 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch TString trdGeoTag; if (setup->GetGeoTag(ECbmModuleId::kTrd, trdGeoTag)) { TString parFile = gSystem->Getenv("VMCWORKDIR"); - parFile = parFile + "/parameters/trd/trd_matbudget_" + trdGeoTag + "_mcbm.root"; + parFile = parFile + "/parameters/trd/trd_matbudget_" + trdGeoTag + ".root "; std::cout << "Using material budget file " << parFile << std::endl; l1->SetTrdMaterialBudgetFileName(parFile.Data()); } @@ -415,16 +415,16 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch TString tofGeoTag; if (setup->GetGeoTag(ECbmModuleId::kTof, tofGeoTag)) { TString parFile = gSystem->Getenv("VMCWORKDIR"); - parFile = parFile + "/parameters/tof/tof_matbudget_" + tofGeoTag + "_mcbm.root"; + parFile = parFile + "/parameters/tof/tof_matbudget_" + tofGeoTag + ".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); + CbmL1GlobalTrackFinder* globalTrackFinder = new CbmL1GlobalTrackFinder(); + FairTask* globalFindTracks = new CbmL1GlobalFindTracksEvents(globalTrackFinder); + run->AddTask(globalFindTracks); } diff --git a/reco/L1/CMakeLists.txt b/reco/L1/CMakeLists.txt index c707cea2e325b5c5013754013d629695f2bd5b50..c183c708432b8c8a68a1e3aae749e95125d87b3f 100644 --- a/reco/L1/CMakeLists.txt +++ b/reco/L1/CMakeLists.txt @@ -1,12 +1,12 @@ -# Create a library called "libL1" which includes the source files given in -# the array . -# The extension is already found. Any number of sources could be listed here. +#Create a library called "libL1" which includes the source files given in +#the array. +#The extension is already found.Any number of sources could be listed here. #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") Set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wshadow -Weffc++ -Wno-unused-variable -Wno-unused-parameter -Wno-sign-compare -Wno-ignored-qualifiers -Wno-overloaded-virtual") -# Set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Weverything -Wno-padded -Wno-global-constructors") -# Set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wold-style-cast") +#Set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Weverything -Wno-padded -Wno-global-constructors") +#Set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wold-style-cast") Set(INCLUDE_DIRECTORIES ${CBMROOT_SOURCE_DIR}/reco/base @@ -53,8 +53,8 @@ Set(SYSTEM_INCLUDE_DIRECTORIES ${KFParticle_INCLUDE_DIR} ) -# For the time being don't use OpenMP on APPLE -# There are runtime problems with L1 (Redmine #2028) +#For the time being don't use OpenMP on APPLE +#There are runtime problems with L1(Redmine #2028) if(NOT APPLE) if (OPENMP_FOUND) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") @@ -88,13 +88,13 @@ link_directories( ${LINK_DIRECTORIES}) set(SRCS -#L1Algo/L1CATrackFinder.cxx -#CbmL1Performance.cxx -#CbmL1ReadEvent.cxx +#L1Algo / L1CATrackFinder.cxx +#CbmL1Performance.cxx +#CbmL1ReadEvent.cxx #CbmL1CATrdTrackFinderSA.cxx CbmL1TrdTracklet.cxx CbmL1TrdTracklet4.cxx -CbmL1.cxx +CbmL1.cxx #CbmL1TrdTrackFinderSts.cxx CbmL1TrackMerger.cxx CbmL1TofMerger.cxx @@ -102,14 +102,16 @@ L1AlgoInputData.cxx OffLineInterface/CbmL1RichENNRingFinder.cxx OffLineInterface/CbmL1RichENNRingFinderParallel.cxx OffLineInterface/CbmL1StsTrackFinder.cxx -#OffLineInterface/CbmL1MuchFinder.cxx -#OffLineInterface/CbmL1MuchHit.cxx -#OffLineInterface/CbmL1MuchTrack.cxx -#OffLineInterface/CbmL1MuchFinderQa.cxx -OffLineInterface/CbmL1RichRingQa.cxx -#OffLineInterface/CbmL1SttHit.cxx -#OffLineInterface/CbmL1SttTrackFinder.cxx -#OffLineInterface/CbmL1SttTrack.cxx +OffLineInterface/CbmL1GlobalTrackFinder.cxx +OffLineInterface/CbmL1GlobalFindTracksEvents.cxx +#OffLineInterface / CbmL1MuchFinder.cxx +#OffLineInterface / CbmL1MuchHit.cxx +#OffLineInterface / CbmL1MuchTrack.cxx +#OffLineInterface / CbmL1MuchFinderQa.cxx +OffLineInterface/CbmL1RichRingQa.cxx +#OffLineInterface / CbmL1SttHit.cxx +#OffLineInterface / CbmL1SttTrackFinder.cxx +#OffLineInterface / CbmL1SttTrack.cxx L1Algo/L1Algo.cxx L1Algo/L1CATrackFinder.cxx @@ -146,25 +148,27 @@ CbmL1TrdHit.h CbmL1TrdTracklet4.h CbmL1TrdTracklet.h CbmL1Vtx.h -#OffLineInterface/CbmL1MuchFinder.h -#OffLineInterface/CbmL1MuchFinderQa.h -#OffLineInterface/CbmL1MuchHit.h -#OffLineInterface/CbmL1MuchTrack.h +#OffLineInterface / CbmL1MuchFinder.h +#OffLineInterface / CbmL1MuchFinderQa.h +#OffLineInterface / CbmL1MuchHit.h +#OffLineInterface / CbmL1MuchTrack.h OffLineInterface/CbmL1RichENNRingFinder.h OffLineInterface/CbmL1RichRingQa.h OffLineInterface/CbmL1StsTrackFinder.h -#OffLineInterface/CbmL1SttHit.h -#OffLineInterface/CbmL1SttTrackFinder.h -#OffLineInterface/CbmL1SttTrack.h -# L1Algo/L1Algo.h +OffLineInterface/CbmL1GlobalTrackFinder.h +OffLineInterface/CbmL1GlobalFindTracksEvents.h +#OffLineInterface / CbmL1SttHit.h +#OffLineInterface / CbmL1SttTrackFinder.h +#OffLineInterface / CbmL1SttTrack.h +#L1Algo / L1Algo.h ) If(APPLE) - ADD_DEFINITIONS(-Wall -Wsign-promo -Wctor-dtor-privacy -Wreorder -Wno-deprecated -Wno-parentheses -DDO_TPCCATRACKER_EFF_PERFORMANCE -DNonhomogeneousField -DCBM -DUSE_TIMERS) # -Weffc++ -Wnon-virtual-dtor -Woverloaded-virtual -Wold-style-cast : wait for other parts of cbmroot\root. - #---Check for compiler flags + ADD_DEFINITIONS(-Wall -Wsign-promo -Wctor-dtor-privacy -Wreorder -Wno-deprecated -Wno-parentheses -DDO_TPCCATRACKER_EFF_PERFORMANCE -DNonhomogeneousField -DCBM -DUSE_TIMERS) # -Weffc++ -Wnon-virtual-dtor -Woverloaded-virtual -Wold-style-cast : wait for other parts of cbmroot\root. +#-- - Check for compiler flags CHECK_CXX_COMPILER_FLAG("-Wno-pmf-conversions" HAS_PMF) If(HAS_PMF) ADD_DEFINITIONS(-Wno-pmf-conversions) @@ -201,8 +205,9 @@ set(LINKDEF L1LinkDef.h) Set(LIBRARY_NAME L1) if (OPENMP_FOUND AND APPLE) Set(DEPENDENCIES - KF CbmMuchBase CbmTrdBase CbmStsBase CbmRecoBase CbmBase CbmData CbmRecoSts Base boost_regex ${OpenMP_CXX_LIBRARIES} -# KF CbmMuchBase CbmTrdBase CbmStsBase CbmRecoBase CbmBase CbmData CbmRecoSts Base boost_regex omp + KF CbmMuchBase CbmTrdBase CbmStsBase CbmRecoBase CbmBase CbmData CbmRecoSts Base boost_regex ${ + OpenMP_CXX_LIBRARIES} +#KF CbmMuchBase CbmTrdBase CbmStsBase CbmRecoBase CbmBase CbmData CbmRecoSts Base boost_regex omp ) else() Set(DEPENDENCIES @@ -217,11 +222,11 @@ Install(FILES CbmL1Counters.h DESTINATION include ) -# Test to check if OpenMP is working on APPLE +#Test to check if OpenMP is working on APPLE #set(EXE_NAME test_openmp) #set(SRCS test.cxx) #set(DEPENDENCIES -# ${DEPENDENCIES} -# omp +#${DEPENDENCIES } +#omp #) #GENERATE_EXECUTABLE() diff --git a/reco/L1/L1LinkDef.h b/reco/L1/L1LinkDef.h index abe909176247ac1f263b2d4fbcd3d922b8f3ef39..6e056b29a76d0bb2d293b21d07f4d6549e4dd958 100644 --- a/reco/L1/L1LinkDef.h +++ b/reco/L1/L1LinkDef.h @@ -23,6 +23,8 @@ #pragma link C++ class CbmL1RichRingQa + ; #pragma link C++ class CbmL1TrdTracklet + ; #pragma link C++ class CbmL1TrdTracklet4 + ; +#pragma link C++ class CbmL1GlobalTrackFinder + ; +#pragma link C++ class CbmL1GlobalFindTracksEvents + ; //#pragma link C++ class CbmL1CATrdTrackFinderSA+; //#pragma link C++ class CbmL1SttHit+; //#pragma link C++ class CbmL1SttTrackFinder+; diff --git a/reco/L1/OffLineInterface/CbmGlobalFindTracksEvents.cxx b/reco/L1/OffLineInterface/CbmGlobalFindTracksEvents.cxx new file mode 100644 index 0000000000000000000000000000000000000000..fad8be06884c45f57eb5d994d17516114148408a --- /dev/null +++ b/reco/L1/OffLineInterface/CbmGlobalFindTracksEvents.cxx @@ -0,0 +1,237 @@ +/** @file CbmGlobalFindTracksEvent.cxx + ** @author V. Akishina <v.akishina@gsi.de> + ** based on CbmStsFindTracksEvent.cxx by Volker Friese <v.friese@gsi.de> + ** @since 07.05.2021 + ** @date 07.05.2021 + **/ + + +// Includes from STS +#include "CbmGlobalFindTracksEvents.h" + +#include "CbmEvent.h" +#include "CbmL1GlobalTrackFinder.h" +#include "CbmStsHit.h" +#include "CbmStsTrack.h" +#include "CbmStsTrackFinderIdeal.h" + +#include <cassert> + +// Includes from base +#include "FairField.h" +#include "FairRootManager.h" +#include "FairRunAna.h" +#include "FairRuntimeDb.h" +#include <Logger.h> + +// Includes from ROOT +#include "TClonesArray.h" + +// Includes from C++ +#include <iomanip> +#include <iostream> + +using std::cout; +using std::endl; +using std::fixed; +using std::left; +using std::pair; +using std::right; +using std::setprecision; +using std::setw; +using std::stringstream; + +// ----- Standard constructor ------------------------------------------ +CbmGlobalFindTracksEvents::CbmGlobalFindTracksEvents(CbmL1GlobalTrackFinder* finder, Bool_t useMvd) + : FairTask("GlobalFindTracksEvents") + , fUseMvd(useMvd) + , fFinder(finder) + , fEvents(NULL) + , fMvdHits(NULL) + , fStsHits(NULL) + , fGlobalTracks(NULL) + , fStsTrackArray(NULL) + , fMuchTrackArray(NULL) + , fTrdTrackArray(NULL) + , fTofTrackArray(NULL) + , fTimer() + , fNofEvents(0) + , fNofHits(0.) + , fNofTracks(0.) + , fTime(0.) +{ + if (!finder) fFinder = new CbmL1GlobalTrackFinder(); +} +// ------------------------------------------------------------------------- + + +// ----- Destructor ---------------------------------------------------- +CbmGlobalFindTracksEvents::~CbmGlobalFindTracksEvents() +{ + fGlobalTracks->Delete(); + if (fFinder) delete fFinder; +} +// ------------------------------------------------------------------------- + + +// ----- Task execution ------------------------------------------------ +void CbmGlobalFindTracksEvents::Exec(Option_t* /*opt*/) +{ + + // --- Local variables + Long64_t nEvents = 0; + Long64_t nHits = 0; + Long64_t nTracks = 0; + pair<UInt_t, UInt_t> result; + TStopwatch timer; + timer.Start(); + + // --- Clear output array + fGlobalTracks->Delete(); + + // --- Event loop (from event objects) + if (fEvents) { + nEvents = fEvents->GetEntriesFast(); + LOG(debug) << GetName() << ": reading time slice with " << nEvents << " events "; + for (Int_t iEvent = 0; iEvent < nEvents; iEvent++) { + CbmEvent* event = static_cast<CbmEvent*>(fEvents->At(iEvent)); + result = ProcessEvent(event); + nHits += result.first; + nTracks += result.second; + } //# events + } //? event branch present + + else { // Timeslice reconstruction without events + ProcessEvent(nullptr); + nHits = result.first; + nTracks = result.second; + } + + // --- Timeslice log and statistics + timer.Stop(); + stringstream logOut; + logOut << setw(20) << left << GetName() << " ["; + logOut << fixed << setw(8) << setprecision(1) << right << timer.RealTime() * 1000. << " ms] "; + logOut << "TS " << fNofTs; + if (fEvents) logOut << ", events " << nEvents; + logOut << ", hits " << nHits << ", tracks " << nTracks; + LOG(info) << logOut.str(); + fNofTs++; + fNofEvents += nEvents; + fNofHits += nHits; + fNofTracks += nTracks; + fTime += timer.RealTime(); +} +// ------------------------------------------------------------------------- + + +// ----- Initialisation ------------------------------------------------ +InitStatus CbmGlobalFindTracksEvents::Init() +{ + + LOG(info) << "====================================="; + LOG(info) << GetName() << ": initialising"; + + // I/O manager + FairRootManager* ioman = FairRootManager::Instance(); + assert(ioman); + + // --- Get input array (Events) + fEvents = dynamic_cast<TClonesArray*>(ioman->GetObject("CbmEvent")); + if (nullptr == fEvents) { LOG(warn) << GetName() << ": No event array! Will process entire tree."; } + + // --- Get input array (StsHits) + fStsHits = (TClonesArray*) ioman->GetObject("StsHit"); + assert(fStsHits); + + // Array of MvdHits + if (fUseMvd) { + fMvdHits = (TClonesArray*) ioman->GetObject("MvdHit"); + if (fMvdHits == nullptr) { + LOG(error) << GetName() << ": Use of MVD hits selected, but no hit branch present! " + << "Tracking will be done without MVD hits."; + } + else + LOG(info) << GetName() << ": including MVD hits in tracking"; + } + + // Create and register output array for StsTracks + fGlobalTracks = new TClonesArray("CbmGlobalTrack", 100); + ioman->Register("GlobalTrack", "Global", fGlobalTracks, IsOutputBranchPersistent("GlobalTrack")); + fStsTrackArray = new TClonesArray("CbmStsTrack", 100); + ioman->Register("StsTrack", "STS", fStsTrackArray, IsOutputBranchPersistent("StsTrack")); + fMuchTrackArray = new TClonesArray("CbmMuchTrack", 100); + ioman->Register("MuchTrack", "MUCH", fMuchTrackArray, IsOutputBranchPersistent("MuchTrack")); + fTrdTrackArray = new TClonesArray("CbmTrdTrack", 100); + ioman->Register("TrdTrack", "TRD", fTrdTrackArray, IsOutputBranchPersistent("TrdTrack")); + fTofTrackArray = new TClonesArray("CbmTofTrack", 100); + ioman->Register("TofTrack", "TOF", fTofTrackArray, IsOutputBranchPersistent("TofTrack")); + + // Check for Track finder + if (!fFinder) { + LOG(fatal) << GetName() << ": no track finding engine selected!"; + return kERROR; + } + LOG(info) << GetName() << ": Use track finder " << fFinder->GetName(); + + // Set members of track finder and initialise it + fFinder->SetMvdHitArray(fMvdHits); + fFinder->SetStsHitArray(fStsHits); + fFinder->SetGlobalTracksArray(fGlobalTracks); + fFinder->SetStsTracksArray(fStsTrackArray); + fFinder->SetMuchTracksArray(fMuchTrackArray); + fFinder->SetTrdTracksArray(fTrdTrackArray); + fFinder->SetTofTracksArray(fTofTrackArray); + fFinder->Init(); + + // Screen output + LOG(info) << GetName() << ": successfully initialised."; + LOG(info) << "=====================================\n"; + + return kSUCCESS; +} +// ------------------------------------------------------------------------- + + +// ----- End-of-run action --------------------------------------------- +void CbmGlobalFindTracksEvents::Finish() +{ + std::cout << std::endl; + LOG(info) << "====================================="; + LOG(info) << GetName() << ": Run summary"; + LOG(info) << "Time slices : " << fNofTs; + LOG(info) << "Hits / TS : " << fixed << setprecision(2) << Double_t(fNofHits) / Double_t(fNofTs); + LOG(info) << "Tracks / TS : " << fixed << setprecision(2) << Double_t(fNofTracks) / Double_t(fNofTs); + LOG(info) << "Hits per track : " << fNofHits / fNofTracks; + LOG(info) << "Time per TS : " << 1000. * fTime / Double_t(fNofTs) << " ms "; + if (fEvents) { + LOG(info) << "Events processed : " << fNofEvents; + LOG(info) << "Hits / event : " << fNofHits / Double_t(fNofEvents); + LOG(info) << "Tracks / event : " << fNofTracks / Double_t(fNofEvents); + } + LOG(info) << "====================================="; +} +// ------------------------------------------------------------------------- + + +// ------ Process one event -------------------------------------------- +pair<UInt_t, UInt_t> CbmGlobalFindTracksEvents::ProcessEvent(CbmEvent* event) +{ + + // --- Call track finder + fTimer.Start(); + Int_t nTracks = fFinder->FindTracks(event); + fTimer.Stop(); + + // --- Event log + Int_t eventNumber = (event ? event->GetNumber() : fNofEvents); + Int_t nHits = (event ? event->GetNofData(ECbmDataType::kStsHit) : fStsHits->GetEntriesFast()); + LOG(debug) << "+ " << setw(20) << GetName() << ": Event " << setw(6) << right << eventNumber << ", real time " + << fixed << setprecision(6) << fTimer.RealTime() << " s, hits: " << nHits << ", tracks: " << nTracks; + + return std::make_pair(nHits, nTracks); +} +// ------------------------------------------------------------------------- + + +ClassImp(CbmGlobalFindTracksEvents) diff --git a/reco/L1/OffLineInterface/CbmGlobalFindTracksEvents.h b/reco/L1/OffLineInterface/CbmGlobalFindTracksEvents.h new file mode 100644 index 0000000000000000000000000000000000000000..399c6138d11f2791a2c55a4106c697397860dcfc --- /dev/null +++ b/reco/L1/OffLineInterface/CbmGlobalFindTracksEvents.h @@ -0,0 +1,118 @@ +/** @file CbmGlobalFindTracksEvent.h + ** @author V. Akishina <v.akishina@gsi.de> + ** based on CbmStsFindTracksEvent.h by Volker Friese <v.friese@gsi.de> + ** @since 07.05.2021 + ** @date 07.05.2021 + **/ + +#ifndef CBMGLOBALFINDTRACKSEVENTS +#define CBMGLOBALFINDTRACKSEVENTS 1 + + +#include "CbmL1GlobalTrackFinder.h" + +#include "FairTask.h" + +#include "TStopwatch.h" + + +class TClonesArray; +class CbmEvent; +class CbmStsTrackFinderIdeal; + + +/** @class CbmGlobalFindTracksEvents + ** @brief Task class for finding Global, STS, MUCH, TRD and TOF tracks in an event + ** @author V. Akishina <v.akishina@gsi.de> + ** based on CbmStsFindTracksEvent.h by Volker Friese <v.friese@gsi.de> + ** @since 07.05.2021 + ** @date 07.05.2021 + ** @version 1.0 + ** + ** This task creates GlobalTrack, StsTrack, MuchTrack, TrdTrack, TofTrack objects + ** from hits. + ** It uses as finding engine CbmL1GlobalTrackFinder. + **/ +class CbmGlobalFindTracksEvents : public FairTask { + +public: + /** Constructor + ** @param finder Track finder engine. Default: Ideal track finder. + ** @param useMvd Include MVD hits in track finding. Default kFALSE. + **/ + CbmGlobalFindTracksEvents(CbmL1GlobalTrackFinder* finder = NULL, Bool_t useMvd = kFALSE); + + + /** Destructor **/ + virtual ~CbmGlobalFindTracksEvents(); + + + /** Task execution **/ + virtual void Exec(Option_t* opt); + + + /** Track finder engine + ** @value Pointer to track finding engine + **/ + CbmL1GlobalTrackFinder* GetFinder() { return fFinder; }; + + + /** Usage of MVD hits + ** @value kTRUE if MVD hits are used for tracking + **/ + Bool_t IsMvdUsed() const { return fUseMvd; } + + + /** Set track finding engine + ** @param finder Pointer to track finding engine + **/ + void UseFinder(CbmL1GlobalTrackFinder* finder) + { + if (fFinder) delete fFinder; + fFinder = finder; + }; + + +private: + Bool_t fUseMvd; // Inclusion of MVD hits + CbmL1GlobalTrackFinder* fFinder; // TrackFinder concrete class + TClonesArray* fEvents; //! Array of CbmEvent objects + TClonesArray* fMvdHits; //! Input array of MVD hits + TClonesArray* fStsHits; //! Input array of STS hits + TClonesArray* fGlobalTracks; //! Output array of CbmGlobalTracks + TClonesArray* fStsTrackArray; //! Output array of CbmStsTracks + TClonesArray* fMuchTrackArray; //! Output array of CbmMuchTracks + TClonesArray* fTrdTrackArray; //! Output array of CbmTrdTracks + TClonesArray* fTofTrackArray; //! Output array of CbmTofTracks + TStopwatch fTimer; //! Timer + Int_t fNofTs = 0; ///< Number of processed timeslices + Int_t fNofEvents; ///< Number of events with success + Double_t fNofHits; ///< Number of hits + Double_t fNofTracks; ///< Number of tracks created + Double_t fTime; ///< Total real time used for good events + + + /** Initialisation at beginning of each event **/ + virtual InitStatus Init(); + + + /** Finish at the end of each event **/ + virtual void Finish(); + + + /** @brief Process one event or timeslice + ** @param event Pointer to event object. If null, entire timeslice is processed. + ** @return Number of input hits and output tracks + **/ + std::pair<UInt_t, UInt_t> ProcessEvent(CbmEvent* event); + + + /** Prevent usage of copy constructor and assignment operator **/ + CbmGlobalFindTracksEvents(const CbmGlobalFindTracksEvents&); + CbmGlobalFindTracksEvents operator=(const CbmGlobalFindTracksEvents&); + + + ClassDef(CbmGlobalFindTracksEvents, 1); +}; + +#endif diff --git a/reco/L1/OffLineInterface/CbmL1GlobalFindTracksEvents.cxx b/reco/L1/OffLineInterface/CbmL1GlobalFindTracksEvents.cxx new file mode 100644 index 0000000000000000000000000000000000000000..c3c868ccbc5f0c9c9332fa5bdddd9fe596ee5e15 --- /dev/null +++ b/reco/L1/OffLineInterface/CbmL1GlobalFindTracksEvents.cxx @@ -0,0 +1,246 @@ +/** @file CbmL1GlobalFindTracksEvent.cxx + ** @author V. Akishina <v.akishina@gsi.de> + ** based on CbmStsFindTracksEvent.cxx by Volker Friese <v.friese@gsi.de> + ** @since 07.05.2021 + ** @date 07.05.2021 + **/ + + +// Includes from STS +#include "CbmL1GlobalFindTracksEvents.h" + +#include "CbmEvent.h" +#include "CbmL1GlobalTrackFinder.h" +#include "CbmStsHit.h" +#include "CbmStsTrack.h" +#include "CbmStsTrackFinderIdeal.h" + +#include <cassert> + +// Includes from base +#include "FairField.h" +#include "FairRootManager.h" +#include "FairRunAna.h" +#include "FairRuntimeDb.h" +#include <Logger.h> + +// Includes from ROOT +#include "TClonesArray.h" + +// Includes from C++ +#include <iomanip> +#include <iostream> + +using std::cout; +using std::endl; +using std::fixed; +using std::left; +using std::pair; +using std::right; +using std::setprecision; +using std::setw; +using std::stringstream; + +// ----- Standard constructor ------------------------------------------ +CbmL1GlobalFindTracksEvents::CbmL1GlobalFindTracksEvents(CbmL1GlobalTrackFinder* finder, Bool_t useMvd) + : FairTask("GlobalFindTracksEvents") + , fUseMvd(useMvd) + , fFinder(finder) + , fEvents(NULL) + , fMvdHits(NULL) + , fStsHits(NULL) + , fGlobalTracks(NULL) + , fStsTrackArray(NULL) + , fMuchTrackArray(NULL) + , fTrdTrackArray(NULL) + , fTofTrackArray(NULL) + , fTimer() + , fNofEvents(0) + , fNofHits(0.) + , fNofTracks(0.) + , fTime(0.) +{ + if (!finder) fFinder = new CbmL1GlobalTrackFinder(); +} +// ------------------------------------------------------------------------- + + +// ----- Destructor ---------------------------------------------------- +CbmL1GlobalFindTracksEvents::~CbmL1GlobalFindTracksEvents() +{ + fGlobalTracks->Delete(); + fStsTrackArray->Delete(); + fMuchTrackArray->Delete(); + fTrdTrackArray->Delete(); + fTofTrackArray->Delete(); + if (fFinder) delete fFinder; +} +// ------------------------------------------------------------------------- + + +// ----- Task execution ------------------------------------------------ +void CbmL1GlobalFindTracksEvents::Exec(Option_t* /*opt*/) +{ + + // --- Local variables + Long64_t nEvents = 0; + Long64_t nHits = 0; + Long64_t nTracks = 0; + pair<UInt_t, UInt_t> result; + TStopwatch timer; + timer.Start(); + + // --- Clear output array + fGlobalTracks->Delete(); + fStsTrackArray->Delete(); + fMuchTrackArray->Delete(); + fTrdTrackArray->Delete(); + fTofTrackArray->Delete(); + + + // --- Event loop (from event objects) + if (fEvents) { + nEvents = fEvents->GetEntriesFast(); + LOG(debug) << GetName() << ": reading time slice with " << nEvents << " events "; + for (Int_t iEvent = 0; iEvent < nEvents; iEvent++) { + CbmEvent* event = static_cast<CbmEvent*>(fEvents->At(iEvent)); + result = ProcessEvent(event); + nHits += result.first; + nTracks += result.second; + } //# events + } //? event branch present + + else { // Timeslice reconstruction without events + ProcessEvent(nullptr); + nHits = result.first; + nTracks = result.second; + } + + // --- Timeslice log and statistics + timer.Stop(); + stringstream logOut; + logOut << setw(20) << left << GetName() << " ["; + logOut << fixed << setw(8) << setprecision(1) << right << timer.RealTime() * 1000. << " ms] "; + logOut << "TS " << fNofTs; + if (fEvents) logOut << ", events " << nEvents; + logOut << ", hits " << nHits << ", tracks " << nTracks; + LOG(info) << logOut.str(); + fNofTs++; + fNofEvents += nEvents; + fNofHits += nHits; + fNofTracks += nTracks; + fTime += timer.RealTime(); +} +// ------------------------------------------------------------------------- + + +// ----- Initialisation ------------------------------------------------ +InitStatus CbmL1GlobalFindTracksEvents::Init() +{ + + LOG(info) << "====================================="; + LOG(info) << GetName() << ": initialising"; + + // I/O manager + FairRootManager* ioman = FairRootManager::Instance(); + assert(ioman); + + // --- Get input array (Events) + fEvents = dynamic_cast<TClonesArray*>(ioman->GetObject("CbmEvent")); + if (nullptr == fEvents) { LOG(warn) << GetName() << ": No event array! Will process entire tree."; } + + // --- Get input array (StsHits) + fStsHits = (TClonesArray*) ioman->GetObject("StsHit"); + assert(fStsHits); + + // Array of MvdHits + if (fUseMvd) { + fMvdHits = (TClonesArray*) ioman->GetObject("MvdHit"); + if (fMvdHits == nullptr) { + LOG(error) << GetName() << ": Use of MVD hits selected, but no hit branch present! " + << "Tracking will be done without MVD hits."; + } + else + LOG(info) << GetName() << ": including MVD hits in tracking"; + } + + // Create and register output array for StsTracks + fGlobalTracks = new TClonesArray("CbmGlobalTrack", 100); + ioman->Register("GlobalTrack", "Global", fGlobalTracks, IsOutputBranchPersistent("GlobalTrack")); + fStsTrackArray = new TClonesArray("CbmStsTrack", 100); + ioman->Register("StsTrack", "STS", fStsTrackArray, IsOutputBranchPersistent("StsTrack")); + fMuchTrackArray = new TClonesArray("CbmMuchTrack", 100); + ioman->Register("MuchTrack", "MUCH", fMuchTrackArray, IsOutputBranchPersistent("MuchTrack")); + fTrdTrackArray = new TClonesArray("CbmTrdTrack", 100); + ioman->Register("TrdTrack", "TRD", fTrdTrackArray, IsOutputBranchPersistent("TrdTrack")); + fTofTrackArray = new TClonesArray("CbmTofTrack", 100); + ioman->Register("TofTrack", "TOF", fTofTrackArray, IsOutputBranchPersistent("TofTrack")); + + // Check for Track finder + if (!fFinder) { + LOG(fatal) << GetName() << ": no track finding engine selected!"; + return kERROR; + } + LOG(info) << GetName() << ": Use track finder " << fFinder->GetName(); + + // Set members of track finder and initialise it + fFinder->SetMvdHitArray(fMvdHits); + fFinder->SetStsHitArray(fStsHits); + fFinder->SetGlobalTracksArray(fGlobalTracks); + fFinder->SetStsTracksArray(fStsTrackArray); + fFinder->SetMuchTracksArray(fMuchTrackArray); + fFinder->SetTrdTracksArray(fTrdTrackArray); + fFinder->SetTofTracksArray(fTofTrackArray); + fFinder->Init(); + + // Screen output + LOG(info) << GetName() << ": successfully initialised."; + LOG(info) << "=====================================\n"; + + return kSUCCESS; +} +// ------------------------------------------------------------------------- + + +// ----- End-of-run action --------------------------------------------- +void CbmL1GlobalFindTracksEvents::Finish() +{ + std::cout << std::endl; + LOG(info) << "====================================="; + LOG(info) << GetName() << ": Run summary"; + LOG(info) << "Time slices : " << fNofTs; + LOG(info) << "Hits / TS : " << fixed << setprecision(2) << Double_t(fNofHits) / Double_t(fNofTs); + LOG(info) << "Tracks / TS : " << fixed << setprecision(2) << Double_t(fNofTracks) / Double_t(fNofTs); + LOG(info) << "Hits per track : " << fNofHits / fNofTracks; + LOG(info) << "Time per TS : " << 1000. * fTime / Double_t(fNofTs) << " ms "; + if (fEvents) { + LOG(info) << "Events processed : " << fNofEvents; + LOG(info) << "Hits / event : " << fNofHits / Double_t(fNofEvents); + LOG(info) << "Tracks / event : " << fNofTracks / Double_t(fNofEvents); + } + LOG(info) << "====================================="; +} +// ------------------------------------------------------------------------- + + +// ------ Process one event -------------------------------------------- +pair<UInt_t, UInt_t> CbmL1GlobalFindTracksEvents::ProcessEvent(CbmEvent* event) +{ + + // --- Call track finder + fTimer.Start(); + Int_t nTracks = fFinder->FindTracks(event); + fTimer.Stop(); + + // --- Event log + Int_t eventNumber = (event ? event->GetNumber() : fNofEvents); + Int_t nHits = (event ? event->GetNofData(ECbmDataType::kStsHit) : fStsHits->GetEntriesFast()); + LOG(debug) << "+ " << setw(20) << GetName() << ": Event " << setw(6) << right << eventNumber << ", real time " + << fixed << setprecision(6) << fTimer.RealTime() << " s, hits: " << nHits << ", tracks: " << nTracks; + + return std::make_pair(nHits, nTracks); +} +// ------------------------------------------------------------------------- + + +ClassImp(CbmL1GlobalFindTracksEvents) diff --git a/reco/L1/OffLineInterface/CbmL1GlobalFindTracksEvents.h b/reco/L1/OffLineInterface/CbmL1GlobalFindTracksEvents.h new file mode 100644 index 0000000000000000000000000000000000000000..1d2f602529991868fc25175b4ceb694b792a2dc4 --- /dev/null +++ b/reco/L1/OffLineInterface/CbmL1GlobalFindTracksEvents.h @@ -0,0 +1,118 @@ +/** @file CbmL1GlobalFindTracksEvent.h + ** @author V. Akishina <v.akishina@gsi.de> + ** based on CbmStsFindTracksEvent.h by Volker Friese <v.friese@gsi.de> + ** @since 07.05.2021 + ** @date 07.05.2021 + **/ + +#ifndef CbmL1GlobalFindTracksEventS +#define CbmL1GlobalFindTracksEventS 1 + + +#include "CbmL1GlobalTrackFinder.h" + +#include "FairTask.h" + +#include "TStopwatch.h" + + +class TClonesArray; +class CbmEvent; +class CbmStsTrackFinderIdeal; + + +/** @class CbmL1GlobalFindTracksEvents + ** @brief Task class for finding Global, STS, MUCH, TRD and TOF tracks in an event + ** @author V. Akishina <v.akishina@gsi.de> + ** based on CbmStsFindTracksEvent.h by Volker Friese <v.friese@gsi.de> + ** @since 07.05.2021 + ** @date 07.05.2021 + ** @version 1.0 + ** + ** This task creates GlobalTrack, StsTrack, MuchTrack, TrdTrack, TofTrack objects + ** from hits. + ** It uses as finding engine CbmL1GlobalTrackFinder. + **/ +class CbmL1GlobalFindTracksEvents : public FairTask { + +public: + /** Constructor + ** @param finder Track finder engine. Default: Ideal track finder. + ** @param useMvd Include MVD hits in track finding. Default kFALSE. + **/ + CbmL1GlobalFindTracksEvents(CbmL1GlobalTrackFinder* finder = NULL, Bool_t useMvd = kFALSE); + + + /** Destructor **/ + virtual ~CbmL1GlobalFindTracksEvents(); + + + /** Task execution **/ + virtual void Exec(Option_t* opt); + + + /** Track finder engine + ** @value Pointer to track finding engine + **/ + CbmL1GlobalTrackFinder* GetFinder() { return fFinder; }; + + + /** Usage of MVD hits + ** @value kTRUE if MVD hits are used for tracking + **/ + Bool_t IsMvdUsed() const { return fUseMvd; } + + + /** Set track finding engine + ** @param finder Pointer to track finding engine + **/ + void UseFinder(CbmL1GlobalTrackFinder* finder) + { + if (fFinder) delete fFinder; + fFinder = finder; + }; + + +private: + Bool_t fUseMvd; // Inclusion of MVD hits + CbmL1GlobalTrackFinder* fFinder; // TrackFinder concrete class + TClonesArray* fEvents; //! Array of CbmEvent objects + TClonesArray* fMvdHits; //! Input array of MVD hits + TClonesArray* fStsHits; //! Input array of STS hits + TClonesArray* fGlobalTracks; //! Output array of CbmGlobalTracks + TClonesArray* fStsTrackArray; //! Output array of CbmStsTracks + TClonesArray* fMuchTrackArray; //! Output array of CbmMuchTracks + TClonesArray* fTrdTrackArray; //! Output array of CbmTrdTracks + TClonesArray* fTofTrackArray; //! Output array of CbmTofTracks + TStopwatch fTimer; //! Timer + Int_t fNofTs = 0; ///< Number of processed timeslices + Int_t fNofEvents; ///< Number of events with success + Double_t fNofHits; ///< Number of hits + Double_t fNofTracks; ///< Number of tracks created + Double_t fTime; ///< Total real time used for good events + + + /** Initialisation at beginning of each event **/ + virtual InitStatus Init(); + + + /** Finish at the end of each event **/ + virtual void Finish(); + + + /** @brief Process one event or timeslice + ** @param event Pointer to event object. If null, entire timeslice is processed. + ** @return Number of input hits and output tracks + **/ + std::pair<UInt_t, UInt_t> ProcessEvent(CbmEvent* event); + + + /** Prevent usage of copy constructor and assignment operator **/ + CbmL1GlobalFindTracksEvents(const CbmL1GlobalFindTracksEvents&); + CbmL1GlobalFindTracksEvents operator=(const CbmL1GlobalFindTracksEvents&); + + + ClassDef(CbmL1GlobalFindTracksEvents, 1); +}; + +#endif diff --git a/reco/L1/OffLineInterface/CbmL1GlobalTrackFinder.cxx b/reco/L1/OffLineInterface/CbmL1GlobalTrackFinder.cxx index 548f22afe916e20c0846e02c3c5f0063dd335aa5..89b2463c2cc31b9e1e7137b2fe6e3b148ba6f767 100644 --- a/reco/L1/OffLineInterface/CbmL1GlobalTrackFinder.cxx +++ b/reco/L1/OffLineInterface/CbmL1GlobalTrackFinder.cxx @@ -1,3 +1,4 @@ + /* Copyright (C) 2019-2020 IKF-UFra, GSI SPDX-License-Identifier: GPL-3.0-only Authors: Valentina Akishina [committer] */ @@ -5,11 +6,11 @@ /* *==================================================================== * - * CBM Level 1 Reconstruction - * + * CBM Level 1 Reconstruction + * * Authors: V. Akishina * - * e-mail : v.akishina@gsi.de + * e-mail : v.akishina@gsi.de * *==================================================================== * @@ -20,15 +21,21 @@ #include "CbmL1GlobalTrackFinder.h" #include "CbmEvent.h" +#include "CbmGlobalTrack.h" #include "CbmKFMath.h" +#include "CbmMuchTrack.h" #include "CbmStsHit.h" #include "CbmStsTrack.h" +#include "CbmTofTrack.h" +#include "CbmTrack.h" +#include "CbmTrdTrack.h" #include "FairHit.h" #include "FairMCPoint.h" #include "FairRootManager.h" #include "TClonesArray.h" +#include "TDatabasePDG.h" #include <iostream> #include <vector> @@ -43,8 +50,11 @@ ClassImp(CbmL1GlobalTrackFinder) // ----- Default constructor ------------------------------------------- CbmL1GlobalTrackFinder::CbmL1GlobalTrackFinder() - : FairTask("CbmL1GlobalTrackFinder") - , fEventNo(0) + : fGlobalTracks(nullptr) + , fStsTracks(nullptr) + , fMuchTracks(nullptr) + , fTrdTracks(nullptr) + , fTofTracks(nullptr) { fName = "Global Track Finder L1"; } @@ -56,313 +66,238 @@ CbmL1GlobalTrackFinder::~CbmL1GlobalTrackFinder() {} // ------------------------------------------------------------------------- // ----- Public method Init -------------------------------------------- -InitStatus CbmL1GlobalTrackFinder::Init() -{ - - FairRootManager* ioman = FairRootManager::Instance(); +void CbmL1GlobalTrackFinder::Init() {} +// ------------------------------------------------------------------------- - // Create and register track arrays - fGlobalTracks = new TClonesArray("CbmGlobalTrack", 100); - ioman->Register("GlobalTrack", "Global", fGlobalTracks, "GlobalTrack"); - { - fMuchTracks = new TClonesArray("CbmMuchTrack", 100); - ioman->Register("MuchTrack", "Much", fMuchTracks, "MuchTrack"); - } +// ----- Copy tracks to output array ----------------------------------- +Int_t CbmL1GlobalTrackFinder::CopyL1Tracks(CbmEvent* event) +{ + CbmL1* L1 = CbmL1::Instance(); + if (!L1) return 0; + Int_t globalTrackIndex = fGlobalTracks->GetEntriesFast(); - { - fTrdTracks = new TClonesArray("CbmTrdTrack", 100); - ioman->Register("TrdTrack", "Trd", fTrdTracks, "TrdTrack"); - } + Int_t stsTrackIndex = fStsTracks->GetEntriesFast(); + Int_t muchTrackIndex = fMuchTracks->GetEntriesFast(); + Int_t trdTrackIndex = fTrdTracks->GetEntriesFast(); + Int_t tofTrackIndex = fTofTracks->GetEntriesFast(); - { - fTofTracks = new TClonesArray("CbmTofTrack", 100); - ioman->Register("TofTrack", "Tof", fTofTracks, "TofTrack"); - } + LOG(debug) << "Copy L1 tracks : " << L1->vRTracks.size() << " tracks in L1"; - fEvents = dynamic_cast<TClonesArray*>(ioman->GetObject("CbmEvent")); + for (vector<CbmL1Track>::iterator it = L1->vRTracks.begin(); it != L1->vRTracks.end(); ++it) { + CbmL1Track& T = *it; + //BEGIN add global track + new ((*fGlobalTracks)[globalTrackIndex]) CbmGlobalTrack(); + if (event) event->AddData(ECbmDataType::kGlobalTrack, globalTrackIndex); + CbmGlobalTrack* t = L1_DYNAMIC_CAST<CbmGlobalTrack*>(fGlobalTracks->At(globalTrackIndex++)); + t->SetFlag(0); + FairTrackParam fpar(*t->GetParamFirst()), lpar(*t->GetParamLast()); + CbmKFMath::CopyTC2TrackParam(&fpar, T.T, T.C); + CbmKFMath::CopyTC2TrackParam(&lpar, T.TLast, T.CLast); + t->SetParamFirst(&fpar); + t->SetParamLast(&lpar); + // t->SetChiSq(T.chi2); + t->SetNDF(T.NDF); + t->SetPidHypo(T.T[4] >= 0 ? 211 : -211); + // t->SetTime(T.Tpv[6]); + // t->SetTimeError(T.Cpv[20]); + //END add global track + //BEGIN create detector tracks if needed + bool hasStsHits = false; + bool hasMuchHits = false; + bool hasTrdHits = false; + bool hasTofHits = false; + for (vector<int>::iterator ih = it->StsHits.begin(); ih != it->StsHits.end(); ++ih) { + CbmL1HitStore& h = L1->vHitStore[*ih]; - LOG(info) << fEvents << " fEvents "; + if (h.Det == 1 && hasStsHits == false) { + hasStsHits = true; + CbmStsTrack* track = new ((*fStsTracks)[stsTrackIndex]) CbmStsTrack(); + t->SetStsTrackIndex(stsTrackIndex); + if (event) event->AddData(ECbmDataType::kStsTrack, stsTrackIndex); + CbmL1TrackToCbmStsTrack(T, track, h.Det); + stsTrackIndex++; + } + if (h.Det == 2 && hasMuchHits == false) { + hasMuchHits = true; + + CbmMuchTrack* track = new ((*fMuchTracks)[muchTrackIndex]) CbmMuchTrack(); + t->SetMuchTrackIndex(muchTrackIndex); + if (event) event->AddData(ECbmDataType::kMuchTrack, muchTrackIndex); + CbmL1TrackToCbmMuchTrack(T, track, h.Det); + muchTrackIndex++; + } + if (h.Det == 3 && hasTrdHits == false) { + hasTrdHits = true; + CbmTrdTrack* track = new ((*fTrdTracks)[trdTrackIndex]) CbmTrdTrack(); + t->SetTrdTrackIndex(trdTrackIndex); + if (event) event->AddData(ECbmDataType::kTrdTrack, trdTrackIndex); + CbmL1TrackToCbmTrdTrack(T, track, h.Det); + trdTrackIndex++; + } + if (h.Det == 4 && hasTofHits == false) { + hasTofHits = true; + CbmTofTrack* track = new ((*fTofTracks)[tofTrackIndex]) CbmTofTrack(); - if (!fEvents) { LOG(warn) << GetName() << ": No event array! Will process entire tree."; } - // --- Get input array (StsHits) - fStsHits = (TClonesArray*) ioman->GetObject("StsHit"); + // t->SetTofHitIndex(tofTrackIndex); - // Array of MvdHits - fMvdHits = (TClonesArray*) ioman->GetObject("MvdHit"); + if (event) event->AddData(ECbmDataType::kTofTrack, tofTrackIndex); + CbmL1TrackToCbmTofTrack(T, track, h.Det); + tofTrackIndex++; - // Screen output - LOG(info) << GetName() << ": successfully initialised."; - LOG(info) << "====================================="; - return kSUCCESS; + if (event) event->AddData(ECbmDataType::kTofHit, h.ExtIndex); + } + } + //END create detector tracks if needed + } + return globalTrackIndex; } +// ------------------------------------------------------------------------- -void CbmL1GlobalTrackFinder::Exec(Option_t* /*opt*/) + +// ----- Public method CbmL1TrackToCbmTrack ------------------------------------------ +void CbmL1GlobalTrackFinder::CbmL1TrackToCbmTrack(CbmL1Track l1track, CbmTrack* track, int systemIdT) { + Int_t ndf = 0; - // --- Clear output array - fTracks->Delete(); - - // --- Event loop (from event objects) - if (fEvents) { - Int_t nEvents = fEvents->GetEntriesFast(); - LOG(debug) << GetName() << ": reading time slice with " << nEvents << " events "; - for (Int_t iEvent = 0; iEvent < nEvents; iEvent++) { - - LOG(debug) << fEvents << " fEvents " << iEvent << " iEvent "; - CbmEvent* event = static_cast<CbmEvent*>(fEvents->At(iEvent)); - ProcessEvent(event); - } //# events - } //? event branch present - - else // Old event-by-event simulation without event branch - { - ProcessEvent(NULL); - LOG(info) << "CbmL1GlobalTrackFinder::Exec event: " << fEventNo++; - } -} + CbmL1Track* T = &l1track; -// ------ Process one event -------------------------------------------- -void CbmL1GlobalTrackFinder::ProcessEvent(CbmEvent* event) -{ + CbmL1* L1 = CbmL1::Instance(); - // --- Call track finder - fTimer.Start(); - Int_t nTracks = FindTracks(event); - fTimer.Stop(); - - // --- Event log - if (fEvents) { - Int_t eventNumber = (event ? event->GetNumber() : fNofEvents); - Int_t nHits = (event ? event->GetNofData(kStsHit) : fStsHits->GetEntriesFast()); - LOG(info) << "+ " << setw(20) << GetName() << ": Event " << setw(6) << right << eventNumber << ", real time " - << fixed << setprecision(6) << fTimer.RealTime() << " s, hits: " << nHits << ", tracks: " << nTracks << ; - - // --- Counters - fNofEvents++; - fNofHits += Double_t(nHits); - fNofTracks += Double_t(nTracks); - fTime += fTimer.RealTime(); + for (vector<int>::iterator ih = T->StsHits.begin(); ih != T->StsHits.end(); ++ih) { + CbmL1HitStore& h = L1->vHitStore[*ih]; + if (h.Det != systemIdT) continue; } + ndf -= 5; + if (ndf <= 0) ndf = 1; + track->SetChiSq(T->chi2); + track->SetNDF(ndf); + //track->SetPreviousTrackId(T->GetPreviousTrackId());//??? + //track->SetFlag(T->GetQuality());//??? + + FairTrackParam fpar(*track->GetParamFirst()), lpar(*track->GetParamLast()); + CbmKFMath::CopyTC2TrackParam(&fpar, T->T, T->C); + CbmKFMath::CopyTC2TrackParam(&lpar, T->TLast, T->CLast); } - - // ------------------------------------------------------------------------- -Int_t CbmL1GlobalTrackFinder::CreateGlobalTrackArray(CbmEvent* event, TClonesArray* globalTracks, - TClonesArray* stsTracks, TClonesArray* trdTracks, - TClonesArray* muchTracks, TClonesArray* tofTracks) +// ----- Public method CbmL1TrackToCbmStsTrack ------------------------------------------ +void CbmL1GlobalTrackFinder::CbmL1TrackToCbmStsTrack(CbmL1Track l1track, CbmStsTrack* track, int systemIdT) { + Int_t ndf = 0; - CbmL1* L1 = CbmL1::Instance(); - if (!L1) return 0; + CbmL1Track* T = &l1track; - Int_t nTracks = 0; + CbmL1* L1 = CbmL1::Instance(); - // Loop over STS tracks and create GlobalTrack for each StsTrack + for (vector<int>::iterator ih = T->StsHits.begin(); ih != T->StsHits.end(); ++ih) { + CbmL1HitStore& h = L1->vHitStore[*ih]; + if (h.Det != systemIdT) continue; + track->AddHit(h.ExtIndex, kSTSHIT); + } - Int_t globalTrackNo = globalTracks->GetEntriesFast(); + ndf -= 5; + if (ndf <= 0) ndf = 1; - Int_t stsTrackNo = (stsTracks != NULL) ? stsTracks->GetEntriesFast() : 0; - Int_t trdTrackNo = (trdTracks != NULL) ? trdTracks->GetEntriesFast() : 0; - Int_t muchTrackNo = (muchTracks != NULL) ? muchTracks->GetEntriesFast() : 0; - Int_t tofTrackNo = (tofTracks != NULL) ? tofTracks->GetEntriesFast() : 0; - for (vector<CbmL1Track>::iterator it = L1->vRTracks.begin(); it != L1->vRTracks.end(); ++it) { + track->SetFlag(0); + track->SetChiSq(T->chi2); + track->SetNDF(T->NDF); + track->SetPidHypo(T->T[4] >= 0 ? 211 : -211); + track->SetTime(T->Tpv[6]); + track->SetTimeError(T->Cpv[20]); - CbmL1Track& T = *it; - - CbmGlobalTrack* globalTrack = new ((*globalTracks)[globalTrackNo]) CbmGlobalTrack(); + FairTrackParam fpar(*track->GetParamFirst()), lpar(*track->GetParamLast()); + CbmKFMath::CopyTC2TrackParam(&fpar, T->T, T->C); + CbmKFMath::CopyTC2TrackParam(&lpar, T->TLast, T->CLast); +} +// ------------------------------------------------------------------------- - globalTrack->SetStsTrackIndex(globalTrackNo); +// ----- Public method CbmL1TrackToCbmMuchTrack ------------------------------------------ +void CbmL1GlobalTrackFinder::CbmL1TrackToCbmMuchTrack(CbmL1Track l1track, CbmMuchTrack* track, int systemIdT) +{ + Int_t ndf = 0; - Int_t iTrack = event ? event->GetIndex(kStsTrack, globalTrackNo) : globalTrackNo; + CbmL1Track* T = &l1track; - globalTrackNo++; - nTracks++; + CbmL1* L1 = CbmL1::Instance(); - if (event) event->AddData(kGlobalTrack, iTrack); + for (vector<int>::iterator ih = T->StsHits.begin(); ih != T->StsHits.end(); ++ih) { + CbmL1HitStore& h = L1->vHitStore[*ih]; + if (h.Det != systemIdT) continue; + track->AddHit(h.ExtIndex, kMUCHPIXELHIT); + } + ndf -= 5; + if (ndf <= 0) ndf = 1; - CbmStsTrack* trackSts = new CbmStsTrack(); - CbmMuchTrack* trackMuch = new CbmMuchTrack(); - CbmTrdTrack* trackTrd = new CbmTrdTrack(); - CbmTofTrack* trackTof = new CbmTofTrack(); + track->SetChiSq(T->chi2); + track->SetNDF(ndf); + //track->SetPreviousTrackId(T->GetPreviousTrackId());//??? + //track->SetFlag(T->GetQuality());//??? - // Set last parameter of the CbmGlobal track to be last parameter of CbmLitTrack - FairTrackParam fpar(*globalTrack->GetParamFirst()), lpar(*globalTrack->GetParamLast()); - CbmKFMath::CopyTC2TrackParam(&fpar, T.T, T.C); - CbmKFMath::CopyTC2TrackParam(&lpar, T.TLast, T.CLast); - globalTrack->SetParamLast(&lpar); - globalTrack->SetParamFirst(&fpar); + FairTrackParam fpar(*track->GetParamFirst()), lpar(*track->GetParamLast()); + CbmKFMath::CopyTC2TrackParam(&fpar, T->T, T->C); + CbmKFMath::CopyTC2TrackParam(&lpar, T->TLast, T->CLast); +} +// ------------------------------------------------------------------------- - trackSts->SetParamLast(&lpar); - trackSts->SetParamFirst(&fpar); +// ----- Public method CbmL1TrackToCbmTrdTrack ------------------------------------------ +void CbmL1GlobalTrackFinder::CbmL1TrackToCbmTrdTrack(CbmL1Track l1track, CbmTrdTrack* track, int systemIdT) +{ + Int_t ndf = 0; - trackMuch->SetParamLast(&lpar); - trackMuch->SetParamFirst(&fpar); + CbmL1Track* T = &l1track; - trackTrd->SetParamLast(&lpar); - trackTrd->SetParamFirst(&fpar); + CbmL1* L1 = CbmL1::Instance(); - for (vector<int>::iterator ih = it->StsHits.begin(); ih != it->StsHits.end(); ++ih) { - CbmL1HitStore& h = L1->vHitStore[*ih]; + for (vector<int>::iterator ih = T->StsHits.begin(); ih != T->StsHits.end(); ++ih) { + CbmL1HitStore& h = L1->vHitStore[*ih]; + if (h.Det != systemIdT) continue; + track->AddHit(h.ExtIndex, kTRDHIT); + } + ndf -= 5; + if (ndf <= 0) ndf = 1; - if (h.Det == 2) { - //CbmLitTrackToCbmTrack(litTrack, trackMuch, kLITMUCH); - trackMuch->AddHit(h.ExtIndex, kMUCHPIXELHIT); - } - if (h.Det == 3) { - //CbmLitTrackToCbmTrack(litTrack, trackMuch, kLITMUCH); - trackTrd->AddHit(h.ExtIndex, kTRDHIT); - } - if (h.Det == 1) { - //CbmLitTrackToCbmTrack(litTrack, trackMuch, kLITMUCH); - trackSts->AddHit(h.ExtIndex, kSTSHIT); - } - if (h.Det == 4) { - - CbmTofTrack* track = new ((*tofTracks)[tofTrackNo++]) CbmTofTrack(); - Int_t globalTrackId = stsTrackNo - 1; - Int_t tofHitId = h.ExtIndex; - track->SetTofHitIndex(tofHitId); - track->SetTrackIndex(globalTrackId); - // track->SetDistance(litTofTrack->GetDistance());!!! - FairTrackParam par; - // CbmLitConverterFairTrackParam::CbmLitTrackParamToFairTrackParam(litTofTrack->GetTrackParam(), &par); - // track->SetTrackParameter(&par); - - CbmGlobalTrack* gTrack = static_cast<CbmGlobalTrack*>(globalTracks->At(globalTrackId)); - gTrack->SetTofHitIndex(tofHitId); - - if (event) event->AddData(kTofHit, tofHitId); - } - } //StsHits loop - - if (trackMuch->GetNofHits() > 0) { - CbmMuchTrack* track = new ((*muchTracks)[muchTrackNo]) CbmMuchTrack(); - int ndf = 0; - double chiSq = 0.; - //TODO calculate chiSq (sum of chiSq for each hit) - for (int i = 0; i < trackMuch->GetNofHits(); i++) { - track->AddHit(trackMuch->GetHitIndex(i), kMUCHPIXELHIT); - ndf += 2; - } - ndf -= 5; - if (ndf <= 0) ndf = 1; - track->SetChiSq(chiSq); - track->SetNDF(ndf); - //TODO fill prev. track id and flag if required - //track->SetPreviousTrackId(litTrack->GetPreviousTrackId()); - //track->SetFlag(litTrack->GetQuality()); - track->SetParamLast(trackMuch->GetParamLast()); - track->SetParamFirst(trackMuch->GetParamFirst()); - - if (event) event->AddData(kMuchTrack, muchTrackNo); - globalTrack->SetMuchTrackIndex(muchTrackNo); - ++muchTrackNo; - } - if (trackTrd->GetNofHits() > 0) { - CbmTrdTrack* track = new ((*trdTracks)[trdTrackNo]) CbmTrdTrack(); - int ndf = 0; - double chiSq = 0.; - //TODO calculate chiSq (sum of chiSq for each hit) - for (int i = 0; i < trackTrd->GetNofHits(); i++) { - track->AddHit(trackTrd->GetHitIndex(i), kTRDHIT); - ndf += 2; - } - ndf -= 5; - if (ndf <= 0) ndf = 1; - track->SetChiSq(chiSq); - track->SetNDF(ndf); - //TODO fill prev. track id and flag if required - //track->SetPreviousTrackId(litTrack->GetPreviousTrackId()); - //track->SetFlag(litTrack->GetQuality()); - track->SetParamLast(trackTrd->GetParamLast()); - track->SetParamFirst(trackTrd->GetParamFirst()); - - if (event) event->AddData(kTrdTrack, trdTrackNo); - globalTrack->SetTrdTrackIndex(trdTrackNo); - ++trdTrackNo; - } - if (trackSts->GetNofHits() > 0) { - CbmStsTrack* track = new ((*stsTracks)[stsTrackNo]) CbmStsTrack(); - int ndf = 0; - double chiSq = 0.; - //TODO calculate chiSq (sum of chiSq for each hit) - for (int i = 0; i < trackSts->GetNofHits(); i++) { - track->AddHit(trackSts->GetHitIndex(i), kSTSHIT); - ndf += 2; - } - ndf -= 5; - if (ndf <= 0) ndf = 1; - track->SetChiSq(chiSq); - track->SetNDF(ndf); - //TODO fill prev. track id and flag if required - //track->SetPreviousTrackId(litTrack->GetPreviousTrackId()); - //track->SetFlag(litTrack->GetQuality()); - track->SetParamLast(trackSts->GetParamLast()); - track->SetParamFirst(trackSts->GetParamFirst()); - - if (event) event->AddData(kStsTrack, stsTrackNo); - globalTrack->SetStsTrackIndex(stsTrackNo); - ++stsTrackNo; - } - } //vRTracks loop + track->SetChiSq(T->chi2); + track->SetNDF(ndf); + //track->SetPreviousTrackId(T->GetPreviousTrackId());//??? + //track->SetFlag(T->GetQuality());//??? - return nTracks; + FairTrackParam fpar(*track->GetParamFirst()), lpar(*track->GetParamLast()); + CbmKFMath::CopyTC2TrackParam(&fpar, T->T, T->C); + CbmKFMath::CopyTC2TrackParam(&lpar, T->TLast, T->CLast); } +// ------------------------------------------------------------------------- - -// ----- Copy tracks to output array ----------------------------------- -Int_t CbmL1GlobalTrackFinder::CopyL1Tracks(CbmEvent* event) +// ----- Public method CbmL1TrackToCbmTofTrack ------------------------------------------ +void CbmL1GlobalTrackFinder::CbmL1TrackToCbmTofTrack(CbmL1Track l1track, CbmTofTrack* track, int systemIdT) { + Int_t ndf = 0; - CbmL1* L1 = CbmL1::Instance(); - if (!L1) return 0; + CbmL1Track* T = &l1track; - Int_t trackIndex = fTracks->GetEntriesFast(); - Int_t nTracks = 0; - LOG(debug) << "Copy L1 tracks : " << L1->vRTracks.size() << " tracks in L1"; - for (vector<CbmL1Track>::iterator it = L1->vRTracks.begin(); it != L1->vRTracks.end(); ++it) { - CbmL1Track& T = *it; - new ((*fTracks)[trackIndex]) CbmStsTrack(); - nTracks++; - if (event) event->AddData(kStsTrack, trackIndex); - CbmStsTrack* t = L1_DYNAMIC_CAST<CbmStsTrack*>(fTracks->At(trackIndex++)); - t->SetFlag(0); - FairTrackParam fpar(*t->GetParamFirst()), lpar(*t->GetParamLast()); - CbmKFMath::CopyTC2TrackParam(&fpar, T.T, T.C); - CbmKFMath::CopyTC2TrackParam(&lpar, T.TLast, T.CLast); - t->SetParamFirst(&fpar); - t->SetParamLast(&lpar); - t->SetChiSq(T.chi2); - t->SetNDF(T.NDF); - t->SetPidHypo(T.T[4] >= 0 ? 211 : -211); - t->SetTime(T.Tpv[6]); - t->SetTimeError(T.Cpv[20]); + CbmL1* L1 = CbmL1::Instance(); - for (vector<int>::iterator ih = it->StsHits.begin(); ih != it->StsHits.end(); ++ih) { - CbmL1HitStore& h = L1->vHitStore[*ih]; - // double zref = L1->algo->vStations[h.iStation].z[0]; - if (h.ExtIndex < 0) { - // CbmMvdHit tmp; - // tmp.SetZ(zref); - t->AddMvdHit(-h.ExtIndex - 1); //, &tmp ); - } - else { - //CbmStsHit tmp; - //tmp.SetZ(zref); - t->AddHit(h.ExtIndex, kSTSHIT); //, &tmp ); - } - } + for (vector<int>::iterator ih = T->StsHits.begin(); ih != T->StsHits.end(); ++ih) { + CbmL1HitStore& h = L1->vHitStore[*ih]; + if (h.Det != systemIdT) continue; + // track->AddHit(h.ExtIndex, kTOFHIT); } + ndf -= 5; + if (ndf <= 0) ndf = 1; - return nTracks; + //track->SetChiSq(T->chi2); + //track->SetNDF(ndf); + //track->SetPreviousTrackId(T->GetPreviousTrackId());//??? + //track->SetFlag(T->GetQuality());//??? + + //FairTrackParam fpar(*track->GetParamFirst()), lpar(*track->GetParamLast()); + //CbmKFMath::CopyTC2TrackParam(&fpar, T->T, T->C); + //CbmKFMath::CopyTC2TrackParam(&lpar, T->TLast, T->CLast); } // ------------------------------------------------------------------------- - // ----- Public method DoFind ------------------------------------------ Int_t CbmL1GlobalTrackFinder::DoFind() { @@ -387,35 +322,32 @@ Int_t CbmL1GlobalTrackFinder::DoFind() // ----- Track finding in one event ------------------------------------ Int_t CbmL1GlobalTrackFinder::FindTracks(CbmEvent* event) { - /* - CbmL1 *l1 = CbmL1::Instance(); - if( ! l1 ) return 0; - l1->Reconstruct(event); - */ - if (fTrdTracks != NULL) fTrdTracks->Delete(); - if (fMuchTracks != NULL) fMuchTracks->Delete(); - if (fTofTracks != NULL) fTofTracks->Delete(); - fGlobalTracks->Clear(); + CbmL1* l1 = CbmL1::Instance(); + if (!l1) return 0; - int nTracks = CreateGlobalTrackArray(event, fGlobalTracks, fTracks, fTrdTracks, fMuchTracks, fTofTracks); + l1->Reconstruct(event); + int nTracks = CopyL1Tracks(event); return nTracks; } // ------------------------------------------------------------------------- -// ----- End-of-run action --------------------------------------------- -void CbmL1GlobalTrackFinder::Finish() +// ------------------------------------------------------------------------- +void CbmL1GlobalTrackFinder::SetDefaultParticlePDG(int pdg) { - std::cout << std::endl; - LOG(info) << "====================================="; - LOG(info) << GetName() << ": Run summary"; - LOG(info) << "Events processed : " << fNofEvents; - LOG(info) << "Hits / event : " << fNofHits / Double_t(fNofEvents); - LOG(info) << "Tracks / event : " << fNofTracks / Double_t(fNofEvents); - LOG(info) << "Hits per track : " << fNofHits / fNofTracks; - LOG(info) << "Time per event : " << fTime / Double_t(fNofEvents) << " s "; - LOG(info) << "====================================="; + /// set a default particle mass for the track fit + /// it is used during reconstruction for the multiple scattering estimation + CbmL1* l1 = CbmL1::Instance(); + if (!l1 || !l1->algo) { + LOG(fatal) << "L1 instance doesn't exist or is not initialised"; + return; + } + auto* p = TDatabasePDG::Instance()->GetParticle(pdg); + if (!p) { + LOG(fatal) << "Particle with pdg " << pdg << " doesn't exist"; + return; + } + l1->algo->SetDefaultParticleMass(p->Mass()); } -// diff --git a/reco/L1/OffLineInterface/CbmL1GlobalTrackFinder.h b/reco/L1/OffLineInterface/CbmL1GlobalTrackFinder.h index 2ba1a50d497de28b0cc0a5354d73c5684e92422e..018bc02563923400c6a5c8d73a89468451e54f49 100644 --- a/reco/L1/OffLineInterface/CbmL1GlobalTrackFinder.h +++ b/reco/L1/OffLineInterface/CbmL1GlobalTrackFinder.h @@ -5,11 +5,11 @@ /* *==================================================================== * - * CBM Level 1 Global Reconstruction + * CBM Level 1 Reconstruction * - * Authors: V.Akishina + * Authors: V. Akishina * - * e-mail : v.akishina@gsi.de + * e-mail : v.akishina@gsi.de * *==================================================================== * @@ -23,25 +23,19 @@ #include "CbmL1.h" - -//#include "CbmStsTrackFinder.h" -#include "CbmGlobalTrack.h" #include "CbmMuchTrack.h" -#include "CbmStsTrack.h" +#include "CbmStsTrackFinder.h" #include "CbmTofTrack.h" +#include "CbmTrack.h" #include "CbmTrdTrack.h" -#include "FairTask.h" - -#include "TStopwatch.h" - class TClonesArray; class CbmEvent; +class CbmTrack; +class CbmGlobalTrack; -class CbmL1GlobalTrackFinder : - public FairTask //, CbmStsTrackFinder -{ +class CbmL1GlobalTrackFinder : public CbmStsTrackFinder { public: /** Default constructor **/ @@ -53,11 +47,7 @@ public: /** Initialisation **/ - //virtual InitStatus Init(); - virtual InitStatus Init(); - virtual void Exec(Option_t* opt); - virtual void Finish(); - void ProcessEvent(CbmEvent* event); + virtual void Init(); /** Track finding algorithm @@ -70,35 +60,40 @@ public: **/ virtual Int_t FindTracks(CbmEvent* event); + /// set a default particle mass for the track fit + /// it is used during reconstruction + /// for the multiple scattering and energy loss estimation + void SetDefaultParticlePDG(int pdg = 13); // muon + void SetGlobalTracksArray(TClonesArray* tracks) { fGlobalTracks = tracks; } + void SetStsTracksArray(TClonesArray* tracks) { fStsTracks = tracks; } + void SetMuchTracksArray(TClonesArray* tracks) { fMuchTracks = tracks; } + void SetTrdTracksArray(TClonesArray* tracks) { fTrdTracks = tracks; } + void SetTofTracksArray(TClonesArray* tracks) { fTofTracks = tracks; } + +protected: + TClonesArray* fGlobalTracks; // GlobalTrack array + TClonesArray* fStsTracks; // StsTrack array + TClonesArray* fMuchTracks; // MuchTrack array + TClonesArray* fTrdTracks; // TrdTrack array + TClonesArray* fTofTracks; // TofTrack array private: - TClonesArray* fMuchTracks; // output CbmMuchTrack array - TClonesArray* fTrdTracks; // output CbmTrdTrack array - TClonesArray* fTofTracks; // output CbmTofTrack array - TClonesArray* fGlobalTracks; //output CbmGlobalTrack array - - TClonesArray* fMvdHits; // MvdHit array - TClonesArray* fStsHits; // StsHit array - TClonesArray* fTracks; // StsTrack array - - TClonesArray* fEvents; //! Array of CbmEvent objects - - TStopwatch fTimer; //! Timer - Int_t fNofEvents; ///< Number of events with success - Double_t fNofHits; ///< Number of hits - Double_t fNofTracks; ///< Number of tracks created - Double_t fTime; ///< Total real time used for good events - Int_t fEventNo; // event counter - /** Copy the tracks from the L1-internal format and array ** to the output TClonesArray. ** @value Number of created tracks **/ Int_t CopyL1Tracks(CbmEvent* event = NULL); - Int_t CreateGlobalTrackArray(CbmEvent* event, TClonesArray* globalTracks, TClonesArray* stsTracks, - TClonesArray* trdTracks, TClonesArray* muchTracks, TClonesArray* tofTracks); - + /** Convert detector specific track info to a detector track + **/ + void CbmL1TrackToCbmTrack(CbmL1Track T, CbmTrack* track, int systemIdT); + void CbmL1TrackToCbmStsTrack(CbmL1Track T, CbmStsTrack* track, int systemIdT); + void CbmL1TrackToCbmMuchTrack(CbmL1Track T, CbmMuchTrack* track, int systemIdT); + void CbmL1TrackToCbmTrdTrack(CbmL1Track T, CbmTrdTrack* track, int systemIdT); + void CbmL1TrackToCbmTofTrack(CbmL1Track T, CbmTofTrack* track, int systemIdT); + + CbmL1GlobalTrackFinder(const CbmL1GlobalTrackFinder&); + CbmL1GlobalTrackFinder& operator=(const CbmL1GlobalTrackFinder&); ClassDef(CbmL1GlobalTrackFinder, 1); };