diff --git a/analysis/PWGC2F/femtoscopy/hal/CMakeLists.txt b/analysis/PWGC2F/femtoscopy/hal/CMakeLists.txt index abfabf4c395fced91229672b6979b381e75ee8a0..570c11d80601985d2d08783e3cfe1b272b6e4c52 100644 --- a/analysis/PWGC2F/femtoscopy/hal/CMakeLists.txt +++ b/analysis/PWGC2F/femtoscopy/hal/CMakeLists.txt @@ -33,6 +33,14 @@ set(HAL_CBM_FORMAT ${HAL_CBM}/format/anatree/mc ${HAL_CBM}/format/anatree/femto ${HAL_CBM}/format/unigen + ${HAL_CBM}/format/v0 +) +set(HAL_CBM_HELPERS + ${HAL_CBM}/helpers + ${HAL_CBM}/helpers/anatree + ${HAL_CBM}/helpers/fair + ${HAL_CBM}/helpers/faircbm + ${HAL_CBM}/helpers/hal ) set(HAL_CBM_CUTS @@ -43,4 +51,4 @@ set(HAL_CBM_CUTS add_subdirectory(format) add_subdirectory(cuts) add_subdirectory(helpers) -add_subdirectory(qa) +#add_subdirectory(qa) diff --git a/analysis/PWGC2F/femtoscopy/hal/format/CMakeLists.txt b/analysis/PWGC2F/femtoscopy/hal/format/CMakeLists.txt index 28e89c3e7ab19207af7e9f33103f9a4cc5067200..1ea0995fc71210144d672f3f880688e4181bcd76 100644 --- a/analysis/PWGC2F/femtoscopy/hal/format/CMakeLists.txt +++ b/analysis/PWGC2F/femtoscopy/hal/format/CMakeLists.txt @@ -27,6 +27,7 @@ set(SRCS HalCbmFormatTypes.cxx +HalCbmReader.cxx combined/HalCbmFullEvent.cxx combined/HalCbmHbtFullEvent.cxx @@ -48,6 +49,11 @@ anatree/reco/HalCbmTrackInterface.cxx anatree/femto/HalCbmHbtTrack.cxx anatree/femto/HalCbmHbtEvent.cxx +v0/HalCbmV0Builder.cxx +v0/HalCbmV0TempTrack.cxx +v0/HalCbmV0Track.cxx +v0/HalCbmV0TrackTrigger.cxx + ) Set(HEADERS ) diff --git a/analysis/PWGC2F/femtoscopy/hal/format/HalCbmFormatLinkDef.h b/analysis/PWGC2F/femtoscopy/hal/format/HalCbmFormatLinkDef.h index 012a9623b96c32780c29d9e2b15a88047584c195..9bce7a24baf05f1d0a505cf910bcf255256728c1 100644 --- a/analysis/PWGC2F/femtoscopy/hal/format/HalCbmFormatLinkDef.h +++ b/analysis/PWGC2F/femtoscopy/hal/format/HalCbmFormatLinkDef.h @@ -27,3 +27,11 @@ #pragma link C++ class HalCbmEventInterface + ; #pragma link C++ class HalCbmTrack + ; #pragma link C++ class HalCbmTrackInterface + ; + + +#pragma link C++ class HalCbmReader + ; +#pragma link C++ class HalCbmV0TrackTrigger + ; +#pragma link C++ class HalCbmV0Track + ; +#pragma link C++ class HalCbmV0TempTrack + ; +#pragma link C++ class HalCbmV0Track + ; +#pragma link C++ class HalCbmV0Builder + ; diff --git a/analysis/PWGC2F/femtoscopy/hal/format/HalCbmReader.cxx b/analysis/PWGC2F/femtoscopy/hal/format/HalCbmReader.cxx new file mode 100644 index 0000000000000000000000000000000000000000..de9b901e3c5e5f949f5e0d362340b3b80982e5d5 --- /dev/null +++ b/analysis/PWGC2F/femtoscopy/hal/format/HalCbmReader.cxx @@ -0,0 +1,33 @@ +/* Copyright (C) 2025-2025 Warsaw University of Technology, Warsaw + SPDX-License-Identifier: GPL-3.0-only + Authors: Daniel Wielanek [committer] */ +#include "HalCbmReader.h" + +#include "HalCbmEvent.h" +#include "HalCbmFullEvent.h" +#include "HalCbmMCEvent.h" + +#include <RtypesCore.h> +#include <TString.h> + +#include <Hal/StdString.h> + +namespace Hal +{ + +} /* namespace Hal */ + +HalCbmReader::HalCbmReader(TString opt) +{ + if (Hal::Std::FindParam(opt, "reco", false) && Hal::Std::FindParam(opt, "mc", false)) { + SetFormat(new HalCbmFullEvent()); + } + else if (Hal::Std::FindParam(opt, "mc", false)) { + SetFormat(new HalCbmMCEvent()); + } + else { + SetFormat(new HalCbmEvent()); + } +} + +HalCbmReader::~HalCbmReader() {} diff --git a/analysis/PWGC2F/femtoscopy/hal/format/HalCbmReader.h b/analysis/PWGC2F/femtoscopy/hal/format/HalCbmReader.h new file mode 100644 index 0000000000000000000000000000000000000000..3f1d42d337127abdeb3efb83f0fbe54e65a63bdd --- /dev/null +++ b/analysis/PWGC2F/femtoscopy/hal/format/HalCbmReader.h @@ -0,0 +1,21 @@ +/* Copyright (C) 2025-2025 Warsaw University of Technology, Warsaw + SPDX-License-Identifier: GPL-3.0-only + Authors: Daniel Wielanek [committer] */ + +#ifndef CBMROOT_V0_ANALYSIS_PWGC2F_FEMTOSCOPY_HAL_FORMAT_HALCBMREADER_H_ +#define CBMROOT_V0_ANALYSIS_PWGC2F_FEMTOSCOPY_HAL_FORMAT_HALCBMREADER_H_ + +#include <Hal/Reader.h> +namespace Hal +{ + class EventInterface; +} +class HalCbmReader : public Hal::Reader { + + public: + HalCbmReader(TString opt = "mc+reco"); + virtual ~HalCbmReader(); + ClassDef(HalCbmReader, 1) +}; + +#endif /* CBMROOT_V0_ANALYSIS_PWGC2F_FEMTOSCOPY_HAL_FORMAT_HALCBMREADER_H_ */ diff --git a/analysis/PWGC2F/femtoscopy/hal/format/anatree/mc/HalCbmMCEvent.cxx b/analysis/PWGC2F/femtoscopy/hal/format/anatree/mc/HalCbmMCEvent.cxx index bb86515bcc80ba91d9518d065c2a81e58a30a439..dd9b7bc182a11ac3d1401f59ef64d54a1cada928 100644 --- a/analysis/PWGC2F/femtoscopy/hal/format/anatree/mc/HalCbmMCEvent.cxx +++ b/analysis/PWGC2F/femtoscopy/hal/format/anatree/mc/HalCbmMCEvent.cxx @@ -60,10 +60,10 @@ void HalCbmMCEvent::ShallowCopyTracks(Hal::Event* event) void HalCbmMCEvent::UpdateAnalysisTree(Hal::EventInterface* source) { - HalCbmMCEventInterface* s = static_cast<HalCbmMCEventInterface*>(source); - CbmAnaTreeMcSourceContainer* data = (CbmAnaTreeMcSourceContainer*) s->GetRawEventPointer(); - AnaTreeMcIds conf = data->GetFieldIds(); - Bool_t UseFreez = kTRUE; + HalCbmMCEventInterface* s = static_cast<HalCbmMCEventInterface*>(source); + CbmAnaTreeMcContainer* data = (CbmAnaTreeMcContainer*) s->GetRawEventPointer(); + AnaTreeMcIds conf = data->GetFieldIds(); + Bool_t UseFreez = kTRUE; if (conf.freezX == AnalysisTree::UndefValueShort) { UseFreez = kFALSE; } @@ -89,7 +89,7 @@ void HalCbmMCEvent::UpdateAnalysisTree(Hal::EventInterface* source) Double_t y = particle.GetField<float>(conf.freezY); Double_t z = particle.GetField<float>(conf.freezZ); Double_t t = particle.GetField<float>(conf.freezT); - track->SetFreezoutPosition(x, y, z, t); + track->SetFreezeoutPosition(x, y, z, t); } if (mother_id == -1) { diff --git a/analysis/PWGC2F/femtoscopy/hal/format/anatree/mc/HalCbmMCEventInterface.cxx b/analysis/PWGC2F/femtoscopy/hal/format/anatree/mc/HalCbmMCEventInterface.cxx index 2b0242885dd46d941ba9d7f7c37eec623ee91195..3e200491e0c5747e0c4b90e8a0743a31312ba9d1 100644 --- a/analysis/PWGC2F/femtoscopy/hal/format/anatree/mc/HalCbmMCEventInterface.cxx +++ b/analysis/PWGC2F/femtoscopy/hal/format/anatree/mc/HalCbmMCEventInterface.cxx @@ -20,7 +20,7 @@ void HalCbmMCEventInterface::Register(Bool_t write) Hal::DataManager* manager = Hal::DataManager::Instance(); switch (fFormatType) { case HalCbm::DataFormat::kAnalysisTree: { - manager->Register("CbmAnaTreeMcSourceContainer.", "CbmAnaTreeMcSourceContainer.", fDataContainer, write); + manager->Register(HalCbm::GetContainerName("mc"), "CbmAnaTreeMcSourceContainer.", fDataContainer, write); } break; case HalCbm::DataFormat::kDST: { manager->Register("CbmMCTrack", "Tracks", fCbmMCtracks, write); @@ -81,7 +81,7 @@ HalCbmMCEventInterface::~HalCbmMCEventInterface() {} void HalCbmMCEventInterface::ConnectToTreeInternal(eMode /*mode*/) { Hal::DataManager* manager = Hal::DataManager::Instance(); - fDataContainer = (CbmAnaTreeMcSourceContainer*) manager->GetObject("CbmAnaTreeMcSourceContainer."); + fDataContainer = (CbmAnaTreeMcContainer*) manager->GetObject(HalCbm::GetContainerName("mc")); if (fDataContainer) { fFormatType = HalCbm::DataFormat::kAnalysisTree; } diff --git a/analysis/PWGC2F/femtoscopy/hal/format/anatree/mc/HalCbmMCEventInterface.h b/analysis/PWGC2F/femtoscopy/hal/format/anatree/mc/HalCbmMCEventInterface.h index 04ecbd8512ef00aafde24d59d4d19c0a0c1d28c1..1ac520a3466d7a6553b60bb4f791ecb8a2426be4 100644 --- a/analysis/PWGC2F/femtoscopy/hal/format/anatree/mc/HalCbmMCEventInterface.h +++ b/analysis/PWGC2F/femtoscopy/hal/format/anatree/mc/HalCbmMCEventInterface.h @@ -14,7 +14,7 @@ class TClonesArray; class FairMCEventHeader; -class CbmAnaTreeMcSourceContainer; +class CbmAnaTreeMcContainer; class HalCbmFullEvent; class HalCbmMCEventInterface : public Hal::EventInterface { @@ -22,15 +22,15 @@ class HalCbmMCEventInterface : public Hal::EventInterface { friend class HalCbmFullEvent; protected: - HalCbm::DataFormat fFormatType = {HalCbm::DataFormat::kUnknown}; - CbmAnaTreeMcSourceContainer* fDataContainer = {nullptr}; - FairMCEventHeader* fEventHeader = {nullptr}; - TClonesArray* fCbmMCtracks = {nullptr}; - TClonesArray* fStsMatches = {nullptr}; - TClonesArray* fTofMatches = {nullptr}; - TClonesArray* fTrdMatches = {nullptr}; - TClonesArray* fRichMatches = {nullptr}; - TClonesArray* fMuchMatches = {nullptr}; + HalCbm::DataFormat fFormatType = {HalCbm::DataFormat::kUnknown}; + CbmAnaTreeMcContainer* fDataContainer = {nullptr}; + FairMCEventHeader* fEventHeader = {nullptr}; + TClonesArray* fCbmMCtracks = {nullptr}; + TClonesArray* fStsMatches = {nullptr}; + TClonesArray* fTofMatches = {nullptr}; + TClonesArray* fTrdMatches = {nullptr}; + TClonesArray* fRichMatches = {nullptr}; + TClonesArray* fMuchMatches = {nullptr}; virtual void ConnectToTreeInternal(eMode mode); void Register(Bool_t write); diff --git a/analysis/PWGC2F/femtoscopy/hal/format/anatree/reco/HalCbmEvent.cxx b/analysis/PWGC2F/femtoscopy/hal/format/anatree/reco/HalCbmEvent.cxx index bc0cd90608521721bd3ba06b47a5f668e8e60528..51efb74c4348ddfdf113810925b2c2a33af2016c 100644 --- a/analysis/PWGC2F/femtoscopy/hal/format/anatree/reco/HalCbmEvent.cxx +++ b/analysis/PWGC2F/femtoscopy/hal/format/anatree/reco/HalCbmEvent.cxx @@ -1,36 +1,52 @@ /* Copyright (C) 2023-2023 Warsaw University of Technology, Warsaw SPDX-License-Identifier: GPL-3.0-only Authors: Daniel Wielanek [committer] */ + #include "HalCbmEvent.h" #include "CbmAnaTreeContainer.h" #include "CbmGlobalTrack.h" +#include "CbmHit.h" +#include "CbmStsTrack.h" #include "CbmTofHit.h" +#include "CbmTrackParam.h" +#include "HalCbmDetectorID.h" #include "HalCbmEventInterface.h" -#include "HalCbmTrack.h" +#include "HalCbmV0TempTrack.h" + +#include <FairTrackParam.h> +#include <TClonesArray.h> #include <TLorentzVector.h> #include <TMath.h> +#include <TObjArray.h> #include <AnalysisTree/Constants.hpp> +#include <AnalysisTree/Detector.hpp> +#include <AnalysisTree/Hit.hpp> #include <AnalysisTree/Matching.hpp> +#include <AnalysisTree/Track.hpp> #include <Hal/DataFormat.h> -#include <Hal/Event.h> -#include <Hal/ExpEvent.h> +#include <Hal/DetectorTrack.h> +#include <Hal/ExpTrack.h> +#include <Hal/ToFTrack.h> +#include <Hal/Track.h> -HalCbmEvent::HalCbmEvent() : Hal::ExpEvent("HalCbmTrack") {} +HalCbmEvent::HalCbmEvent() : Hal::ExpEvent("HalCbmTrack", "HalCbmV0Track") {} HalCbmEvent::HalCbmEvent(const HalCbmEvent& other) : Hal::ExpEvent(other) {} void HalCbmEvent::Update(Hal::EventInterface* interface) { - fTracks->Clear(); + Clear(); + fVertexTracks = 0; HalCbmEventInterface* source = (HalCbmEventInterface*) interface; switch (source->fFormatType) { case HalCbm::DataFormat::kAnalysisTree: { UpdateAnaTree(source); + UpdateV0(source); } break; case HalCbm::DataFormat::kDST: { UpdateDST(source); @@ -41,6 +57,63 @@ void HalCbmEvent::Update(Hal::EventInterface* interface) HalCbmEvent::HalCbmEvent(TString classname) : Hal::ExpEvent(classname) {} +void HalCbmEvent::UpdateV0(HalCbmEventInterface* ei) +{ + if (!ei->fTempV0) return; + auto clones = ei->fTempV0; + int nv = clones->GetEntriesFast(); + fTotalTracksNo += nv; + fTracks->ExpandCreateFast(fTotalTracksNo); + for (int i = 0; i < nv; i++) { + auto temp = (HalCbmV0TempTrack*) clones->UncheckedAt(i); + HalCbmTrack* track = (HalCbmTrack*) fTracks->UncheckedAt(i + fVertexTracks); + track->ResetTrack(i + fVertexTracks, this); + track->Hal::ExpTrack::CopyData(&temp->GetTrack()); + track->BuildHelix(); + track->EnableV0(kTRUE, kTRUE); +#ifdef DEBUG_EXTR + auto vecpos = temp->GetV0().GetMomPos(); //copy at-data + auto vecneg = temp->GetV0().GetMomNeg(); +#endif + temp->ComputeStuff(this, track); + //new track momenta calculated ! + auto recalcmom1 = temp->GetV0().GetMomPos(); + auto recalcmom2 = temp->GetV0().GetMomNeg(); + track->GetV0Info()->SetMomPos(recalcmom1.X(), recalcmom1.Y(), recalcmom1.Z()); + track->GetV0Info()->SetMomNeg(recalcmom2.X(), recalcmom2.Y(), recalcmom2.Z()); + + +#ifdef DEBUG_EXTR + //recomputed data present print them + auto vecpos1 = temp->GetV0().GetMomPos(); + auto vecpos2 = temp->GetV0().GetMomNeg(); + std::cout << __FILE__ << "____" << std::endl; + auto print = [](TString t, TVector3 x) { + std::cout << Form("%4.4f %4.4f %4.4f %s", x.X(), x.Y(), x.Z(), t.Data()) << std::endl; + }; + auto raw1 = GetTrack(temp->GetV0().GetPosId())->GetMomentum().Vect(); + auto raw2 = GetTrack(temp->GetV0().GetNegId())->GetMomentum().Vect(); + /*print("pos ori", vecpos); + print("pos com", vecpos1); + print("neg ori", vecneg); + print("neg com", vecpos2);*/ + print("p1", raw1); + print("p2", raw2); + print("p1c", vecpos1); + print("p1x", vecpos); + print("p2c", vecpos2); + print("p2x", vecneg); + print("sum com", (vecpos1 + vecpos2)); + print("sum raw", (raw1 + raw2)); + print("tot v0m", track->GetMomentum().Vect()); + +#else + +#endif + track->GetV0Info()->CopyData(&temp->GetV0()); + } +} + HalCbmEvent::~HalCbmEvent() {} Bool_t HalCbmEvent::ExistInTree() const @@ -57,6 +130,7 @@ void HalCbmEvent::UpdateDST(HalCbmEventInterface* ei) TLorentzVector start = ei->GetVertex(); fVertex->SetXYZT(start.X(), start.Y(), start.Z(), start.T()); fTracks->ExpandCreateFast(fTotalTracksNo); + fVertexTracks = ei->GetTotalTrackNo(); for (int i = 0; i < fTotalTracksNo; i++) { HalCbmTrack* track = (HalCbmTrack*) fTracks->UncheckedAt(i); track->ResetTrack(i, this); @@ -109,9 +183,9 @@ void HalCbmEvent::UpdateDST(HalCbmEventInterface* ei) void HalCbmEvent::UpdateAnaTree(HalCbmEventInterface* ei) { - CbmAnaTreeRecoSourceContainer* container = ei->GetContainer(); - fTotalTracksNo = ei->GetTotalTrackNo(); - TLorentzVector start = ei->GetVertex(); + CbmAnaTreeRecoContainer* container = ei->GetContainer(); + fTotalTracksNo = fVertexTracks = ei->GetTotalTrackNo(); //number of vtx tracks + TLorentzVector start = ei->GetVertex(); fVertex->SetXYZT(start.X(), start.Y(), start.Z(), start.T()); fTracks->ExpandCreateFast(fTotalTracksNo); AnaTreeRecoIds ids = container->GetFieldIds(); @@ -151,3 +225,10 @@ void HalCbmEvent::UpdateAnaTree(HalCbmEventInterface* ei) } Hal::EventInterface* HalCbmEvent::CreateInterface() const { return new HalCbmEventInterface(); } + +void HalCbmEvent::ShallowCopyEvent(Hal::Event* event) +{ + Hal::ExpEvent::ShallowCopyEvent(event); + auto ev = (HalCbmEvent*) event; + fVertexTracks = ev->fVertexTracks; +} diff --git a/analysis/PWGC2F/femtoscopy/hal/format/anatree/reco/HalCbmEvent.h b/analysis/PWGC2F/femtoscopy/hal/format/anatree/reco/HalCbmEvent.h index 36409f07ab77f41713ab6353797b3da676d3be24..e4ad55bf1c19fb82c8e13b5ebfb67fc8cabc8b4c 100644 --- a/analysis/PWGC2F/femtoscopy/hal/format/anatree/reco/HalCbmEvent.h +++ b/analysis/PWGC2F/femtoscopy/hal/format/anatree/reco/HalCbmEvent.h @@ -22,12 +22,17 @@ class HalCbmEvent : public Hal::ExpEvent { HalCbmEvent(TString classname); void UpdateDST(HalCbmEventInterface* ei); void UpdateAnaTree(HalCbmEventInterface* ei); + void UpdateV0(HalCbmEventInterface* ei); + Int_t fVertexTracks = {0}; + + virtual void ShallowCopyEvent(Hal::Event* event); public: HalCbmEvent(); HalCbmEvent(const HalCbmEvent& other); virtual void Update(Hal::EventInterface* interface); virtual Bool_t ExistInTree() const; + Int_t GetVertexTracksNo() const { return fVertexTracks; } virtual Hal::EventInterface* CreateInterface() const; virtual Hal::Track* GetNewTrack() const { return new HalCbmTrack(); }; virtual Hal::Event* GetNewEvent() const { return new HalCbmEvent(); }; diff --git a/analysis/PWGC2F/femtoscopy/hal/format/anatree/reco/HalCbmEventInterface.cxx b/analysis/PWGC2F/femtoscopy/hal/format/anatree/reco/HalCbmEventInterface.cxx index 9157b9b6302da747e5be35b6b82e395c2a47c550..e0fdf5a3e12171d3333e4b98b4b4a429cd23d04f 100644 --- a/analysis/PWGC2F/femtoscopy/hal/format/anatree/reco/HalCbmEventInterface.cxx +++ b/analysis/PWGC2F/femtoscopy/hal/format/anatree/reco/HalCbmEventInterface.cxx @@ -9,6 +9,7 @@ #include "CbmTofTrack.h" #include "CbmVertex.h" #include "FairRootManager.h" +#include "HalCbmDetectorID.h" #include <RtypesCore.h> #include <TObjArray.h> @@ -23,8 +24,9 @@ HalCbmEventInterface::HalCbmEventInterface() {} void HalCbmEventInterface::ConnectToTreeInternal(eMode /*mode*/) { Hal::DataManager* manager = Hal::DataManager::Instance(); - fDataContainer = (CbmAnaTreeRecoSourceContainer*) manager->GetObject("CbmAnaTreeSourceContainer."); - auto branchList = manager->GetBranchNameList(); + fDataContainer = (CbmAnaTreeRecoContainer*) manager->GetObject(HalCbm::GetContainerName("reco")); + + auto branchList = manager->GetBranchNameList(); for (auto name : branchList) { std::cout << name << std::endl; } @@ -44,6 +46,7 @@ void HalCbmEventInterface::ConnectToTreeInternal(eMode /*mode*/) } else { fFormatType = HalCbm::DataFormat::kAnalysisTree; + fTempV0 = (TClonesArray*) manager->GetObject("TempV0."); } } @@ -52,7 +55,7 @@ void HalCbmEventInterface::Register(Bool_t write) Hal::DataManager* manager = Hal::DataManager::Instance(); switch (fFormatType) { case HalCbm::DataFormat::kAnalysisTree: { - manager->Register("CbmAnaTreeSourceContainer.", "CbmAnaTreeSourceContainer.", fDataContainer, write); + manager->Register(HalCbm::GetContainerName("reco"), "CbmAnaTreeSourceContainer.", fDataContainer, write); } break; case HalCbm::DataFormat::kDST: { manager->Register("PrimaryVertex.", "PrimaryVertex", fCbmVertex, write); diff --git a/analysis/PWGC2F/femtoscopy/hal/format/anatree/reco/HalCbmEventInterface.h b/analysis/PWGC2F/femtoscopy/hal/format/anatree/reco/HalCbmEventInterface.h index 3ae2e5e8d250b8eedf261338544c09a1636a6b83..5e2c9f9ba0b9743b6d5f4bcfafff9daa37b676f2 100644 --- a/analysis/PWGC2F/femtoscopy/hal/format/anatree/reco/HalCbmEventInterface.h +++ b/analysis/PWGC2F/femtoscopy/hal/format/anatree/reco/HalCbmEventInterface.h @@ -29,15 +29,16 @@ class HalCbmEventInterface : public Hal::EventInterface { friend class HalCbmFullEvent; protected: - HalCbm::DataFormat fFormatType = {HalCbm::DataFormat::kUnknown}; - CbmAnaTreeRecoSourceContainer* fDataContainer = {nullptr}; - TClonesArray* fGlobalTracks = {nullptr}; - TClonesArray* fStsTracks = {nullptr}; - TClonesArray* fTrdTracks = {nullptr}; - TClonesArray* fTofHits = {nullptr}; - TClonesArray* fRichRings = {nullptr}; - TClonesArray* fMuchTracks = {nullptr}; - CbmVertex* fCbmVertex = {nullptr}; + HalCbm::DataFormat fFormatType = {HalCbm::DataFormat::kUnknown}; + CbmAnaTreeRecoContainer* fDataContainer = {nullptr}; + TClonesArray* fGlobalTracks = {nullptr}; + TClonesArray* fStsTracks = {nullptr}; + TClonesArray* fTrdTracks = {nullptr}; + TClonesArray* fTofHits = {nullptr}; + TClonesArray* fRichRings = {nullptr}; + TClonesArray* fMuchTracks = {nullptr}; + TClonesArray* fTempV0 = {nullptr}; + CbmVertex* fCbmVertex = {nullptr}; void UpdateDst(HalCbmMCEventInterface* ie); void UpdateAnaTree(HalCbmMCEventInterface* ie); virtual void ConnectToTreeInternal(eMode mode); @@ -48,12 +49,13 @@ class HalCbmEventInterface : public Hal::EventInterface { HalCbm::DataFormat GetFormatType() const { return fFormatType; }; virtual Int_t GetTotalTrackNo() const; virtual Hal::TrackInterface* GetTrackInterface() const { return new HalCbmTrackInterface(); } - CbmAnaTreeRecoSourceContainer* GetContainer() const { return fDataContainer; } + CbmAnaTreeRecoContainer* GetContainer() const { return fDataContainer; } virtual TObject* GetRawTrackPointer(Int_t index) const; /** GETTERS AND SETTERS **/ virtual void SetRunInfoId(Int_t /*i*/){}; virtual Int_t GetRunInfoId() const { return 0; }; virtual TLorentzVector GetVertex() const; + TClonesArray* GetV0Temp() const { return fTempV0; } virtual ~HalCbmEventInterface(); ClassDef(HalCbmEventInterface, 1) }; diff --git a/analysis/PWGC2F/femtoscopy/hal/format/combined/HalCbmFullEvent.cxx b/analysis/PWGC2F/femtoscopy/hal/format/combined/HalCbmFullEvent.cxx index 13ece70b227314c14bf33312fe048368a30f52bd..ad80f2918aa69bd6ab6a175f3376873183247068 100644 --- a/analysis/PWGC2F/femtoscopy/hal/format/combined/HalCbmFullEvent.cxx +++ b/analysis/PWGC2F/femtoscopy/hal/format/combined/HalCbmFullEvent.cxx @@ -9,6 +9,7 @@ #include "HalCbmEventInterface.h" #include "HalCbmMCEvent.h" #include "HalCbmMCEventInterface.h" +#include "HalCbmV0TempTrack.h" #include <AnalysisTree/Constants.hpp> @@ -51,10 +52,11 @@ HalCbmFullEvent::HalCbmFullEvent(Hal::Event* re, Hal::Event* im) : Hal::ComplexE void HalCbmFullEvent::UpdateAnalysisTree(Hal::ComplexEventInterface* interface) { - HalCbmEventInterface* s = (HalCbmEventInterface*) interface->GetReal(); - CbmAnaTreeRecoSourceContainer* reco = (CbmAnaTreeRecoSourceContainer*) s->GetContainer(); - auto vecToSim = reco->GetVtx2Sim(); - for (Int_t i = 0; i < fTotalTracksNo; i++) { + HalCbmEventInterface* s = (HalCbmEventInterface*) interface->GetReal(); + CbmAnaTreeRecoContainer* reco = (CbmAnaTreeRecoContainer*) s->GetContainer(); + auto vecToSim = reco->GetVtx2Sim(); + Int_t charged = ((HalCbmEvent*) fRealEvent)->GetVertexTracksNo(); + for (Int_t i = 0; i < charged; i++) { Hal::ComplexTrack* track = (Hal::ComplexTrack*) fTracks->UncheckedAt(i); track->ResetTrack(i, this); track->SetRealTrack(fRealEvent->GetTrack(i)); @@ -69,6 +71,25 @@ void HalCbmFullEvent::UpdateAnalysisTree(Hal::ComplexEventInterface* interface) track->SetMatchID(match); } } + //v0 stuff + auto v0Tracks = s->GetV0Temp(); + if (!v0Tracks) return; + for (int i = charged; i < charged + fRealEvent->GetTotalV0No(); i++) { + Hal::ComplexTrack* track = (Hal::ComplexTrack*) fTracks->UncheckedAt(i); + track->ResetTrack(i, this); + track->SetRealTrack(fRealEvent->GetTrack(i)); + track->Hal::Track::CopyData(fRealEvent->GetTrack(i)); + auto v0Temp = (HalCbmV0TempTrack*) v0Tracks->UncheckedAt(i - charged); + Int_t match = v0Temp->GetMcId(); + if (match < 0 || match == AnalysisTree::UndefValueInt) { + track->SetImgTrack(nullptr); + track->SetMatchID(-1); + } + else { + track->SetImgTrack(fImgEvent->GetTrack(match)); + track->SetMatchID(match); + } + } } void HalCbmFullEvent::UpdateDst(Hal::ComplexEventInterface* interface) @@ -85,7 +106,7 @@ void HalCbmFullEvent::UpdateDst(Hal::ComplexEventInterface* interface) if (sts_index >= 0) { CbmTrackMatchNew* match = (CbmTrackMatchNew*) ims->fStsMatches->UncheckedAt(sts_index); Int_t mcId = match->GetMatchedLink().GetIndex(); - if (mcId > 0) { + if (mcId >= 0) { track->SetImgTrack(fImgEvent->GetTrack(mcId)); track->SetMatchID(mcId); } diff --git a/analysis/PWGC2F/femtoscopy/hal/format/unigen/HalCbmUnigenEvent.cxx b/analysis/PWGC2F/femtoscopy/hal/format/unigen/HalCbmUnigenEvent.cxx index c365be1b00aec2dbf958e1c59fe114e5597f2ce3..5ca305862e6dc563a51074bda72164f7dfc4b59b 100644 --- a/analysis/PWGC2F/femtoscopy/hal/format/unigen/HalCbmUnigenEvent.cxx +++ b/analysis/PWGC2F/femtoscopy/hal/format/unigen/HalCbmUnigenEvent.cxx @@ -42,7 +42,7 @@ void HalCbmUnigenEvent::Update(Hal::EventInterface* interface) target_track->SetMotherIndex(particle->GetParent()); } target_track->SetMomentum(particle->Px(), particle->Py(), particle->Pz(), particle->E()); - target_track->SetFreezoutPosition(particle->X(), particle->Y(), particle->Z(), particle->T()); + target_track->SetFreezeoutPosition(particle->X(), particle->Y(), particle->Z(), particle->T()); target_track->SetStatus(particle->GetStatus()); } } diff --git a/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0Builder.cxx b/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0Builder.cxx new file mode 100644 index 0000000000000000000000000000000000000000..ef7002bd8758ef0d04f6ff9748688595832a8a35 --- /dev/null +++ b/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0Builder.cxx @@ -0,0 +1,195 @@ +/* Copyright (C) 2025-2025 Warsaw University of Technology, Warsaw + SPDX-License-Identifier: GPL-3.0-only + Authors: Daniel Wielanek [committer] */ +#include "HalCbmV0Builder.h" + +#include "HalCbmAnalysisManager.h" +#include "HalCbmDetectorID.h" +#include "HalCbmTrack.h" +#include "HalCbmV0TempTrack.h" +#include "HalCbmV0Track.h" + +#include <TClonesArray.h> +#include <TDatabasePDG.h> +#include <TParticlePDG.h> + +#include <Hal/Cout.h> +#include <Hal/DataManager.h> + +namespace Hal +{ + +} /* namespace Hal */ + +HalCbmV0Builder::v0rawInfo HalCbmV0Builder::Convert(const AnalysisTree::Particle& p) +{ + HalCbmV0Builder::v0rawInfo v0Info; + v0Info.chi2geo = p.GetField<float>(fV0Container->GetFieldIds().chi2geo); + v0Info.chi2_prim_first = p.GetField<float>(fV0Container->GetFieldIds().chi2_prim_first); + v0Info.chi2_prim_second = p.GetField<float>(fV0Container->GetFieldIds().chi2_prim_second); + v0Info.chi2_topo = p.GetField<float>(fV0Container->GetFieldIds().chi2_topo); + v0Info.cosine_first = p.GetField<float>(fV0Container->GetFieldIds().cosine_first); + v0Info.cosine_second = p.GetField<float>(fV0Container->GetFieldIds().cosine_second); + v0Info.cosine_topo = p.GetField<float>(fV0Container->GetFieldIds().cosine_topo); + v0Info.distance = p.GetField<float>(fV0Container->GetFieldIds().distance); + v0Info.l = p.GetField<float>(fV0Container->GetFieldIds().l); + v0Info.l_dl = p.GetField<float>(fV0Container->GetFieldIds().l_over_dl); + v0Info.mass = p.GetField<float>(fV0Container->GetFieldIds().mass); + v0Info.px = p.GetField<float>(fV0Container->GetFieldIds().px); + v0Info.py = p.GetField<float>(fV0Container->GetFieldIds().py); + v0Info.pz = p.GetField<float>(fV0Container->GetFieldIds().pz); + v0Info.x = p.GetField<float>(fV0Container->GetFieldIds().x); + v0Info.y = p.GetField<float>(fV0Container->GetFieldIds().y); + v0Info.z = p.GetField<float>(fV0Container->GetFieldIds().z); + v0Info.pid = p.GetField<int>(fV0Container->GetFieldIds().pdg); + v0Info.dau1id = p.GetField<int>(fV0Container->GetFieldIds().dau1id); + v0Info.dau2id = p.GetField<int>(fV0Container->GetFieldIds().dau2id); + +#ifdef DEBUG_EXTR + v0Info.dau1px = p.GetField<float>(fV0Container->GetFieldIds().dau1px); + v0Info.dau1py = p.GetField<float>(fV0Container->GetFieldIds().dau1py); + v0Info.dau1pz = p.GetField<float>(fV0Container->GetFieldIds().dau1pz); + v0Info.dau1x = p.GetField<float>(fV0Container->GetFieldIds().dau1x); + v0Info.dau1y = p.GetField<float>(fV0Container->GetFieldIds().dau1y); + v0Info.dau1z = p.GetField<float>(fV0Container->GetFieldIds().dau1z); + + v0Info.dau2px = p.GetField<float>(fV0Container->GetFieldIds().dau2px); + v0Info.dau2py = p.GetField<float>(fV0Container->GetFieldIds().dau2py); + v0Info.dau2pz = p.GetField<float>(fV0Container->GetFieldIds().dau2pz); + v0Info.dau2x = p.GetField<float>(fV0Container->GetFieldIds().dau2x); + v0Info.dau2y = p.GetField<float>(fV0Container->GetFieldIds().dau2y); + v0Info.dau2z = p.GetField<float>(fV0Container->GetFieldIds().dau2z); +#endif + return v0Info; +} + +HalCbmV0Builder::HalCbmV0Builder(Int_t motherPid, Int_t posdau, Int_t negdau) + : fPidMom(motherPid) + , fPidPosDau(posdau) + , fPidNegDau(negdau) +{ +} + +HalCbmV0Builder::EInitFlag HalCbmV0Builder::Init() +{ + fSimContainer = (CbmAnaTreeMcContainer*) Hal::DataManager::Instance()->GetObject(HalCbm::GetContainerName("mc")); + fRecoContainer = (CbmAnaTreeRecoContainer*) Hal::DataManager::Instance()->GetObject(HalCbm::GetContainerName("reco")); + fV0Container = (CbmAnaTreeV0Container*) Hal::DataManager::Instance()->GetObject(HalCbm::GetContainerName("v0")); + auto trk = TDatabasePDG::Instance()->GetParticle(fPidMom); + if (!trk) { + Hal::Cout::PrintInfo(Form("HalCbmV0Builder::Init cannot find selected mother PID=%i", fPidMom), Hal::EInfo::kError); + return EInitFlag::kERROR; + } + fMass = trk->Mass(); + if (!fV0Container) { + Hal::Cout::PrintInfo("HalCbmV0Builder::Init cannot find V0 data", Hal::EInfo::kError); + return EInitFlag::kERROR; + } + if (!fRecoContainer) { + Hal::Cout::PrintInfo("HalCbmV0Builder::Init cannot find reco data", Hal::EInfo::kError); + return EInitFlag::kERROR; + } + fV0Temp = (TClonesArray*) Hal::DataManager::Instance()->GetObject("TempV0."); + if (!fV0Temp) { + fV0Temp = new TClonesArray("HalCbmV0TempTrack"); + Hal::DataManager::Instance()->Register("TempV0.", "TempV0", fV0Temp, kFALSE); + fOwner = kTRUE; + } + return EInitFlag::kSUCCESS; +} + +void HalCbmV0Builder::Exec(Option_t* /*option*/) +{ + auto recoCont = fRecoContainer->GetVtxTracks(); + auto recoMatch = fRecoContainer->GetVtx2Sim(); + auto sim = fSimContainer->GetParticles(); + int charge_field = fRecoContainer->GetFieldIds().vtx_q; + int nv0s = fV0Container->GetParticles()->GetNumberOfChannels(); + int mother_field = fSimContainer->GetFieldIds().motherId; + int ent = 0; + if (fOwner) { + fV0Temp->Clear(""); + fV0Temp->ExpandCreateFast(nv0s); + } + else { + ent = fV0Temp->GetEntriesFast(); + fV0Temp->ExpandCreateFast(ent + nv0s); + } + for (int i = 0; i < nv0s; i++) { + auto particleV0 = fV0Container->GetParticles()->GetChannel(i); + auto v0struct = Convert(particleV0); + auto dau1 = recoCont->GetChannel(v0struct.dau1id); + auto dau2 = recoCont->GetChannel(v0struct.dau2id); + int ch1 = dau1.GetField<int>(charge_field); + int ch2 = dau2.GetField<int>(charge_field); + AnalysisTree::Track daupos = dau1, dauneg = dau2; + if (ch1 < 0 && ch2 > 0) { // daughters swap + daupos = dau2; + dauneg = dau1; + int temp = v0struct.dau1id; + v0struct.dau1id = v0struct.dau2id; + v0struct.dau2id = temp; + } + auto v0Track = (HalCbmV0TempTrack*) fV0Temp->ConstructedAt(ent + i); + v0Track->GetTrack().SetVertexChi2(v0struct.chi2_topo); + double e = TMath::Sqrt(v0struct.px * v0struct.px + v0struct.py * v0struct.py + v0struct.pz * v0struct.pz + + v0struct.mass * v0struct.mass); + v0Track->GetTrack().SetMomentum(v0struct.px, v0struct.py, v0struct.pz, e); + v0Track->GetTrack().SetDCA(v0struct.x, v0struct.y, v0struct.z); + int field_hit = fRecoContainer->GetFieldIds().vtx_mvdhits; + int field_sts = fRecoContainer->GetFieldIds().vtx_nhits; + v0Track->GetTrack().SetNMvdHits(daupos.GetField<int>(field_hit) + dauneg.GetField<int>(field_hit)); + v0Track->GetTrack().SetNStsHits(daupos.GetField<int>(field_sts) + dauneg.GetField<int>(field_sts) + - daupos.GetField<int>(field_hit) - dauneg.GetField<int>(field_hit)); + v0Track->GetV0().SetPdgDaughters(fPidPosDau, fPidNegDau); + v0Track->GetV0().SetPosId(v0struct.dau1id); + v0Track->GetV0().SetNegId(v0struct.dau2id); + v0Track->GetV0().SetDecLenght(v0struct.l); + v0Track->GetV0().SetDecDl(v0struct.l_dl); + v0Track->GetV0().SetDauDist(v0struct.distance); + +#ifdef DEBUG_EXTR + v0Track->GetV0().SetMomentumPos(TVector3(v0struct.dau1px, v0struct.dau1py, v0struct.dau1pz)); + v0Track->GetV0().SetMomentumNeg(TVector3(v0struct.dau2px, v0struct.dau2py, v0struct.dau2pz)); +#else + v0Track->GetV0().SetMomentumPos(TVector3(daupos.GetPx(), daupos.GetPy(), daupos.GetPz())); + v0Track->GetV0().SetMomentumNeg(TVector3(dauneg.GetPx(), dauneg.GetPy(), dauneg.GetPz())); +#endif + v0Track->GetV0().SetMcId(v0struct.pid); + v0Track->SetMcId(-1); + //mc matching + if (!recoMatch) continue; + int mc1 = recoMatch->GetMatchDirect(v0struct.dau1id); + int mc2 = recoMatch->GetMatchDirect(v0struct.dau2id); + if (fBeFriendly) { + if (mc1 >= 0 && mc2 >= 0) { + auto mctrack1 = sim->GetChannel(mc1); + auto mctrack2 = sim->GetChannel(mc2); + int mom1 = mctrack1.GetField<int>(mother_field); + int mom2 = mctrack2.GetField<int>(mother_field); + v0Track->SetMcId(mom1); + } + else if (mc1 >= 0) { + auto mctrack = sim->GetChannel(mc1); + v0Track->SetMcId(mctrack.GetField<int>(mother_field)); + } + else if (mc2 >= 0) { + auto mctrack = sim->GetChannel(mc2); + v0Track->SetMcId(mctrack.GetField<int>(mother_field)); + } + } + else { + if (mc1 < 0) continue; + if (mc2 < 0) continue; + auto mctrack1 = sim->GetChannel(mc1); + auto mctrack2 = sim->GetChannel(mc2); + int mom1 = mctrack1.GetField<int>(mother_field); + int mom2 = mctrack2.GetField<int>(mother_field); + if (mom1 == mom2) { + v0Track->SetMcId(mom1); + } + } + } +} + +HalCbmV0Builder::~HalCbmV0Builder() {} diff --git a/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0Builder.h b/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0Builder.h new file mode 100644 index 0000000000000000000000000000000000000000..bda002d0a5d9e496dd395dd8b28894a06a63a32b --- /dev/null +++ b/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0Builder.h @@ -0,0 +1,57 @@ +/* Copyright (C) 2025-2025 Warsaw University of Technology, Warsaw + SPDX-License-Identifier: GPL-3.0-only + Authors: Daniel Wielanek [committer] */ +#ifndef CBMROOT_V0_ANALYSIS_PWGC2F_FEMTOSCOPY_HAL_HELPERS_HALCBMV0BUILDER_H_ +#define CBMROOT_V0_ANALYSIS_PWGC2F_FEMTOSCOPY_HAL_HELPERS_HALCBMV0BUILDER_H_ + +#include "CbmAnaTreeContainer.h" + +#include <Hal/Task.h> + +class CbmAnaTreeV0Container; +class TClonesArray; + +namespace AnalysisTree +{ + class Particle; +} + + +class HalCbmV0Builder : public Hal::Task { + struct v0rawInfo { + float chi2geo, chi2_prim_first; + float chi2_prim_second, chi2_topo; + float cosine_first, cosine_second, cosine_topo; + float distance, l, l_dl; + float mass, px, py, pz; + float x, y, z; + int dau1id, dau2id, pid, id; + int mcid; +#ifdef DEBUG_EXTR + int dau1px, dau1py, dau1pz, dau1x, dau1y, dau1z; + int dau2px, dau2py, dau2pz, dau2x, dau2y, dau2z; +#endif + }; + Int_t fPidMom; + Int_t fPidPosDau; + Int_t fPidNegDau; + Bool_t fBeFriendly = {kFALSE}; + Double_t fMass = {0}; + AnaTreeV0Ids fFields; + CbmAnaTreeV0Container* fV0Container = {nullptr}; + CbmAnaTreeRecoContainer* fRecoContainer = {nullptr}; + CbmAnaTreeMcContainer* fSimContainer = {nullptr}; + TClonesArray* fV0Temp = {nullptr}; + Bool_t fOwner = {kFALSE}; + v0rawInfo Convert(const AnalysisTree::Particle& p); + + public: + HalCbmV0Builder(Int_t motherPid = 3321, Int_t posdau = 2212, Int_t negdau = -211); + virtual EInitFlag Init(); + void BeFriendly() { fBeFriendly = kTRUE; } + virtual void Exec(Option_t* option = ""); + virtual ~HalCbmV0Builder(); + ClassDef(HalCbmV0Builder, 1) +}; + +#endif /* CBMROOT_V0_ANALYSIS_PWGC2F_FEMTOSCOPY_HAL_HELPERS_HALCBMV0BUILDER_H_ */ diff --git a/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0TempTrack.cxx b/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0TempTrack.cxx new file mode 100644 index 0000000000000000000000000000000000000000..d66b537a3252465e2d9481138ba6b21652001b5c --- /dev/null +++ b/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0TempTrack.cxx @@ -0,0 +1,97 @@ +/* Copyright (C) 2025-2025 Warsaw University of Technology, Warsaw + SPDX-License-Identifier: GPL-3.0-only + Authors: Daniel Wielanek [committer] */ +#include "HalCbmV0TempTrack.h" + +#include <TLorentzVector.h> +#include <TVector3.h> + +#include <Hal/Event.h> +#include <Hal/ExpTrack.h> +#include <Hal/Track.h> +#include <Hal/V0Track.h> + +Double_t HalCbmV0TempTrack::GetValue(kTriggerCut val) +{ + switch (val) { + case kTriggerCut::kChi2Geo: { + return fV0Hidden.GetChi2geo(); + } break; + case kTriggerCut::kChi2PrimFirst: { + return fV0Hidden.GetChi2Pos(); + } break; + case kTriggerCut::kChi2PrimSecond: { + return fV0Hidden.GetChi2Neg(); + } break; + case kTriggerCut::kChi2Topo: { + //return fV0Hidden.GetChi2topo(); + } break; + case kTriggerCut::kCosineFirst: { + return fCosinePos; + } break; + case kTriggerCut::kCosineSecond: { + return fCosineNeg; + } break; + case kTriggerCut::kDistance: { + return fV0Hidden.GetChi2Pos(); + } break; + case kTriggerCut::kL: { + return fV0Hidden.GetDecLength(); + } break; + case kTriggerCut::kDl: { + return fV0Hidden.GetDecDl(); + } break; + case kTriggerCut::kMass: { + return 0; + } break; + case kTriggerCut::kPt: { + return fRecoTrack.GetMomentum().Pt(); + } break; + case kTriggerCut::kEta: { + return fRecoTrack.GetMomentum().Eta(); + } break; + case kTriggerCut::kRxy: { + return fRecoTrack.GetDCA().Pt(); + } break; + case kTriggerCut::kRz: { + return fRecoTrack.GetDCA().Z(); + } break; + case kTriggerCut::kCosineTopo: { + return fCosineTopo; + } break; + case kTriggerCut::kPid: { + return fV0Hidden.GetPdg(); + } break; + } + return 0; +} + +void HalCbmV0TempTrack::ComputeStuff(Hal::Event* event, Hal::Track* assignedTrack) +{ + auto dau1 = (HalCbmTrack*) event->GetTrack(fV0Hidden.GetPosId()); + auto dau2 = (HalCbmTrack*) event->GetTrack(fV0Hidden.GetNegId()); + TVector3 vtx = event->GetVertex()->Vect(); + auto expTrack = (Hal::ExpTrack*) assignedTrack; + TVector3 pos(expTrack->GetDCA()); //or + event pos? + TVector3 mom(expTrack->GetPx(), expTrack->GetPy(), expTrack->GetPz()); + auto shift = mom.Unit() * fV0Hidden.GetDecLength() + vtx; //new position + pos gorsze wyniki + fV0Hidden.SetDecayPos(shift.X(), shift.Y(), shift.Z()); + TVector3 dau1mom, dau2mom, dau1pos, dau2pos; + dau1pos = dau1->GetHelix().Eval(shift.Z(), dau1mom); + dau2pos = dau2->GetHelix().Eval(shift.Z(), dau2mom); +#ifdef DEBUG_EXTR + std::cout << "DECPOS " << std::endl; + std::cout << __FILE__ << "____" << std::endl; + auto print = [](TString t, TVector3 x) { + std::cout << Form("%4.4f %4.4f %4.4f %s", x.X(), x.Y(), x.Z(), t.Data()) << std::endl; + }; + print("Dau1dec", dau1pos); + print("Dau2dec", dau2pos); + + print("Dau1vec", dau1mom); + print("Dau2vec", dau2mom); +#endif + fV0Hidden.SetMomPos(dau1mom.X(), dau1mom.Y(), dau1mom.Z()); + fV0Hidden.SetMomNeg(dau2mom.X(), dau2mom.Y(), dau2mom.Z()); + fV0Hidden.Recalc(*assignedTrack); +} diff --git a/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0TempTrack.h b/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0TempTrack.h new file mode 100644 index 0000000000000000000000000000000000000000..908a7cf1ff766148e659ab2708e4f3414a8b219d --- /dev/null +++ b/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0TempTrack.h @@ -0,0 +1,58 @@ +/* Copyright (C) 2025-2025 Warsaw University of Technology, Warsaw + SPDX-License-Identifier: GPL-3.0-only + Authors: Daniel Wielanek [committer] */ +#ifndef CBMROOT_V0_ANALYSIS_PWGC2F_FEMTOSCOPY_HAL_HELPERS_V0_HALCBMV0TEMPTRACK_H_ +#define CBMROOT_V0_ANALYSIS_PWGC2F_FEMTOSCOPY_HAL_HELPERS_V0_HALCBMV0TEMPTRACK_H_ + +#include "HalCbmTrack.h" +#include "HalCbmV0Track.h" + +#include <Rtypes.h> +#include <RtypesCore.h> + +class HalCbmV0TempTrack : public TObject { + HalCbmV0Track fV0Hidden; + HalCbmTrack fRecoTrack; + Int_t fMcId = {-1}; //match id + Double_t fCosinePos = {0}; + Double_t fCosineNeg = {0}; + Double_t fCosineTopo = {0}; + Double_t fDl = {0}; + + public: + enum class kTriggerCut + { + kChi2Geo = 0, + kChi2PrimFirst = 1, + kChi2PrimSecond = 2, + kChi2Topo = 3, + kCosineFirst = 4, + kCosineSecond = 5, + kDistance = 6, + kL = 7, + kDl = 8, + kMass = 9, + kPt = 10, + kEta = 11, + kRxy = 12, + kRz = 13, + kCosineTopo = 14, + kPid = 15, + }; + HalCbmV0TempTrack(){}; + Double_t GetValue(kTriggerCut val); + void SetCosPos(Double_t val) { fCosinePos = val; } + void SetCosNeg(Double_t val) { fCosineNeg = val; } + void SetCosTopo(Double_t val) { fCosineTopo = val; } + void SetDL(Double_t val) { fDl = val; } + HalCbmV0Track& GetV0() { return fV0Hidden; } + HalCbmTrack& GetTrack() { return fRecoTrack; } + void ComputeStuff(Hal::Event* event, + Hal::Track* assignedTrack); //compute missing fields (not available in root trees) + void SetMcId(Int_t mc) { fMcId = mc; }; + Int_t GetMcId() const { return fMcId; } + virtual ~HalCbmV0TempTrack(){}; + ClassDef(HalCbmV0TempTrack, 1); +}; + +#endif /* CBMROOT_V0_ANALYSIS_PWGC2F_FEMTOSCOPY_HAL_HELPERS_V0_HALCBMV0TEMPTRACK_H_ */ diff --git a/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0Track.cxx b/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0Track.cxx new file mode 100644 index 0000000000000000000000000000000000000000..0f8c9a0ceb8c8d9bbc30cbc5c1cec4b54b497cee --- /dev/null +++ b/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0Track.cxx @@ -0,0 +1,15 @@ +/* Copyright (C) 2025-2025 Warsaw University of Technology, Warsaw + SPDX-License-Identifier: GPL-3.0-only + Authors: Daniel Wielanek [committer] */ +#include "HalCbmV0Track.h" + +void HalCbmV0Track::CopyData(V0Track* v) +{ + Hal::V0Track::CopyData(v); + HalCbmV0Track* v0 = (HalCbmV0Track*) (v); + fMcId = v0->fMcId; + fDecDl = v0->fDecDl; + fChi2geo = v0->fChi2geo; + fChi2First = v0->fChi2First; + fChi2Second = v0->fChi2Second; +} diff --git a/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0Track.h b/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0Track.h new file mode 100644 index 0000000000000000000000000000000000000000..53b45709a0c096a5bdcf17f56cc247b945fbe6c8 --- /dev/null +++ b/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0Track.h @@ -0,0 +1,36 @@ +/* Copyright (C) 2025-2025 Warsaw University of Technology, Warsaw + SPDX-License-Identifier: GPL-3.0-only + Authors: Daniel Wielanek [committer] */ +#ifndef CBMROOT_V0_ANALYSIS_PWGC2F_FEMTOSCOPY_HAL_FORMAT_V0_HALCBMV0TRACK_H_ +#define CBMROOT_V0_ANALYSIS_PWGC2F_FEMTOSCOPY_HAL_FORMAT_V0_HALCBMV0TRACK_H_ + +#include <Hal/V0Track.h> + +class HalCbmV0Track : public Hal::V0Track { + Int_t fMcId = {-1}; + Float_t fDecDl = {0}; + Float_t fChi2geo = {0}; + Float_t fChi2First = {0}; + Float_t fChi2Second = {0}; + + public: + HalCbmV0Track(){}; + virtual ~HalCbmV0Track() {} + virtual void CopyData(V0Track* v); + void SetChi2geo(Float_t Chi2geo) { fChi2geo = Chi2geo; } + void SetDecDl(Float_t DecDl) { fDecDl = DecDl; } + void SetMcId(Int_t McId) { fMcId = McId; } + void SetChi2Dau(Double_t pos, Double_t neg) + { + fChi2First = pos; + fChi2Second = neg; + } + Float_t GetChi2geo() const { return fChi2geo; } + Float_t GetDecDl() const { return fDecDl; } + Float_t GetChi2Pos() const { return fChi2First; } + Float_t GetChi2Neg() const { return fChi2Second; } + Int_t GetMcId() const { return fMcId; }; + ClassDef(HalCbmV0Track, 1) +}; + +#endif /* CBMROOT_V0_ANALYSIS_PWGC2F_FEMTOSCOPY_HAL_FORMAT_V0_HALCBMV0TRACK_H_ */ diff --git a/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0TrackTrigger.cxx b/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0TrackTrigger.cxx new file mode 100644 index 0000000000000000000000000000000000000000..4f0d1ce15f966ead2708608868257090f229884d --- /dev/null +++ b/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0TrackTrigger.cxx @@ -0,0 +1,8 @@ +/* Copyright (C) 2025-2025 Warsaw University of Technology, Warsaw + SPDX-License-Identifier: GPL-3.0-only + Authors: Daniel Wielanek [committer] */ +#include "HalCbmV0TrackTrigger.h" + +HalCbmV0TrackTrigger::HalCbmV0TrackTrigger() {} + +Bool_t HalCbmV0TrackTrigger::Pass(HalCbmV0TempTrack& /*tr*/) { return kTRUE; } diff --git a/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0TrackTrigger.h b/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0TrackTrigger.h new file mode 100644 index 0000000000000000000000000000000000000000..6ee3cb22662a8993a412f641e3689a4b336d5464 --- /dev/null +++ b/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0TrackTrigger.h @@ -0,0 +1,48 @@ +/* Copyright (C) 2025-2025 Warsaw University of Technology, Warsaw + SPDX-License-Identifier: GPL-3.0-only + Authors: Daniel Wielanek [committer] */ +//TODO complete this class + +#ifndef CBMROOT_V0_ANALYSIS_PWGC2F_FEMTOSCOPY_HAL_FORMAT_V0_HALCBMV0TRACKTRIGGER_H_ +#define CBMROOT_V0_ANALYSIS_PWGC2F_FEMTOSCOPY_HAL_FORMAT_V0_HALCBMV0TRACKTRIGGER_H_ + +#include "HalCbmV0TempTrack.h" + +#include <TObject.h> +class HalCbmV0TrackTrigger : public TObject { + Double_t fMin[16]; + Double_t fMax[16]; + + void SetCut(Double_t lo, Double_t hi, HalCbmV0TempTrack::kTriggerCut pos) + { + int poz = static_cast<int>(pos); + fMin[poz] = lo; + fMax[poz] = hi; + } + + public: + HalCbmV0TrackTrigger(); + void SetChi2GeoCut(Double_t lo, Double_t hi) { SetCut(lo, hi, HalCbmV0TempTrack::kTriggerCut::kChi2Geo); } + void SetChi2PosDauCut(Double_t lo, Double_t hi) { SetCut(lo, hi, HalCbmV0TempTrack::kTriggerCut::kChi2PrimFirst); } + void SetChi2NegDauCut(Double_t lo, Double_t hi) { SetCut(lo, hi, HalCbmV0TempTrack::kTriggerCut::kChi2PrimSecond); } + void SetChi2TopoCut(Double_t lo, Double_t hi) { SetCut(lo, hi, HalCbmV0TempTrack::kTriggerCut::kChi2Topo); } + void SetCosTopoCut(Double_t lo, Double_t hi) { SetCut(lo, hi, HalCbmV0TempTrack::kTriggerCut::kCosineTopo); } + + void SetCosPosDauCut(Double_t lo, Double_t hi) { SetCut(lo, hi, HalCbmV0TempTrack::kTriggerCut::kCosineFirst); } + void SetCosNegDauCut(Double_t lo, Double_t hi) { SetCut(lo, hi, HalCbmV0TempTrack::kTriggerCut::kCosineSecond); } + void SetDauDistCut(Double_t lo, Double_t hi) { SetCut(lo, hi, HalCbmV0TempTrack::kTriggerCut::kDistance); } + void SetDecLenCut(Double_t lo, Double_t hi) { SetCut(lo, hi, HalCbmV0TempTrack::kTriggerCut::kL); } + void SetDeltaDecLenCut(Double_t lo, Double_t hi) { SetCut(lo, hi, HalCbmV0TempTrack::kTriggerCut::kDl); } + + void SetMassCut(Double_t lo, Double_t hi) { SetCut(lo, hi, HalCbmV0TempTrack::kTriggerCut::kMass); } + void SetPtCut(Double_t lo, Double_t hi) { SetCut(lo, hi, HalCbmV0TempTrack::kTriggerCut::kPt); } + void SetEtaCut(Double_t lo, Double_t hi) { SetCut(lo, hi, HalCbmV0TempTrack::kTriggerCut::kEta); } + void SetDCAxyCut(Double_t lo, Double_t hi) { SetCut(lo, hi, HalCbmV0TempTrack::kTriggerCut::kRxy); } + void SetDCAz(Double_t lo, Double_t hi) { SetCut(lo, hi, HalCbmV0TempTrack::kTriggerCut::kRz); } + + Bool_t Pass(HalCbmV0TempTrack& tr); + virtual ~HalCbmV0TrackTrigger(){}; + ClassDef(HalCbmV0TrackTrigger, 1) +}; + +#endif /* CBMROOT_V0_ANALYSIS_PWGC2F_FEMTOSCOPY_HAL_FORMAT_V0_HALCBMV0TRACKTRIGGER_H_ */ diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/CMakeLists.txt b/analysis/PWGC2F/femtoscopy/hal/helpers/CMakeLists.txt index 8adf62e130be4fdc1fd0c12365d185147652cfe0..fba9b22338c5e0a1d8efd1cc8554bf3d227d2648 100644 --- a/analysis/PWGC2F/femtoscopy/hal/helpers/CMakeLists.txt +++ b/analysis/PWGC2F/femtoscopy/hal/helpers/CMakeLists.txt @@ -11,8 +11,7 @@ Set(INCLUDE_DIRECTORIES ${CBMDATA_DIR}/global ${CBMDATA_DIR}/sts ${CMAKE_SOURCE_DIR}/core/field - ${HAL_CBM}/helpers - ${HAL_CBM}/helpers/anatree + ${HAL_CBM_HELPERS} ${AnalysisTree_INCLUDE_DIR} ) Set(SYSTEM_INCLUDE_DIRECTORIES @@ -30,15 +29,25 @@ Link_Directories(${LINK_DIRECTORIES}) # List of source files set(SRCS - HalCbmDetectorID.cxx - HalCbmTaskManager.cxx - HalCbmCompressionTask.cxx - HalCbmAnalysisManager.cxx CbmHelix.cxx - HalCbmField.cxx - anatree/CbmAnaTreeContainer.cxx - anatree/CbmAnaTreeSource.cxx - anatree/HalCbmSource.cxx + HalCbmDetectorID.cxx + HalCbmField.cxx + + hal/HalCbmAnalysisManager.cxx + hal/HalCbmSource.cxx + + faircbm/HalCbmCompressionTask.cxx + faircbm/HalCbmTaskManager.cxx + + fair/Field.cxx + fair/QAManagerBasic.cxx + fair/RootManager.cxx + fair/TaskManager.cxx + + anatree/CbmAnaTreeContainer.cxx + anatree/CbmAnaTreeObjectTrack.cxx + anatree/CbmAnaTreeSource.cxx + ) Set(LINKDEF HalCbmHelpersLinkDef.h) @@ -48,9 +57,10 @@ set(PUBLIC_DEPENDENCIES CbmField FairRoot::Base HalCut - HalFair HalFeatures HalData + HalAna + HalQA KF KFParticle AnalysisTreeBase diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/CbmHelix.cxx b/analysis/PWGC2F/femtoscopy/hal/helpers/CbmHelix.cxx index 9f80d9b776acdef4396068f524d5b85dad4f3cda..c9c7ff71bf733588ef43f3db1612b725ea1200af 100644 --- a/analysis/PWGC2F/femtoscopy/hal/helpers/CbmHelix.cxx +++ b/analysis/PWGC2F/femtoscopy/hal/helpers/CbmHelix.cxx @@ -7,7 +7,7 @@ #include <vector> -#include <Hal/Field.h> +#include <Hal/MagField.h> // matrix x, y, tx,ty, qp, z Hal::MagField* CbmHelix::fgField = NULL; CbmHelix::CbmHelix() {} diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/CbmHelix.h b/analysis/PWGC2F/femtoscopy/hal/helpers/CbmHelix.h index a925f525c46e946724c47aab72e7aa5a234af3ad..34f5fed2dfe8427f1378ef5d06e0a46dbd80c98f 100644 --- a/analysis/PWGC2F/femtoscopy/hal/helpers/CbmHelix.h +++ b/analysis/PWGC2F/femtoscopy/hal/helpers/CbmHelix.h @@ -53,7 +53,18 @@ class CbmHelix : public TObject { << std::endl; } Double_t* GetTrack() { return fT; } + /** + * eval coordinates at Z + * @param z + * @return + */ TVector3 Eval(Double_t z); + /** + * eval coordinates and momentum at Z + * @param z + * @param mom + * @return + */ TVector3 Eval(Double_t z, TVector3& mom); virtual ~CbmHelix(); ClassDef(CbmHelix, 1) diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmDetectorID.cxx b/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmDetectorID.cxx index 06dcc2cde71cd22cad0e7a7ea1c4d40827e049d8..22688b80fbf2a9ac83cd8c04033e16d2ca72d44f 100644 --- a/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmDetectorID.cxx +++ b/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmDetectorID.cxx @@ -2,3 +2,20 @@ SPDX-License-Identifier: GPL-3.0-only Authors: Daniel Wielanek [committer] */ #include "HalCbmDetectorID.h" + +#include <Hal/Cout.h> + +TString HalCbm::GetContainerName(TString name) +{ + if (name == "reco") { + return "CbmAnaTreeSourceContainer."; + } + if (name == "mc") { + return "CbmAnaTreeMcSourceContainer."; + } + if (name == "v0") { + return "CbmAnaTreeV0SourceContainer."; + } + Hal::Cout::PrintInfo(Form("HalCbm::GetContainerName wrong flag '%s'", name.Data()), Hal::EInfo::kError); + return ""; +} diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmDetectorID.h b/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmDetectorID.h index a9557842be1be20048515da5cf8e140142b237e5..d80ac3715fdeb134d142b919140d47c5140bea7c 100644 --- a/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmDetectorID.h +++ b/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmDetectorID.h @@ -4,6 +4,7 @@ #ifndef CBMROOT_NICA_CBM_HELPERS_CBMDETECTORID_H_ #define CBMROOT_NICA_CBM_HELPERS_CBMDETECTORID_H_ + #include <Hal/DataFormat.h> namespace HalCbm { @@ -31,6 +32,13 @@ namespace HalCbm kAnalysisTree = 1, kUnknown = 2 }; + /** + * returns container name in tree + * @param name "reco" "mc" or "v0" available + * @return + */ + TString GetContainerName(TString name); + } // namespace HalCbm diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmHelpersLinkDef.h b/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmHelpersLinkDef.h index 5f4b2c89824ab84fbb3d1e2044de85c77e29a20b..c722238c54fe1b044bec8aad23372ff891c26ade 100644 --- a/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmHelpersLinkDef.h +++ b/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmHelpersLinkDef.h @@ -9,17 +9,30 @@ #pragma link C++ namespace HalCbm::DetectorID; #pragma link C++ enum HalCbm::GeoSetup; #pragma link C++ enum HalCbm::DataFormat; -#pragma link C++ class HalCbmTaskManager + ; -#pragma link C++ class HalCbmCompressionTask + ; + #pragma link C++ class CbmHelix + ; #pragma link C++ class HalCbmField + ; -#pragma link C++ class HalCbmAnalysisManager + ; -#pragma link C++ class CbmAnaTreeRecoSourceContainer + ; -#pragma link C++ class CbmAnaTreeMcSourceContainer + ; -#pragma link C++ class CbmAnaTreeSource + ; -#pragma link C++ class CbmAnaTreeObjectTrack + ; + #pragma link C++ class HalCbmATIOManager + ; #pragma link C++ class HalCbmSource + ; +#pragma link C++ class HalCbmAnalysisManager + ; + +#pragma link C++ class HalCbmTaskManager + ; +#pragma link C++ class HalCbmCompressionTask + ; +#pragma link C++ class Hal::Fair::TaskManager + ; +#pragma link C++ class Hal::Fair::RootManager + ; +#pragma link C++ class Hal::Fair::QAManagerBasic + ; +#pragma link C++ class Hal::Fair::Field + ; + +#pragma link C++ class CbmAnaTreeSource + ; +#pragma link C++ class CbmAnaTreeObjectTrack + ; +#pragma link C++ class CbmAnaTreeContainer + ; +#pragma link C++ class CbmAnaTreeRecoContainer + ; +#pragma link C++ class CbmAnaTreeMcContainer + ; +#pragma link C++ class CbmAnaTreeV0Container + ; +#pragma link C++ class CbmAnaTreeContainers + ; +//#pragma link C++ class HalCbmQACoreManager + ; +#pragma link C++ namespace Hal::Fair; //#pragma link C++ class CbmNicaCompression + ; diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/CbmAnaTreeContainer.cxx b/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/CbmAnaTreeContainer.cxx index f56b6300082bbe2bc7242bea617168f7ed68598b..31ec9e41fe82e9ee634747484ab0986a6be24bb1 100644 --- a/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/CbmAnaTreeContainer.cxx +++ b/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/CbmAnaTreeContainer.cxx @@ -4,21 +4,104 @@ #include "CbmAnaTreeContainer.h" #include "AnalysisTree/Matching.hpp" +#include "HalCbmSource.h" #include <TChain.h> #include <TFile.h> #include <AnalysisTree/Configuration.hpp> +#include <vector> #include <Hal/Cout.h> +#include <Hal/InputDataInfo.h> +#include <Hal/RootIOManager.h> -Bool_t CbmAnaTreeRecoSourceContainer::ConnectToTree(TChain* tree) +void CbmAnaTreeRecoContainer::LoadFields(std::vector<TString> files) { + Bool_t found; + AnalysisTree::BranchConfig conf = GetBranchConf(files, "VtxTracks", found); + if (!found) return; + GetFieldIds().vtx_px = conf.GetFieldId("px"); + GetFieldIds().vtx_py = conf.GetFieldId("py"); + GetFieldIds().vtx_pz = conf.GetFieldId("pz"); + GetFieldIds().vtx_dcax = conf.GetFieldId("dcax"); + GetFieldIds().vtx_dcay = conf.GetFieldId("dcay"); + GetFieldIds().vtx_dcaz = conf.GetFieldId("dcaz"); + + GetFieldIds().vtx_chi2 = conf.GetFieldId("chi2"); + GetFieldIds().vtx_vtxchi2 = conf.GetFieldId("vtx_chi2"); + GetFieldIds().vtx_q = conf.GetFieldId("q"); + GetFieldIds().vtx_nhits = conf.GetFieldId("nhits"); + GetFieldIds().vtx_mvdhits = conf.GetFieldId("nhits_mvd"); + + GetFieldIds().vtx_x = conf.GetFieldId("x"); + GetFieldIds().vtx_cx0 = conf.GetFieldId("cx0"); + GetFieldIds().vtx_cov1 = conf.GetFieldId("cov1"); + conf = GetBranchConf(files, "TofHits", found); + if (!found) return; + GetFieldIds().tof_mass2 = conf.GetFieldId("mass2"); +} + +void CbmAnaTreeMcContainer::LoadFields(std::vector<TString> files) +{ + + Bool_t found; + AnalysisTree::BranchConfig conf = GetBranchConf(files, "SimParticles", found); + if (!found) return; + + GetFieldIds().px = conf.GetFieldId("px"); + GetFieldIds().py = conf.GetFieldId("py"); + GetFieldIds().pz = conf.GetFieldId("pz"); + GetFieldIds().mass = conf.GetFieldId("mass"); + GetFieldIds().pdg = conf.GetFieldId("pid"); + GetFieldIds().motherId = conf.GetFieldId("mother_id"); + + GetFieldIds().freezX = conf.GetFieldId("xfreez"); + GetFieldIds().freezY = conf.GetFieldId("yfreez"); + GetFieldIds().freezZ = conf.GetFieldId("zfreez"); + GetFieldIds().freezT = conf.GetFieldId("tfreez"); + + conf = GetBranchConf(files, "SimEventHeader", found); + if (!found) return; + + GetFieldIds().event_b = conf.GetFieldId("b"); + GetFieldIds().event_psi = conf.GetFieldId("psi_RP"); +} + +AnalysisTree::BranchConfig CbmAnaTreeContainer::GetBranchConf(std::vector<TString> files, TString patternToFind, + Bool_t& found) const +{ + TFile* oldFile = gFile; + TDirectory* oldDir = gDirectory; + for (auto file : files) { + TFile* f = new TFile(file); + AnalysisTree::Configuration* conf = (AnalysisTree::Configuration*) f->Get("Configuration"); + auto branches = conf->GetListOfBranches(); + for (auto branch : branches) { + if (patternToFind.EqualTo(branch)) { + found = kTRUE; + f->Close(); + gFile = oldFile; + gDirectory = oldDir; + return conf->GetBranchConfig(patternToFind.Data()); + } + } + f->Close(); + } + gFile = oldFile; + gDirectory = oldDir; + found = kFALSE; + return AnalysisTree::BranchConfig(); +} + +Bool_t CbmAnaTreeRecoContainer::ConnectToTree(TChain* tree) +{ + fEvent = new AnalysisTree::EventHeader(); fVtxTracks = new AnalysisTree::TrackDetector(); fTofHits = new AnalysisTree::HitDetector(); fVtx2Tof = new AnalysisTree::Matching(); - fVtx2Mc = new AnalysisTree::Matching(); + fVtx2Mc = nullptr; if (tree->GetBranch("VtxTracks.") == nullptr) { Hal::Cout::PrintInfo("Lack of VtxTracks in AT", Hal::EInfo::kError); return kFALSE; @@ -51,7 +134,7 @@ Bool_t CbmAnaTreeRecoSourceContainer::ConnectToTree(TChain* tree) return kTRUE; } -Bool_t CbmAnaTreeMcSourceContainer::ConnectToTree(TChain* tree) +Bool_t CbmAnaTreeMcContainer::ConnectToTree(TChain* tree) { fEvent = new AnalysisTree::EventHeader(); fParticles = new AnalysisTree::Particles(); @@ -64,63 +147,120 @@ Bool_t CbmAnaTreeMcSourceContainer::ConnectToTree(TChain* tree) return kTRUE; } -void CbmAnaTreeRecoSourceContainer::LoadFields(TString file) +void CbmAnaTreeV0Container::LoadFields(std::vector<TString> list) { - TFile* oldFile = gFile; - TDirectory* oldDir = gDirectory; + Bool_t found; + AnalysisTree::BranchConfig conf = GetBranchConf(list, "Candidates", found); + if (!found) return; + GetFieldIds().chi2geo = conf.GetFieldId("chi2_geo"); + GetFieldIds().chi2_prim_first = conf.GetFieldId("chi2_prim_first"); + GetFieldIds().chi2_prim_second = conf.GetFieldId("chi2_prim_second"); + GetFieldIds().chi2_topo = conf.GetFieldId("chi2_topo"); + GetFieldIds().cosine_first = conf.GetFieldId("cosine_first"); + GetFieldIds().cosine_second = conf.GetFieldId("cosine_second"); - TFile* f = new TFile(file); - AnalysisTree::Configuration* conf = (AnalysisTree::Configuration*) f->Get("Configuration"); - GetFieldIds().vtx_px = conf->GetBranchConfig("VtxTracks").GetFieldId("px"); - GetFieldIds().vtx_py = conf->GetBranchConfig("VtxTracks").GetFieldId("py"); - GetFieldIds().vtx_pz = conf->GetBranchConfig("VtxTracks").GetFieldId("pz"); - GetFieldIds().vtx_dcax = conf->GetBranchConfig("VtxTracks").GetFieldId("dcax"); - GetFieldIds().vtx_dcay = conf->GetBranchConfig("VtxTracks").GetFieldId("dcay"); - GetFieldIds().vtx_dcaz = conf->GetBranchConfig("VtxTracks").GetFieldId("dcaz"); - GetFieldIds().vtx_chi2 = conf->GetBranchConfig("VtxTracks").GetFieldId("chi2"); - GetFieldIds().vtx_vtxchi2 = conf->GetBranchConfig("VtxTracks").GetFieldId("vtx_chi2"); - GetFieldIds().vtx_q = conf->GetBranchConfig("VtxTracks").GetFieldId("q"); - GetFieldIds().vtx_nhits = conf->GetBranchConfig("VtxTracks").GetFieldId("nhits"); - GetFieldIds().vtx_mvdhits = conf->GetBranchConfig("VtxTracks").GetFieldId("nhits_mvd"); + GetFieldIds().cosine_topo = conf.GetFieldId("cosine_topo"); + GetFieldIds().distance = conf.GetFieldId("distance"); + GetFieldIds().l = conf.GetFieldId("l"); + GetFieldIds().l_over_dl = conf.GetFieldId("l_over_dl"); + GetFieldIds().px = conf.GetFieldId("px"); + GetFieldIds().py = conf.GetFieldId("py"); + GetFieldIds().pz = conf.GetFieldId("pz"); + GetFieldIds().x = conf.GetFieldId("x"); + GetFieldIds().y = conf.GetFieldId("y"); + GetFieldIds().z = conf.GetFieldId("z"); + GetFieldIds().dau1id = conf.GetFieldId("daughter1_id"); + GetFieldIds().dau2id = conf.GetFieldId("daughter2_id"); + GetFieldIds().mass = conf.GetFieldId("mass"); - GetFieldIds().tof_mass2 = conf->GetBranchConfig("TofHits").GetFieldId("mass2"); +#ifdef DEBUG_EXTR + GetFieldIds().dau1px = conf.GetFieldId("dau1px"); + GetFieldIds().dau1py = conf.GetFieldId("dau1py"); + GetFieldIds().dau1pz = conf.GetFieldId("dau1pz"); + GetFieldIds().dau1x = conf.GetFieldId("dau1x"); + GetFieldIds().dau1y = conf.GetFieldId("dau1y"); + GetFieldIds().dau1z = conf.GetFieldId("dau1z"); - GetFieldIds().vtx_x = conf->GetBranchConfig("VtxTracks").GetFieldId("x"); - GetFieldIds().vtx_cx0 = conf->GetBranchConfig("VtxTracks").GetFieldId("cx0"); - GetFieldIds().vtx_cov1 = conf->GetBranchConfig("VtxTracks").GetFieldId("cov1"); - gFile = oldFile; - gDirectory = oldDir; + GetFieldIds().dau2px = conf.GetFieldId("dau2px"); + GetFieldIds().dau2py = conf.GetFieldId("dau2py"); + GetFieldIds().dau2pz = conf.GetFieldId("dau2pz"); + GetFieldIds().dau2x = conf.GetFieldId("dau2x"); + GetFieldIds().dau2y = conf.GetFieldId("dau2y"); + GetFieldIds().dau2z = conf.GetFieldId("dau2z"); - f->Close(); - delete f; +#endif + + + GetFieldIds().id = conf.GetFieldId("id"); + GetFieldIds().pdg = conf.GetFieldId("pid"); + // if (!found) return; + // GetFieldIds().mass = conf.GetFieldId("dcaz"); } -void CbmAnaTreeMcSourceContainer::LoadFields(TString inFile) +Bool_t CbmAnaTreeV0Container::ConnectToTree(TChain* tree) { - TFile* oldFile = gFile; - TDirectory* oldDir = gDirectory; + fParticles = new AnalysisTree::Particles(); + fParticlesMc = new AnalysisTree::Particles(); + + auto vec = Hal::RootIOManager::GetListOfBranches(tree, true); + bool found = false; + for (auto brName : vec) { + brName.EqualTo("Candidates."); + found = true; + } + if (!found) return kFALSE; + tree->SetBranchAddress("Candidates.", &fParticles); + tree->SetBranchAddress("Simulated.", &fParticlesMc); + tree->SetBranchAddress("Candidates2Simulated.", &fV02Mc); + + tree->SetBranchStatus("Candidates.", 1); + tree->SetBranchStatus("Simulated.", 1); + tree->SetBranchStatus("Candidates2Simulated.", 1); + return kTRUE; +} + +void CbmAnaTreeContainers::LoadConf(Hal::InputDataInfo* info) +{ + auto listRow = info->GetListOfFiles(); + std::vector<TString> rec1; + for (auto lev : listRow) { + rec1.push_back(lev[0]); + } + for (int i = 0; i < GetSize(); i++) { + fContainers[i]->LoadFields(rec1); + } +} + +CbmAnaTreeContainers::CbmAnaTreeContainers() +{ + fContainers[0] = new CbmAnaTreeMcContainer(); + fContainers[1] = new CbmAnaTreeRecoContainer(); + fContainers[2] = new CbmAnaTreeV0Container(); +} - TFile* f = new TFile(inFile); - - AnalysisTree::Configuration* conf = (AnalysisTree::Configuration*) f->Get("Configuration"); - - GetFieldIds().px = conf->GetBranchConfig("SimParticles").GetFieldId("px"); - GetFieldIds().py = conf->GetBranchConfig("SimParticles").GetFieldId("py"); - GetFieldIds().pz = conf->GetBranchConfig("SimParticles").GetFieldId("pz"); - GetFieldIds().mass = conf->GetBranchConfig("SimParticles").GetFieldId("mass"); - GetFieldIds().pdg = conf->GetBranchConfig("SimParticles").GetFieldId("pid"); - GetFieldIds().motherId = conf->GetBranchConfig("SimParticles").GetFieldId("mother_id"); - GetFieldIds().event_b = conf->GetBranchConfig("SimEventHeader").GetFieldId("b"); - GetFieldIds().event_psi = conf->GetBranchConfig("SimEventHeader").GetFieldId("psi_RP"); - GetFieldIds().freezX = conf->GetBranchConfig("SimParticles").GetFieldId("xfreez"); - GetFieldIds().freezY = conf->GetBranchConfig("SimParticles").GetFieldId("yfreez"); - GetFieldIds().freezZ = conf->GetBranchConfig("SimParticles").GetFieldId("zfreez"); - GetFieldIds().freezT = conf->GetBranchConfig("SimParticles").GetFieldId("tfreez"); - gFile = oldFile; - gDirectory = oldDir; - - f->Close(); - delete f; +CbmAnaTreeContainer* CbmAnaTreeContainers::GetContainer(EContainerType type) +{ + switch (type) { + case EContainerType::kMc: { + return fContainers[0]; + } break; + case EContainerType::kReco: { + return fContainers[1]; + } break; + case EContainerType::kV0: { + return fContainers[2]; + } break; + } + return nullptr; +} + +std::vector<TString> CbmAnaTreeContainers::GetNames() +{ + std::vector<TString> res; + res.push_back("mc"); + res.push_back("reco"); + res.push_back("v0"); + return res; } diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/CbmAnaTreeContainer.h b/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/CbmAnaTreeContainer.h index 4c6d77cc108bd32928f7d28abadf9a4894cc49b3..849e1f32d9a0b84c4fff1cc860ebd8686f32fcd8 100644 --- a/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/CbmAnaTreeContainer.h +++ b/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/CbmAnaTreeContainer.h @@ -4,6 +4,7 @@ #ifndef NICACBMATCONTAINER_H_ #define NICACBMATCONTAINER_H_ + #include <TNamed.h> #include <AnalysisTree/Detector.hpp> @@ -11,7 +12,19 @@ #include <AnalysisTree/Matching.hpp> class TChain; +class TFile; +//#define DEBUG_EXTR + +namespace AnalysisTree +{ + class Configuration; +} +namespace Hal +{ + class InputDataInfo; +} +class HalCbmATIOManager; struct AnaTreeRecoIds { Int_t vtx_px, vtx_py, vtx_pz; Int_t vtx_dcax, vtx_dcay, vtx_dcaz; @@ -21,7 +34,19 @@ struct AnaTreeRecoIds { Int_t tof_mass2; }; -class CbmAnaTreeRecoSourceContainer : public TNamed { +class CbmAnaTreeContainer : public TNamed { + + public: + CbmAnaTreeContainer() : TNamed(){}; + virtual void LoadFields(std::vector<TString> list) = 0; + virtual Bool_t ConnectToTree(TChain* chains) = 0; + AnalysisTree::BranchConfig GetBranchConf(std::vector<TString> files, TString patternToFind, Bool_t& found) const; + virtual ~CbmAnaTreeContainer(){}; + ClassDef(CbmAnaTreeContainer, 1) +}; + + +class CbmAnaTreeRecoContainer : public CbmAnaTreeContainer { AnalysisTree::EventHeader* fEvent = {nullptr}; AnalysisTree::TrackDetector* fVtxTracks = {nullptr}; AnalysisTree::Matching* fVtx2Tof = {nullptr}; @@ -30,16 +55,16 @@ class CbmAnaTreeRecoSourceContainer : public TNamed { AnaTreeRecoIds fVtxIds; public: - CbmAnaTreeRecoSourceContainer(){}; - void LoadFields(TString file); - Bool_t ConnectToTree(TChain* tree); + CbmAnaTreeRecoContainer(){}; + void LoadFields(std::vector<TString> list); + Bool_t ConnectToTree(TChain* chains); inline AnalysisTree::EventHeader* GetEventHeader() const { return fEvent; }; inline AnalysisTree::TrackDetector* GetVtxTracks() const { return fVtxTracks; }; inline AnalysisTree::HitDetector* GetTofHits() const { return fTofHits; }; inline AnalysisTree::Matching* GetVtx2ToFMatch() const { return fVtx2Tof; }; inline AnalysisTree::Matching* GetVtx2Sim() const { return fVtx2Mc; }; inline AnaTreeRecoIds& GetFieldIds() { return fVtxIds; } - virtual ~CbmAnaTreeRecoSourceContainer() + virtual ~CbmAnaTreeRecoContainer() { if (fEvent) { delete fEvent; @@ -49,7 +74,7 @@ class CbmAnaTreeRecoSourceContainer : public TNamed { delete fVtx2Mc; } } - ClassDef(CbmAnaTreeRecoSourceContainer, 1) + ClassDef(CbmAnaTreeRecoContainer, 1) }; struct AnaTreeMcIds { @@ -60,26 +85,88 @@ struct AnaTreeMcIds { Int_t freezX, freezY, freezZ, freezT; }; -class CbmAnaTreeMcSourceContainer : public TNamed { +class CbmAnaTreeMcContainer : public CbmAnaTreeContainer { AnalysisTree::EventHeader* fEvent = {nullptr}; AnalysisTree::Particles* fParticles = {nullptr}; AnaTreeMcIds fIds; public: - CbmAnaTreeMcSourceContainer(){}; - void LoadFields(TString inFile); - Bool_t ConnectToTree(TChain* tree); + CbmAnaTreeMcContainer(){}; + void LoadFields(std::vector<TString> list); + Bool_t ConnectToTree(TChain* chains); inline AnaTreeMcIds& GetFieldIds() { return fIds; }; inline AnalysisTree::EventHeader* GetEventHeader() const { return fEvent; }; inline AnalysisTree::Particles* GetParticles() const { return fParticles; }; - virtual ~CbmAnaTreeMcSourceContainer() + virtual ~CbmAnaTreeMcContainer() { if (fEvent) { delete fEvent; delete fParticles; } }; - ClassDef(CbmAnaTreeMcSourceContainer, 1) + ClassDef(CbmAnaTreeMcContainer, 1) +}; + +struct AnaTreeV0Ids { + Int_t chi2geo, chi2_prim_first; + Int_t chi2_prim_second, chi2_topo; + Int_t cosine_first, cosine_second, cosine_topo; + Int_t distance, l, l_over_dl; + Int_t px, py, pz; + Int_t x, y, z; + Int_t dau1id, dau2id, id; + Int_t pdg, mass; +#ifdef DEBUG_EXTR + int dau1px, dau1py, dau1pz, dau1x, dau1y, dau1z; + int dau2px, dau2py, dau2pz, dau2x, dau2y, dau2z; +#endif +}; + +class CbmAnaTreeV0Container : public CbmAnaTreeContainer { + AnalysisTree::Particles* fParticles = {nullptr}; + AnalysisTree::Particles* fParticlesMc = {nullptr}; + AnalysisTree::Matching* fV02Mc = {nullptr}; + AnaTreeV0Ids fIds; + + public: + CbmAnaTreeV0Container(){}; + void LoadFields(std::vector<TString> list); + Bool_t ConnectToTree(TChain* chains); + inline AnaTreeV0Ids& GetFieldIds() { return fIds; }; + inline AnalysisTree::Particles* GetParticles() const { return fParticles; }; + AnalysisTree::Matching* GetMaching() const { return fV02Mc; }; + virtual ~CbmAnaTreeV0Container() + { + if (fParticles) delete fParticles; + if (fParticlesMc) delete fParticlesMc; + if (fV02Mc) delete fV02Mc; + }; + ClassDef(CbmAnaTreeV0Container, 1) }; + +class CbmAnaTreeContainers : public TObject { + + + public: + enum class EContainerType + { + kMc = 0, + kReco = 1, + kV0 = 2 + }; + CbmAnaTreeContainer* fContainers[3] = {nullptr, nullptr, nullptr}; + CbmAnaTreeContainers(); + void LoadConf(Hal::InputDataInfo* info); + static std::vector<TString> GetNames(); + CbmAnaTreeContainer* GetContainer(EContainerType type); + CbmAnaTreeV0Container* GetV0Data() const { return (CbmAnaTreeV0Container*) fContainers[2]; } + CbmAnaTreeRecoContainer* GetRecoData() const { return (CbmAnaTreeRecoContainer*) fContainers[2]; } + CbmAnaTreeMcContainer* GetSimData() const { return (CbmAnaTreeMcContainer*) fContainers[2]; } + Int_t GetSize() const { return 3; } + virtual ~CbmAnaTreeContainers(){}; + ClassDef(CbmAnaTreeContainers, 1) +}; + + #endif /* NICACBMATCONTAINER_H_ */ diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/CbmAnaTreeSource.cxx b/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/CbmAnaTreeSource.cxx index 2122087bbd73f340ad72d64e70c0e2d9fd17d6aa..d78fcda8ff347212c0ebaecead5fe0aca8850c77 100644 --- a/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/CbmAnaTreeSource.cxx +++ b/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/CbmAnaTreeSource.cxx @@ -4,6 +4,7 @@ #include "CbmAnaTreeSource.h" #include "CbmAnaTreeContainer.h" +#include "HalCbmDetectorID.h" #include <FairLogger.h> #include <FairRootManager.h> @@ -14,6 +15,9 @@ #include <AnalysisTree/Configuration.hpp> #include <fstream> +#include <vector> + +#include <Hal/InputDataInfo.h> CbmAnaTreeSource::CbmAnaTreeSource() : CbmAnaTreeSource("", "aTree") {} @@ -23,8 +27,7 @@ CbmAnaTreeSource::CbmAnaTreeSource(TString inFile, TString treeName) , fTreeName(treeName) , fChain(nullptr) , fFileName(nullptr) - , fContainerReco(nullptr) - , fContainerSim(nullptr) + , fATSource(nullptr) { fFileName = new TString[1]; fFileName[0] = inFile; @@ -40,13 +43,14 @@ Bool_t CbmAnaTreeSource::Init() LOG(debug) << "Init source "; FairRootManager* mngr = FairRootManager::Instance(); fChain = new TChain(fTreeName); //new name of tree? - TString first_file_name; + + Hal::InputDataInfo info; if (fFileName[0].EndsWith(".root")) { for (int i = 0; i < fNFiles; i++) { LOG(debug) << "CbmAnaTree: opening single file" << fFileName[i]; fChain->Add(fFileName[i]); + info.AddFile(fFileName[i]); } - first_file_name = fFileName[0]; } else { // this is long list std::ifstream list; @@ -57,9 +61,9 @@ Bool_t CbmAnaTreeSource::Init() list >> temp; if (temp.Length() > 1) { fChain->Add(temp); + info.AddFile(temp); if (first) { - first_file_name = temp; - first = false; + first = false; } } else { @@ -69,29 +73,22 @@ Bool_t CbmAnaTreeSource::Init() } while (!list.eof()); list.close(); } + + + info.AddFile(mngr->GetInFile()->GetName()); + fATSource = new CbmAnaTreeContainers(); LOG(debug) << "load container "; - fContainerReco = new CbmAnaTreeRecoSourceContainer(); - fContainerSim = new CbmAnaTreeMcSourceContainer(); - Bool_t recoAvail = fContainerReco->ConnectToTree(fChain); - Bool_t simAvail = fContainerSim->ConnectToTree(fChain); - if (recoAvail == kFALSE) { - delete fContainerReco; - fContainerReco = nullptr; - } - if (simAvail == kFALSE) { - delete fContainerSim; - fContainerSim = nullptr; - } - LOG(debug) << "load conf "; - LoadConf(first_file_name); + fATSource->LoadConf(&info); + mngr->SetInChain(fChain, -1); - if (fContainerReco) { - LOG(debug) << "Loading reco data"; - mngr->Register("CbmAnaTreeSourceContainer.", "CbmAnaTreeSourceContainer", fContainerReco, kFALSE); - } - if (fContainerSim) { - LOG(debug) << "Loading sim ana"; - mngr->Register("CbmAnaTreeMcSourceContainer.", "CbmAnaTreeMcSourceContainer", fContainerSim, kFALSE); + + auto contNames = CbmAnaTreeContainers::GetNames(); + for (int i = 0; i < fATSource->GetSize(); i++) { + bool con = fATSource->fContainers[i]->ConnectToTree(fChain); + if (con) { + TString name = HalCbm::GetContainerName(contNames[i]); + mngr->Register(name, "AT", fATSource->fContainers[i], kFALSE); + } } return kTRUE; } @@ -104,24 +101,6 @@ Int_t CbmAnaTreeSource::ReadEvent(UInt_t unsignedInt) void CbmAnaTreeSource::Close() {} -void CbmAnaTreeSource::LoadConf(TString name) -{ - /// Save old global file and folder pointer to avoid messing with FairRoot - TFile* oldFile = gFile; - TDirectory* oldDir = gDirectory; - - if (fContainerReco) { - fContainerReco->LoadFields(name); - } - if (fContainerSim) { - fContainerSim->LoadFields(name); - } - - /// Restore old global file and folder pointer to avoid messing with FairRoot - gFile = oldFile; - gDirectory = oldDir; -} - void CbmAnaTreeSource::AddFile(TString file) { TString* temp = fFileName; diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/CbmAnaTreeSource.h b/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/CbmAnaTreeSource.h index 2460c4674a161a43c54dd0dd494d7f06c0c3b6e5..7c3dc14cccb2019d71e0eba1fadb080c27658d57 100644 --- a/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/CbmAnaTreeSource.h +++ b/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/CbmAnaTreeSource.h @@ -12,8 +12,7 @@ #include <TString.h> -class CbmAnaTreeMcSourceContainer; -class CbmAnaTreeRecoSourceContainer; +class CbmAnaTreeContainers; class TChain; class CbmAnaTreeSource : public FairSource { @@ -21,11 +20,7 @@ class CbmAnaTreeSource : public FairSource { TString fTreeName; TChain* fChain; TString* fFileName; //[fNFiles] - CbmAnaTreeRecoSourceContainer* fContainerReco; - CbmAnaTreeMcSourceContainer* fContainerSim; - - protected: - void LoadConf(TString name); + CbmAnaTreeContainers* fATSource; public: /** @@ -60,8 +55,6 @@ class CbmAnaTreeSource : public FairSource { virtual void ReadBranchEvent(const char* /*BrName*/){}; virtual void ReadBranchEvent(const char* /*BrName*/, Int_t /*Event*/){}; virtual void FillEventHeader(FairEventHeader* /*feh*/){}; - CbmAnaTreeRecoSourceContainer* GetRecoContainer() const { return fContainerReco; }; - CbmAnaTreeMcSourceContainer* GetSimContainer() const { return fContainerSim; } void SetRunId(Int_t runId) { fRunId = runId; } ClassDef(CbmAnaTreeSource, 1) }; diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/HalCbmSource.cxx b/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/HalCbmSource.cxx deleted file mode 100644 index dd8dae3baf3f6c7ef3c9ebe0fd3a7c413d83ad0b..0000000000000000000000000000000000000000 --- a/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/HalCbmSource.cxx +++ /dev/null @@ -1,59 +0,0 @@ -/* Copyright (C) 2023-2023 Warsaw University of Technology, Warsaw - SPDX-License-Identifier: GPL-3.0-only - Authors: Daniel Wielanek [committer] */ -#include "HalCbmSource.h" - -#include "CbmAnaTreeContainer.h" - -#include <TBranch.h> -#include <TNamed.h> -#include <TObjArray.h> - -#include <Hal/RootIOManager.h> - -HalCbmSource::HalCbmSource(TString filename) : Source(filename) { fManager = new HalCbmATIOManager(filename); } - -void HalCbmSource::AddFile(TString fileName) { fManager->AddFile(fileName); } - -void HalCbmSource::AddFriend(TString friendName, Int_t level) { fManager->AddFriend(friendName, level); } - -HalCbmSource::~HalCbmSource() { delete fManager; } - -void HalCbmATIOManager::FillBranches() -{ - auto inchain = GetInChain(); - fRecoContainer = new CbmAnaTreeRecoSourceContainer(); - fSimContainer = new CbmAnaTreeMcSourceContainer(); - Bool_t recoAvail = fRecoContainer->ConnectToTree(inchain[0]); - Bool_t simAvail = fSimContainer->ConnectToTree(inchain[0]); - fRecoContainer->LoadFields(GetInputFileName()); - fSimContainer->LoadFields(GetInputFileName()); - int count = -1; - for (auto chain : inchain) { - count++; - if (count == 0) { - if (recoAvail) { - AddBranch("CbmAnaTreeSourceContainer.", fRecoContainer, Hal::BranchInfo::EFlag::kInActive); - } - if (simAvail) { - AddBranch("CbmAnaTreeMcSourceContainer.", fSimContainer, Hal::BranchInfo::EFlag::kInActive); - } - continue; //skip first chain - we are looking for AT data - } - TObjArray* list_branch = chain->GetListOfBranches(); - for (int i = 0; i < list_branch->GetEntries(); i++) { - TBranch* branch = (TBranch*) list_branch->At(i); - TString name = branch->GetName(); - TObject** obj = new TObject*(); - PushTObject(obj); - chain->SetBranchAddress(name, obj); - AddBranch(branch->GetName(), obj[0], Hal::BranchInfo::EFlag::kInActive); - } - } -} - -HalCbmATIOManager::~HalCbmATIOManager() -{ - if (fRecoContainer) delete fRecoContainer; - if (fSimContainer) delete fSimContainer; -} diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/fair/Field.cxx b/analysis/PWGC2F/femtoscopy/hal/helpers/fair/Field.cxx new file mode 100644 index 0000000000000000000000000000000000000000..eb8c8511034e84bebca5dc3ec4b201b27f8fb5db --- /dev/null +++ b/analysis/PWGC2F/femtoscopy/hal/helpers/fair/Field.cxx @@ -0,0 +1,21 @@ +/* Copyright (C) 2025-2025 Warsaw University of Technology, Warsaw + SPDX-License-Identifier: GPL-3.0-only + Authors: Daniel Wielanek [committer] */ +#include "Field.h" + +#include <FairField.h> + +namespace Hal +{ + namespace Fair + { + + Field::Field() : fField(nullptr) {} + + TVector3 Field::GetField(Double_t x, Double_t y, Double_t z) const + { + return TVector3(fField->GetBx(x, y, z), fField->GetBy(x, y, z), fField->GetBz(x, y, z)); + } + Field::~Field() { fField = nullptr; } + } // namespace Fair +} /* namespace Hal */ diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/fair/Field.h b/analysis/PWGC2F/femtoscopy/hal/helpers/fair/Field.h new file mode 100644 index 0000000000000000000000000000000000000000..39fc5d712e42bafd2912e2a6d62ddf81cf538beb --- /dev/null +++ b/analysis/PWGC2F/femtoscopy/hal/helpers/fair/Field.h @@ -0,0 +1,33 @@ +/* Copyright (C) 2025-2025 Warsaw University of Technology, Warsaw + SPDX-License-Identifier: GPL-3.0-only + Authors: Daniel Wielanek [committer] */ +#ifndef HAL_FAIR_FIELD_H_ +#define HAL_FAIR_FIELD_H_ + +#include <TVector3.h> + +#include <Hal/MagField.h> + +/** + * interface to Fair magnetic field + */ +class FairField; +namespace Hal +{ + namespace Fair + { + class Field : public ::Hal::MagField { + FairField* fField; + + public: + Field(); + void SetField(FairField* field) { fField = field; }; + FairField* GetFairField() const { return fField; } + TVector3 GetField(Double_t x, Double_t y, Double_t z) const; + virtual ~Field(); + ClassDef(Field, 1) + }; + } // namespace Fair +} /* namespace Hal */ + +#endif /* HAL_FAIR_FIELD_H_ */ diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/fair/QAManagerBasic.cxx b/analysis/PWGC2F/femtoscopy/hal/helpers/fair/QAManagerBasic.cxx new file mode 100644 index 0000000000000000000000000000000000000000..f8ffaaeccc443385f6a434ccc354af7013560e23 --- /dev/null +++ b/analysis/PWGC2F/femtoscopy/hal/helpers/fair/QAManagerBasic.cxx @@ -0,0 +1,42 @@ +/* Copyright (C) 2025-2025 Warsaw University of Technology, Warsaw + SPDX-License-Identifier: GPL-3.0-only + Authors: Daniel Wielanek [committer] */ +#include "QAManagerBasic.h" + +#include <FairFileSource.h> +#include <FairParRootFileIo.h> +#include <FairRun.h> +#include <FairRunAna.h> +#include <FairRuntimeDb.h> + +namespace Hal +{ + namespace Fair + { + QAManagerBasic::QAManagerBasic() {} + + QAManagerBasic::~QAManagerBasic() {} + + FairRunAna* QAManagerBasic::GetRunAna(TString outFile, TString simFile, TString recoFile, TString parFile) + { + if (simFile.Length() == 0) { + simFile = recoFile; + recoFile = ""; + } + FairRunAna* run = new FairRunAna(); + FairFileSource* file = new FairFileSource(simFile); + if (recoFile != "") { + file->AddFriend(recoFile); + } + if (parFile != "") { + FairRuntimeDb* rtdb = run->GetRuntimeDb(); + FairParRootFileIo* parIo1 = new FairParRootFileIo(); + parIo1->open(parFile.Data()); + rtdb->setFirstInput(parIo1); + } + run->SetSource(file); + run->SetOutputFile(outFile); + return run; + } + } // namespace Fair +} /* namespace Hal */ diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/fair/QAManagerBasic.h b/analysis/PWGC2F/femtoscopy/hal/helpers/fair/QAManagerBasic.h new file mode 100644 index 0000000000000000000000000000000000000000..47155a0d76818754123ce051ebe71cc4d546b2ca --- /dev/null +++ b/analysis/PWGC2F/femtoscopy/hal/helpers/fair/QAManagerBasic.h @@ -0,0 +1,29 @@ +/* Copyright (C) 2025-2025 Warsaw University of Technology, Warsaw + SPDX-License-Identifier: GPL-3.0-only + Authors: Daniel Wielanek [committer] */ +#ifndef HAL_FAIR_QAMANAGERBASIC_H_ +#define HAL_FAIR_QAMANAGERBASIC_H_ + +#include <TString.h> + +#include <Hal/QAManager.h> + +/** + * abstract class for QA in FairRoot-based frameworks + */ +class FairRunAna; +namespace Hal +{ + namespace Fair + { + class QAManagerBasic : public ::Hal::QAManager { + public: + QAManagerBasic(); + virtual FairRunAna* GetRunAna(TString outFile, TString simFile, TString recoFile = "", TString parFile = ""); + virtual ~QAManagerBasic(); + ClassDef(QAManagerBasic, 1) + }; + } // namespace Fair +} /* namespace Hal */ + +#endif /* HAL_FAIR_QAMANAGERBASIC_H_ */ diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/fair/RootManager.cxx b/analysis/PWGC2F/femtoscopy/hal/helpers/fair/RootManager.cxx new file mode 100644 index 0000000000000000000000000000000000000000..5c9f9271ab828ca3d00a5d58c2bb9726ec5eac9a --- /dev/null +++ b/analysis/PWGC2F/femtoscopy/hal/helpers/fair/RootManager.cxx @@ -0,0 +1,88 @@ +/* Copyright (C) 2025-2025 Warsaw University of Technology, Warsaw + SPDX-License-Identifier: GPL-3.0-only + Authors: Daniel Wielanek [committer] */ +#include "RootManager.h" + +#include <FairRootManager.h> + +#include <RtypesCore.h> +#include <TCollection.h> +#include <TFile.h> +#include <TList.h> +#include <TObjString.h> + +#include <Hal/InputDataInfo.h> + +namespace Hal +{ + namespace Fair + { + RootManager::RootManager() + : Hal::IOManager(new Hal::InputDataInfo(FairRootManager::Instance()->GetInFile()->GetName())) + { + fFairManager = FairRootManager::Instance(); + if (fFairManager->GetInFile()) { + fDataInfo->OverwriteSourceName(fFairManager->GetInFile()->GetName()); + } + } + + TObject* RootManager::GetObject(const char* BrName) { return fFairManager->GetObject(BrName); } + + TFile* RootManager::GetInFile() { return fFairManager->GetInFile(); } + + void RootManager::UpdateBranches() { fFairManager->UpdateBranches(); } + + void RootManager::SetInChain(TChain* tempChain, Int_t ident) { fFairManager->SetInChain(tempChain, ident); } + + void RootManager::RegisterInternal(const char* name, const char* folderName, TNamed* obj, Bool_t toFile) + { + fFairManager->Register(name, folderName, obj, toFile); + } + + void RootManager::RegisterInternal(const char* name, const char* Foldername, TCollection* obj, Bool_t toFile) + { + fFairManager->Register(name, Foldername, obj, toFile); + } + + void RootManager::RefreshBranchList() + { + fFairManager = FairRootManager::Instance(); + TList* l = fFairManager->GetBranchNameList(); + for (int i = 0; i < l->GetEntries(); i++) { + TString name = ((TObjString*) l->At(i))->GetString(); + Int_t stat = fFairManager->CheckBranch(name); + TObject* obj = fFairManager->GetObject(name); + switch (stat) { + case 0: // not exist + break; + case 1: // in file + AddBranch(name, obj, BranchInfo::EFlag::kInActive); + break; + case 2: // memory + AddBranch(name, obj, BranchInfo::EFlag::kVirtual); + break; + } + } + } + + Bool_t RootManager::InitInternal() + { + if (fFairManager == nullptr) { + fFairManager = FairRootManager::Instance(); + if (fFairManager->GetInFile()) { + fDataInfo->OverwriteSourceName(fFairManager->GetInFile()->GetName()); + } + } + RefreshBranchList(); + return kTRUE; + } + + void RootManager::CdToOutput() + { + if (!fFairManager) return; + auto file = fFairManager->GetOutFile(); + if (file) file->cd(); + } + + } // namespace Fair +} // namespace Hal diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/fair/RootManager.h b/analysis/PWGC2F/femtoscopy/hal/helpers/fair/RootManager.h new file mode 100644 index 0000000000000000000000000000000000000000..836d4d3ba7cd8add6c245e271341d0858adf6425 --- /dev/null +++ b/analysis/PWGC2F/femtoscopy/hal/helpers/fair/RootManager.h @@ -0,0 +1,48 @@ +/* Copyright (C) 2025-2025 Warsaw University of Technology, Warsaw + SPDX-License-Identifier: GPL-3.0-only + Authors: Daniel Wielanek [committer] */ +#ifndef HAL_FAIR_ROOTMANAGER_H_ +#define HAL_FAIR_ROOTMANAGER_H_ + +#include <Hal/DataManager.h> +#include <Hal/IOManager.h> + + +/** + * IO manager for FairRoot + */ +class TObject; +class TFile; +class TChain; +class TList; +class FairRootManager; +namespace Hal +{ + namespace Fair + { + class RootManager : public IOManager { + FairRootManager* fFairManager; + + protected: + virtual void RegisterInternal(const char* name, const char* folderName, TNamed* obj, Bool_t toFile); + virtual void RegisterInternal(const char* name, const char* Foldername, TCollection* obj, Bool_t toFile); + virtual void RefreshBranchList(); + virtual Bool_t InitInternal(); + + public: + RootManager(); + TObject* GetObject(const char* BrName); + TFile* GetInFile(); + void UpdateBranches(); + void FillTree(){}; + void SetInChain(TChain* tempChain, Int_t ident = -1); + Int_t CheckBranch(const char* BrName); + Int_t GetEntries() const { return -1; } + Int_t GetEntry(Int_t /*i*/, Int_t /*flag*/) { return -1; }; + void CdToOutput(); + virtual ~RootManager(){}; + ClassDef(RootManager, 1) + }; + } // namespace Fair +} // namespace Hal +#endif /* HAL_FAIR_ROOTMANAGER_H_ */ diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/fair/TaskManager.cxx b/analysis/PWGC2F/femtoscopy/hal/helpers/fair/TaskManager.cxx new file mode 100644 index 0000000000000000000000000000000000000000..e451ddc1e4c8e3d36c1297e18686fa898a7f6ed8 --- /dev/null +++ b/analysis/PWGC2F/femtoscopy/hal/helpers/fair/TaskManager.cxx @@ -0,0 +1,128 @@ +/* Copyright (C) 2025-2025 Warsaw University of Technology, Warsaw + SPDX-License-Identifier: GPL-3.0-only + Authors: Daniel Wielanek [committer] */ +#include "TaskManager.h" + +#include "RootManager.h" + +#include <RtypesCore.h> +#include <TFile.h> + +#include <cstdlib> + +#include <Hal/DataManager.h> +#include <Hal/IOManager.h> +#include <Hal/Package.h> +#include <Hal/Parameter.h> +#include <Hal/Source.h> +#include <Hal/Std.h> +#include <Hal/Task.h> +#include <Hal/TriggerTask.h> +namespace Hal +{ + namespace Fair + { + TaskManager::TaskManager() : fManager(nullptr), fProcessedEvents(0) { fManager = new RootManager(); } + + InitStatus TaskManager::Init() + { + fManager->Init(); + DataManager* mng = DataManager::Instance(); + mng->SetManager(fManager); + for (auto task : fTriggers) { + Task::EInitFlag stat = task->Init(); + switch (stat) { + case Task::EInitFlag::kERROR: { + fPassiveTriggers.push_back(task); + } break; + case Task::EInitFlag::kSUCCESS: { + fActiveTriggers.push_back(task); + } break; + case Task::EInitFlag::kFATAL: { + exit(0); + return kFATAL; + } break; + } + } + for (auto task : fTasks) { + Task::EInitFlag stat = task->Init(); + switch (stat) { + case Task::EInitFlag::kERROR: { + fPassiveTasks.push_back(task); + } break; + case Task::EInitFlag::kSUCCESS: { + fActiveTasks.push_back(task); + } break; + case Task::EInitFlag::kFATAL: { + exit(0); + return kFATAL; + } break; + } + } + return kSUCCESS; + } + + void TaskManager::Exec(Option_t* option) + { + ++fProcessedEvents; + for (auto trigger : fActiveTriggers) { + trigger->Exec(option); + if (!trigger->IsEventGood()) { + return; + } + } + for (auto task : fActiveTasks) { + task->Exec(option); + } + } + + void TaskManager::Finish() + { + auto GoToDir = [](TString name) { + TDirectory* dir = (TDirectory*) gFile; + std::vector<TString> array = Hal::Std::ExplodeString(name, '/'); + for (int i = 0; i < (int) array.size(); i++) { + TDirectory* newdir = (TDirectory*) dir->FindObject(array[i]); + if (!newdir) { + dir->mkdir(array[i]); + } + dir->cd(array[i]); + } + }; + Package* metadata_new = new Package(); + metadata_new->SetName("RunInfo"); + metadata_new->AddObject(new ParameterString("Software ver", HAL_PHYSICALANALYSYS_VER)); + metadata_new->AddObject(new ParameterString("Date", Hal::Std::GetDate(), 'f')); + metadata_new->AddObject(new ParameterString("Time", Hal::Std::GetTime(), 'f')); + metadata_new->AddObject(new ParameterUInt("Processed_events", fProcessedEvents, '+')); + metadata_new->AddObject(new ParameterString("Input file", DataManager::Instance()->GetSourceName(), 'f')); + TList* list = new TList(); + list->SetName("Tasks"); + for (auto task : fTasks) { + TString name = task->ClassName(); + TString label = "Active"; + for (auto probeTask : fPassiveTasks) { + if (probeTask == task) label = "Passive"; + } + list->AddLast(new ParameterString(name, label)); + } + metadata_new->AddObject(list); + + GoToDir("HalInfo"); + TDirectory* dir = (TDirectory*) gFile; + TDirectory* metadatata = (TDirectory*) dir->Get("HalInfo"); + if (metadatata->Get("RunInfo")) { + delete metadata_new; + } + else { + metadata_new->Write("RunInfo"); + } + gFile->cd(); + for (auto task : fTasks) { + task->FinishTask(); + } + } + + TaskManager::~TaskManager() {} + } // namespace Fair +} /* namespace Hal */ diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/fair/TaskManager.h b/analysis/PWGC2F/femtoscopy/hal/helpers/fair/TaskManager.h new file mode 100644 index 0000000000000000000000000000000000000000..84243909019e20d64e54d6ff5f6ddebceb42693b --- /dev/null +++ b/analysis/PWGC2F/femtoscopy/hal/helpers/fair/TaskManager.h @@ -0,0 +1,56 @@ +/* Copyright (C) 2025-2025 Warsaw University of Technology, Warsaw + SPDX-License-Identifier: GPL-3.0-only + Authors: Daniel Wielanek [committer] */ +#ifndef HAL_FAIR_HALFAIRANALYSISMANAGER_H_ +#define HAL_FAIR_HALFAIRANALYSISMANAGER_H_ + +#include <FairTask.h> + +#include <RtypesCore.h> +#include <TString.h> + +#include <vector> + +#include <Hal/Task.h> + +/** + * wrapper of task for FairRoot + * You should add all task for analysis here, and later add this task as to the FairRunAna + */ +namespace Hal +{ + class IOManager; + class Source; + class TriggerTask; +} /* namespace Hal */ + +namespace Hal +{ + namespace Fair + { + class TaskManager : public FairTask { + protected: + IOManager* fManager; + std::vector<::Hal::TriggerTask*> fTriggers; + std::vector<::Hal::TriggerTask*> fActiveTriggers; + std::vector<::Hal::TriggerTask*> fPassiveTriggers; + std::vector<::Hal::Task*> fTasks; + std::vector<::Hal::Task*> fActiveTasks; + std::vector<::Hal::Task*> fPassiveTasks; + UInt_t fProcessedEvents; + + virtual InitStatus Init(); + + public: + TaskManager(); + virtual void AddTrigger(::Hal::TriggerTask* trigger) { fTriggers.push_back(trigger); } + virtual void AddTask(::Hal::Task* task) { fTasks.push_back(task); }; + virtual void Exec(Option_t* option); + virtual void Finish(); + virtual ~TaskManager(); + ClassDef(TaskManager, 1) + }; + } // namespace Fair +} /* namespace Hal */ + +#endif /* HAL_FAIR_HALFAIRANALYSISMANAGER_H_ */ diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmCompressionTask.cxx b/analysis/PWGC2F/femtoscopy/hal/helpers/faircbm/HalCbmCompressionTask.cxx similarity index 100% rename from analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmCompressionTask.cxx rename to analysis/PWGC2F/femtoscopy/hal/helpers/faircbm/HalCbmCompressionTask.cxx diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmCompressionTask.h b/analysis/PWGC2F/femtoscopy/hal/helpers/faircbm/HalCbmCompressionTask.h similarity index 100% rename from analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmCompressionTask.h rename to analysis/PWGC2F/femtoscopy/hal/helpers/faircbm/HalCbmCompressionTask.h diff --git a/analysis/PWGC2F/femtoscopy/hal/qa/CbmQACoreManager.cxx b/analysis/PWGC2F/femtoscopy/hal/helpers/faircbm/HalCbmQACoreManager.cxx similarity index 87% rename from analysis/PWGC2F/femtoscopy/hal/qa/CbmQACoreManager.cxx rename to analysis/PWGC2F/femtoscopy/hal/helpers/faircbm/HalCbmQACoreManager.cxx index 07465fa5edf80419680d0cce350546400c283c94..982ece5ad4fa6068aa5f00c0690981fc44736257 100644 --- a/analysis/PWGC2F/femtoscopy/hal/qa/CbmQACoreManager.cxx +++ b/analysis/PWGC2F/femtoscopy/hal/helpers/faircbm/HalCbmQACoreManager.cxx @@ -1,7 +1,7 @@ /* Copyright (C) 2023-2023 Warsaw University of Technology, Warsaw SPDX-License-Identifier: GPL-3.0-only Authors: Daniel Wielanek [committer] */ -#include "CbmQACoreManager.h" +#include "HalCbmQACoreManager.h" #include "CbmAnaTreeSource.h" #include "HalCbmBasicTrackCuts.h" @@ -19,7 +19,7 @@ #include <Hal/TrackAna.h> -CbmQACoreManager::CbmQACoreManager() +HalCbmQACoreManager::HalCbmQACoreManager() { fEta[0] = -2; fEta[1] = 4; @@ -27,7 +27,7 @@ CbmQACoreManager::CbmQACoreManager() fDCAz[1] = 10; } -Hal::Event* CbmQACoreManager::GetFormat(eFormatType type, eAnaType ana) +Hal::Event* HalCbmQACoreManager::GetFormat(eFormatType type, eAnaType ana) { switch (ana) { case eAnaType::kDefault: @@ -48,7 +48,7 @@ Hal::Event* CbmQACoreManager::GetFormat(eFormatType type, eAnaType ana) return nullptr; } -void CbmQACoreManager::SetRecoTrackCut(Hal::TrackAna* ana, ePidCut cut, eParticleType primary, TString flag) +void HalCbmQACoreManager::SetRecoTrackCut(Hal::TrackAna* ana, ePidCut cut, eParticleType primary, TString flag) { HalCbmBasicTrackCuts cuts; switch (cut) { @@ -122,7 +122,7 @@ void CbmQACoreManager::SetRecoTrackCut(Hal::TrackAna* ana, ePidCut cut, eParticl ana->AddCutsAndMonitors(cuts); } -FairRunAna* CbmQACoreManager::GetRunAna(TString outFile, TString simFile, TString /*recoFile*/, TString /*parFile*/) +FairRunAna* HalCbmQACoreManager::GetRunAna(TString outFile, TString simFile, TString /*recoFile*/, TString /*parFile*/) { FairRunAna* run = new FairRunAna(); CbmAnaTreeSource* file = new CbmAnaTreeSource(simFile); @@ -131,4 +131,4 @@ FairRunAna* CbmQACoreManager::GetRunAna(TString outFile, TString simFile, TStrin return run; } -CbmQACoreManager::~CbmQACoreManager() {} +HalCbmQACoreManager::~HalCbmQACoreManager() {} diff --git a/analysis/PWGC2F/femtoscopy/hal/qa/CbmQACoreManager.h b/analysis/PWGC2F/femtoscopy/hal/helpers/faircbm/HalCbmQACoreManager.h similarity index 86% rename from analysis/PWGC2F/femtoscopy/hal/qa/CbmQACoreManager.h rename to analysis/PWGC2F/femtoscopy/hal/helpers/faircbm/HalCbmQACoreManager.h index 801837e805cae5277dc2b8d9901739934a01f3ab..0953413d9200f86e36c75efbc54cf6b569c0cf91 100644 --- a/analysis/PWGC2F/femtoscopy/hal/qa/CbmQACoreManager.h +++ b/analysis/PWGC2F/femtoscopy/hal/helpers/faircbm/HalCbmQACoreManager.h @@ -4,8 +4,9 @@ #ifndef CBMROOT_ANALYSIS_PWGC2F_FEMTOSCOPY_NICAFEMTO_HELPERS_CBMQACOREMANAGER_H_ #define CBMROOT_ANALYSIS_PWGC2F_FEMTOSCOPY_NICAFEMTO_HELPERS_CBMQACOREMANAGER_H_ +#include "QAManagerBasic.h" + #include <Hal/QAManager.h> -#include <Hal/QAManagerBasic.h> namespace Hal { @@ -13,9 +14,9 @@ namespace Hal class TrackAna; class TwoTrackAna; } // namespace Hal -class CbmQACoreManager : public Hal::Fair::QAManagerBasic { +class HalCbmQACoreManager : public Hal::Fair::QAManagerBasic { public: - CbmQACoreManager(); + HalCbmQACoreManager(); virtual FairRunAna* GetRunAna(TString outFile, TString simFile, TString recoFile, TString parFile = ""); virtual Hal::Event* GetFormat(Hal::QAManager::eFormatType type, Hal::QAManager::eAnaType ana = Hal::QAManager::eAnaType::kDefault); @@ -24,8 +25,8 @@ class CbmQACoreManager : public Hal::Fair::QAManagerBasic { virtual void SetEventCut(Hal::TrackAna* /*ana*/, Int_t /*col*/, TString /*flag = ""*/){}; virtual void SetPairCut(Hal::TwoTrackAna* /*ana*/, Hal::QAManager::ePidCut /*pid1*/, Hal::QAManager::ePidCut /*pid2*/){}; - virtual ~CbmQACoreManager(); - ClassDef(CbmQACoreManager, 1) + virtual ~HalCbmQACoreManager(); + ClassDef(HalCbmQACoreManager, 1) }; diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmTaskManager.cxx b/analysis/PWGC2F/femtoscopy/hal/helpers/faircbm/HalCbmTaskManager.cxx similarity index 96% rename from analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmTaskManager.cxx rename to analysis/PWGC2F/femtoscopy/hal/helpers/faircbm/HalCbmTaskManager.cxx index fd662951d318a504ac98eaa147339cfcab27f74a..4db8632de496476a299cb218484213d1737e334e 100644 --- a/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmTaskManager.cxx +++ b/analysis/PWGC2F/femtoscopy/hal/helpers/faircbm/HalCbmTaskManager.cxx @@ -6,6 +6,7 @@ #include "CbmFieldMap.h" #include "CbmFieldMapSym3.h" #include "HalCbmField.h" +#include "RootManager.h" #include <FairRunAna.h> @@ -13,7 +14,6 @@ #include <vector> #include <Hal/IOManager.h> -#include <Hal/RootManager.h> HalCbmTaskManager::HalCbmTaskManager() : fMagField(nullptr) {} diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmTaskManager.h b/analysis/PWGC2F/femtoscopy/hal/helpers/faircbm/HalCbmTaskManager.h similarity index 95% rename from analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmTaskManager.h rename to analysis/PWGC2F/femtoscopy/hal/helpers/faircbm/HalCbmTaskManager.h index d68ba0752868ce6e9a059775af9c20f3d22c2307..73116cc268ed0503399e8742729e1490dcbe8ae2 100644 --- a/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmTaskManager.h +++ b/analysis/PWGC2F/femtoscopy/hal/helpers/faircbm/HalCbmTaskManager.h @@ -6,8 +6,7 @@ #include "CbmHelix.h" #include "FairField.h" #include "FairTask.h" - -#include <Hal/TaskManager.h> +#include "TaskManager.h" namespace Hal { diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmAnalysisManager.cxx b/analysis/PWGC2F/femtoscopy/hal/helpers/hal/HalCbmAnalysisManager.cxx similarity index 100% rename from analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmAnalysisManager.cxx rename to analysis/PWGC2F/femtoscopy/hal/helpers/hal/HalCbmAnalysisManager.cxx diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmAnalysisManager.h b/analysis/PWGC2F/femtoscopy/hal/helpers/hal/HalCbmAnalysisManager.h similarity index 100% rename from analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmAnalysisManager.h rename to analysis/PWGC2F/femtoscopy/hal/helpers/hal/HalCbmAnalysisManager.h diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/hal/HalCbmSource.cxx b/analysis/PWGC2F/femtoscopy/hal/helpers/hal/HalCbmSource.cxx new file mode 100644 index 0000000000000000000000000000000000000000..f6dcaa0d6afa34e7a685f8f23ed7e7b547e46022 --- /dev/null +++ b/analysis/PWGC2F/femtoscopy/hal/helpers/hal/HalCbmSource.cxx @@ -0,0 +1,62 @@ +/* Copyright (C) 2023-2023 Warsaw University of Technology, Warsaw + SPDX-License-Identifier: GPL-3.0-only + Authors: Daniel Wielanek [committer] */ +#include "HalCbmSource.h" + +#include "CbmAnaTreeContainer.h" +#include "HalCbmDetectorID.h" + +#include <TBranch.h> +#include <TNamed.h> +#include <TObjArray.h> + +#include <vector> + +#include <Hal/Cout.h> +#include <Hal/InputDataInfo.h> +#include <Hal/RootIOManager.h> + +HalCbmSource::HalCbmSource(TString filename) : Source(filename) { fManager = new HalCbmATIOManager(filename); } + +void HalCbmSource::AddFile(TString fileName) { fManager->AddFile(fileName); } + +void HalCbmSource::AddFriend(TString friendName, Int_t level) { fManager->AddFriend(friendName, level); } + +HalCbmSource::~HalCbmSource() { delete fManager; } + +void HalCbmATIOManager::UpdateBranches() +{ + if (!fAtBranchesSet) { + auto inchain = GetInChain(); + fContainer = new CbmAnaTreeContainers(); + fContainer->LoadConf(fDataInfo); + + auto names = CbmAnaTreeContainers::GetNames(); + for (int i = 0; i < fContainer->GetSize(); i++) { + bool con = fContainer->fContainers[i]->ConnectToTree(GetInChain()); + if (con) { + TString name = HalCbm::GetContainerName(names[i]); + AddBranch(name, fContainer->fContainers[i], Hal::BranchInfo::EFlag::kInActive); + TObject** obj = new TObject*(); + obj[0] = fContainer->fContainers[i]; + PushTObject(obj); + } + } + fAtBranchesSet = kTRUE; + } + Hal::RootIOManager::UpdateBranches(); +} + +HalCbmATIOManager::HalCbmATIOManager(std::initializer_list<TString> lists) + : Hal::RootIOManager(new Hal::InputRootDataInfo(lists)) +{ +} + +HalCbmATIOManager::~HalCbmATIOManager() +{ + if (fContainer) delete fContainer; +} + +Bool_t HalCbmSource::Init() { return kTRUE; } + +HalCbmSource::HalCbmSource(std::initializer_list<TString> lists) { fManager = new HalCbmATIOManager(lists); } diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/HalCbmSource.h b/analysis/PWGC2F/femtoscopy/hal/helpers/hal/HalCbmSource.h similarity index 81% rename from analysis/PWGC2F/femtoscopy/hal/helpers/anatree/HalCbmSource.h rename to analysis/PWGC2F/femtoscopy/hal/helpers/hal/HalCbmSource.h index 2746315511b25ada74fc726da02987722ad01cad..df6e83e375e41c1ee67528e93fd003bac4b38278 100644 --- a/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/HalCbmSource.h +++ b/analysis/PWGC2F/femtoscopy/hal/helpers/hal/HalCbmSource.h @@ -18,17 +18,17 @@ /** * ugly work-around for AT that doesn't contain TObject based object */ -class CbmAnaTreeRecoSourceContainer; -class CbmAnaTreeMcSourceContainer; +class CbmAnaTreeContainers; class HalCbmATIOManager : public Hal::RootIOManager { protected: - virtual void FillBranches(); - CbmAnaTreeRecoSourceContainer* fRecoContainer = {nullptr}; - CbmAnaTreeMcSourceContainer* fSimContainer = {nullptr}; + CbmAnaTreeContainers* fContainer = {nullptr}; + Bool_t fAtBranchesSet = {kFALSE}; public: HalCbmATIOManager(TString name = "") : Hal::RootIOManager(name){}; + HalCbmATIOManager(std::initializer_list<TString> lists); + virtual void UpdateBranches(); virtual ~HalCbmATIOManager(); ClassDef(HalCbmATIOManager, 1) }; @@ -39,6 +39,8 @@ class HalCbmSource : public Hal::Source { public: HalCbmSource(TString filename = ""); + HalCbmSource(std::initializer_list<TString> lists); + Bool_t Init(); virtual void AddFile(TString fileName = ""); virtual void AddFriend(TString friendName = "", Int_t level = 0); Hal::IOManager* GetIOManager() const { return fManager; }; diff --git a/analysis/PWGC2F/femtoscopy/hal/qa/CMakeLists.txt b/analysis/PWGC2F/femtoscopy/hal/qa/CMakeLists.txt deleted file mode 100644 index 19c6e6436d097c07dcf307cf9f331ae34a4b6b7e..0000000000000000000000000000000000000000 --- a/analysis/PWGC2F/femtoscopy/hal/qa/CMakeLists.txt +++ /dev/null @@ -1,59 +0,0 @@ -# Create a library called "" 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} -g") -Set(INCLUDE_DIRECTORIES - ${CMAKE_SOURCE_FAIRMCSTACK} - ${KF_HEADERS} - ${CBMDATA_DIR} - ${CBMDATA_DIR}/global - ${CBMDATA_DIR}/sts - ${HAL_CBM}/helpers - ${HAL_CBM}/qa - ${HAL_CBM_FORMAT} - ${HAL_CBM_CUTS} - ${Hal_INCLUDE_DIR} -) -Set(SYSTEM_INCLUDE_DIRECTORIES - ${ROOT_INCLUDE_DIR} - ${BASE_INCLUDE_DIRECTORIES} - ${CLHEP_INCLUDE_DIR} - ${Boost_INCLUDE_DIRS} -) - -Set(LINK_DIRECTORIES - ${ROOT_LIBRARY_DIR} - ${FAIRROOT_LIBRARY_DIR} - ${Boost_LIBRARY_DIRS} - ${Vc_LIB_DIR} - ${KFParticle_LIB_DIR} -) - -Include_Directories(${INCLUDE_DIRECTORIES}) -Include_Directories(SYSTEM ${SYSTEM_INCLUDE_DIRECTORIES}) - -Link_Directories(${LINK_DIRECTORIES}) - -# List of source files -set(SRCS -CbmQACoreManager.cxx -) - -Set(HEADERS ) -Set(LINKDEF HalCbmQALinkDef.h) -Set(LIBRARY_NAME HalCbmQa) -Set(PUBLIC_DEPENDENCIES - HalFeatures - HalCbmFormat - HalData - HalCbmCuts - FairRoot::Base - HalCut - HalAna - HalQA - KF - KFParticle) -generate_cbm_library() - -add_dependencies(G__HalCbmQa ANALYSISTREE HAL) - diff --git a/analysis/PWGC2F/femtoscopy/hal/qa/HalCbmQALinkDef.h b/analysis/PWGC2F/femtoscopy/hal/qa/HalCbmQALinkDef.h deleted file mode 100644 index ae4bfa1e12e15e142d9fb42f12f3212a8b81772b..0000000000000000000000000000000000000000 --- a/analysis/PWGC2F/femtoscopy/hal/qa/HalCbmQALinkDef.h +++ /dev/null @@ -1,9 +0,0 @@ -/* Copyright (C) 2023-2023 Warsaw University of Technology, Warsaw - SPDX-License-Identifier: GPL-3.0-only - Authors: Daniel Wielanek [committer] */ -#pragma link off all globals; -#pragma link off all classes; -#pragma link off all functions; - -#pragma link C++ class CbmQACoreManager + ; -//#pragma link C++ class CbmNicaCompression + ; diff --git a/cmake/modules/CbmGenerateConfig.cmake b/cmake/modules/CbmGenerateConfig.cmake index 92716aaacb044eb7b7e5118bb177b853c5239fb6..24a7e6882d134316db077e6f5580eab27860e836 100644 --- a/cmake/modules/CbmGenerateConfig.cmake +++ b/cmake/modules/CbmGenerateConfig.cmake @@ -11,6 +11,7 @@ macro(generate_config_files) "${CMAKE_INSTALL_PREFIX}/include/mvd" "${CMAKE_INSTALL_PREFIX}/include/littrack" "${CMAKE_INSTALL_PREFIX}/include/KF" + "${CMAKE_INSTALL_PREFIX}/include/Hal" "${CMAKE_INSTALL_PREFIX}/include/AnalysisTree" "${CMAKE_INSTALL_PREFIX}/include/AnalysisTreeQA" ) diff --git a/external/Hal.patch b/external/Hal.patch deleted file mode 100644 index 09dcb8a2221391e8bd9101ff658ab347ff6dc786..0000000000000000000000000000000000000000 --- a/external/Hal.patch +++ /dev/null @@ -1,108 +0,0 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 9376018..c87ecb1 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -15,7 +15,18 @@ endif() - Set(USE_FAIRROOT FALSE) - Set(USE_EXAMPLES FALSE) - #check if simpath detected --if(DEFINED ENV{SIMPATH}) -+ -+if(NOT DEFINED ENV{SIMPATH} AND NOT DEFINED SIMPATH) -+message (FATAL_ERROR "\ -+You did not define the environment variable SIMPATH or define SIMPATH when calling cmake. \ -+Either of the two is needed to properly find the external packages. \ -+Please either set this environment variable or pass -DSIMPATH=<path> and execute cmake again. \ -+") -+endif() -+if (NOT DEFINED SIMPATH) -+ set(SIMPATH $ENV{SIMPATH}) -+endif() -+if(DEFINED SIMPATH) - Set(USE_FAIRROOT TRUE) - endif() - #check if fairroot disabled -diff --git a/cmake/fair/CheckCompiler.cmake b/cmake/fair/CheckCompiler.cmake -index 2bc05b2..91a6fa2 100644 ---- a/cmake/fair/CheckCompiler.cmake -+++ b/cmake/fair/CheckCompiler.cmake -@@ -19,7 +19,7 @@ endif (NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE) - # the compiler and compiler flags used to install fairsoft. - # Compare compiler and compiler flags used to compile fairsoft with the compiler and flags used now - # In case of differences print a warning --Find_Program(FAIRSOFT_CONFIG fairsoft-config PATHS $ENV{SIMPATH}/bin $ENV{FAIRSOFT_ROOT}/bin NO_DEFAULT_PATH) -+Find_Program(FAIRSOFT_CONFIG fairsoft-config PATHS ${SIMPATH}/bin $ENV{SIMPATH}/bin $ENV{FAIRSOFT_ROOT}/bin NO_DEFAULT_PATH) - - If(FAIRSOFT_CONFIG) - Message(STATUS "fairsoft-config found") -diff --git a/cmake/modules/CMakeFairRoot.cmake b/cmake/modules/CMakeFairRoot.cmake -index 1fad98c..19a3290 100644 ---- a/cmake/modules/CMakeFairRoot.cmake -+++ b/cmake/modules/CMakeFairRoot.cmake -@@ -22,9 +22,12 @@ IF(NOT UNIX) - ENDIF(NOT UNIX) - - --IF(NOT DEFINED ENV{SIMPATH}) -+if(NOT DEFINED ENV{SIMPATH} AND NOT DEFINED SIMPATH) - MESSAGE(FATAL_ERROR "You did not define the environment variable SIMPATH which is nedded to find the external packages. Please set this variable and execute cmake again.") - ENDIF(NOT DEFINED ENV{SIMPATH}) -+if(NOT SIMPATH) -+ Set(SIMPATH $ENV{SIMPATH}) -+endif() - - find_package(ROOT 6.00.00 REQUIRED) - if("${ROOT_VERSION_MAJOR}.${ROOT_VERSION_MINOR}" VERSION_GREATER 6.16) -@@ -36,7 +39,6 @@ find_package(ROOT 6.00.00 REQUIRED) - set(VMCLIB VMCLibrary) - endif() - endif() --Set(SIMPATH $ENV{SIMPATH}) - Set(Boost_NO_SYSTEM_PATHS TRUE) - Set(Boost_NO_BOOST_CMAKE TRUE) - Set(BOOST_ROOT ${SIMPATH}) -diff --git a/cmake/modules/HalMacros.cmake b/cmake/modules/HalMacros.cmake -index c48a4ca..19e60d0 100644 ---- a/cmake/modules/HalMacros.cmake -+++ b/cmake/modules/HalMacros.cmake -@@ -8,15 +8,20 @@ Macro(SetFairBase) - SET(FAIRBASE ${FAIRBASE}) - Else (FAIRBASE) - Message(STATUS "NOT Found FAIRBASE") -- IF(NOT DEFINED ENV{FAIRROOTPATH}) -+ if(NOT DEFINED ENV{FAIRROOTPATH} AND NOT DEFINED FAIRROOTPATH) - MESSAGE(FATAL_ERROR "You did not define the environment variable FAIRROOTPATH which is needed to find FairRoot. Please set this variable and execute cmake again.") - SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/fair" ${CMAKE_MODULE_PATH}) - MESSAGE(WARNING "CMP ${CMAKE_MODULE_PATH}") -- ENDIF(NOT DEFINED ENV{FAIRROOTPATH}) -- SET(FAIRROOTPATH $ENV{FAIRROOTPATH}) -+ endif() -+ if(NOT FAIRROOTPATH) -+ SET(FAIRROOTPATH $ENV{FAIRROOTPATH}) -+ endif() -+ if(NOT ENV{FAIRROOTPATH}) -+ SET(ENV{FAIRROOTPATH} ${FAIRROOTPATH}) -+ endif() - EndIf (FAIRBASE) -- set(CMAKE_MODULE_PATH "$ENV{FAIRROOTPATH}/share/fairbase/cmake/modules_old" ${CMAKE_MODULE_PATH}) -- set(CMAKE_MODULE_PATH "$ENV{FAIRROOTPATH}/share/fairbase/cmake/modules" ${CMAKE_MODULE_PATH}) -+ set(CMAKE_MODULE_PATH "${FAIRROOTPATH}/share/fairbase/cmake/modules_old" ${CMAKE_MODULE_PATH}) -+ set(CMAKE_MODULE_PATH "${FAIRROOTPATH}/share/fairbase/cmake/modules" ${CMAKE_MODULE_PATH}) - IF(FAIRROOTPATH) - Set(CheckSrcDir "${FAIRROOTPATH}/share/fairbase/cmake/checks") - ELSE(FAIRROOTPATH) -diff --git a/fair/CMakeLists.txt b/fair/CMakeLists.txt -index 266e82e..46246e6 100644 ---- a/fair/CMakeLists.txt -+++ b/fair/CMakeLists.txt -@@ -8,8 +8,8 @@ ${HAL_CORE}/fair - Set(SYSTEM_INCLUDE_DIRECTORIES - ${ROOT_INCLUDE_DIR} - ${BASE_INCLUDE_DIRECTORIES} -- $ENV{SIMPATH}/include -- $ENV{SIMPATH}/include/vmc -+ ${SIMPATH}/include -+ ${SIMPATH}/include/vmc - ) - - Set(LINK_DIRECTORIES diff --git a/external/InstallHal.cmake b/external/InstallHal.cmake index e4cf62ada2b1c6a316ceedd256e3425938a271aa..6ca1a268a31974a50ff6167f616f4ee960e96e9e 100644 --- a/external/InstallHal.cmake +++ b/external/InstallHal.cmake @@ -1,17 +1,16 @@ -set(HAL_VERSION 9da3fa0b6511765b83409a1804753e4b46ab81a7) +set(HAL_VERSION 9fb2e4528db4a8ffa9205a496b1003c388bb6de8) set(HAL_SRC_URL "https://github.com/DanielWielanek/HAL.git") set(HAL_DESTDIR "${CMAKE_BINARY_DIR}/external/HAL-prefix") list(APPEND HAL_LIB_LIST "HalAna" "HalCut" "HalData" "HalFeatures" "HalFemto") -list(APPEND HAL_LIB_LIST "HalFlow" "HalFluct" "HalSpectra" "HalFair" "HalQA") +list(APPEND HAL_LIB_LIST "HalFlow" "HalFluct" "HalSpectra" "HalQA") download_project_if_needed(PROJECT Hal_source GIT_REPOSITORY ${HAL_SRC_URL} GIT_TAG ${HAL_VERSION} SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/Hal - PATCH_COMMAND "patch -p1 < ${CMAKE_CURRENT_SOURCE_DIR}/Hal.patch" ) If(ProjectUpdated) @@ -41,6 +40,7 @@ ExternalProject_Add(HAL -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR} -DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD} -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH} + -DINCLUDE_HAL_SUBIDIR=TRUE -DROOTSYS=${SIMPATH} -DSIMPATH=${SIMPATH} -DFAIRROOTPATH=${FAIRROOTPATH} diff --git a/macro/analysis/cbmfemto/hbt_common.C b/macro/analysis/cbmfemto/hbt_common.C index 8b1dfd39727790e8ffb5daa421ee7cf4d71f3950..5bd556bfd06e7d0e0a2ef4aec8c71c9ccd7b5c62 100644 --- a/macro/analysis/cbmfemto/hbt_common.C +++ b/macro/analysis/cbmfemto/hbt_common.C @@ -94,12 +94,12 @@ Hal::FemtoBasicAna* MakeAna(Bool_t speedUp) * speed up analysis by using compression and special HBT format * the sts exit distance and phi* are calculated once per track */ - task->SetFormat(new HalCbmFullEvent(), Hal::EFormatDepth::kNonBuffered); + // task->SetFormat(new HalCbmFullEvent(), Hal::EFormatDepth::kNonBuffered); task->SetFormat(new HalCbmHbtFullEvent(), Hal::EFormatDepth::kBuffered); task->SetFormatOption(Hal::EventAna::EFormatOption::kCompress); } else { - task->SetFormat(new HalCbmFullEvent()); + //task->SetFormat(new HalCbmFullEvent()); } SetEventCut(task); SetTrackCuts(task); diff --git a/macro/analysis/cbmfemto/hbt_v0.C b/macro/analysis/cbmfemto/hbt_v0.C new file mode 100644 index 0000000000000000000000000000000000000000..cc9d2e742f138200ebc05bb9e59b3cca3b64bb17 --- /dev/null +++ b/macro/analysis/cbmfemto/hbt_v0.C @@ -0,0 +1,83 @@ +/* Copyright (C) 2023-2023 Warsaw University of Technology, Warsaw + SPDX-License-Identifier: GPL-3.0-only + Authors: Daniel Wielanek [committer] */ + +#ifndef __CLING__ +#include "CbmAnaTreeSource.h" +#include "CbmFieldMap.h" +#include "FairFileSource.h" +#include "FairParRootFileIo.h" +#include "FemtoBasicAna.h" +#include "HalCbmAnalysisManager.h" +#include "HalCbmReader.h" +#include "HalCbmSource.h" +#include "HalCbmV0Builder.h" +#include "TFile.h" +#include "data/CbmDefs.h" + +#include <FairLogger.h> +#include <FairRun.h> +#include <FairRunAna.h> + +#include <RtypesCore.h> +#include <TStopwatch.h> +#include <TString.h> +#include <TTimer.h> + +#include <cstdio> +#include <iostream> + +#include <Hal/AnalysisManager.h> +#include <Hal/DataFormat.h> +#include <Hal/PropertyMonitorX.h> +#include <Hal/PropertyMonitorXY.h> +#include <Hal/Source.h> + + +using namespace std; +#endif +#include "hbt_common.C" + +#define KRONOS + +/** + * analysis macro done via FairRoot + * @param task + */ + +void hbt_v0(TString inFile = "3000.analysistree.root", TString outFile = "test2.root") +{ + HalCbmAnalysisManager* manager = new HalCbmAnalysisManager(); + auto source = new HalCbmSource(inFile); + source->AddFriend("v0.root"); + manager->SetSource(source); + manager->SetOutput(outFile); + + HalCbmV0Builder* v0 = + new HalCbmV0Builder(Hal::Const::LambdaPID(), Hal::Const::ProtonPID(), -Hal::Const::PionPlusPID()); + + manager->AddTask(v0); + + auto reader = new HalCbmReader(); + manager->AddTask(reader); + + Hal::FemtoBasicAna* task = MakeAna(kTRUE); + task->SetPdg(Hal::Const::LambdaPID()); //switch to lambda PID + + + Hal::TrackFieldMonitorXY armenteros(Hal::DataFieldID::Track::EV0::kAlphaArm, Hal::DataFieldID::Track::EV0::kPtArm); + armenteros.SetXaxis(200, -1, 1); + armenteros.SetYaxis(200, 0, 1); + task->AddCutMonitor(armenteros); + + + manager->AddTask(task); + + TStopwatch timer; + timer.Start(); + + manager->Init(); + manager->Run(0, 1000); + Double_t rtime = timer.RealTime(), ctime = timer.CpuTime(); + printf("RealTime=%f seconds, CpuTime=%f seconds\n", rtime, ctime); +} diff --git a/scripts/checklibs.sh b/scripts/checklibs.sh index 9c95ff650f8aba53ad1c416f58e7273a9a0ddd35..3212e736ef10580ed7ce789884e9d6891f27e5ca 100755 --- a/scripts/checklibs.sh +++ b/scripts/checklibs.sh @@ -29,12 +29,15 @@ for lib in $all_libs; do # So \\\\ becomes \\ which becomes \ # => Seems to still work with mawk (Mike's awk, debian 10) on run2, so ok like this? rootmap_defs_token="\\\\[ lib" - # if [[ ${rootmap_file} == *"libHal"* ]]; then - # # Commented out for now as lead to missing headers detection in 60% of HAL libraries (9/14) - # rootmap_defs_token="\\\\[ Hal" - # fi first_class=$(awk -v token="${rootmap_defs_token}" '$0 ~ token ,0' ${rootmap_file} | grep -m1 "${start_token_class}" | tr -d ';') + if [[ "" == ${first_class} && ${rootmap_file} == *"libHal"* ]]; then + rootmap_defs_token="\\\\[ Hal" + first_class=$(awk -v token="${rootmap_defs_token}" '$0 ~ token ,0' ${rootmap_file} | grep -m1 "${start_token_class}" | tr -d ';') + fi first_class="${first_class##"${start_token_class}"}" + if [[ "" == ${first_class} ]]; then + echo "WARNING: No 1st class found in rootmap for ${lib} (prob. need tuning of checklibs.sh)" + fi # Printouts commented out to limit spam in test logs # FIXME: make it a "-v" option @@ -43,7 +46,6 @@ for lib in $all_libs; do # echo "Loading the library ${lib}" fi - root -l -q -b "${SCRIPTDIR}/loadlib.C(\"${lib}\", \"${first_class}\")" &> ${tmpfile} retval=$? if [[ retval -ne 0 ]]; then