GENIEGenerator
Loading...
Searching...
No Matches
genie::flux::GFluxBlender Class Reference

GENIE GFluxI adapter to allow flavor modification. More...

#include <GFluxBlender.h>

Inheritance diagram for genie::flux::GFluxBlender:
[legend]
Collaboration diagram for genie::flux::GFluxBlender:
[legend]

Public Member Functions

 GFluxBlender ()
 ~GFluxBlender ()
const PDGCodeListFluxParticles (void)
 declare list of flux neutrinos that can be generated (for init. purposes)
double MaxEnergy (void)
 declare the max flux neutrino energy that can be generated (for init. purposes)
bool GenerateNext (void)
 generate the next flux neutrino (return false in err)
int PdgCode (void)
 returns the flux neutrino pdg code
double Weight (void)
 returns the flux neutrino weight (if any)
const TLorentzVector & Momentum (void)
 returns the flux neutrino 4-momentum
const TLorentzVector & Position (void)
 returns the flux neutrino 4-position (note: expect SI rather than physical units)
bool End (void)
 true if no more flux nu's can be thrown (eg reaching end of beam sim ntuples)
long int Index (void)
 returns corresponding index for current flux neutrino (e.g. for a flux ntuple returns the current entry number)
void Clear (Option_t *opt)
 reset state variables based on opt
void GenerateWeighted (bool gen_weighted)
 set whether to generate weighted or unweighted neutrinos
int PdgCodeGenerated (void)
 returns the flux neutrino original pdg code
double Energy (void)
double TravelDist (void)
 returns the distance used in the flavor mixing
void SetBaselineDist (double dist)
double GetBaselineDist (void)
GFluxIAdoptFluxGenerator (GFluxI *generator)
 return previous
GFlavorMixerIAdoptFlavorMixer (GFlavorMixerI *mixer)
 return previous
GFluxIGetFluxGenerator ()
 access, not ownership
GFlavorMixerIGetFlavorMixer ()
 access, not ownership
void PrintConfig (void)
void PrintState (bool verbose=true)
Public Member Functions inherited from genie::GFluxI
virtual ~GFluxI ()

Private Member Functions

int ChooseFlavor (int pdg_init, double energy, double dist)

Private Attributes

GFluxIfRealGFluxI
 actual flux generator
GNuMIFluxfGNuMIFlux
 ref to avoid repeat dynamic_cast
GSimpleNtpFluxfGSimpleFlux
 ref to avoid repeat dynamic_cast
GFlavorMixerIfFlavorMixer
 flavor modification schema
PDGCodeList fPDGListGenerator
 possible flavors from generator
PDGCodeList fPDGListMixed
 possible flavors after mixing
