Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4NuMuNucleusNcModel Class Reference

#include <G4NuMuNucleusNcModel.hh>

+ Inheritance diagram for G4NuMuNucleusNcModel:

Public Member Functions

 G4NuMuNucleusNcModel (const G4String &name="NuMuNuclNcModel")
 
virtual ~G4NuMuNucleusNcModel ()
 
virtual void InitialiseModel ()
 
virtual G4bool IsApplicable (const G4HadProjectile &aTrack, G4Nucleus &targetNucleus)
 
virtual G4HadFinalStateApplyYourself (const G4HadProjectile &aTrack, G4Nucleus &targetNucleus)
 
void SampleLVkr (const G4HadProjectile &aTrack, G4Nucleus &targetNucleus)
 
G4double GetMinNuMuEnergy ()
 
G4double ThresholdEnergy (G4double mI, G4double mF, G4double mP)
 
virtual void ModelDescription (std::ostream &) const
 
- Public Member Functions inherited from G4NeutrinoNucleusModel
 G4NeutrinoNucleusModel (const G4String &name="neutrino-nucleus")
 
virtual ~G4NeutrinoNucleusModel ()
 
G4double SampleXkr (G4double energy)
 
G4double GetXkr (G4int iEnergy, G4double prob)
 
G4double SampleQkr (G4double energy, G4double xx)
 
G4double GetQkr (G4int iE, G4int jX, G4double prob)
 
void ClusterDecay (G4LorentzVector &lvX, G4int qX)
 
void MesonDecay (G4LorentzVector &lvX, G4int qX)
 
void FinalBarion (G4LorentzVector &lvB, G4int qB, G4int pdgB)
 
void RecoilDeexcitation (G4Fragment &fragment)
 
void FinalMeson (G4LorentzVector &lvM, G4int qM, G4int pdgM)
 
void CoherentPion (G4LorentzVector &lvP, G4int pdgP, G4Nucleus &targetNucleus)
 
void SetCutEnergy (G4double ec)
 
G4double GetCutEnergy ()
 
G4double GetNuEnergy ()
 
G4double GetQtransfer ()
 
G4double GetQ2 ()
 
G4double GetXsample ()
 
G4int GetPDGencoding ()
 
G4bool GetCascade ()
 
G4bool GetString ()
 
G4double GetCosTheta ()
 
G4double GetEmu ()
 
G4double GetEx ()
 
G4double GetMuMass ()
 
G4double GetW2 ()
 
G4double GetM1 ()
 
G4double GetMr ()
 
G4double GetTr ()
 
G4double GetDp ()
 
G4bool GetfBreak ()
 
G4bool GetfCascade ()
 
G4bool GetfString ()
 
G4LorentzVector GetLVl ()
 
G4LorentzVector GetLVh ()
 
G4LorentzVector GetLVt ()
 
G4LorentzVector GetLVcpi ()
 
G4double GetMinNuMuEnergy ()
 
G4double ThresholdEnergy (G4double mI, G4double mF, G4double mP)
 
G4double GetQEratioA ()
 
void SetQEratioA (G4double qea)
 
G4double FinalMomentum (G4double mI, G4double mF, G4double mP, G4LorentzVector lvX)
 
G4double FermiMomentum (G4Nucleus &targetNucleus)
 
G4double NucleonMomentum (G4Nucleus &targetNucleus)
 
G4double GetEx (G4int A, G4bool fP)
 
G4double GgSampleNM (G4Nucleus &nucl)
 
G4int GetEnergyIndex (G4double energy)
 
G4double GetNuMuQeTotRat (G4int index, G4double energy)
 
G4int GetOnePionIndex (G4double energy)
 
G4double GetNuMuOnePionProb (G4int index, G4double energy)
 
G4double CalculateQEratioA (G4int Z, G4int A, G4double energy, G4int nepdg)
 
- Public Member Functions inherited from G4HadronicInteraction
 G4HadronicInteraction (const G4String &modelName="HadronicModel")
 
virtual ~G4HadronicInteraction ()
 
virtual G4double SampleInvariantT (const G4ParticleDefinition *p, G4double plab, G4int Z, G4int A)
 
G4double GetMinEnergy () const
 
G4double GetMinEnergy (const G4Material *aMaterial, const G4Element *anElement) const
 
void SetMinEnergy (G4double anEnergy)
 
