Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-02-22 09:55:28

0001 // This file is part of the Acts project.
0002 //
0003 // Copyright (C) 2021 CERN for the benefit of the Acts project
0004 //
0005 // This Source Code Form is subject to the terms of the Mozilla Public
0006 // License, v. 2.0. If a copy of the MPL was not distributed with this
0007 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
0008 
0009 #pragma once
0010 
0011 #include "Acts/Definitions/Common.hpp"
0012 
0013 #include <vector>
0014 
0015 namespace ActsFatras::detail {
0016 
0017 /// @brief Data storage of the parametrized nuclear interaction
0018 struct NuclearInteractionParameters {
0019   using CumulativeDistribution =
0020       std::pair<std::vector<float>, std::vector<uint32_t>>;
0021   using Distributions = std::vector<CumulativeDistribution>;
0022   using PdgMap =
0023       std::vector<std::pair<int, std::vector<std::pair<int, float>>>>;
0024 
0025   /// @brief Nested struct for the storage of the kinematic parametrisations for
0026   /// a given final state multiplicity
0027   struct ParametersWithFixedMultiplicity {
0028     ParametersWithFixedMultiplicity() = default;
0029 
0030     ParametersWithFixedMultiplicity(
0031         Distributions& momenta, Acts::ActsDynamicVector& eValMom,
0032         Acts::ActsDynamicVector& eVecMom, Acts::ActsDynamicVector& meanMom,
0033         Distributions& invariantMasses, Acts::ActsDynamicVector& eValIM,
0034         Acts::ActsDynamicVector& eVecIM, Acts::ActsDynamicVector& meanIM)
0035         : validParametrisation(true),
0036           momentumDistributions(momenta),
0037           eigenvaluesMomentum(eValMom),
0038           meanMomentum(meanMom),
0039           invariantMassDistributions(invariantMasses),
0040           eigenvaluesInvariantMass(eValIM),
0041           meanInvariantMass(meanIM) {
0042       const unsigned int sizeMom = eigenvaluesMomentum.size();
0043       eigenvectorsMomentum.resize(sizeMom, sizeMom);
0044       for (unsigned int i = 0; i < sizeMom; i++) {
0045         for (unsigned int j = 0; j < sizeMom; j++) {
0046           eigenvectorsMomentum(i, j) = eVecMom[i * sizeMom + j];
0047         }
0048       }
0049 
0050       const unsigned int sizeInvMass = eigenvaluesInvariantMass.size();
0051       eigenvectorsInvariantMass.resize(sizeInvMass, sizeInvMass);
0052       for (unsigned int i = 0; i < sizeInvMass; i++) {
0053         for (unsigned int j = 0; j < sizeInvMass; j++) {
0054           eigenvectorsInvariantMass(i, j) = eVecIM[i * sizeInvMass + j];
0055         }
0056       }
0057     }
0058 
0059     bool validParametrisation = false;
0060 
0061     /// Momentum parameters
0062     /// Generation-wise distributions
0063     Distributions momentumDistributions;
0064     /// Eigenvalues
0065     Acts::ActsDynamicVector eigenvaluesMomentum;
0066     /// Eigenvectors
0067     Acts::ActsDynamicMatrix eigenvectorsMomentum;
0068     /// Mean in eigenspace
0069     Acts::ActsDynamicVector meanMomentum;
0070 
0071     /// Invariant mass parameters
0072     /// Generation-wise distributions
0073     Distributions invariantMassDistributions;
0074     /// Eigenvalues
0075     Acts::ActsDynamicVector eigenvaluesInvariantMass;
0076     /// Eigenvectors
0077     Acts::ActsDynamicMatrix eigenvectorsInvariantMass;
0078     /// Mean in eigenspace
0079     Acts::ActsDynamicVector meanInvariantMass;
0080   };
0081 
0082   /// Initial momentum
0083   float momentum = 0;
0084   /// Probability for soft nuclear interacion
0085   float softInteractionProbability = 0;
0086   /// PDG ID based branching probabilities
0087   PdgMap pdgMap;
0088   /// Probability for nuclear interaction
0089   CumulativeDistribution nuclearInteractionProbability;
0090   /// Multiplicity in soft interactions
0091   CumulativeDistribution softMultiplicity;
0092   /// Multiplicity in hard interactions
0093   CumulativeDistribution hardMultiplicity;
0094   /// Kinematic distributions in soft interactions
0095   std::vector<ParametersWithFixedMultiplicity> softKinematicParameters;
0096   /// Kinematic distributions in hard interactions
0097   std::vector<ParametersWithFixedMultiplicity> hardKinematicParameters;
0098 };
0099 
0100 /// Parametrisation of a single particle
0101 using NuclearInteractionParametrisation =
0102     std::vector<std::pair<float, NuclearInteractionParameters>>;
0103 /// Parametrisation of multiple particles
0104 using MultiParticleNuclearInteractionParametrisation =
0105     std::vector<std::pair<int, NuclearInteractionParametrisation>>;
0106 }  // namespace ActsFatras::detail