Import Geant4 4.0.0 source tree

This commit is contained in:
Gabriele Cosmo
2016-06-08 16:18:25 +02:00
parent 36c080dca6
commit 921d3b1cda
3990 changed files with 185376 additions and 82884 deletions
+127 -9
View File
@@ -21,8 +21,8 @@
// ********************************************************************
//
//
// $Id: G4StackManager.cc,v 1.3.4.1 2001/06/28 19:07:58 gunter Exp $
// GEANT4 tag $Name: $
// $Id: G4StackManager.cc,v 1.6 2001/07/19 00:14:17 asaim Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
//
// Last Modification : 09/Dec/96 M.Asai
@@ -35,7 +35,7 @@
#include "G4ios.hh"
G4StackManager::G4StackManager()
:verboseLevel(0),userStackingAction(NULL)
:userStackingAction(0),verboseLevel(0),numberOfAdditionalWaitingStacks(0)
{
theMessenger = new G4StackingMessenger(this);
urgentStack = new G4TrackStack;
@@ -50,13 +50,18 @@ G4StackManager::~G4StackManager()
delete waitingStack;
delete postponeStack;
delete theMessenger;
if(numberOfAdditionalWaitingStacks>0) {
for(int i=0;i<numberOfAdditionalWaitingStacks;i++) {
delete additionalWaitingStacks[i];
}
}
}
const G4StackManager & G4StackManager::operator=
(const G4StackManager &) { return *this; }
int G4StackManager::operator==(const G4StackManager &)
G4int G4StackManager::operator==(const G4StackManager &)
const{ return false; }
int G4StackManager::operator!=(const G4StackManager &)
G4int G4StackManager::operator!=(const G4StackManager &)
const{ return true; }
G4int G4StackManager::PushOneTrack(G4Track *newTrack,G4VTrajectory *newTrajectory)
@@ -96,6 +101,14 @@ G4int G4StackManager::PushOneTrack(G4Track *newTrack,G4VTrajectory *newTrajector
break;
case fKill:
break;
default:
G4int i = classification - 10;
if(i<1||i>numberOfAdditionalWaitingStacks) {
G4Exception("G4StackManager : invalid classification");
} else {
additionalWaitingStacks[i-1]->PushToStack( newStackedTrack );
}
break;
}
}
@@ -120,13 +133,22 @@ G4Track * G4StackManager::PopNextTrack(G4VTrajectory**newTrajectory)
<< " waiting tracks are re-classified to" << G4endl;
#endif
waitingStack->TransferTo(urgentStack);
if(numberOfAdditionalWaitingStacks>0) {
for(int i=0;i<numberOfAdditionalWaitingStacks;i++) {
if(i==0) {
additionalWaitingStacks[0]->TransferTo(waitingStack);
} else {
additionalWaitingStacks[i]->TransferTo(additionalWaitingStacks[i-1]);
}
}
}
if(userStackingAction) userStackingAction->NewStage();
#ifdef G4VERBOSE
if( verboseLevel > 0 ) G4cout << " " << GetNUrgentTrack()
<< " urgent tracks and " << GetNWaitingTrack()
<< " waiting tracks." << G4endl;
#endif
if( ( GetNUrgentTrack()==0 ) && ( GetNWaitingTrack()==0 ) ) return NULL;
if( ( GetNUrgentTrack()==0 ) && ( GetNWaitingTrack()==0 ) ) return 0;
}
G4StackedTrack * selectedStackedTrack = urgentStack->PopFromStack();
@@ -157,7 +179,7 @@ void G4StackManager::ReClassify()
if( GetNUrgentTrack() == 0 ) return;
urgentStack->TransferTo(&tmpStack);
while( (aStackedTrack=tmpStack.PopFromStack()) != NULL )
while( (aStackedTrack=tmpStack.PopFromStack()) != 0 )
{
G4ClassificationOfNewTrack classification =
userStackingAction->ClassifyNewTrack( aStackedTrack->GetTrack() );
@@ -177,6 +199,14 @@ void G4StackManager::ReClassify()
case fPostpone:
postponeStack->PushToStack( aStackedTrack );
break;
default:
G4int i = classification - 10;
if(i<1||i>numberOfAdditionalWaitingStacks) {
G4Exception("G4StackManager : invalid classification");
} else {
additionalWaitingStacks[i-1]->PushToStack( aStackedTrack );
}
break;
}
}
}
@@ -202,10 +232,9 @@ G4int G4StackManager::PrepareNewEvent()
postponeStack->TransferTo(&tmpStack);
while( (aStackedTrack=tmpStack.PopFromStack()) != NULL )
while( (aStackedTrack=tmpStack.PopFromStack()) != 0 )
{
G4Track* aTrack = aStackedTrack->GetTrack();
G4VTrajectory* aTrajectory = aStackedTrack->GetTrajectory();
aTrack->SetParentID(-1);
G4ClassificationOfNewTrack classification;
if(userStackingAction)
@@ -234,6 +263,14 @@ G4int G4StackManager::PrepareNewEvent()
break;
case fKill:
break;
default:
G4int i = classification - 10;
if(i<1||i>numberOfAdditionalWaitingStacks) {
G4Exception("G4StackManager : invalid classification");
} else {
additionalWaitingStacks[i-1]->PushToStack( aStackedTrack );
}
break;
}
}
}
@@ -242,4 +279,85 @@ G4int G4StackManager::PrepareNewEvent()
return n_passedFromPrevious;
}
void G4StackManager::SetNumberOfAdditionalWaitingStacks(G4int iAdd)
{
if(iAdd > numberOfAdditionalWaitingStacks)
{
for(int i=numberOfAdditionalWaitingStacks;i<iAdd;i++)
{
G4TrackStack* newStack = new G4TrackStack;
additionalWaitingStacks.push_back(newStack);
}
numberOfAdditionalWaitingStacks = iAdd;
}
else if (iAdd < numberOfAdditionalWaitingStacks)
{
for(int i=numberOfAdditionalWaitingStacks;i>iAdd;i--)
{
delete additionalWaitingStacks[i];
}
}
}
void G4StackManager::TransferStackedTracks(G4ClassificationOfNewTrack origin, G4ClassificationOfNewTrack destination)
{
G4TrackStack* originStack = 0;
switch(origin)
{
case fUrgent:
originStack = urgentStack;
break;
case fWaiting:
originStack = waitingStack;
break;
case fPostpone:
originStack = postponeStack;
break;
case fKill:
break;
default:
int i = origin - 10;
if(i<=numberOfAdditionalWaitingStacks) originStack = additionalWaitingStacks[i-1];
break;
}
if(!originStack) return;
if(destination==fKill)
{
G4StackedTrack * aStackedTrack;
while( (aStackedTrack=originStack->PopFromStack()) != 0 )
{
delete aStackedTrack->GetTrack();
delete aStackedTrack;
}
}
else
{
G4TrackStack* targetStack = 0;
switch(destination)
{
case fUrgent:
targetStack = urgentStack;
break;
case fWaiting:
targetStack = waitingStack;
break;
case fPostpone:
targetStack = postponeStack;
break;
default:
int i = origin - 10;
if(i<=numberOfAdditionalWaitingStacks) targetStack = additionalWaitingStacks[i-1];
break;
}
if(!targetStack) return;
if(originStack==targetStack) return;
originStack->TransferTo(targetStack);
}
return;
}