void SetMinEnergy (G4double anEnergy, const G4Element *anElement)
 
void SetMinEnergy (G4double anEnergy, const G4Material *aMaterial)
 
G4double GetMaxEnergy () const
 
G4double GetMaxEnergy (const G4Material *aMaterial, const G4Element *anElement) const
 
void SetMaxEnergy (const G4double anEnergy)
 
void SetMaxEnergy (G4double anEnergy, const G4Element *anElement)
 
void SetMaxEnergy (G4double anEnergy, const G4Material *aMaterial)
 
G4int GetVerboseLevel () const
 
void SetVerboseLevel (G4int value)
 
const G4StringGetModelName () const
 
void DeActivateFor (const G4Material *aMaterial)
 
void ActivateFor (const G4Material *aMaterial)
 
void DeActivateFor (const G4Element *anElement)
 
void ActivateFor (const G4Element *anElement)
 
G4bool IsBlocked (const G4Material *aMaterial) const
 
G4bool IsBlocked (const G4Element *anElement) const
 
void SetRecoilEnergyThreshold (G4double val)
 
G4double GetRecoilEnergyThreshold () const
 
virtual const std::pair< G4double, G4doubleGetFatalEnergyCheckLevels () const
 
virtual std::pair< G4double, G4doubleGetEnergyMomentumCheckLevels () const
 
void SetEnergyMomentumCheckLevels (G4double relativeLevel, G4double absoluteLevel)
 
virtual void BuildPhysicsTable (const G4ParticleDefinition &)
 
 G4HadronicInteraction (const G4HadronicInteraction &right)=delete
 
const G4HadronicInteractionoperator= (const G4HadronicInteraction &right)=delete
 
G4bool operator== (const G4HadronicInteraction &right) const =delete
 
G4bool operator!= (const G4HadronicInteraction &right) const =delete
 

Additional Inherited Members

- Protected Member Functions inherited from G4HadronicInteraction
void SetModelName (const G4String &nam)
 
G4bool IsBlocked () const
 
void Block ()
 
- Protected Attributes inherited from G4NeutrinoNucleusModel
G4ParticleDefinitiontheMuonMinus
 
G4ParticleDefinitiontheMuonPlus
 
G4double fSin2tW
 
G4double fCutEnergy
 
G4int fNbin
 
G4int fIndex
 
G4int fEindex
 
G4int fXindex
 
G4int fQindex
 
G4int fOnePionIndex
 
G4int fPDGencoding
 
G4bool fCascade
 
G4bool fString
 
G4bool fProton
 
G4bool f2p2h
 
G4bool fBreak
 
G4double fNuEnergy
 
G4double fQ2
 
G4double fQtransfer
 
G4double fXsample
 
G4double fM1
 
G4double fM2
 
G4double fMt
 
G4double fMu
 
G4double fW2
 
G4double fMpi
 
G4double fW2pi
 
G4double fMinNuEnergy
 
G4double fDp
 
G4double fTr
 
G4double fEmu
 
G4double fEmuPi
 
G4double fEx
 
G4double fMr
 
G4double fCosTheta
 
G4double fCosThetaPi
 
G4double fQEratioA
 
G4LorentzVector fLVh
 
G4LorentzVector fLVl
 
G4LorentzVector fLVt
 
G4LorentzVector fLVcpi
 
G4GeneratorPrecompoundInterfacefPrecoInterface
 
G4PreCompoundModelfPreCompound
 
G4ExcitationHandlerfDeExcitation
 
G4NucleusfRecoil
 
G4int fSecID
 
- Protected Attributes inherited from G4HadronicInteraction
G4HadFinalState theParticleChange
 
G4int verboseLevel
 
G4double theMinEnergy
 
G4double theMaxEnergy
 
G4bool isBlocked
 
- Static Protected Attributes inherited from G4NeutrinoNucleusModel
static const G4int fResNumber = 6
 
static const G4double fResMass [6]
 
static const G4int fClustNumber = 4
 
static const G4double fMesMass [4] = {1260., 980., 770., 139.57}
 
static const G4int fMesPDG [4] = {20213, 9000211, 213, 211}
 
static const G4double fBarMass [4] = {1700., 1600., 1232., 939.57}
 
static const G4int fBarPDG [4] = {12224, 32224, 2224, 2212}
 
static const G4double fNuMuResQ [50][50]
 
