2#include <FairRootManager.h>
6 std::string_view inputMult,
7 std::string_view inputCluster,
8 std::string_view output)
9 : FairTask(
"R3BNeulandNeutronsRValue")
10 , fEkinRefMeV(EkinRefMeV)
11 , fInputMultName(inputMult)
12 , fMultiplicity(nullptr)
13 , fClusters(inputCluster)
20 auto* ioman = FairRootManager::Instance();
35 cluster_buffer_.clear();
37 cluster_buffer_ = fClusters.get();
42 SortClustersByRValue(cluster_buffer_);
43 PrioritizeTimeWiseFirstCluster(cluster_buffer_);
45 const auto mult = fMultiplicity->GetMultiplicity();
46 for (
size_t index = 0; index < cluster_buffer_.size() && index < mult; index++)
48 fNeutrons.get().emplace_back(cluster_buffer_.at(index));
52void R3BNeulandNeutronsRValue::SortClustersByRValue(std::vector<R3BNeulandCluster>& clusters)
const
54 std::sort(clusters.begin(),
57 { return one.GetRECluster(fEkinRefMeV) < other.GetRECluster(fEkinRefMeV); });
60void R3BNeulandNeutronsRValue::PrioritizeTimeWiseFirstCluster(std::vector<R3BNeulandCluster>& clusters)
62 auto timewiseFirstCluster = std::min_element(clusters.begin(),
64 [](
const R3BNeulandCluster& one,
const R3BNeulandCluster& other)
65 { return one.GetT() < other.GetT(); });
67 std::rotate(clusters.begin(), timewiseFirstCluster, timewiseFirstCluster + 1);
70void R3BNeulandNeutronsRValue::FilterClustersByEnergyDeposit(std::vector<R3BNeulandCluster>& clusters)
74 clusters.begin(), clusters.end(), [&](
const R3BNeulandCluster& cluster) { return cluster.GetE() < 2.5; }),
78void R3BNeulandNeutronsRValue::FilterClustersByKineticEnergy(std::vector<R3BNeulandCluster>& clusters)
const
80 clusters.erase(std::remove_if(clusters.begin(),
82 [
this](
const R3BNeulandCluster& cluster)
83 { return std::abs(cluster.GetEToF() - fEkinRefMeV) / fEkinRefMeV > 0.05; }),
87void R3BNeulandNeutronsRValue::FilterClustersByElasticScattering(std::vector<R3BNeulandCluster>& clusters)
89 std::map<const R3BNeulandCluster*, bool> marked;
91 for (
const auto& cluster : clusters)
93 marked[&cluster] =
false;
96 for (
const auto& one_cluster : clusters)
98 for (
const auto& other_cluster : clusters)
100 if (&one_cluster != &other_cluster && one_cluster.GetT() < other_cluster.GetT() &&
103 marked[&other_cluster] =
true;
110 clusters.begin(), clusters.end(), [&](
const R3BNeulandCluster& cluster) { return marked.at(&cluster); }),
ClassImp(R3B::Neuland::Cal2HitPar)
void Exec(Option_t *) override
auto Init() -> InitStatus override
R3BNeulandNeutronsRValue(double EkinRefMeV, std::string_view inputMult="NeulandMultiplicity", std::string_view inputCluster="NeulandClusters", std::string_view output="NeulandNeutrons")
bool IsElastic(const R3BNeulandCluster *, const R3BNeulandCluster *)