diff --git a/reco/steer/CbmReco.cxx b/reco/steer/CbmReco.cxx index 64770bf95f7fb561527d69467210a08067cd8325..f8af5f90a954b0bc3a9c5702a718453a491ecc8a 100644 --- a/reco/steer/CbmReco.cxx +++ b/reco/steer/CbmReco.cxx @@ -16,15 +16,16 @@ #include <iostream> #include <memory> +#include <string> using std::cout; using std::endl; -using std::make_unique; +using std::string; -// ----- Constructor ------------------------------------------------------ -CbmReco::CbmReco(TString source, TString outFile, int32_t numTs, const CbmRecoConfig& config) - : fInputFileName(source) +// ----- Constructor from single source ----------------------------------- +CbmReco::CbmReco(string source, TString outFile, int32_t numTs, const CbmRecoConfig& config) + : fSourceNames {source} , fOutputFileName(outFile) , fNumTs(numTs) , fConfig(config) @@ -33,6 +34,30 @@ CbmReco::CbmReco(TString source, TString outFile, int32_t numTs, const CbmRecoCo // ---------------------------------------------------------------------------- +// ----- Constructor from multiple sources -------------------------------- +CbmReco::CbmReco(std::vector<string> sources, TString outFile, int32_t numTs, const CbmRecoConfig& config) + : fSourceNames(sources) + , fOutputFileName(outFile) + , fNumTs(numTs) + , fConfig(config) +{ +} +// ---------------------------------------------------------------------------- + + +// ----- List of source names --------------------------------------------- +std::string CbmReco::ListSources() const +{ + std::string result = "{"; + for (auto& source : fSourceNames) { + result += source + ", "; + } + result += "}"; + return result; +} +// ---------------------------------------------------------------------------- + + // ----- Configure and execute run ---------------------------------------- int32_t CbmReco::Run() { @@ -41,16 +66,19 @@ int32_t CbmReco::Run() TStopwatch timer; timer.Start(); + // TODO: I cannot yet use unique pointers for the objects to be passed to FairRunline. + // Ownership, however, is passed to FairRunOnline, which takes care of deleting the objects. + // --- Input source - auto source = make_unique<CbmSourceTs>(fInputFileName.Data()); - if (source) LOG(info) << "Reco: Using source " << fInputFileName.Data(); + auto source = new CbmSourceTs(fSourceNames); + if (source) LOG(info) << "Reco: Using sources " << ListSources(); else { - LOG(error) << "Reco: Could not open source " << fInputFileName.Data() << "; aborting."; + LOG(error) << "Reco: Could not open sources " << ListSources() << "; aborting."; return -1; } // --- Output file - auto sink = make_unique<FairRootFileSink>(fOutputFileName.Data()); + auto sink = new FairRootFileSink(fOutputFileName.Data()); if (sink) LOG(info) << "Reco: Using output file " << fOutputFileName.Data(); else { LOG(error) << "Reco: Could not open output " << fOutputFileName.Data() << "; aborting."; @@ -58,31 +86,31 @@ int32_t CbmReco::Run() } // --- Event header - auto header = make_unique<CbmTsEventHeader>(); + auto header = new CbmTsEventHeader(); // --- Unpacking - auto unpack = make_unique<CbmTaskUnpack>(); + auto unpack = new CbmTaskUnpack(); unpack->SetOutputBranchPersistent("DigiTimeslice.", fConfig.fStoreTimeslice); // --- Digi trigger - auto trigger = make_unique<CbmTaskTriggerDigi>(); + auto trigger = new CbmTaskTriggerDigi(); trigger->AddSystem(fConfig.fTriggerDet); trigger->SetAlgoParams(fConfig.fTriggerWin, fConfig.fTriggerThreshold, fConfig.fTriggerDeadTime); trigger->SetOutputBranchPersistent("Trigger", fConfig.fStoreTrigger); // --- Event building - auto evtBuild = make_unique<CbmTaskBuildEvents>(); + auto evtBuild = new CbmTaskBuildEvents(); for (auto& entry : fConfig.fEvtbuildWindows) evtBuild->SetEventWindow(entry.first, entry.second.first, entry.second.second); evtBuild->SetOutputBranchPersistent("DigiEvent", fConfig.fStoreEvents); // --- Run configuration - FairRunOnline run(source.release()); - run.SetSink(sink.release()); - run.SetEventHeader(header.release()); - run.AddTask(unpack.release()); - run.AddTask(trigger.release()); - run.AddTask(evtBuild.release()); + FairRunOnline run(source); + run.SetSink(sink); + run.SetEventHeader(header); + run.AddTask(unpack); + run.AddTask(trigger); + run.AddTask(evtBuild); // --- Initialise and start run timer.Stop(); diff --git a/reco/steer/CbmReco.h b/reco/steer/CbmReco.h index 7a4aace9899c426b92da9b8a3944924729b79dfd..b0e806ef76c96555fd3f96aed126eeb9121a2717 100644 --- a/reco/steer/CbmReco.h +++ b/reco/steer/CbmReco.h @@ -10,6 +10,7 @@ #include <TString.h> #include <map> +#include <string> #include <utility> @@ -58,19 +59,34 @@ public: CbmReco() {}; - /** @brief Standard constructor - ** @param source Name of input file or input source + /** @brief Standard constructor for a single source + ** @param source Name of input file or stream ** @param outFile Name of output file ** @param numTs Number of timeslices to process. If negative, all available will be used. ** @param config Configuration **/ - CbmReco(TString source, TString outFile, int32_t numTs, const CbmRecoConfig& config); + CbmReco(std::string source, TString outFile, int32_t numTs, const CbmRecoConfig& config); + + + /** @brief Standard constructor for list of sources + ** @param source Vector of names of input files or input sources + ** @param outFile Name of output file + ** @param numTs Number of timeslices to process. If negative, all available will be used. + ** @param config Configuration + **/ + CbmReco(std::vector<std::string> sources, TString outFile, int32_t numTs, const CbmRecoConfig& config); /** @brief Destructor **/ virtual ~CbmReco() {}; + /** @brief List all entries in the input vector + ** @return String concatenating the sources names + **/ + std::string ListSources() const; + + /** @brief Configure and execute run ** @return Number of processed timeslices. -1 if error encountered. **/ @@ -78,10 +94,10 @@ public: private: - TString fInputFileName = ""; - TString fOutputFileName = ""; - int32_t fNumTs = -1; - CbmRecoConfig fConfig = {}; + std::vector<std::string> fSourceNames = {}; ///< Sources (input files or stream) + TString fOutputFileName = ""; + int32_t fNumTs = -1; + CbmRecoConfig fConfig = {}; ClassDef(CbmReco, 1); };