static const G4double fNuMuEnergy [50]
 
static const G4double fNuMuQeTotRat [50]
 
static const G4double fOnePionEnergy [58]
 
static const G4double fOnePionProb [58]
 
static const G4double fNuMuEnergyLogVector [50]
 
static G4double fNuMuXarrayKR [50][51] = {{1.0}}
 
static G4double fNuMuXdistrKR [50][50] = {{1.0}}
 
static G4double fNuMuQarrayKR [50][51][51] = {{{1.0}}}
 
static G4double fNuMuQdistrKR [50][51][50] = {{{1.0}}}
 
static const G4double fQEnergy [50]
 
static const G4double fANeMuQEratio [50]
 
static const G4double fNeMuQEratio [50]
 

Detailed Description

Definition at line 60 of file G4NuMuNucleusNcModel.hh.

Constructor & Destructor Documentation

◆ G4NuMuNucleusNcModel()

G4NuMuNucleusNcModel::G4NuMuNucleusNcModel ( const G4String & name = "NuMuNuclNcModel")

Definition at line 68 of file G4NuMuNucleusNcModel.cc.

70{
71 SetMinEnergy( 0.0*GeV );
72 SetMaxEnergy( 100.*TeV );
73 SetMinEnergy(1.e-6*eV);
74
75 theNuMu = G4NeutrinoMu::NeutrinoMu();
77
78 fMnumu = 0.;
79 fData = fMaster = false;
81
82}
static G4AntiNeutrinoMu * AntiNeutrinoMu()
void SetMinEnergy(G4double anEnergy)
void SetMaxEnergy(const G4double anEnergy)
static G4NeutrinoMu * NeutrinoMu()
G4NeutrinoNucleusModel(const G4String &name="neutrino-nucleus")

◆ ~G4NuMuNucleusNcModel()

G4NuMuNucleusNcModel::~G4NuMuNucleusNcModel ( )
virtual

Definition at line 85 of file G4NuMuNucleusNcModel.cc.

86{}

Member Function Documentation

◆ ApplyYourself()

G4HadFinalState * G4NuMuNucleusNcModel::ApplyYourself ( const G4HadProjectile & aTrack,
G4Nucleus & targetNucleus )
virtual

Implements G4NeutrinoNucleusModel.

Definition at line 220 of file G4NuMuNucleusNcModel.cc.

