| Summary: | Bug in Sphere Volume | ||
|---|---|---|---|
| Product: | Geant4 | Reporter: | mingshenjin |
| Component: | geometry/solids | Assignee: | Vladimir.Grichine |
| Status: | RESOLVED WORKSFORME | ||
| Severity: | normal | ||
| Priority: | P2 | ||
| Version: | 6.0 | ||
| Hardware: | PC | ||
| OS: | Linux | ||
|
Description
mingshenjin
2004-09-29 04:04:55 CEST
Can you please provide the details of you geometry setup ? Did you try using one of the latest releases of Geant4 ? Fixes have introduced to G4Sphere since release 6.0 ... Waiting for your reply. HI, all
Yes, I try the latest version, which is Geant4.6.0 then, and the problem seems
still exit. And the attachments are my files.
The first file is my scfPrimaryGeneratorAction.cc
#include "scfPrimaryGeneratorAction.hh"
#include "scfDetectorConstruction.hh"
#include "G4Event.hh"
#include "G4ParticleGun.hh"
#include "G4ParticleTable.hh"
#include "G4ParticleDefinition.hh"
#include "Randomize.hh"
#include "G4RunManager.hh"
#include "G4ios.hh"
//#include "fstream.h"
#include "globals.hh"
#include "math.h"
extern G4double PrimaryBeamEDeposit;
extern long IntegrateEnergySpectrum[250];
extern G4double AirCoef[37][2];
extern G4int runNm;
scfPrimaryGeneratorAction::scfPrimaryGeneratorAction(
scfDetectorConstruction* scfDC)
:scfDetector(scfDC),rndmFlag("on")
{ G4int n_particle = 1;
particleGun = new G4ParticleGun(n_particle);
G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable();
G4String particleName;
G4ParticleDefinition* particle
= particleTable->FindParticle(particleName="gamma");
particleGun->SetParticleDefinition(particle);
}
scfPrimaryGeneratorAction::~scfPrimaryGeneratorAction()
{
delete particleGun;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void scfPrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent)
{//G4cout<<"enter primaryGun"<<G4endl;
//this function is called at the begining of event
//rndmFlag=="on"
G4int ID_energy=G4UniformRand()*IntegrateEnergySpectrum[249];
G4int Ibot=0;
G4int Imid=124;
G4int Itop=249;
do{
if(ID_energy<IntegrateEnergySpectrum[Imid-1])
{
Itop=Imid;
Imid=(Itop+Ibot)/2;
}
else if(ID_energy>IntegrateEnergySpectrum[Imid-1])
{
Ibot=Imid;
Imid=(Ibot+Itop)/2;
}
else
{
Ibot=Imid-1;
Itop=Imid;
}
} while(Ibot!=Imid&&Imid!=Itop);
G4double ParticleEnergy=(Ibot+G4UniformRand())*10*keV;
// //G4cout <<"ParticleEnergy="<<ParticleEnergy/keV<<"keV"<<G4endl;
// //G4cout <<"ParticleEnergy="<<ParticleEnergy/MeV<<"MeV"<<G4endl;
particleGun->SetParticleEnergy(ParticleEnergy);
G4double theta=(runNm+1.)*deg/rad;
G4double Momentx,Momenty,Momentz;
Momentx=cos(theta);
Momenty=0.;
Momentz=-sin(theta);
particleGun->SetParticleMomentumDirection(G4ThreeVector(Momentx,Momenty,
Momentz));
particleGun->SetParticlePosition(G4ThreeVector(-Momentx*cm,Momenty*cm,-
Momentz*cm));
particleGun->GeneratePrimaryVertex(anEvent);
PrimaryBeamEDeposit+=ParticleEnergy*CalculateAirCoef(ParticleEnergy);
}
G4double scfPrimaryGeneratorAction::CalculateAirCoef(G4double GammaEnergy)
{
//G4cout <<"aircof[36][1]="<<AirCoef[36][1]<<"cm^2/g"<<G4endl;//for
debug only
G4double Factor[4];
G4double AirCoefficient=0.;
int PosInTheTable=0;
int EnergyRatio=1;
for( int i=0;i<4;i++)
{
Factor[i]=1.;
}
EnergyRatio=GammaEnergy/AirCoef[0][0];
PosInTheTable=log(double(EnergyRatio))/log(10);
PosInTheTable=PosInTheTable*8+1+EnergyRatio/pow(10,PosInTheTable);
if(PosInTheTable<2)
{AirCoefficient=AirCoef[0][1];
//cout<<"energy too lower"<<endl;
}
else if(PosInTheTable>=35)
{
for (int J=33;J<=36;J++)
{for (int K=33;K<=36;K++)
{if (J!=K)
Factor[J-33]=Factor[J-33]*(GammaEnergy-AirCoef[K][0])/
(AirCoef[J][0]-AirCoef[K][0]);
}
AirCoefficient=AirCoefficient+Factor[J-33]*AirCoef[J][1];
}
}
else{
int ILOW=PosInTheTable-4;
int IMED=PosInTheTable;
int IUPPR=PosInTheTable+1;
while(ILOW!=IMED&&IMED!=IUPPR)
{if (GammaEnergy<AirCoef[IMED][0])
{IUPPR=IMED;
IMED=(IUPPR+ILOW)/2;
}
else if(GammaEnergy>AirCoef[IMED][0])
{ILOW=IMED;
IMED=(ILOW+IUPPR)/2;
}
else
ILOW=IMED;
}
PosInTheTable=ILOW;
if (fabs((GammaEnergy-AirCoef[PosInTheTable][0])/AirCoef
[PosInTheTable][0])<0.01)
AirCoefficient=AirCoef[PosInTheTable][1];
else if(fabs((GammaEnergy-AirCoef[PosInTheTable+1][0])/AirCoef
[PosInTheTable+1][0])<0.01)
AirCoefficient=AirCoef[PosInTheTable+1][1];
else
{for (int J=PosInTheTable-1;J<=PosInTheTable+2;J++)
{for (int K=PosInTheTable-1;K<=PosInTheTable+2;K++)
if (J!=K)
Factor[J-PosInTheTable+1]=Factor[J-PosInTheTable+1]*
(GammaEnergy-AirCoef[K][0])/
(AirCoef[J][0]-AirCoef[K][0]);
AirCoefficient=AirCoefficient+Factor[J-PosInTheTable+1]
*AirCoef[J][1];
}
}
}
<<GammaEnergy<<"MeV"<<"AirCoefficient"<<AirCoefficient<<endl;//for debug only!
return(AirCoefficient);
}
The second one is my scfDetectorConstruction.cc
#include "scfDetectorConstruction.hh"
#include "G4Material.hh"
#include "G4Sphere.hh"
#include "G4LogicalVolume.hh"
#include "G4PVPlacement.hh"
#include "G4PVReplica.hh"
#include "G4FieldManager.hh"
#include "G4UniformMagField.hh"
#include "G4TransportationManager.hh"
#include "G4IdentityTrajectoryFilter.hh"
#include "G4PropagatorInField.hh"
#include "G4SDManager.hh"
#include "G4RunManager.hh"
#include "G4PhysicalVolumeStore.hh"
#include "G4LogicalVolumeStore.hh"
#include "G4SolidStore.hh"
#include "G4VisAttributes.hh"
#include "G4Colour.hh"
#include "G4ios.hh"
scfDetectorConstruction::scfDetectorConstruction():MaterialSteel(0),MaterialAir
(0),MaterialVacuum(0)
{
// create commands for interactive definition of the calorimeter
// detectorMessenger = new scfDetectorMessenger(this);
DefineMaterials();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
scfDetectorConstruction::~scfDetectorConstruction()
{
// delete detectorMessenger;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void scfDetectorConstruction::DefineMaterials()
{
//This function illustrates the possible ways to define materials
G4String name, symbol; //a=mass of a mole;
G4double a, z, density; //z=mean number of protons;
//G4int iz; //iz=number of protons in an isotope;
G4int ncomponents;
G4double temperature, pressure;
//
// define Elements
//
a = 1.01*g/mole;
G4Element* H = new G4Element(name="Hydrogen", symbol="H", z=1., a);
a = 12.01*g/mole;
G4Element* C = new G4Element(name="Carbon", symbol="C", z=6., a);
a = 14.01*g/mole;
G4Element* N = new G4Element(name="Nitrogen", symbol="N", z=7., a);
a = 16.00*g/mole;
G4Element* O = new G4Element(name="Oxygen", symbol="O", z=8., a);
a = 55.85*g/mole;
G4Element* Fe = new G4Element(name="Iron", symbol="Fe", z=26., a);
// mixture by fractional mass
density = 1.290*mg/cm3;
G4Material* Air = new G4Material(name="Air", density, ncomponents=2);
Air->AddElement(N,0.7);
Air->AddElement(O,0.3);
//Steel
density = 7.83*g/cm3;
G4Material* Steel = new G4Material(name="Steel",density, ncomponents=2);
Steel->AddElement(Fe, 0.99);
Steel->AddElement(C, 0.01);
//Vacuum
density = universe_mean_density;
pressure = 3.e-18*pascal;
temperature = 2.73*kelvin;
G4Material* Vacuum = new G4Material(name="Galactic", z=1., a=1.01*g/mole,
density,kStateGas,temperature,pressure);
//default materials used in the plant
MaterialSteel=Steel;
MaterialAir=Air;
MaterialVacuum=Vacuum;
}
G4VPhysicalVolume* scfDetectorConstruction::Construct()
{
G4PhysicalVolumeStore::GetInstance()->Clean();
G4LogicalVolumeStore::GetInstance()->Clean();
G4SolidStore::GetInstance()->Clean();
//XY is horizontal, Z is the height.
G4Sphere* scfPlant = new G4Sphere("Plant", //its
name
0.,1.8*m,0.,2*M_PI,0.,M_PI); //its size
scfPlant_log = new G4LogicalVolume(scfPlant, //its solid
MaterialVacuum, //its material
"Plant"); //its name
scfPlant_phy = new G4PVPlacement(0, //no rotation
G4ThreeVector(), //at (0,0,0)
scfPlant_log, //its logical
volume
"Plant", //its name
0, //its mother logic volume
false, //no boolean
operation
0); //copy number
G4Sphere* scatVolume = new G4Sphere("scaVolume", //its
name
0.,1.8*m,0.,2*M_PI,M_PI/2.,M_PI); //its size
scatVolume_log = new G4LogicalVolume(scatVolume, //its solid
MaterialSteel, //its material
"scaVolume"); //its name
scatVolume_phy = new G4PVPlacement(0, //no rotation
G4ThreeVector(), //at (0,0,0)
scatVolume_log, //its logical volume
"scaVolume", //its name
scfPlant_log, //its mother
logic volume
false, //no boolean
operation
0); //copy number
G4Sphere* testVolume = new G4Sphere("tstVolume", //its
name
1.0*m,1.01*m,0.,2*M_PI,0.,M_PI/2.); //its size
testVolume_log = new G4LogicalVolume(testVolume, //its solid
MaterialAir, //its material
"tstVolume"); //its name
testVolume_phy = new G4PVPlacement(0, //no rotation
G4ThreeVector(), //at (0,0,0)
testVolume_log, //its logical volume
"tstVolume", //its name
scfPlant_log, //its mother
logic volume
false, //no boolean
operation
0); //copy number
// Visualization attributes
scfPlant_log->SetVisAttributes (G4VisAttributes::Invisible);
return scfPlant_phy;
}
You are highly appreciate for answering
One can check that for half sphere distance to in for p(0,0,0)
and v(0,0,1) returns the correct value Rmin. Therefore the problem is not
related to the sphere. Other reasons for strange behaviout could be:
1. zero gap betwenn world volume and steel, just increase a bit
world radius;
2. Too small density of vacuum. Are you sure your vacuum is
~10^-18 Pascal?
In any case a tar file with application (as simple as possible)
will help to resolve the source of volume skip.
|