Import Geant4 0.1.0 source tree

This commit is contained in:
Gabriele Cosmo
2016-06-08 15:09:25 +02:00
parent b97f8d0df7
commit aaa409b6ee
2922 changed files with 55107 additions and 81674 deletions
+68 -325
View File
@@ -5,344 +5,87 @@
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G3VolTable.cc,v 2.3 1998/09/18 08:55:41 lockman Exp $
// GEANT4 tag $Name: geant4-00 $
// $Id: G3VolTable.cc,v 1.13 1999/05/28 23:12:47 gcosmo Exp $
// GEANT4 tag $Name: geant4-00-01 $
//
#include <iomanip.h>
#include "globals.hh"
#include "G3VolTable.hh"
#include "G4LogicalVolumeStore.hh"
#include "G3Pos.hh"
G4VPhysicalVolume* G3VolTable::mothPV = NULL; // physical volume of mother of all mothers initialized to NULL.
G4LogicalVolume* G3VolTable::mothLV = NULL; // logical volume of mother of all mothers initialized to NULL.
G3VolTable::G3VolTable()
: _VTD(0), G3toG4TopVTE(0), _FirstKey("UnDefined"), _NVTE(0), _NG3Pos(0){
_VTD = new RWTPtrHashDictionary<G4String,VolTableEntry>(RWCString::hash);
};
RWBoolean VolTableMatch(const VolTableEntry *VolTentry, const void *pt)
{
G4String *vname;
vname = (G4String*) pt;
if (VolTentry->vname == *vname)
{
return TRUE;
} else {
return FALSE;
G3VolTable::~G3VolTable(){
_VTD->clearAndDestroy();
delete _VTD;
G4cout << "Deleted G3VolTable..." << endl;
};
VolTableEntry*
G3VolTable::GetVTE(const G4String& Vname) {
return _VTD->findValue(&Vname);
};
void
G3VolTable::ListVTE(){
RWTPtrHashDictionaryIterator<G4String, VolTableEntry> iter(*_VTD);
if (_VTD->entries()>0) {
for (int i=0;iter();i++){
_VTE = iter.value();
G4cout << "G3VolTable element " << setw(3) << i << " name "
<< _VTE->GetName() << " has " << _VTE->GetNoDaughters()
<< " daughters" << endl;
}
}
}
G3VolTable::G3VolTable()
{
VolTable = &VolT;
G4int nent = VolTable->entries();
ScanTmed = 0;
Rect[0] = kXAxis;
Rect[1] = kYAxis;
Rect[2] = kZAxis;
Polar[0] = kRho;
Polar[1] = kPhi;
Polar[2] = kZAxis;
}
RWTPtrHashDictionary <G4String, VolTableEntry>*
G3VolTable::GetVTD() {return _VTD;}
G3VolTable::~G3VolTable()
{
while (! VolTable->isEmpty()) {
VolTableEntry *VolTentry = VolTable->last();
VolTable->removeReference(VolTentry);
// delete VolTentry->par;
delete VolTentry;
}
delete VolTable;
}
G4LogicalVolume* G3VolTable::GetLVx(G4String& vname)
{
// loop through the G4 List of currently defined logical volumes
VolTableEntry*
G3VolTable::PutVTE(VolTableEntry* aVolTableEntry){
if (GetVTE(aVolTableEntry->GetName()) == 0 ){
RWTPtrOrderedVector <G4LogicalVolume>* _ptrToList;
_ptrToList = G4LogicalVolumeStore::GetInstance();
G4LogicalVolume* _lvol;
G4int nentries = _ptrToList->entries();
for (G4int i=0; i<nentries; i++){
_lvol = (*_ptrToList)[i];
if (_lvol->GetName() == vname) return _lvol;
}
return NULL;
// create a hash key
G4String* _HashID = new G4String(aVolTableEntry->GetName());
if (_FirstKey == "UnDefined") _FirstKey = *(_HashID);
// insert into dictionary
_VTD->insertKeyAndValue(_HashID, aVolTableEntry);
_NVTE++;
}
return GetVTE(aVolTableEntry->GetName());
};
void
G3VolTable::CountG3Pos(){
_NG3Pos++;
}
G4LogicalVolume *G3VolTable::GetLV(G4String *vname)
{
curEntry = find(vname);
if (curEntry == NULL) {
return NULL;
} else {
return curEntry->lvpt;
}
void
G3VolTable::SetFirstVTE(){
G3toG4TopVTE = _VTD->findValue(&_FirstKey);
if (G3toG4TopVTE->NPCopies() > 0) {
_FirstKey = G3toG4TopVTE->GetMother()->GetName();
SetFirstVTE();
}
}
G4LogicalVolume* G3VolTable::GetLV()
{
// G3Mother* TV;
// return TV->GetLV(); // return the pointer to the top-level logical volume
// G4cout << "LV pointer to top level logical volume" << mothLV << endl;
return mothLV;
VolTableEntry*
G3VolTable::GetFirstVTE() {
return G3toG4TopVTE;
};
void
G3VolTable::VTEStat() {
G4cout << "VTEStat: instantiated " << _NVTE << " logical and "
<< _NG3Pos << " positioned volumes." << endl;
}
G4VPhysicalVolume *G3VolTable::GetPV(G4int npv)
{
G4int ln = pVolsPtr->length();
if (npv > ln) {
G4cout << "G3VolTable::GetPV error: request index too high " << npv <<
" > " << pVolsPtr->length() << endl;
return NULL;
} else {
if (ln == 0) {
// No associated physical volume. Use global mother.
G4cout << "GetPV: returning global mother " << endl;
return mothPV;
} else {
return pVolsPtr->at(npv);
}
}
}
G4VPhysicalVolume *G3VolTable::GetPV()
{
return mothPV;
}
void G3VolTable::FindPV(G4int* nvols, G4String *vname)
{
const void *pt;
pt = vname;
curEntry = find(vname);
if (curEntry == NULL) {
*nvols = 0;
return;
} else {
pVolsPtr = &(curEntry->pVols);
if (pVolsPtr->length() == 0) {
// use global mother
pVolsPtr->insert(mothPV);
G4cout << "Global mother set as physical volume for " << *vname << endl;
}
*nvols = pVolsPtr->length();
}
}
void G3VolTable::MatchPV(G4int* nvols, G4String *vname)
{
const void *pt;
pt = vname;
curEntry = find(vname);
if (curEntry == NULL) {
*nvols = -1;
G4cout << "G3VolTable error: no entry for " << *vname << endl;
return;
} else {
pVolsPtr = &(curEntry->pVols);
*nvols = pVolsPtr->length();
}
}
void G3VolTable::GetLVPars(G4String *vname, G4int iaxis, G4double *rnghi,
G4double *rnglo,
EAxis *axis, G4String *shape, G4int *nmed,
G4double *par[], G4int *npar, G4VSolid *solid)
{
const void *pt;
pt = vname;
curEntry = find(vname);
if (curEntry == NULL) {
*rnghi = 0.;
*rnglo = 0.;
// $$$ *axis = kUndefined;
*shape = "";
*nmed = 0;
*npar = 0;
return;
} else {
*rnghi = curEntry->rangehi[iaxis-1];
*rnglo = curEntry->rangelo[iaxis-1];
*axis = curEntry->axiscode[iaxis-1];
*shape = curEntry->shape;
*nmed = curEntry->tmed;
*par = curEntry->par;
*npar = curEntry->npar;
solid = curEntry->solid;
}
}
void G3VolTable::GetLVInfo(G4String *vname, G4String *shape, G4int *nmed)
{
const void *pt;
pt = vname;
curEntry = find(vname);
if (curEntry == NULL) {
*shape = "";
*nmed = 0;
return;
} else {
*shape = curEntry->shape;
*nmed = curEntry->tmed;
}
}
void G3VolTable::AddConstituentLVol(G4String* vname, G4LogicalVolume* lvol)
{
const void *pt;
pt = vname;
curEntry = find(vname);
if (curEntry == NULL) {
G4cout << "G3 LVol " << *vname << " not found" << endl;
return;
} else {
curEntry->lVols.insert(lvol);
}
}
void G3VolTable::PutLV(G4String *vname, G4LogicalVolume *lvpt, G4int tmed,
G4double rnghi[], G4double rnglo[],
EAxis axis, G4String shape,
G4double par[], G4int npar, G4VSolid *solid)
{
G4LogicalVolume *lvptold = NULL;
if (VolTable->entries() > 0) lvptold = GetLV(vname);
if (lvptold == NULL) { // create a new entry
VolTableEntry *VolTentry = new VolTableEntry;
VolTentry->vname = *vname;
VolTentry->lvpt = lvpt;
VolTentry->tmed = tmed;
VolTentry->shape = shape;
VolTentry->npar = npar;
VolTentry->solid = solid;
VolTentry->count = 0;
// associated physical volume is initialized to the root mother
// physical volume $$$
VolTentry->pvpt = mothPV;
G4double *params = new G4double[npar];
G4int i;
for (i=0; i<npar; i++) {
params[i] = par[i];
}
VolTentry->par = params;
if (axis == kXAxis) VolTentry->axiscode = Rect;
if (axis == kRho) VolTentry->axiscode = Polar;
for (i=0; i<3; i++) {
VolTentry->rangehi[i] = rnghi[i];
VolTentry->rangelo[i] = rnglo[i];
}
VolTable->append(VolTentry);
} else { // load existing entry
curEntry->lvpt = lvpt;
}
}
// For case where nothing is known about the volume; it doesn't
// come from G3toG4 (eg. externally specified global mother)
void G3VolTable::PutLV(G4String *vname, G4LogicalVolume *lvpt)
{
G4LogicalVolume *lvptold = NULL;
if (VolTable->entries() > 0) lvptold = GetLV(vname);
if (lvptold == NULL) { // create a new entry
VolTableEntry *VolTentry = new VolTableEntry;
VolTentry->vname = *vname;
VolTentry->lvpt = lvpt;
VolTentry->tmed = 0;
VolTentry->shape = "unknown";
VolTentry->npar = 0;
VolTentry->solid = 0;
VolTentry->count = 0;
// associated physical volume is initialized to the root mother
// physical volume $$$
VolTentry->pvpt = mothPV;
VolTentry->par = 0;
VolTentry->axiscode = Rect;
G4int i;
for (i=0; i<3; i++) {
VolTentry->rangehi[i] = 0.;
VolTentry->rangelo[i] = 0.;
}
VolTable->append(VolTentry);
} else { // load existing entry
curEntry->lvpt = lvpt;
}
}
void G3VolTable::PutPV(G4String *vname, G4VPhysicalVolume *pvpt)
{
G4int npv=0;
MatchPV(&npv,vname);
if (npv >= 0) {
curEntry->pVols.insert(pvpt);
}
}
void G3VolTable::PutPV1(G4String *vname, G4VPhysicalVolume *pvpt)
{
// Only add it if List is empty
G4int npv=0;
MatchPV(&npv,vname);
if (npv == 0) {
curEntry->pVols.insert(pvpt);
}
}
void G3VolTable::MatchTmed(G4int tmed)
{
// Set tmed to match with NextTmed
ScanTmed = tmed;
nEntry = 0;
}
G4LogicalVolume *G3VolTable::NextTmed()
{
// Return successively all matching lvols; NULL terminates
for (G4int i=nEntry; i<VolTable->entries(); i++) {
VolTableEntry *vte = VolTable->at(i);
if (vte->tmed == ScanTmed) {
nEntry = nEntry + i + 1;
return vte->lvpt;
}
}
return NULL;
}
void G3VolTable::SetMother(G4VPhysicalVolume *MotherOfAll)
{
if (!mothPV) mothPV = MotherOfAll;
}
void G3VolTable::SetMother(G4LogicalVolume *MotherOfAll)
{
if (!mothLV) mothLV = MotherOfAll;
}
void G3VolTable::SetMother()
{
mothLV = NULL;
mothPV = NULL;
}
VolTableEntry *G3VolTable::find(G4String *vname)
{
G4int nEntries = VolTable->entries();
for (G4int i=0; i<nEntries; i++) {
VolTableEntry *vte = VolTable->at(i);
if (vte->vname == *vname) {
return vte;
}
}
return NULL;
}
G4int G3VolTable::Increment(G4String *vname)
{
curEntry = find(vname);
if (curEntry == NULL) {
return 0;
} else {
curEntry->count++;
return curEntry->count;
}
}