size_t fNPDGOut
double fBaselineDist
 travel dist for mixing (if flux doesn't support GetDecayDist())
double fEnergy
 current neutrino's energy
double fDistance
 current neutrino's travel distance
int fPdgCGenerated
 current neutrino's original flavor
int fPdgCMixed
 current neutrino's new flavor
std::vector< double > fProb
 individual transition probs
std::vector< double > fSumProb
 cummulative probability
double fRndm
 random # used to make choice

Additional Inherited Members

Protected Member Functions inherited from genie::GFluxI
 GFluxI ()

Detailed Description

GENIE GFluxI adapter to allow flavor modification.

    This adapter intervenes between the GENIE GMCJDriver class
    (MC job driver) and a concrete GFluxI flux generator, to
    allow user modification of the neutrino flavor.  This
    modification could be a fixed "swap" or an energy and/or
    distance dependent (standard oscillations) one.

    Because the GMCJDriver only queries the flavor of a
    generated neutrino once, prior to propagation through
    the geometry, this approach is _not_ appropriate with
    use of an oscillatory model in situations where the flavor
    might change significantly over the scale of the geometry.
    In such cases one would have to generate with a fixed flavor
    (energy/distance independent) swap and reweight after the fact.

    Do not use this as a means of selecting only certain flavor
    from flux generators that support other means (e.g. GNuMIFlux,
    GSimpleNtpFlux which have SetFluxParticles(PDGCodeList)) as
    those will be more efficient.
Author
Robert Hatcher <rhatcher \at fnal.gov> Fermi National Accelerator Laboratory
Created:\n 2010/12/22
License:\n Copyright (c) 2003-2025, The GENIE Collaboration
for the full text of the license visit http://copyright.genie-mc.org

Definition at line 52 of file GFluxBlender.h.

Constructor & Destructor Documentation

◆ GFluxBlender()

genie::flux::GFluxBlender::GFluxBlender ( )

Definition at line 32 of file GFluxBlender.cxx.

32 :
33 GFluxI(),
34 fRealGFluxI(0),
35 fGNuMIFlux(0),
36 fGSimpleFlux(0),
37 fFlavorMixer(0),
40 fNPDGOut(0),
42 fEnergy(0),
43 fDistance(0),
45 fPdgCMixed(0)
46{ ; }
double fDistance
current neutrino's travel distance
double fBaselineDist
travel dist for mixing (if flux doesn't support GetDecayDist())
GSimpleNtpFlux * fGSimpleFlux
ref to avoid repeat dynamic_cast
int fPdgCMixed
current neutrino's new flavor
GFluxI * fRealGFluxI
actual flux generator
PDGCodeList fPDGListMixed
possible flavors after mixing
double fEnergy
current neutrino's energy
GNuMIFlux * fGNuMIFlux
ref to avoid repeat dynamic_cast
PDGCodeList fPDGListGenerator
possible flavors from generator
int fPdgCGenerated
current neutrino's original flavor
GFlavorMixerI * fFlavorMixer
flavor modification schema

References fBaselineDist, fDistance, fEnergy, fFlavorMixer, fGNuMIFlux, fGSimpleFlux, fNPDGOut, fPdgCGenerated, fPdgCMixed, fPDGListGenerator, fPDGListMixed, fRealGFluxI, and genie::GFluxI::GFluxI().

◆ ~GFluxBlender()

genie::flux::GFluxBlender::~GFluxBlender ( )

Definition at line 48 of file GFluxBlender.cxx.

49{
50 if ( fRealGFluxI ) { delete fRealGFluxI; fRealGFluxI = 0; }
51 if ( fFlavorMixer ) { delete fFlavorMixer; fFlavorMixer = 0; }
52}

References fFlavorMixer, and fRealGFluxI.

Member Function Documentation

◆ AdoptFlavorMixer()

GFlavorMixerI * genie::flux::GFluxBlender::AdoptFlavorMixer ( GFlavorMixerI * mixer)

return previous

Definition at line 148 of file GFluxBlender.cxx.

149{
150 GFlavorMixerI* oldmix = fFlavorMixer;
151 fFlavorMixer = mixer;
152 return oldmix;
153}

References fFlavorMixer.

◆ AdoptFluxGenerator()

GFluxI * genie::flux::GFluxBlender::AdoptFluxGenerator ( GFluxI * generator)

return previous

Definition at line 134 of file GFluxBlender.cxx.

135{
136 GFluxI* oldgen = fRealGFluxI;
138 // avoid re-casting
139 fGNuMIFlux = dynamic_cast<GNuMIFlux*>(fRealGFluxI);
140 fGSimpleFlux = dynamic_cast<GSimpleNtpFlux*>(fRealGFluxI);
141 // force evaluation of particle lists
142 this->FluxParticles();
143
144 return oldgen;
145}
const PDGCodeList & FluxParticles(void)
declare list of flux neutrinos that can be generated (for init. purposes)
TRandom3 generator(0)

References fGNuMIFlux, fGSimpleFlux, FluxParticles(), fRealGFluxI, generator(), and genie::GFluxI::GFluxI().

◆ ChooseFlavor()

int genie::flux::GFluxBlender::ChooseFlavor ( int pdg_init,
double energy,
double dist )
private

Definition at line 156 of file GFluxBlender.cxx.

157{
158 // choose a new flavor
159 bool isset = false;
160 int pdg_out = 0;
161 double sumprob = 0;
162
163 fRndm = RandomGen::Instance()->RndFlux().Rndm();
164 for (size_t indx = 0; indx < fNPDGOut; ++indx ) {
165 int pdg_test = fPDGListMixed[indx];
166 double prob = fFlavorMixer->Probability(pdg_init,pdg_test,energy,dist);
167 fProb[indx] = prob;
168 sumprob += fProb[indx];
169 fSumProb[indx] = sumprob;
170 if ( ! isset && fRndm < sumprob ) {
171 isset = true;
172 pdg_out = pdg_test;
173 }
174 }
175
176 return pdg_out;
177}
static RandomGen * Instance()
Access instance.
Definition RandomGen.cxx:74
TRandom3 & RndFlux(void) const
rnd number generator used by flux drivers
Definition RandomGen.h:71
std::vector< double > fSumProb
cummulative probability
double fRndm
random # used to make choice
std::vector< double > fProb
individual transition probs

References fFlavorMixer, fNPDGOut, fPDGListMixed, fProb, fRndm, fSumProb, genie::RandomGen::Instance(), and genie::RandomGen::RndFlux().

Referenced by GenerateNext().

◆ Clear()

void genie::flux::GFluxBlender::Clear ( Option_t * opt)
virtual

reset state variables based on opt

Implements genie::GFluxI.

Definition at line 111 of file GFluxBlender.cxx.

112{
113// Clear method needed to conform to GFluxI interface
114//
115 fRealGFluxI->Clear(opt);
116}

References fRealGFluxI.

◆ End()

bool genie::flux::GFluxBlender::End ( void )
inlinevirtual

true if no more flux nu's can be thrown (eg reaching end of beam sim ntuples)

Implements genie::GFluxI.

Definition at line 72 of file GFluxBlender.h.

References fRealGFluxI.

◆ Energy()

double genie::flux::GFluxBlender::Energy ( void )
inline

Definition at line 81 of file GFluxBlender.h.

81{ return fEnergy; } //< returns the current neutrino's energy

References fEnergy.

◆ FluxParticles()

const PDGCodeList & genie::flux::GFluxBlender::FluxParticles ( void )
virtual

declare list of flux neutrinos that can be generated (for init. purposes)

Return (reference to) list of possible neutrinos after mixing. These are PDG code that might be interacted.

Implements genie::GFluxI.

Definition at line 55 of file GFluxBlender.cxx.

56{
57 /// Return (reference to) list of possible neutrinos *after* mixing.
58 /// These are PDG code that might be interacted.
59
60 // this is only ever called by GMCJDriver::GetParticleLists()
61 // during GMCJDriver::Configure() which should happen just once
62 // so don't try to be too clever.
63 fPDGListGenerator = fRealGFluxI->FluxParticles();
64
65 // okay, really stupid at this time ...
66 fPDGListMixed.clear();
67 fPDGListMixed.push_back(kPdgNuE);
68 fPDGListMixed.push_back(kPdgNuMu);
69 fPDGListMixed.push_back(kPdgNuTau);
70 fPDGListMixed.push_back(kPdgAntiNuE);
71 fPDGListMixed.push_back(kPdgAntiNuMu);
73
74 // size the probability arrays to the same number of entries
75 fNPDGOut = fPDGListMixed.size();
76 fProb.resize(fNPDGOut);
77 fSumProb.resize(fNPDGOut);
78
79 if ( ! fFlavorMixer ) return fRealGFluxI->FluxParticles();
80 else return fPDGListMixed;
81}
const int kPdgAntiNuE
Definition PDGCodes.h:29
const int kPdgAntiNuTau
Definition PDGCodes.h:33
const int kPdgNuE
Definition PDGCodes.h:28
const int kPdgNuTau
Definition PDGCodes.h:32
const int kPdgAntiNuMu
Definition PDGCodes.h:31
const int kPdgNuMu
Definition PDGCodes.h:30

References fFlavorMixer, fNPDGOut, fPDGListGenerator, fPDGListMixed, fProb, fRealGFluxI, fSumProb, genie::kPdgAntiNuE, genie::kPdgAntiNuMu, genie::kPdgAntiNuTau, genie::kPdgNuE, genie::kPdgNuMu, and genie::kPdgNuTau.

Referenced by AdoptFluxGenerator().

◆ GenerateNext()

bool genie::flux::GFluxBlender::GenerateNext ( void )
virtual

generate the next flux neutrino (return false in err)

Implements genie::GFluxI.

Definition at line 84 of file GFluxBlender.cxx.

85{
86
87 bool gen1 = false;
88 while ( ! gen1 ) {
89 if ( ! fRealGFluxI->GenerateNext() ) return false;
90 // have a new entry
91 fPdgCGenerated = fRealGFluxI->PdgCode();
92 if ( ! fFlavorMixer ) {
93 // simple case when not configured with a mixing model
95 gen1 = true;
96 } else {
97 // now pick a new flavor
99 if ( fGNuMIFlux ) fDistance = fGNuMIFlux->GetDecayDist();
100 if ( fGSimpleFlux ) fDistance = fGSimpleFlux->GetDecayDist();
101 fEnergy = fRealGFluxI->Momentum().Energy();
103 // we may have to generate a new neutrino if it oscillates away
104 // don't pass non-particles to GENIE ... it won't like it
105 gen1 = ( fPdgCMixed != 0 );
106 }
107 }
108 return true;
109}
int ChooseFlavor(int pdg_init, double energy, double dist)

References ChooseFlavor(), fBaselineDist, fDistance, fEnergy, fFlavorMixer, fGNuMIFlux, fGSimpleFlux, fPdgCGenerated, fPdgCMixed, and fRealGFluxI.

◆ GenerateWeighted()

void genie::flux::GFluxBlender::GenerateWeighted ( bool gen_weighted)
virtual

set whether to generate weighted or unweighted neutrinos

Implements genie::GFluxI.

Definition at line 125 of file GFluxBlender.cxx.

126{
127// Dummy implementation needed to conform to GFluxI interface
128//
129 LOG("FluxBlender", pERROR) <<
130 "No GenerateWeighted(bool gen_weighted) method implemented for " <<
131 "gen_weighted: " << gen_weighted;
132}
#define pERROR
Definition Messenger.h:59
#define LOG(stream, priority)
A macro that returns the requested log4cpp::Category appending a string (using the FILE,...
Definition Messenger.h:96

References LOG, and pERROR.

◆ GetBaselineDist()

double genie::flux::GFluxBlender::GetBaselineDist ( void )
inline

Definition at line 90 of file GFluxBlender.h.

90{ return fBaselineDist; }

References fBaselineDist.

◆ GetFlavorMixer()

GFlavorMixerI * genie::flux::GFluxBlender::GetFlavorMixer ( )
inline

access, not ownership

Definition at line 98 of file GFluxBlender.h.

References fFlavorMixer.

◆ GetFluxGenerator()

GFluxI * genie::flux::GFluxBlender::GetFluxGenerator ( )
inline

access, not ownership

Definition at line 97 of file GFluxBlender.h.

References fRealGFluxI, and genie::GFluxI::GFluxI().

◆ Index()

long int genie::flux::GFluxBlender::Index ( void )
virtual

returns corresponding index for current flux neutrino (e.g. for a flux ntuple returns the current entry number)

Implements genie::GFluxI.

Definition at line 118 of file GFluxBlender.cxx.

119{
120// Index method needed to conform to GFluxI interface
121//
122 return fRealGFluxI->Index();
123}

References fRealGFluxI.

◆ MaxEnergy()

double genie::flux::GFluxBlender::MaxEnergy ( void )
inlinevirtual

declare the max flux neutrino energy that can be generated (for init. purposes)

Implements genie::GFluxI.

Definition at line 66 of file GFluxBlender.h.

References fRealGFluxI.

◆ Momentum()

const TLorentzVector & genie::flux::GFluxBlender::Momentum ( void )
inlinevirtual

returns the flux neutrino 4-momentum

Implements genie::GFluxI.

Definition at line 70 of file GFluxBlender.h.

References fRealGFluxI.

◆ PdgCode()

int genie::flux::GFluxBlender::PdgCode ( void )
inlinevirtual

returns the flux neutrino pdg code

Implements genie::GFluxI.

Definition at line 68 of file GFluxBlender.h.

References fPdgCMixed.

◆ PdgCodeGenerated()

int genie::flux::GFluxBlender::PdgCodeGenerated ( void )
inline

returns the flux neutrino original pdg code

Definition at line 80 of file GFluxBlender.h.

References fPdgCGenerated.

◆ Position()

const TLorentzVector & genie::flux::GFluxBlender::Position ( void )
inlinevirtual

returns the flux neutrino 4-position (note: expect SI rather than physical units)

Implements genie::GFluxI.

Definition at line 71 of file GFluxBlender.h.

References fRealGFluxI.

◆ PrintConfig()

void genie::flux::GFluxBlender::PrintConfig ( void )

Definition at line 180 of file GFluxBlender.cxx.

181{
182 LOG_BEGIN("FluxBlender", pINFO) << "GFluxBlender::PrintConfig()" << LOG_END;
183 if ( fRealGFluxI ) {
184 LOG_BEGIN("FluxBlender", pINFO)
185 << " fRealGFluxI is a \""
186 << typeid(fRealGFluxI).name() << "\""
187 << LOG_END;
188 } else {
189 LOG_BEGIN("FluxBlender", pINFO)
190 << " fRealGFluxI is not initialized" << LOG_END;
191 }
192 if ( fFlavorMixer ) {
193 LOG_BEGIN("FluxBlender", pINFO)
194 << " fFlavorMixer is a \""
195 << typeid(fFlavorMixer).name() << "\""
196 << LOG_END;
197 } else {
198 LOG_BEGIN("FluxBlender", pINFO)
199 << " fFlavorMixer is not initialized" << LOG_END;
200 }
201 LOG_BEGIN("FluxBlender", pINFO)
202 << " BaselineDist " << fBaselineDist << LOG_END;
203 LOG_BEGIN("FluxBlender", pINFO)
204 << "PDG List from Generator" << fPDGListGenerator << LOG_END;
205 LOG_BEGIN("FluxBlender", pINFO)
206 << "PDG List after mixing (n=" << fNPDGOut << ")"
208
209}
#define LOG_BEGIN(a, b)
#define LOG_END
#define pINFO
Definition Messenger.h:62

References fBaselineDist, fFlavorMixer, fNPDGOut, fPDGListGenerator, fPDGListMixed, fRealGFluxI, LOG_BEGIN, LOG_END, and pINFO.

◆ PrintState()

void genie::flux::GFluxBlender::PrintState ( bool verbose = true)

Definition at line 212 of file GFluxBlender.cxx.

213{
214 LOG_BEGIN("FluxBlender", pINFO) << "GFluxBlender::PrintState()" << LOG_END;
215 LOG_BEGIN("FluxBlender", pINFO)
216 << " Flavor " << fPdgCGenerated
217 << " ==> " << fPdgCMixed
218 << " (E=" << fEnergy << ", dist=" << fDistance << ")" << LOG_END;
219 if ( verbose ) {
220 LOG_BEGIN("FluxBlender", pINFO) << " Rndm = " << fRndm << LOG_END;
221 for (size_t indx = 0; indx < fNPDGOut; ++indx ) {
222 LOG_BEGIN("FluxBlender", pINFO)
223 << " [" << indx << "] "
224 << std::setw(3) << fPdgCGenerated << " => "
225 << std::setw(3) << fPDGListMixed[indx]
226 << " p = " << std::setw(10) << fProb[indx]
227 << " sum_p = " << std::setw(10) << fSumProb[indx] << LOG_END;
228 }
229 }
230}

References fDistance, fEnergy, fNPDGOut, fPdgCGenerated, fPdgCMixed, fPDGListMixed, fProb, fRndm, fSumProb, LOG_BEGIN, LOG_END, and pINFO.

◆ SetBaselineDist()

void genie::flux::GFluxBlender::SetBaselineDist ( double dist)
inline

Definition at line 89 of file GFluxBlender.h.

89{ fBaselineDist = dist; }

References fBaselineDist.

◆ TravelDist()

double genie::flux::GFluxBlender::TravelDist ( void )
inline

returns the distance used in the flavor mixing

Definition at line 82 of file GFluxBlender.h.

References fDistance.

◆ Weight()

double genie::flux::GFluxBlender::Weight ( void )
inlinevirtual

returns the flux neutrino weight (if any)

Implements genie::GFluxI.

Definition at line 69 of file GFluxBlender.h.

References fRealGFluxI.

Member Data Documentation

◆ fBaselineDist

double genie::flux::GFluxBlender::fBaselineDist
private

travel dist for mixing (if flux doesn't support GetDecayDist())

Definition at line 116 of file GFluxBlender.h.

Referenced by GenerateNext(), GetBaselineDist(), GFluxBlender(), PrintConfig(), and SetBaselineDist().

◆ fDistance

double genie::flux::GFluxBlender::fDistance
private

current neutrino's travel distance

Definition at line 119 of file GFluxBlender.h.

Referenced by GenerateNext(), GFluxBlender(), PrintState(), and TravelDist().

◆ fEnergy

double genie::flux::GFluxBlender::fEnergy
private

current neutrino's energy

Definition at line 118 of file GFluxBlender.h.

Referenced by Energy(), GenerateNext(), GFluxBlender(), and PrintState().

◆ fFlavorMixer

GFlavorMixerI* genie::flux::GFluxBlender::fFlavorMixer
private

flavor modification schema

Definition at line 110 of file GFluxBlender.h.

Referenced by AdoptFlavorMixer(), ChooseFlavor(), FluxParticles(), GenerateNext(), GetFlavorMixer(), GFluxBlender(), PrintConfig(), and ~GFluxBlender().

◆ fGNuMIFlux

GNuMIFlux* genie::flux::GFluxBlender::fGNuMIFlux
private

ref to avoid repeat dynamic_cast

Definition at line 107 of file GFluxBlender.h.

Referenced by AdoptFluxGenerator(), GenerateNext(), and GFluxBlender().

◆ fGSimpleFlux

GSimpleNtpFlux* genie::flux::GFluxBlender::fGSimpleFlux
private

ref to avoid repeat dynamic_cast

Definition at line 108 of file GFluxBlender.h.

Referenced by AdoptFluxGenerator(), GenerateNext(), and GFluxBlender().

◆ fNPDGOut

size_t genie::flux::GFluxBlender::fNPDGOut
private

of possible output flavors

Definition at line 114 of file GFluxBlender.h.

Referenced by ChooseFlavor(), FluxParticles(), GFluxBlender(), PrintConfig(), and PrintState().

◆ fPdgCGenerated

int genie::flux::GFluxBlender::fPdgCGenerated
private

current neutrino's original flavor

Definition at line 120 of file GFluxBlender.h.

Referenced by GenerateNext(), GFluxBlender(), PdgCodeGenerated(), and PrintState().

◆ fPdgCMixed

int genie::flux::GFluxBlender::fPdgCMixed
private

current neutrino's new flavor

Definition at line 121 of file GFluxBlender.h.

Referenced by GenerateNext(), GFluxBlender(), PdgCode(), and PrintState().

◆ fPDGListGenerator

PDGCodeList genie::flux::GFluxBlender::fPDGListGenerator
private

possible flavors from generator

Definition at line 112 of file GFluxBlender.h.

Referenced by FluxParticles(), GFluxBlender(), and PrintConfig().

◆ fPDGListMixed

PDGCodeList genie::flux::GFluxBlender::fPDGListMixed
private

possible flavors after mixing

Definition at line 113 of file GFluxBlender.h.

Referenced by ChooseFlavor(), FluxParticles(), GFluxBlender(), PrintConfig(), and PrintState().

◆ fProb

std::vector<double> genie::flux::GFluxBlender::fProb
private

individual transition probs

Definition at line 123 of file GFluxBlender.h.

Referenced by ChooseFlavor(), FluxParticles(), and PrintState().

◆ fRealGFluxI

GFluxI* genie::flux::GFluxBlender::fRealGFluxI
private

◆ fRndm

double genie::flux::GFluxBlender::fRndm
private

random # used to make choice

Definition at line 125 of file GFluxBlender.h.

Referenced by ChooseFlavor(), and PrintState().

◆ fSumProb

std::vector<double> genie::flux::GFluxBlender::fSumProb
private

cummulative probability

Definition at line 124 of file GFluxBlender.h.

Referenced by ChooseFlavor(), FluxParticles(), and PrintState().


The documentation for this class was generated from the following files: