#include <G4VPartonStringModel.hh>
Inheritance diagram for G4VPartonStringModel:
Public Member Functions | |
G4VPartonStringModel (const G4String &modelName="Parton String Model") | |
virtual | ~G4VPartonStringModel () |
void | SetFragmentationModel (G4VStringFragmentation *aModel) |
G4KineticTrackVector * | Scatter (const G4Nucleus &theNucleus, const G4DynamicParticle &thePrimary) |
virtual G4V3DNucleus * | GetWoundedNucleus () const =0 |
virtual void | ModelDescription (std::ostream &outFile) const |
Protected Member Functions | |
virtual void | Init (const G4Nucleus &theNucleus, const G4DynamicParticle &thePrimary)=0 |
virtual G4ExcitedStringVector * | GetStrings ()=0 |
void | SetThisPointer (G4VPartonStringModel *aPointer) |
G4bool | EnergyAndMomentumCorrector (G4KineticTrackVector *Output, G4LorentzVector &TotalCollisionMomentum) |
Definition at line 51 of file G4VPartonStringModel.hh.
G4VPartonStringModel::G4VPartonStringModel | ( | const G4String & | modelName = "Parton String Model" |
) |
Definition at line 48 of file G4VPartonStringModel.cc.
References G4ShortLivedConstructor::ConstructParticle().
00049 : G4VHighEnergyGenerator(modelName), 00050 stringFragmentationModel(0), 00051 theThis(0) 00052 { 00053 // Make shure Shotrylived partyicles are constructed. 00054 G4ShortLivedConstructor ShortLived; 00055 ShortLived.ConstructParticle(); 00056 }
G4VPartonStringModel::~G4VPartonStringModel | ( | ) | [virtual] |
G4bool G4VPartonStringModel::EnergyAndMomentumCorrector | ( | G4KineticTrackVector * | Output, | |
G4LorentzVector & | TotalCollisionMomentum | |||
) | [protected] |
virtual G4ExcitedStringVector* G4VPartonStringModel::GetStrings | ( | ) | [protected, pure virtual] |
Implemented in G4FTFModel, G4QGSModel< ParticipantType >, G4QGSModel< G4GammaParticipants >, and G4QGSModel< G4QGSParticipants >.
Referenced by Scatter().
virtual G4V3DNucleus* G4VPartonStringModel::GetWoundedNucleus | ( | ) | const [pure virtual] |
Implements G4VHighEnergyGenerator.
Implemented in G4FTFModel, G4QGSModel< ParticipantType >, G4QGSModel< G4GammaParticipants >, and G4QGSModel< G4QGSParticipants >.
Referenced by Scatter().
virtual void G4VPartonStringModel::Init | ( | const G4Nucleus & | theNucleus, | |
const G4DynamicParticle & | thePrimary | |||
) | [protected, pure virtual] |
Implemented in G4FTFModel, G4QGSModel< ParticipantType >, G4QGSModel< G4GammaParticipants >, and G4QGSModel< G4QGSParticipants >.
Referenced by Scatter().
void G4VPartonStringModel::ModelDescription | ( | std::ostream & | outFile | ) | const [virtual] |
Reimplemented from G4VHighEnergyGenerator.
Reimplemented in G4FTFModel, G4QGSModel< ParticipantType >, G4QGSModel< G4GammaParticipants >, and G4QGSModel< G4QGSParticipants >.
Definition at line 171 of file G4VPartonStringModel.cc.
References G4VHighEnergyGenerator::GetModelName().
00172 { 00173 outFile << GetModelName() << " has no description yet.\n"; 00174 }
G4KineticTrackVector * G4VPartonStringModel::Scatter | ( | const G4Nucleus & | theNucleus, | |
const G4DynamicParticle & | thePrimary | |||
) | [virtual] |
Implements G4VHighEnergyGenerator.
Definition at line 62 of file G4VPartonStringModel.cc.
References G4Nucleon::AreYouHit(), G4VStringFragmentation::FragmentStrings(), G4cout, G4endl, G4Nucleon::Get4Momentum(), G4DynamicParticle::Get4Momentum(), G4V3DNucleus::GetCharge(), G4Nucleon::GetDefinition(), G4IonTable::GetIonMass(), G4ParticleTable::GetIonTable(), G4V3DNucleus::GetMassNumber(), G4DynamicParticle::GetMomentum(), G4V3DNucleus::GetNextNucleon(), G4ParticleTable::GetParticleTable(), GetStrings(), GetWoundedNucleus(), Init(), G4Proton::Proton(), G4DynamicParticle::Set4Momentum(), and G4V3DNucleus::StartLoop().
00064 { 00065 G4ExcitedStringVector * strings = NULL; 00066 00067 G4DynamicParticle thePrimary=aPrimary; 00068 00069 G4LorentzRotation toZ; 00070 G4LorentzVector Ptmp=thePrimary.Get4Momentum(); 00071 toZ.rotateZ(-1*Ptmp.phi()); 00072 toZ.rotateY(-1*Ptmp.theta()); 00073 thePrimary.Set4Momentum(toZ*Ptmp); 00074 G4LorentzRotation toLab(toZ.inverse()); 00075 00076 G4int attempts = 0, maxAttempts=20; 00077 while ( strings == NULL ) 00078 { 00079 if (attempts++ > maxAttempts ) 00080 { 00081 throw G4HadronicException(__FILE__, __LINE__, "G4VPartonStringModel::Scatter(): fails to generate strings"); 00082 } 00083 00084 theThis->Init(theNucleus,thePrimary); 00085 00086 strings = GetStrings(); 00087 } 00088 00089 G4double stringEnergy(0); 00090 G4LorentzVector SumStringMom(0.,0.,0.,0.); 00091 00092 for ( unsigned int astring=0; astring < strings->size(); astring++) 00093 { 00094 // rotate string to lab frame, models have it aligned to z 00095 stringEnergy += (*strings)[astring]->GetLeftParton()->Get4Momentum().t(); 00096 stringEnergy += (*strings)[astring]->GetRightParton()->Get4Momentum().t(); 00097 (*strings)[astring]->LorentzRotate(toLab); 00098 SumStringMom+=(*strings)[astring]->Get4Momentum(); 00099 } 00100 00101 G4double InvMass=SumStringMom.mag(); 00102 00103 //#define debug_PartonStringModel 00104 #ifdef debug_PartonStringModel 00105 00106 G4V3DNucleus * fancynucleus=theThis->GetWoundedNucleus(); 00107 00108 // loop over wounded nucleus 00109 G4int hits(0), charged_hits(0); 00110 G4ThreeVector hitNucleonMomentum(0.,0.,0.); 00111 G4Nucleon * theCurrentNucleon = fancynucleus->StartLoop() ? fancynucleus->GetNextNucleon() : NULL; 00112 while( theCurrentNucleon ) 00113 { 00114 if(theCurrentNucleon->AreYouHit()) 00115 { 00116 hits++; 00117 hitNucleonMomentum += theCurrentNucleon->Get4Momentum().vect(); 00118 if ( theCurrentNucleon->GetDefinition() == G4Proton::Proton() ) ++charged_hits; 00119 } 00120 theCurrentNucleon = fancynucleus->GetNextNucleon(); 00121 } 00122 00123 G4int initialZ=fancynucleus->GetCharge(); 00124 G4int initialA=fancynucleus->GetMassNumber(); 00125 G4double initial_mass=G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(initialZ,initialA); 00126 G4double final_mass = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(initialZ-charged_hits, initialA-hits); 00127 G4cout << "G4VPSM: strE, hit nucleons, Primary, SumStringE, nucleus intial, nucleus final, excitation estimate " 00128 << stringEnergy << " " << hits << ", " << Ptmp.e() << ", "<< SumStringMom.e() << ", " 00129 << initial_mass<< ", " << final_mass<< ", " << Ptmp.e() + initial_mass - final_mass - stringEnergy << G4endl; 00130 G4cout << "momentum balance " << thePrimary.GetMomentum() + hitNucleonMomentum - SumStringMom.vect()<< G4endl; 00131 #endif 00132 00133 // Fragment strings 00134 00135 G4KineticTrackVector * theResult = 0; 00136 G4double SumMass(0.); 00137 attempts = 0; 00138 maxAttempts=100; 00139 do 00140 { 00141 attempts++; 00142 if(theResult != 0) 00143 { 00144 std::for_each(theResult->begin(), theResult->end(), DeleteKineticTrack()); 00145 delete theResult; 00146 } 00147 theResult = stringFragmentationModel->FragmentStrings(strings); 00148 if(attempts > maxAttempts ) break; 00149 00150 //G4cout<<"G4endl<<"G4VPartonStringModel:: Final Result, Size "<<theResult->size()<<G4endl; 00151 00152 SumMass=0.; 00153 //G4LorentzVector SumP(0.,0.,0.,0.); 00154 for ( unsigned int i=0; i < theResult->size(); i++) 00155 { 00156 SumMass+=(*theResult)[i]->GetDefinition()->GetPDGMass(); 00157 //SumP+=(*theResult)[i]->Get4Momentum(); 00158 //G4cout<<i<<" : "<<(*theResult)[i]->GetDefinition()->GetParticleName(); 00159 //G4cout<<"p= " << (*theResult)[i]->Get4Momentum()<<" m= "<<(*theResult)[i]->Get4Momentum().mag()<<G4endl; 00160 } 00161 00162 //G4cout<<"SumP "<<SumP<<G4endl; 00163 } while(SumMass > InvMass); 00164 00165 std::for_each(strings->begin(), strings->end(), DeleteString() ); 00166 delete strings; 00167 00168 return theResult; 00169 }
void G4VPartonStringModel::SetFragmentationModel | ( | G4VStringFragmentation * | aModel | ) | [inline] |
Definition at line 86 of file G4VPartonStringModel.hh.
Referenced by G4MiscQGSCBuilder::Build(), G4ElectroNuclearBuilder::Build(), G4BertiniElectroNuclearBuilder::Build(), G4QGSBuilder::BuildModel(), G4FTFBuilder::BuildModel(), G4ElectroNuclearReaction::G4ElectroNuclearReaction(), G4ElectroVDNuclearModel::G4ElectroVDNuclearModel(), G4FTFBinaryKaonBuilder::G4FTFBinaryKaonBuilder(), G4FTFBinaryNeutronBuilder::G4FTFBinaryNeutronBuilder(), G4FTFBinaryPiKBuilder::G4FTFBinaryPiKBuilder(), G4FTFBinaryPionBuilder::G4FTFBinaryPionBuilder(), G4FTFBinaryProtonBuilder::G4FTFBinaryProtonBuilder(), G4FTFCNeutronBuilder::G4FTFCNeutronBuilder(), G4FTFCPiKBuilder::G4FTFCPiKBuilder(), G4FTFCProtonBuilder::G4FTFCProtonBuilder(), G4FTFPAntiBarionBuilder::G4FTFPAntiBarionBuilder(), G4FTFPNeutronBuilder::G4FTFPNeutronBuilder(), G4FTFPPiKBuilder::G4FTFPPiKBuilder(), G4FTFPProtonBuilder::G4FTFPProtonBuilder(), G4HadronicAbsorptionFritiof::G4HadronicAbsorptionFritiof(), G4HyperonFTFPBuilder::G4HyperonFTFPBuilder(), G4MuonVDNuclearModel::G4MuonVDNuclearModel(), G4QGSBinaryNeutronBuilder::G4QGSBinaryNeutronBuilder(), G4QGSBinaryPiKBuilder::G4QGSBinaryPiKBuilder(), G4QGSBinaryProtonBuilder::G4QGSBinaryProtonBuilder(), G4QGSC_CHIPSNeutronBuilder::G4QGSC_CHIPSNeutronBuilder(), G4QGSC_CHIPSPiKBuilder::G4QGSC_CHIPSPiKBuilder(), G4QGSC_CHIPSProtonBuilder::G4QGSC_CHIPSProtonBuilder(), G4QGSC_QGSCNeutronBuilder::G4QGSC_QGSCNeutronBuilder(), G4QGSC_QGSCPiKBuilder::G4QGSC_QGSCPiKBuilder(), G4QGSC_QGSCProtonBuilder::G4QGSC_QGSCProtonBuilder(), G4QGSCEflowNeutronBuilder::G4QGSCEflowNeutronBuilder(), G4QGSCEflowPiKBuilder::G4QGSCEflowPiKBuilder(), G4QGSCEflowProtonBuilder::G4QGSCEflowProtonBuilder(), G4QGSCNeutronBuilder::G4QGSCNeutronBuilder(), G4QGSCPiKBuilder::G4QGSCPiKBuilder(), G4QGSCProtonBuilder::G4QGSCProtonBuilder(), G4QGSPNeutronBuilder::G4QGSPNeutronBuilder(), G4QGSPPiKBuilder::G4QGSPPiKBuilder(), G4QGSPPionBuilder::G4QGSPPionBuilder(), G4QGSPProtonBuilder::G4QGSPProtonBuilder(), and TheoModelFactory< C, S, F >::New().
void G4VPartonStringModel::SetThisPointer | ( | G4VPartonStringModel * | aPointer | ) | [inline, protected] |
Definition at line 92 of file G4VPartonStringModel.hh.
Referenced by G4FTFModel::G4FTFModel(), G4QGSModel< ParticipantType >::G4QGSModel(), and G4QGSModel< ParticipantType >::operator=().