222{
224 fProton = f2p2h = fBreak = false;
225 const G4HadProjectile* aParticle = &aTrack;
226 G4double energy = aParticle->GetTotalEnergy();
227
228 G4String pName = aParticle->GetDefinition()->GetParticleName();
229
230 if( energy < fMinNuEnergy )
231 {
234 return &theParticleChange;
235 }
236 SampleLVkr( aTrack, targetNucleus);
237
238 if( fBreak == true || fEmu < fMnumu ) // ~5*10^-6
239 {
240 // G4cout<<"ni, ";
243 return &theParticleChange;
244 }
245
246 // LVs of initial state
247
248 G4LorentzVector lvp1 = aParticle->Get4Momentum();
249 G4LorentzVector lvt1( 0., 0., 0., fM1 );
251
252 // 1-pi by fQtransfer && nu-energy
253 G4LorentzVector lvpip1( 0., 0., 0., mPip );
254 G4LorentzVector lvsum, lv2, lvX;
255 G4ThreeVector eP;
256 G4double cost(1.), sint(0.), phi(0.), muMom(0.), massX2(0.);
257 G4DynamicParticle* aLept = nullptr; // lepton lv
258
259 G4int Z = targetNucleus.GetZ_asInt();
260 G4int A = targetNucleus.GetA_asInt();
261 G4double mTarg = targetNucleus.AtomicMass(A,Z);
262 G4int pdgP(0), qB(0);
263 // G4double mSum = G4ParticleTable::GetParticleTable()->FindParticle(2212)->GetPDGMass() + mPip;
264
265 G4int iPi = GetOnePionIndex(energy);
266 G4double p1pi = GetNuMuOnePionProb( iPi, energy);
267
268 if( p1pi > G4UniformRand() && fCosTheta > 0.9 ) // && fQtransfer < 0.95*GeV ) // mu- & coherent pion + nucleus
269 {
270 // lvsum = lvp1 + lvpip1;
271 lvsum = lvp1 + lvt1;
272 // cost = fCosThetaPi;
273 cost = fCosTheta;
274 sint = std::sqrt( (1.0 - cost)*(1.0 + cost) );
275 phi = G4UniformRand()*CLHEP::twopi;
276 eP = G4ThreeVector( sint*std::cos(phi), sint*std::sin(phi), cost );
277
278 // muMom = sqrt(fEmuPi*fEmuPi-fMnumu*fMnumu);
279 muMom = sqrt(fEmu*fEmu-fMnumu*fMnumu);
280
281 eP *= muMom;
282
283 // lv2 = G4LorentzVector( eP, fEmuPi );
284 lv2 = G4LorentzVector( eP, fEmu );
285 lv2 = fLVl;
286
287 lvX = lvsum - lv2;
288 lvX = fLVh;
289 massX2 = lvX.m2();
290 G4double massX = lvX.m();
291 G4double massR = fLVt.m();
292
293 // if ( massX2 <= 0. ) // vmg: very rarely ~ (1-4)e-6 due to big Q2/x, to be improved
294 if ( massX2 <= fM1*fM1 ) // 9-3-20 vmg: very rarely ~ (1-4)e-6 due to big Q2/x, to be improved
295 if ( lvX.e() <= fM1 ) // 9-3-20 vmg: very rarely ~ (1-4)e-6 due to big Q2/x, to be improved
296 {
299 return &theParticleChange;
300 }
301 fW2 = massX2;
302
303 if( pName == "nu_mu" ) aLept = new G4DynamicParticle( theNuMu, lv2 );
304 else if( pName == "anti_nu_mu") aLept = new G4DynamicParticle( theANuMu, lv2 );
305 else
306 {
309 return &theParticleChange;
310 }
311
312 pdgP = 111;
313
314 G4double eCut; // = fMpi + 0.5*(fMpi*fMpi - massX2)/mTarg; // massX -> fMpi
315
316 if( A > 1 )
317 {
318 eCut = (fMpi + mTarg)*(fMpi + mTarg) - (massX + massR)*(massX + massR);
319 eCut /= 2.*massR;
320 eCut += massX;
321 }
322 else eCut = fM1 + fMpi;
323
324 if ( lvX.e() > eCut ) // && sqrt( GetW2() ) < 1.4*GeV ) //
325 {
326 CoherentPion( lvX, pdgP, targetNucleus);
327 }
328 else
329 {
332 return &theParticleChange;
333 }
335
336 return &theParticleChange;
337 }
338 else // lepton part in lab
339 {
340 lvsum = lvp1 + lvt1;
341 cost = fCosTheta;
342 sint = std::sqrt( (1.0 - cost)*(1.0 + cost) );
343 phi = G4UniformRand()*CLHEP::twopi;
344 eP = G4ThreeVector( sint*std::cos(phi), sint*std::sin(phi), cost );
345
346 muMom = sqrt(fEmu*fEmu-fMnumu*fMnumu);
347
348 eP *= muMom;
349
350 lv2 = G4LorentzVector( eP, fEmu );
351
352 lvX = lvsum - lv2;
353
354 massX2 = lvX.m2();
355
356 if ( massX2 <= 0. ) // vmg: very rarely ~ (1-4)e-6 due to big Q2/x, to be improved
357 {
360 return &theParticleChange;
361 }
362 fW2 = massX2;
363
364 aLept = new G4DynamicParticle( theNuMu, lv2 );
365
367 }
368
369 // hadron part
370
371 fRecoil = nullptr;
372 fCascade = false;
373 fString = false;
374
375 if( A == 1 )
376 {
377 qB = 1;
378
379 // if( G4UniformRand() > 0.1 ) // > 0.9999 ) // > 0.0001 ) //
380 {
381 ClusterDecay( lvX, qB );
382 }
383 return &theParticleChange;
384 }
385 G4Nucleus recoil;
386 G4double rM(0.), ratio = G4double(Z)/G4double(A);
387
388 if( ratio > G4UniformRand() ) // proton is excited
389 {
390 fProton = true;
391 recoil = G4Nucleus(A-1,Z-1);
392 fRecoil = &recoil;
393 rM = recoil.AtomicMass(A-1,Z-1);
394
397 }
398 else // excited neutron
399 {
400 fProton = false;
401 recoil = G4Nucleus(A-1,Z);
402 fRecoil = &recoil;
403 rM = recoil.AtomicMass(A-1,Z);
404
407 }
408 // G4int index = GetEnergyIndex(energy);
409 G4int nepdg = aParticle->GetDefinition()->GetPDGEncoding();
410
411 G4double qeTotRat; // = GetNuMuQeTotRat(index, energy);
412 qeTotRat = CalculateQEratioA( Z, A, energy, nepdg);
413
414 G4ThreeVector dX = (lvX.vect()).unit();
415 G4double eX = lvX.e(); // excited nucleon
416 G4double mX = sqrt(massX2);
417
418 if( qeTotRat > G4UniformRand() || mX <= fMt ) // || eX <= 1232.*MeV) // QE
419 {
420 fString = false;
421
422 if( fProton )
423 {
424 fPDGencoding = 2212;
425 fMr = proton_mass_c2;
426 recoil = G4Nucleus(A-1,Z-1);
427 fRecoil = &recoil;
428 rM = recoil.AtomicMass(A-1,Z-1);
429 }
430 else
431 {
432 fPDGencoding = 2112;
434 FindParticle(fPDGencoding)->GetPDGMass(); // 939.5654133*MeV;
435 recoil = G4Nucleus(A-1,Z);
436 fRecoil = &recoil;
437 rM = recoil.AtomicMass(A-1,Z);
438 }
439 G4double eTh = fMr+0.5*(fMr*fMr-mX*mX)/rM;
440
441 if(eX <= eTh) // vmg, very rarely out of kinematics
442 {
445 return &theParticleChange;
446 }
447 FinalBarion( lvX, 0, fPDGencoding ); // p(n)+deexcited recoil
448 }
449 else // if ( eX < 9500000.*GeV ) // < 25.*GeV) // < 95.*GeV ) // < 2.5*GeV ) //cluster decay
450 {
451 if ( fProton && pName == "nu_mu" ) qB = 1;
452 else if( !fProton && pName == "nu_mu" ) qB = 0;
453
454 ClusterDecay( lvX, qB );
455 }
456 return &theParticleChange;
457}
CLHEP::HepLorentzVector G4LorentzVector
CLHEP::Hep3Vector G4ThreeVector
double G4double
Definition G4Types.hh:83
int G4int
Definition G4Types.hh:85
const G4double A[17]
#define G4UniformRand()
Definition Randomize.hh:52
Hep3Vector unit() const
Hep3Vector vect() const
void AddSecondary(G4DynamicParticle *aP, G4int mod=-1)
void SetEnergyChange(G4double anEnergy)
void SetMomentumChange(const G4ThreeVector &aV)
const G4ParticleDefinition * GetDefinition() const
const G4LorentzVector & Get4Momentum() const
G4double GetTotalEnergy() const
void CoherentPion(G4LorentzVector &lvP, G4int pdgP, G4Nucleus &targetNucleus)
G4int GetOnePionIndex(G4double energy)
G4double GetNuMuOnePionProb(G4int index, G4double energy)
G4double CalculateQEratioA(G4int Z, G4int A, G4double energy, G4int nepdg)
void ClusterDecay(G4LorentzVector &lvX, G4int qX)
void FinalBarion(G4LorentzVector &lvB, G4int qB, G4int pdgB)
void SampleLVkr(const G4HadProjectile &aTrack, G4Nucleus &targetNucleus)
G4int GetA_asInt() const
Definition G4Nucleus.hh:99
G4int GetZ_asInt() const
Definition G4Nucleus.hh:105
G4double AtomicMass(const G4double A, const G4double Z, const G4int numberOfLambdas=0) const
Definition G4Nucleus.cc:369
const G4String & GetParticleName() const
G4ParticleDefinition * FindParticle(G4int PDGEncoding)
static G4ParticleTable * GetParticleTable()
G4double energy(const ThreeVector &p, const G4double m)

