#include <G4BinaryCascade.hh>
Inheritance diagram for G4BinaryCascade:
Public Member Functions | |
G4BinaryCascade (G4VPreCompoundModel *ptr=0) | |
virtual | ~G4BinaryCascade () |
G4HadFinalState * | ApplyYourself (const G4HadProjectile &aTrack, G4Nucleus &theNucleus) |
virtual G4ReactionProductVector * | Propagate (G4KineticTrackVector *, G4V3DNucleus *) |
virtual void | ModelDescription (std::ostream &) const |
virtual void | PropagateModelDescription (std::ostream &) const |
Definition at line 70 of file G4BinaryCascade.hh.
G4BinaryCascade::G4BinaryCascade | ( | G4VPreCompoundModel * | ptr = 0 |
) |
Definition at line 102 of file G4BinaryCascade.cc.
References G4ShortLivedConstructor::ConstructParticle(), G4HadronicInteractionRegistry::FindModel(), G4VIntraNuclearTransportModel::GetDeExcitation(), G4VPreCompoundModel::GetExcitationHandler(), G4HadronicInteractionRegistry::Instance(), G4VIntraNuclearTransportModel::SetDeExcitation(), G4HadronicInteraction::SetEnergyMomentumCheckLevels(), G4HadronicInteraction::SetMaxEnergy(), and G4HadronicInteraction::SetMinEnergy().
00102 : 00103 G4VIntraNuclearTransportModel("Binary Cascade", ptr) 00104 { 00105 // initialise the resonance sector 00106 G4ShortLivedConstructor ShortLived; 00107 ShortLived.ConstructParticle(); 00108 00109 theCollisionMgr = new G4CollisionManager; 00110 theDecay=new G4BCDecay; 00111 theImR.push_back(theDecay); 00112 theLateParticle= new G4BCLateParticle; 00113 G4MesonAbsorption * aAb=new G4MesonAbsorption; 00114 theImR.push_back(aAb); 00115 G4Scatterer * aSc=new G4Scatterer; 00116 theH1Scatterer = new G4Scatterer; 00117 theImR.push_back(aSc); 00118 00119 thePropagator = new G4RKPropagation; 00120 theCurrentTime = 0.; 00121 theBCminP = 45*MeV; 00122 theCutOnP = 90*MeV; 00123 theCutOnPAbsorb= 0*MeV; // No Absorption of slow Mesons, other than above G4MesonAbsorption 00124 00125 // reuse existing pre-compound model 00126 if(!ptr) { 00127 G4HadronicInteraction* p = 00128 G4HadronicInteractionRegistry::Instance()->FindModel("PRECO"); 00129 G4VPreCompoundModel* pre = static_cast<G4VPreCompoundModel*>(p); 00130 if(!pre) { pre = new G4PreCompoundModel(); } 00131 SetDeExcitation(pre); 00132 } 00133 theExcitationHandler = GetDeExcitation()->GetExcitationHandler(); 00134 SetMinEnergy(0.0*GeV); 00135 SetMaxEnergy(10.1*GeV); 00136 //PrintWelcomeMessage(); 00137 thePrimaryEscape = true; 00138 thePrimaryType = 0; 00139 00140 SetEnergyMomentumCheckLevels(1*perCent, 1*MeV); 00141 00142 // init data members 00143 currentA=currentZ=0; 00144 lateA=lateZ=0; 00145 initialA=initialZ=0; 00146 projectileA=projectileZ=0; 00147 currentInitialEnergy=initial_nuclear_mass=0.; 00148 massInNucleus=0.; 00149 theOuterRadius=0.; 00150 }
G4BinaryCascade::~G4BinaryCascade | ( | ) | [virtual] |
Definition at line 159 of file G4BinaryCascade.cc.
00160 { 00161 ClearAndDestroy(&theTargetList); 00162 ClearAndDestroy(&theSecondaryList); 00163 ClearAndDestroy(&theCapturedList); 00164 delete thePropagator; 00165 delete theCollisionMgr; 00166 std::for_each(theImR.begin(), theImR.end(), Delete<G4BCAction>()); 00167 delete theLateParticle; 00168 //delete theExcitationHandler; 00169 delete theH1Scatterer; 00170 }
G4HadFinalState * G4BinaryCascade::ApplyYourself | ( | const G4HadProjectile & | aTrack, | |
G4Nucleus & | theNucleus | |||
) | [virtual] |
Implements G4HadronicInteraction.
Definition at line 208 of file G4BinaryCascade.cc.
References G4HadFinalState::AddSecondary(), G4VPreCompoundModel::ApplyYourself(), G4HadFinalState::Clear(), G4CollisionManager::ClearAndDestroy(), G4cerr, G4endl, G4HadProjectile::Get4Momentum(), G4Nucleus::GetA_asInt(), G4HadProjectile::GetDefinition(), G4HadProjectile::GetKineticEnergy(), G4V3DNucleus::GetOuterRadius(), G4Nucleus::GetZ_asInt(), G4VFieldPropagation::Init(), G4V3DNucleus::Init(), isAlive, G4Neutron::NeutronDefinition(), G4KineticTrack::outside, G4PionMinus::PionMinusDefinition(), G4PionPlus::PionPlusDefinition(), Propagate(), G4Proton::ProtonDefinition(), G4HadFinalState::SetEnergyChange(), G4HadFinalState::SetMomentumChange(), G4KineticTrack::SetState(), G4HadFinalState::SetStatusChange(), stopAndKill, G4VIntraNuclearTransportModel::the3DNucleus, G4VIntraNuclearTransportModel::theDeExcitation, and G4HadronicInteraction::theParticleChange.
00211 { 00212 static G4int eventcounter=0; 00213 00214 // if ( eventcounter == 0 ) { 00215 // SetEpReportLevel(3); // report non conservation with model etc. 00216 // G4double relativeLevel = 1*perCent; 00217 // G4double absoluteLevel = 2*MeV; 00218 // SetEnergyMomentumCheckLevels(relativeLevel,absoluteLevel); 00219 // } 00220 00221 //if(eventcounter == 100*(eventcounter/100) ) 00222 eventcounter++; 00223 if(getenv("BCDEBUG") ) G4cerr << " ######### Binary Cascade Reaction number starts ######### "<<eventcounter<<G4endl; 00224 00225 G4LorentzVector initial4Momentum = aTrack.Get4Momentum(); 00226 G4ParticleDefinition * definition = const_cast<G4ParticleDefinition *>(aTrack.GetDefinition()); 00227 00228 if(initial4Momentum.e()-initial4Momentum.m()<theBCminP && 00229 ( definition==G4Neutron::NeutronDefinition() || definition==G4Proton::ProtonDefinition() ) ) 00230 { 00231 return theDeExcitation->ApplyYourself(aTrack, aNucleus); 00232 } 00233 00234 theParticleChange.Clear(); 00235 // initialize the G4V3DNucleus from G4Nucleus 00236 the3DNucleus = new G4Fancy3DNucleus; 00237 00238 // Build a KineticTrackVector with the G4Track 00239 G4KineticTrackVector * secondaries;// = new G4KineticTrackVector; 00240 G4ThreeVector initialPosition(0., 0., 0.); // will be set later 00241 00242 if(!getenv("I_Am_G4BinaryCascade_Developer") ) 00243 { 00244 if(definition!=G4Neutron::NeutronDefinition() && 00245 definition!=G4Proton::ProtonDefinition() && 00246 definition!=G4PionPlus::PionPlusDefinition() && 00247 definition!=G4PionMinus::PionMinusDefinition() ) 00248 { 00249 G4cerr << "You are using G4BinaryCascade for projectiles other than nucleons or pions."<<G4endl; 00250 G4cerr << "If you want to continue, please switch on the developer environment: "<<G4endl; 00251 G4cerr << "setenv I_Am_G4BinaryCascade_Developer 1 "<<G4endl<<G4endl; 00252 throw G4HadronicException(__FILE__, __LINE__, "G4BinaryCascade - used for unvalid particle type - Fatal"); 00253 } 00254 } 00255 00256 // keep primary 00257 thePrimaryType = definition; 00258 thePrimaryEscape = false; 00259 00260 // try until an interaction will happen 00261 G4ReactionProductVector * products = 0; 00262 G4int interactionCounter = 0; 00263 do 00264 { 00265 // reset status that could be changed in previous loop event 00266 theCollisionMgr->ClearAndDestroy(); 00267 00268 if(products != 0) 00269 { // free memory from previous loop event 00270 ClearAndDestroy(products); 00271 delete products; 00272 products=0; 00273 } 00274 00275 G4int massNumber=aNucleus.GetA_asInt(); 00276 the3DNucleus->Init(massNumber, aNucleus.GetZ_asInt()); 00277 thePropagator->Init(the3DNucleus); 00278 // GF Leak on kt??? but where to delete? 00279 G4KineticTrack * kt;// = new G4KineticTrack(definition, 0., initialPosition, initial4Momentum); 00280 do // sample impact parameter until collisions are found 00281 { 00282 theCurrentTime=0; 00283 G4double radius = the3DNucleus->GetOuterRadius()+3*fermi; 00284 initialPosition=GetSpherePoint(1.1*radius, initial4Momentum); // get random position 00285 kt = new G4KineticTrack(definition, 0., initialPosition, initial4Momentum); 00286 kt->SetState(G4KineticTrack::outside); 00287 // secondaries has been cleared by Propagate() in the previous loop event 00288 secondaries= new G4KineticTrackVector; 00289 secondaries->push_back(kt); 00290 if(massNumber > 1) // 1H1 is special case 00291 { 00292 products = Propagate(secondaries, the3DNucleus); 00293 } else { 00294 products = Propagate1H1(secondaries,the3DNucleus); 00295 } 00296 } while(! products ); // until we FIND a collision... 00297 00298 if(++interactionCounter>99) break; 00299 } while(products->size() == 0); // ...until we find an ALLOWED collision 00300 00301 if(products->size()>0) 00302 { 00303 // G4cout << "BIC Applyyourself: number of products " << products->size() << G4endl; 00304 00305 // Fill the G4ParticleChange * with products 00306 theParticleChange.SetStatusChange(stopAndKill); 00307 G4ReactionProductVector::iterator iter; 00308 00309 for(iter = products->begin(); iter != products->end(); ++iter) 00310 { 00311 G4DynamicParticle * aNew = 00312 new G4DynamicParticle((*iter)->GetDefinition(), 00313 (*iter)->GetTotalEnergy(), 00314 (*iter)->GetMomentum()); 00315 theParticleChange.AddSecondary(aNew); 00316 } 00317 00318 // DebugEpConservation(track, products); 00319 00320 00321 } else { // no interaction, return primary 00322 if(getenv("BCDEBUG") ) G4cerr << " ######### Binary Cascade Reaction number void ######### "<<eventcounter<<G4endl; 00323 theParticleChange.SetStatusChange(isAlive); 00324 theParticleChange.SetEnergyChange(aTrack.GetKineticEnergy()); 00325 theParticleChange.SetMomentumChange(aTrack.Get4Momentum().vect().unit()); 00326 } 00327 00328 ClearAndDestroy(products); 00329 delete products; 00330 00331 delete the3DNucleus; 00332 the3DNucleus = NULL; 00333 00334 if(getenv("BCDEBUG") ) G4cerr << " ######### Binary Cascade Reaction number ends ######### "<<eventcounter<<G4endl; 00335 00336 return &theParticleChange; 00337 }
void G4BinaryCascade::ModelDescription | ( | std::ostream & | ) | const [virtual] |
Reimplemented from G4VIntraNuclearTransportModel.
Definition at line 172 of file G4BinaryCascade.cc.
00173 { 00174 outFile << "G4BinaryCascade is an intra-nuclear cascade model in which\n" 00175 << "an incident hadron collides with a nucleon, forming two\n" 00176 << "final-state particles, one or both of which may be resonances.\n" 00177 << "The resonances then decay hadronically and the decay products\n" 00178 << "are then propagated through the nuclear potential along curved\n" 00179 << "trajectories until they re-interact or leave the nucleus.\n" 00180 << "This model is valid for incident pions up to 1.5 GeV and\n" 00181 << "nucleons up to 10 GeV.\n"; 00182 }
G4ReactionProductVector * G4BinaryCascade::Propagate | ( | G4KineticTrackVector * | , | |
G4V3DNucleus * | ||||
) | [virtual] |
Implements G4VIntraNuclearTransportModel.
Definition at line 339 of file G4BinaryCascade.cc.
References _CheckChargeAndBaryonNumber_, G4CollisionManager::ClearAndDestroy(), G4CollisionManager::Entries(), G4cerr, G4cout, G4endl, G4V3DNucleus::GetMass(), G4CollisionManager::GetNextCollision(), G4V3DNucleus::GetOuterRadius(), G4VFieldPropagation::Init(), G4CollisionManager::RemoveCollision(), and G4VIntraNuclearTransportModel::the3DNucleus.
Referenced by ApplyYourself().
00342 { 00343 G4ping debug("debug_G4BinaryCascade"); 00344 #ifdef debug_BIC_Propagate 00345 G4cout << "G4BinaryCascade Propagate starting -------------------------------------------------------" <<G4endl; 00346 #endif 00347 00348 the3DNucleus=aNucleus; 00349 G4ReactionProductVector * products = new G4ReactionProductVector; 00350 theOuterRadius = the3DNucleus->GetOuterRadius(); 00351 theCurrentTime=0; 00352 theProjectile4Momentum=G4LorentzVector(0,0,0,0); 00353 // build theSecondaryList, theProjectileList and theCapturedList 00354 ClearAndDestroy(&theCapturedList); 00355 ClearAndDestroy(&theSecondaryList); 00356 theSecondaryList.clear(); 00357 ClearAndDestroy(&theFinalState); 00358 std::vector<G4KineticTrack *>::iterator iter; 00359 theCollisionMgr->ClearAndDestroy(); 00360 00361 theCutOnP=90*MeV; 00362 if(the3DNucleus->GetMass()>30) theCutOnP = 70*MeV; 00363 if(the3DNucleus->GetMass()>60) theCutOnP = 50*MeV; 00364 if(the3DNucleus->GetMass()>120) theCutOnP = 45*MeV; 00365 00366 00367 BuildTargetList(); 00368 00369 #ifdef debug_BIC_GetExcitationEnergy 00370 G4cout << "ExcitationEnergy0 " << GetExcitationEnergy() << G4endl; 00371 #endif 00372 00373 thePropagator->Init(the3DNucleus); 00374 00375 G4bool success = BuildLateParticleCollisions(secondaries); 00376 if (! success ) // fails if no excitation energy left.... 00377 { 00378 products=HighEnergyModelFSProducts(products, secondaries); 00379 ClearAndDestroy(secondaries); 00380 delete secondaries; 00381 00382 #ifdef debug_G4BinaryCascade 00383 G4cout << "G4BinaryCascade::Propagate: warning - high energy model failed energy conservation, returning unchanged high energy final state" << G4endl; 00384 #endif 00385 00386 return products; 00387 } 00388 // check baryon and charge ... 00389 00390 _CheckChargeAndBaryonNumber_("lateparticles"); 00391 00392 // if called stand alone find first collisions 00393 FindCollisions(&theSecondaryList); 00394 00395 00396 if(theCollisionMgr->Entries() == 0 ) //late particles ALWAYS create Entries 00397 { 00398 //G4cout << " no collsions -> return 0" << G4endl; 00399 delete products; 00400 #ifdef debug_BIC_return 00401 G4cout << "return @ begin2, no collisions "<< G4endl; 00402 #endif 00403 return 0; 00404 } 00405 00406 // end of initialization: do the job now 00407 // loop until there are no more collisions 00408 00409 00410 G4bool haveProducts = false; 00411 G4int collisionCount=0; 00412 theMomentumTransfer=G4ThreeVector(0,0,0); 00413 while(theCollisionMgr->Entries() > 0 && currentZ) 00414 { 00415 if(Absorb()) { // absorb secondaries, pions only 00416 haveProducts = true; 00417 } 00418 _CheckChargeAndBaryonNumber_("absorbed"); 00419 if(Capture()) { // capture secondaries, nucleons only 00420 haveProducts = true; 00421 } 00422 _CheckChargeAndBaryonNumber_("captured"); 00423 00424 // propagate to the next collision if any (collisions could have been deleted 00425 // by previous absorption or capture) 00426 if(theCollisionMgr->Entries() > 0) 00427 { 00428 G4CollisionInitialState * 00429 nextCollision = theCollisionMgr->GetNextCollision(); 00430 #ifdef debug_BIC_Propagate_Collisions 00431 G4cout << " NextCollision * , Time, curtime = " << nextCollision << " " 00432 <<nextCollision->GetCollisionTime()<< " " << 00433 theCurrentTime<< G4endl; 00434 #endif 00435 if (!DoTimeStep(nextCollision->GetCollisionTime()-theCurrentTime) ) 00436 { 00437 // Check if nextCollision is still valid, ie. particle did not leave nucleus 00438 if (theCollisionMgr->GetNextCollision() != nextCollision ) 00439 { 00440 nextCollision = 0; 00441 } 00442 } 00443 00444 if( nextCollision ) 00445 { 00446 if (ApplyCollision(nextCollision)) 00447 { 00448 //G4cerr << "ApplyCollision success " << G4endl; 00449 haveProducts = true; 00450 collisionCount++; 00451 _CheckChargeAndBaryonNumber_("ApplyCollision"); 00452 00453 } else { 00454 //G4cerr << "ApplyCollision failure " << G4endl; 00455 theCollisionMgr->RemoveCollision(nextCollision); 00456 } 00457 } 00458 } 00459 } 00460 00461 //--------- end of while on Collisions 00462 //G4cout << "currentZ @ end loop " << currentZ << G4endl; 00463 if ( ! currentZ ){ 00464 // nucleus completely destroyed, fill in ReactionProductVector 00465 products = FillVoidNucleusProducts(products); 00466 #ifdef debug_BIC_return 00467 G4cout << "return @ Z=0 after collision loop "<< G4endl; 00468 PrintKTVector(&theSecondaryList,std::string(" theSecondaryList")); 00469 G4cout << "theTargetList size: " << theTargetList.size() << G4endl; 00470 PrintKTVector(&theTargetList,std::string(" theTargetList")); 00471 PrintKTVector(&theCapturedList,std::string(" theCapturedList")); 00472 00473 G4cout << " ExcitE be4 Correct : " <<GetExcitationEnergy() << G4endl; 00474 G4cout << " Mom Transfered to nucleus : " << theMomentumTransfer << " " << theMomentumTransfer.mag() << G4endl; 00475 PrintKTVector(&theFinalState,std::string(" FinalState uncorrected")); 00476 G4cout << "returned products: " << products->size() << G4endl; 00477 #endif 00478 // @@GF FixMe cannot return here. 00479 return products; 00480 } 00481 00482 // No more collisions: absorb, capture and propagate the secondaries out of the nucleus 00483 if(Absorb()) { 00484 haveProducts = true; 00485 // G4cout << "Absorb sucess " << G4endl; 00486 } 00487 00488 if(Capture()) { 00489 haveProducts = true; 00490 // G4cout << "Capture sucess " << G4endl; 00491 } 00492 00493 if(!haveProducts) // no collisions happened. Return an empty vector. 00494 { 00495 #ifdef debug_BIC_return 00496 G4cout << "return 3, no products "<< G4endl; 00497 #endif 00498 return products; 00499 } 00500 00501 00502 #ifdef debug_BIC_Propagate 00503 G4cout << " Momentum transfer to Nucleus " << theMomentumTransfer << " " << theMomentumTransfer.mag() << G4endl; 00504 G4cout << " Stepping particles out...... " << G4endl; 00505 #endif 00506 00507 StepParticlesOut(); 00508 00509 00510 if ( theSecondaryList.size() > 0 ) 00511 { 00512 #ifdef debug_G4BinaryCascade 00513 G4cerr << "G4BinaryCascade: Warning, have active particles at end" << G4endl; 00514 PrintKTVector(&theSecondaryList, "active particles @ end added to theFinalState"); 00515 #endif 00516 // add left secondaries to FinalSate 00517 for ( iter =theSecondaryList.begin(); iter != theSecondaryList.end(); ++iter) 00518 { 00519 theFinalState.push_back(*iter); 00520 } 00521 theSecondaryList.clear(); 00522 00523 } 00524 while ( theCollisionMgr->Entries() > 0 ) 00525 { 00526 #ifdef debug_G4BinaryCascade 00527 G4cerr << " Warning: remove left over collision(s) " << G4endl; 00528 #endif 00529 theCollisionMgr->RemoveCollision(theCollisionMgr->GetNextCollision()); 00530 } 00531 00532 #ifdef debug_BIC_Propagate_Excitation 00533 00534 PrintKTVector(&theSecondaryList,std::string(" theSecondaryList")); 00535 G4cout << "theTargetList size: " << theTargetList.size() << G4endl; 00536 // PrintKTVector(&theTargetList,std::string(" theTargetList")); 00537 PrintKTVector(&theCapturedList,std::string(" theCapturedList")); 00538 00539 G4cout << " ExcitE be4 Correct : " <<GetExcitationEnergy() << G4endl; 00540 G4cout << " Mom Transfered to nucleus : " << theMomentumTransfer << " " << theMomentumTransfer.mag() << G4endl; 00541 PrintKTVector(&theFinalState,std::string(" FinalState uncorrected")); 00542 #endif 00543 00544 // 00545 00546 00547 G4double ExcitationEnergy=GetExcitationEnergy(); 00548 00549 #ifdef debug_BIC_Propagate_finals 00550 PrintKTVector(&theFinalState,std::string(" FinalState be4 corr")); 00551 G4cout << " Excitation Energy prefinal, #collisions:, out, captured " 00552 << ExcitationEnergy << " " 00553 << collisionCount << " " 00554 << theFinalState.size() << " " 00555 << theCapturedList.size()<<G4endl; 00556 #endif 00557 00558 if (ExcitationEnergy < 0 ) 00559 { 00560 G4int maxtry=5, ntry=0; 00561 do { 00562 CorrectFinalPandE(); 00563 ExcitationEnergy=GetExcitationEnergy(); 00564 } while ( ++ntry < maxtry && ExcitationEnergy < 0 ); 00565 } 00566 00567 #ifdef debug_BIC_Propagate_finals 00568 PrintKTVector(&theFinalState,std::string(" FinalState corrected")); 00569 G4cout << " Excitation Energy final, #collisions:, out, captured " 00570 << ExcitationEnergy << " " 00571 << collisionCount << " " 00572 << theFinalState.size() << " " 00573 << theCapturedList.size()<<G4endl; 00574 #endif 00575 00576 00577 if ( ExcitationEnergy < 0. ) 00578 { 00579 // if ( ExcitationEnergy < 0. ) 00580 { 00581 //#ifdef debug_G4BinaryCascade 00582 // G4cerr << "G4BinaryCascade-Warning: negative excitation energy "; 00583 // G4cerr <<ExcitationEnergy<<G4endl; 00584 // PrintKTVector(&theFinalState,std::string("FinalState")); 00585 // PrintKTVector(&theCapturedList,std::string("captured")); 00586 // G4cout << "negative ExE:Final 4Momentum .mag: " << GetFinal4Momentum() 00587 // << " "<< GetFinal4Momentum().mag()<< G4endl 00588 // << "negative ExE:FinalNucleusMom .mag: " << GetFinalNucleusMomentum() 00589 // << " "<< GetFinalNucleusMomentum().mag()<< G4endl; 00590 //#endif 00591 } 00592 ClearAndDestroy(products); 00593 //G4cout << " negative Excitation E return empty products " << products << G4endl; 00594 #ifdef debug_BIC_return 00595 G4cout << "return 4, excit < 0 "<< G4endl; 00596 #endif 00597 return products; // return empty products- FIXME 00598 } 00599 00600 G4ReactionProductVector * precompoundProducts=DeExcite(); 00601 00602 00603 G4DecayKineticTracks decay(&theFinalState); 00604 00605 products= ProductsAddFinalState(products, theFinalState); 00606 00607 products= ProductsAddPrecompound(products, precompoundProducts); 00608 00609 // products=ProductsAddFakeGamma(products); 00610 00611 00612 thePrimaryEscape = true; 00613 00614 #ifdef debug_BIC_return 00615 G4cout << "return @end, all ok "<< G4endl; 00616 //G4cout << " return products " << products << G4endl; 00617 #endif 00618 00619 return products; 00620 }
void G4BinaryCascade::PropagateModelDescription | ( | std::ostream & | ) | const [virtual] |
Reimplemented from G4VIntraNuclearTransportModel.
Definition at line 183 of file G4BinaryCascade.cc.
00184 { 00185 outFile << "G4BinaryCascade propagtes secondaries produced by a high\n" 00186 << "energy model through the wounded nucleus.\n" 00187 << "Secondaries are followed after the formation time and if\n" 00188 << "within the nucleus are propagated through the nuclear\n" 00189 << "potential along curved trajectories until they interact\n" 00190 << "with a nucleon, decay, or leave the nucleus.\n" 00191 << "An interaction of a secondary with a nucleon produces two\n" 00192 << "final-state particles, one or both of which may be resonances.\n" 00193 << "Resonances decay hadronically and the decay products\n" 00194 << "are in turn propagated through the nuclear potential along curved\n" 00195 << "trajectories until they re-interact or leave the nucleus.\n" 00196 << "This model is valid for pions up to 1.5 GeV and\n" 00197 << "nucleons up to about 3.5 GeV.\n"; 00198 }