Files
geant4/source/digits+hits/detector/src/G4SDStructure.cc
T
2016-06-08 15:09:25 +02:00

218 lines
5.3 KiB
C++

// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4SDStructure.cc,v 1.1 1999/01/07 16:06:26 gunter Exp $
// GEANT4 tag $Name: geant4-00-01 $
//
// G4SDStructure
#include "G4SDStructure.hh"
#include "G4ios.hh"
G4SDStructure::G4SDStructure(G4String aPath):verboseLevel(0)
{
pathName = aPath;
dirName = aPath;
int i = dirName.length();
if( i > 1 )
{
dirName.remove(i-1);
int isl = dirName.last('/');
dirName.remove(0,isl+1);
dirName += "/";
}
}
G4SDStructure::~G4SDStructure()
{
}
int G4SDStructure::operator==(const G4SDStructure &right) const
{
return false;
}
void G4SDStructure::AddNewDetector(G4VSensitiveDetector*aSD,
G4String treeStructure)
{
G4String remainingPath = treeStructure;
remainingPath.remove(0,pathName.length());
if( ! remainingPath.isNull() )
{ // The detector should be kept in subdirectory.
// First, check if the subdirectoy exists.
G4String subD = ExtractDirName( remainingPath );
G4SDStructure* tgtSDS = FindSubDirectory(subD);
if( tgtSDS == NULL )
{ // Subdirectory not found. Create a new directory.
subD.prepend(pathName);
tgtSDS = new G4SDStructure(subD);
structure.insert( tgtSDS );
}
tgtSDS->AddNewDetector(aSD,treeStructure);
}
else
{ // The sensitive detector should be kept in this directory.
G4VSensitiveDetector* tgtSD = GetSD( aSD->GetName() );
if( tgtSD != NULL )
{
G4cout << aSD->GetName() << " had already stored in "
<< pathName << endl;
}
else
{
detector.insert( aSD );
}
}
}
G4SDStructure* G4SDStructure::FindSubDirectory(G4String subD)
{
for( int i=0; i<structure.entries(); i++ )
{
if( subD == structure(i)->dirName ) return structure(i);
}
return NULL;
}
G4VSensitiveDetector* G4SDStructure::GetSD(G4String aSDName)
{
for( int i=0; i<detector.entries(); i++ )
{
G4VSensitiveDetector* tgtSD = detector(i);
if( aSDName == tgtSD->GetName() ) return tgtSD;
}
return NULL;
}
G4String G4SDStructure::ExtractDirName(G4String aName)
{
G4String subD = aName;
int i = aName.first('/');
if( i != RW_NPOS ) subD.remove(i+1);
return subD;
}
void G4SDStructure::Activate(G4String aName, G4bool sensitiveFlag)
{
G4String aPath = aName;
aPath.remove(0,pathName.length());
if( aPath.first('/') != RW_NPOS )
{ // Command is ordered for a subdirectory.
G4String subD = ExtractDirName(aPath);
G4SDStructure* tgtSDS = FindSubDirectory(subD);
if( tgtSDS == NULL )
{ // The subdirectory is not found
G4cout << subD << " is not found in " << pathName << endl;
}
else
{
tgtSDS->Activate(aName,sensitiveFlag);
}
}
else if( aPath.isNull() )
{ // Command is ordered for all detectors in this directory.
for( int i=0; i<detector.entries(); i++)
{
detector(i)->Activate(sensitiveFlag);
}
for( int j=0;j<structure.entries(); j++)
{
structure(j)->Activate(G4String("/"),sensitiveFlag);
}
}
else
{ // Command is ordered to a particular detector.
G4VSensitiveDetector* tgtSD = GetSD(aPath);
if( tgtSD == NULL )
{ // The detector is not found.
G4cout << aPath << " is not found in " << pathName << endl;
}
else
{
tgtSD->Activate(sensitiveFlag);
}
}
}
G4VSensitiveDetector* G4SDStructure::FindSensitiveDetector(G4String aName)
{
G4String aPath = aName;
aPath.remove(0,pathName.length());
if( aPath.first('/') != RW_NPOS )
{ // SD exists in sub-directory
G4String subD = ExtractDirName(aPath);
G4SDStructure* tgtSDS = FindSubDirectory(subD);
if( tgtSDS == NULL )
{ // The subdirectory is not found
G4cout << subD << " is not found in " << pathName << endl;
return NULL;
}
else
{
return tgtSDS->FindSensitiveDetector(aName);
}
}
else
{ // SD must exist in this directory
G4VSensitiveDetector* tgtSD = GetSD(aPath);
if( tgtSD == NULL )
{ // The detector is not found.
G4cout << aPath << " is not found in " << pathName << endl;
}
return tgtSD;
}
}
void G4SDStructure::Initialize(G4HCofThisEvent*HCE)
{
int i;
// Broadcast to subdirectories.
for( i=0; i<structure.entries(); i++ )
{
structure(i)->Initialize(HCE);
}
// Initialize all detectors in this directory.
for( i=0; i<detector.entries(); i++ )
{
if(detector(i)->isActive()) detector(i)->Initialize(HCE);
}
}
void G4SDStructure::Terminate(G4HCofThisEvent*HCE)
{
int i;
// Broadcast to subdirectories.
for( i=0; i<structure.entries(); i++ )
{
structure(i)->Terminate(HCE);
}
// Initialize all detectors in this directory.
for( i=0; i<detector.entries(); i++ )
{
if(detector(i)->isActive()) detector(i)->EndOfEvent(HCE);
}
}
void G4SDStructure::ListTree()
{
G4cout << pathName << endl;
for(int i=0; i<detector.entries(); i++)
{
G4VSensitiveDetector* sd = detector(i);
G4cout << pathName << sd->GetName();
if( sd->isActive() )
{ G4cout << " *** Active "; }
else
{ G4cout << " XXX Inactive "; }
G4cout << endl;
}
for(int j=0; j<structure.entries(); j++)
{ structure(j)->ListTree(); }
}