◆ GetMinNuMuEnergy()

G4double G4NuMuNucleusNcModel::GetMinNuMuEnergy ( )
inline

Definition at line 81 of file G4NuMuNucleusNcModel.hh.

81{ return fMnumu + 0.5*fMnumu*fMnumu/fM1 + 4.*CLHEP::keV; }; // kinematics + accuracy for sqrts

◆ InitialiseModel()

void G4NuMuNucleusNcModel::InitialiseModel ( )
virtual

Reimplemented from G4HadronicInteraction.

Definition at line 102 of file G4NuMuNucleusNcModel.cc.

103{
104 G4String pName = "nu_mu";
105
106 G4int nSize(0), i(0), j(0), k(0);
107
108 if(!fData)
109 {
110#ifdef G4MULTITHREADED
111 G4MUTEXLOCK(&numuNucleusModel);
112 if(!fData)
113 {
114#endif
115 fMaster = true;
116#ifdef G4MULTITHREADED
117 }
118 G4MUTEXUNLOCK(&numuNucleusModel);
119#endif
120 }
121
122 if(fMaster)
123 {
124 const char* path = G4FindDataDir("G4PARTICLEXSDATA");
125 std::ostringstream ost1, ost2, ost3, ost4;
126 ost1 << path << "/" << "neutrino" << "/" << pName << "/xarraynckr";
127
128 std::ifstream filein1( ost1.str().c_str() );
129
130 // filein.open("$PARTICLEXSDATA/");
131
132 filein1>>nSize;
133
134 for( k = 0; k < fNbin; ++k )
135 {
136 for( i = 0; i <= fNbin; ++i )
137 {
138 filein1 >> fNuMuXarrayKR[k][i];
139 // G4cout<< fNuMuXarrayKR[k][i] << " ";
140 }
141 }
142 // G4cout<<G4endl<<G4endl;
143
144 ost2 << path << "/" << "neutrino" << "/" << pName << "/xdistrnckr";
145 std::ifstream filein2( ost2.str().c_str() );
146
147 filein2>>nSize;
148
149 for( k = 0; k < fNbin; ++k )
150 {
151 for( i = 0; i < fNbin; ++i )
152 {
153 filein2 >> fNuMuXdistrKR[k][i];
154 // G4cout<< fNuMuXdistrKR[k][i] << " ";
155 }
156 }
157 // G4cout<<G4endl<<G4endl;
158
159 ost3 << path << "/" << "neutrino" << "/" << pName << "/q2arraynckr";
160 std::ifstream filein3( ost3.str().c_str() );
161
162 filein3>>nSize;
163
164 for( k = 0; k < fNbin; ++k )
165 {
166 for( i = 0; i <= fNbin; ++i )
167 {
168 for( j = 0; j <= fNbin; ++j )
169 {
170 filein3 >> fNuMuQarrayKR[k][i][j];
171 // G4cout<< fNuMuQarrayKR[k][i][j] << " ";
172 }
173 }
174 }
175 // G4cout<<G4endl<<G4endl;
176
177 ost4 << path << "/" << "neutrino" << "/" << pName << "/q2distrnckr";
178 std::ifstream filein4( ost4.str().c_str() );
179
180 filein4>>nSize;
181
182 for( k = 0; k < fNbin; ++k )
183 {
184 for( i = 0; i <= fNbin; ++i )
185 {
186 for( j = 0; j < fNbin; ++j )
187 {
188 filein4 >> fNuMuQdistrKR[k][i][j];
189 // G4cout<< fNuMuQdistrKR[k][i][j] << " ";
190 }
191 }
192 }
193 fData = true;
194 }
195}
const char * G4FindDataDir(const char *)
#define G4MUTEXLOCK(mutex)
#define G4MUTEXUNLOCK(mutex)
static G4double fNuMuQarrayKR[50][51][51]
static G4double fNuMuXarrayKR[50][51]
static G4double fNuMuXdistrKR[50][50]
static G4double fNuMuQdistrKR[50][51][50]

