27 m_hasFinalStatePhotons( false ),
30 m_totalDelayedNeutronMultiplicity( nullptr ) {
44 m_neutronIndex( a_setupInfo.m_neutronIndex ),
46 m_hasFinalStatePhotons( false ),
49 m_totalDelayedNeutronMultiplicity( nullptr ) {
51 if( a_outputChannel !=
nullptr ) {
53 m_isFission = a_outputChannel->
isFission( );
57 double domainMin = m_Q->domainMin( ), domainMax = m_Q->domainMax( );
62 a_setupInfo.
m_Q = m_Q->evaluate( 0 );
68 a_setupInfo.
m_product2Mass = product->particle( ).mass(
"MeV/c**2" );
72 bool electronPresent =
false;
74 std::set<std::size_t> productsToDo;
75 for( std::size_t i1 = 0; i1 < a_outputChannel->
products( ).size( ); ++i1 ) {
80 if( !electronPresent && !product->isCompleteParticle( ) && ( product->outputChannel( ) ==
nullptr ) )
continue;
83 productsToDo.insert( i1 );
85 size = productsToDo.
size( );
91 bool addIncoherentPhotoAtomicScatteringElectron =
false;
93 if( !electronPresent ) {
95 addIncoherentPhotoAtomicScatteringElectron =
true;
99 m_products.reserve( size );
103 std::string label = ID;
108 m_products.push_back( product );
114 m_products.push_back( product );
117 for( std::size_t i1 = 0; i1 < a_outputChannel->
products( ).size( ); ++i1 ) {
118 if( productsToDo.find( i1 ) == productsToDo.end( ) )
continue;
128 m_products.push_back(
new Product( product, a_setupInfo, a_settings, a_particles, m_isFission ) );
130 if( addIncoherentPhotoAtomicScatteringElectron && ( product->particle( ).ID( ) ==
PoPI::IDs::photon ) ) {
131 addIncoherentPhotoAtomicScatteringElectron =
false;
136 m_products.push_back( product2 );
145 bool missingData =
false;
153 GIDI::Suite const &multiplicity = product.multiplicity( );
163 std::cerr <<
"OutputChannel::OutputChannel: GIDI::DelayedNeutron multiplicity type != GIDI::FormType::XYs1d" << std::endl;
169 totalDelayedNeutronMultiplicity += *multiplicityXYs1d;
173 if( !missingData ) m_totalDelayedNeutronMultiplicity =
new Functions::XYs1d( totalDelayedNeutronMultiplicity );
187 for( std::size_t i1 = 0; i1 < m_products.size( ); ++i1 )
delete m_products[i1];
189 delete m_totalDelayedNeutronMultiplicity;
190 for( std::size_t i1 = 0; i1 < m_delayedNeutrons.size( ); ++i1 )
delete m_delayedNeutrons[i1];
203 double final_Q = m_Q->evaluate( a_x1 );
205 for( std::size_t i1 = 0; i1 < m_products.size( ); ++i1 ) final_Q += m_products[i1]->
finalQ( a_x1 );
217 if( m_isFission )
return(
true );
218 for( std::size_t i1 = 0; i1 < m_products.size( ); ++i1 ) {
219 if( m_products[i1]->
hasFission( ) )
return(
true );
233 for(
auto iter = m_products.begin( ); iter != m_products.end( ); ++iter ) (*iter)->setUserParticleIndex( a_particleIndex, a_userParticleIndex );
234 for(
auto iter = m_delayedNeutrons.begin( ); iter != m_delayedNeutrons.end( ); ++iter ) (*iter)->setUserParticleIndex( a_particleIndex, a_userParticleIndex );
246 for(
auto iter = m_products.begin( ); iter != m_products.end( ); ++iter ) (*iter)->setUserParticleIndexViaIntid( a_particleIntid, a_userParticleIndex );
247 for(
auto iter = m_delayedNeutrons.begin( ); iter != m_delayedNeutrons.end( ); ++iter ) (*iter)->setUserParticleIndexViaIntid( a_particleIntid, a_userParticleIndex );
258 m_products[0]->setModelDBRC_data( a_modelDBRC_data );
272 std::vector<DelayedNeutron *> &a_delayedNeutrons, std::vector<Functions::Function1d_d1 *> &a_Qs ) {
274 if( a_totalDelayedNeutronMultiplicity !=
nullptr ) {
275 *a_totalDelayedNeutronMultiplicity = m_totalDelayedNeutronMultiplicity;
276 m_totalDelayedNeutronMultiplicity =
nullptr;
277 for( std::size_t index = 0; index < m_delayedNeutrons.size( ); ++index ) {
278 a_delayedNeutrons.push_back( m_delayedNeutrons[index] );
279 m_delayedNeutrons[index] =
nullptr;
283 a_Qs.push_back( m_Q );
285 for( std::size_t productIndex = 0; productIndex < m_products.size( ); ++productIndex ) {
286 Product *product = m_products[productIndex];
288 if( product->outputChannel( ) !=
nullptr ) {
289 product->outputChannel( )->moveProductsEtAlToReaction( a_products,
nullptr, a_delayedNeutrons, a_Qs );
292 a_products.push_back( product );
294 m_products[productIndex] =
nullptr;
298#ifdef MCGIDI_USE_OUTPUT_CHANNEL
307LUPI_HOST void OutputChannel::addOrphanProductToProductList( std::vector<Product *> &a_products )
const {
309 for(
int productIndex = 0; productIndex < m_products.size( ); ++productIndex ) {
310 Product *product = m_products[productIndex];
312 if( product->outputChannel( ) !=
nullptr ) {
313 product->outputChannel( )->addOrphanProductToProductList( a_products ); }
315 a_products.push_back( product );
331 for(
int productIndex = 0; productIndex < m_products.size( ); ++productIndex ) {
332 Product *
product = m_products[productIndex];
334 if(
product->outputChannel( ) !=
nullptr ) {
335 product->outputChannel( )->addOrphanProductToProductList( a_products ); }
337 a_products.push_back( product );
353 for(
int productIndex = 0; productIndex < m_products.size( ); ++productIndex ) {
354 Product *
product = m_products[productIndex];
356 if(
product->outputChannel( ) !=
nullptr ) {
357 product->outputChannel( )->addOrphanProductToProductList( a_products ); }
359 a_products.push_back( product );
378 double multiplicity = 0.0;
381 multiplicity += (*iter)->productAverageMultiplicity( a_index, a_projectileEnergy );
384 if( m_totalDelayedNeutronMultiplicity !=
nullptr ) {
385 if( a_index == m_neutronIndex ) multiplicity += m_totalDelayedNeutronMultiplicity->evaluate( a_projectileEnergy );
388 return( multiplicity );
403 double multiplicity = 0.0;
406 multiplicity += (*iter)->productAverageMultiplicityViaIntid( a_intid, a_projectileEnergy );
409 if( m_totalDelayedNeutronMultiplicity !=
nullptr ) {
410 if( a_intid ==
PoPI::Intids::neutron ) multiplicity += m_totalDelayedNeutronMultiplicity->evaluate( a_projectileEnergy );
413 return( multiplicity );
427 switch( m_channelType ) {
458 m_totalDelayedNeutronMultiplicity =
serializeFunction1d( a_buffer, a_mode, m_totalDelayedNeutronMultiplicity );
G4ConcreteNNToDeltaDelta channelType
#define DATA_MEMBER_CAST(member, buf, mode, someType)
#define DATA_MEMBER_INT( member, buf, mode)
FissionFragmentData & fissionFragmentData()
T * get(std::size_t a_Index)
bool hasParticle(std::string const &a_id) const
DelayedNeutrons delayedNeutrons() const
LUPI_HOST_DEVICE void serialize(LUPI::DataBuffer &a_buffer, LUPI::DataBuffer::Mode a_mode)
LUPI_HOST_DEVICE double finalQ(double a_x1) const
LUPI_HOST_DEVICE bool hasFission() const
LUPI_HOST_DEVICE Vector< Product * > const & products() const
Vector< DelayedNeutron * > delayedNeutrons() const
LUPI_HOST_DEVICE OutputChannel()
LUPI_HOST void setUserParticleIndexViaIntid(int a_particleIntid, int a_userParticleIndex)
LUPI_HOST_DEVICE double productAverageMultiplicity(int a_index, double a_projectileEnergy) const
LUPI_HOST void setUserParticleIndex(int a_particleIndex, int a_userParticleIndex)
LUPI_HOST void moveProductsEtAlToReaction(std::vector< Product * > &a_products, Functions::Function1d **a_totalDelayedNeutronMultiplicity, std::vector< DelayedNeutron * > &a_delayedNeutrons, std::vector< Functions::Function1d_d1 * > &a_Qs)
LUPI_HOST_DEVICE double productAverageMultiplicityViaIntid(int a_intid, double a_projectileEnergy) const
LUPI_HOST_DEVICE DelayedNeutron const * delayedNeutron(std::size_t a_index) const
LUPI_HOST void setModelDBRC_data(Sampling::Upscatter::ModelDBRC_data *a_modelDBRC_data)
LUPI_HOST_DEVICE ~OutputChannel()
LUPI_HOST_DEVICE Distributions::Distribution const * distribution() const
LUPI_HOST void setMultiplicity(Functions::Function1d *a_multiplicity)
LUPI_HOST_DEVICE bool isTNSL_ProtareSingle() const
LUPI_HOST_DEVICE int targetIntid() const
bool m_isPhotoAtomicIncoherentScattering
TwoBodyOrder m_twoBodyOrder
bool m_hasFinalStatePhotons
PoPI::Database const & m_popsUser
ProtareSingle & m_protare
PoPI::Database const & m_pops
LUPI_HOST bool sampleNonTransportingParticles() const
LUPI_HOST Function1d_d1 * parseFunction1d_d1(Transporting::MC const &a_settings, GIDI::Suite const &a_suite)
Simple C++ string class, useful as replacement for std::string if this cannot be used,...
LUPI_HOST int MCGIDI_popsIntid(PoPI::Database const &a_pops, std::string const &a_ID)
LUPI_HOST_DEVICE void serializeDelayedNeutrons(LUPI::DataBuffer &a_buffer, LUPI::DataBuffer::Mode a_mode, Vector< DelayedNeutron * > &a_delayedNeutrons)
LUPI_HOST_DEVICE Functions::Function1d * serializeFunction1d(LUPI::DataBuffer &a_buffer, LUPI::DataBuffer::Mode a_mode, Functions::Function1d *a_function1d)
LUPI_HOST_DEVICE void serializeProducts(LUPI::DataBuffer &a_buffer, LUPI::DataBuffer::Mode a_mode, Vector< Product * > &a_products)
LUPI_HOST_DEVICE Functions::Function1d_d1 * serializeFunction1d_d1(LUPI::DataBuffer &a_buffer, LUPI::DataBuffer::Mode a_mode, Functions::Function1d_d1 *a_function1d)
@ ptwXY_interpolationLinLin
static std::string const photon
static std::string const neutron
static std::string const electron
static int constexpr neutron