Referenced by G4NuMuNucleusNcModel().

◆ IsApplicable()

G4bool G4NuMuNucleusNcModel::IsApplicable ( const G4HadProjectile & aTrack,
G4Nucleus & targetNucleus )
virtual

Reimplemented from G4NeutrinoNucleusModel.

Definition at line 199 of file G4NuMuNucleusNcModel.cc.

201{
202 G4bool result = false;
203 G4String pName = aPart.GetDefinition()->GetParticleName();
204 G4double energy = aPart.GetTotalEnergy();
205
206 if( pName == "nu_mu" // || pName == "anti_nu_mu" )
207 &&
208 energy > fMinNuEnergy )
209 {
210 result = true;
211 }
212
213 return result;
214}
bool G4bool
Definition G4Types.hh:86

◆ ModelDescription()

void G4NuMuNucleusNcModel::ModelDescription ( std::ostream & outFile) const
virtual

Reimplemented from G4NeutrinoNucleusModel.

Definition at line 89 of file G4NuMuNucleusNcModel.cc.

90{
91
92 outFile << "G4NuMuNucleusNcModel is a neutrino-nucleus (neutral current) scattering\n"
93 << "model which uses the standard model \n"
94 << "transfer parameterization. The model is fully relativistic\n";
95
96}

◆ SampleLVkr()

void G4NuMuNucleusNcModel::SampleLVkr ( const G4HadProjectile & aTrack,
G4Nucleus & targetNucleus )

Definition at line 468 of file G4NuMuNucleusNcModel.cc.

469{
470 fBreak = false;
471 G4int A = targetNucleus.GetA_asInt(), iTer(0), iTerMax(100);
472 G4int Z = targetNucleus.GetZ_asInt();
473 G4double e3(0.), pMu2(0.), pX2(0.), nMom(0.), rM(0.), hM(0.), tM = targetNucleus.AtomicMass(A,Z);
474 G4double cost(1.), sint(0.), phi(0.), muMom(0.);
475 G4ThreeVector eP, bst;
476 const G4HadProjectile* aParticle = &aTrack;
477 G4LorentzVector lvp1 = aParticle->Get4Momentum();
478 nMom = NucleonMomentum( targetNucleus );
479
480 if( A == 1 || nMom == 0. ) // hydrogen, no Fermi motion ???
481 {
482 fNuEnergy = aParticle->GetTotalEnergy();
483 iTer = 0;
484
485 do
486 {
490
491 if( fXsample > 0. )
492 {
493 fW2 = fM1*fM1 - fQ2 + fQ2/fXsample; // sample excited hadron mass
495 }
496 else
497 {
498 fW2 = fM1*fM1;
499 fEmu = fNuEnergy;
500 }
501 e3 = fNuEnergy + fM1 - fEmu;
502
503 // if( e3 < sqrt(fW2) ) G4cout<<"energyX = "<<e3/GeV<<", fW = "<<sqrt(fW2)/GeV<<G4endl; // vmg ~10^-5 for NC
504
505 pMu2 = fEmu*fEmu - fMnumu*fMnumu;
506 pX2 = e3*e3 - fW2;
507
508 fCosTheta = fNuEnergy*fNuEnergy + pMu2 - pX2;
509 fCosTheta /= 2.*fNuEnergy*sqrt(pMu2);
510 iTer++;
511 }
512 while( ( abs(fCosTheta) > 1. || fEmu < fMnumu ) && iTer < iTerMax );
513
514 if( iTer >= iTerMax ) { fBreak = true; return; }
515
516 if( abs(fCosTheta) > 1.) // vmg: due to big Q2/x values. To be improved ...
517 {
518 G4cout<<"H2: fCosTheta = "<<fCosTheta<<", fEmu = "<<fEmu<<G4endl;
519 // fCosTheta = -1. + 2.*G4UniformRand();
520 if(fCosTheta < -1.) fCosTheta = -1.;
521 if(fCosTheta > 1.) fCosTheta = 1.;
522 }
523 // LVs
524
525 G4LorentzVector lvt1 = G4LorentzVector( 0., 0., 0., fM1 );
526 G4LorentzVector lvsum = lvp1 + lvt1;
527
528 cost = fCosTheta;
529 sint = std::sqrt( (1.0 - cost)*(1.0 + cost) );
530 phi = G4UniformRand()*CLHEP::twopi;
531 eP = G4ThreeVector( sint*std::cos(phi), sint*std::sin(phi), cost );
532 muMom = sqrt(fEmu*fEmu-fMnumu*fMnumu);
533 eP *= muMom;
534 fLVl = G4LorentzVector( eP, fEmu );
535
536 fLVh = lvsum - fLVl;
537 fLVt = G4LorentzVector( 0., 0., 0., 0. ); // no recoil
538 }
539 else // Fermi motion, Q2 in nucleon rest frame
540 {
541 G4ThreeVector nMomDir = nMom*G4RandomDirection();
542
543 if( !f2p2h ) // 1p1h
544 {
545 G4Nucleus recoil(A-1,Z);
546 rM = sqrt( recoil.AtomicMass(A-1,Z)*recoil.AtomicMass(A-1,Z) + nMom*nMom );
547 hM = tM - rM;
548
549 fLVt = G4LorentzVector( nMomDir, sqrt( rM*rM+nMom*nMom ) );
550 fLVh = G4LorentzVector(-nMomDir, sqrt( hM*hM+nMom*nMom ) );
551 }
552 else // 2p2h
553 {
554 G4Nucleus recoil(A-2,Z-1);
555 rM = recoil.AtomicMass(A-2,Z-1)+sqrt(nMom*nMom+fM1*fM1);
556 hM = tM - rM;
557
558 fLVt = G4LorentzVector( nMomDir, sqrt( rM*rM+nMom*nMom ) );
559 fLVh = G4LorentzVector(-nMomDir, sqrt( hM*hM+nMom*nMom ) );
560 }
561 // G4cout<<hM<<", ";
562 // bst = fLVh.boostVector(); // 9-3-20
563
564 // lvp1.boost(-bst); // 9-3-20 -> nucleon rest system, where Q2 transfer is ???
565
566 fNuEnergy = lvp1.e();
567 iTer = 0;
568
569 do
570 {
574
575 if( fXsample > 0. )
576 {
577 fW2 = fM1*fM1 - fQ2 + fQ2/fXsample; // sample excited hadron mass
579 }
580 else
581 {
582 fW2 = fM1*fM1;
583 fEmu = fNuEnergy;
584 }
585
586 // if(fEmu < 0.) G4cout<<"fEmu = "<<fEmu<<" hM = "<<hM<<G4endl;
587
588 e3 = fNuEnergy + fM1 - fEmu;
589
590 // if( e3 < sqrt(fW2) ) G4cout<<"energyX = "<<e3/GeV<<", fW = "<<sqrt(fW2)/GeV<<G4endl;
591
592 pMu2 = fEmu*fEmu - fMnumu*fMnumu;
593 pX2 = e3*e3 - fW2;
594
595 fCosTheta = fNuEnergy*fNuEnergy + pMu2 - pX2;
596 fCosTheta /= 2.*fNuEnergy*sqrt(pMu2);
597 iTer++;
598 }
599 while( ( abs(fCosTheta) > 1. || fEmu < fMnumu ) && iTer < iTerMax );
600
601 if( iTer >= iTerMax ) { fBreak = true; return; }
602
603 if( abs(fCosTheta) > 1.) // vmg: due to big Q2/x values. To be improved ...
604 {
605 G4cout<<"FM: fCosTheta = "<<fCosTheta<<", fEmu = "<<fEmu<<G4endl;
606 // fCosTheta = -1. + 2.*G4UniformRand();
607 if(fCosTheta < -1.) fCosTheta = -1.;
608 if(fCosTheta > 1.) fCosTheta = 1.;
609 }
610 // LVs
611 G4LorentzVector lvt1 = G4LorentzVector( 0., 0., 0., fM1 );
612 G4LorentzVector lvsum = lvp1 + lvt1;
613
614 cost = fCosTheta;
615 sint = std::sqrt( (1.0 - cost)*(1.0 + cost) );
616 phi = G4UniformRand()*CLHEP::twopi;
617 eP = G4ThreeVector( sint*std::cos(phi), sint*std::sin(phi), cost );
618 muMom = sqrt(fEmu*fEmu-fMnumu*fMnumu);
619 eP *= muMom;
620 fLVl = G4LorentzVector( eP, fEmu );
621 fLVh = lvsum - fLVl;
622 // back to lab system
623 // fLVl.boost(bst); // 9-3-20
624 // fLVh.boost(bst); // 9-3-20
625 }
626 //G4cout<<iTer<<", "<<fBreak<<"; ";
627}
G4ThreeVector G4RandomDirection()
#define G4endl
Definition G4ios.hh:67
G4GLOB_DLL std::ostream G4cout
G4double NucleonMomentum(G4Nucleus &targetNucleus)
G4double SampleXkr(G4double energy)
G4double SampleQkr(G4double energy, G4double xx)

Referenced by ApplyYourself().

◆ ThresholdEnergy()

G4double G4NuMuNucleusNcModel::ThresholdEnergy ( G4double mI,
G4double mF,
G4double mP )
inline

Definition at line 83 of file G4NuMuNucleusNcModel.hh.

84 {
85 G4double w = std::sqrt(fW2);
86 return w + 0.5*( (mP+mF)*(mP+mF)-(w+mI)*(w+mI) )/mI;
87 };

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