Import Geant4 11.2.0.beta source tree

This commit is contained in:
Gabriele Cosmo
2023-06-30 09:09:57 +02:00
parent aef78ca386
commit dd1f179cda
3780 changed files with 212808 additions and 142780 deletions
@@ -7,28 +7,35 @@ examples/extended/visualization/standalone
This example illustrates how one might use the Geant4 Visualization
System as a "stand alone" graphics library and viewer. It makes use
of the "user action" feature of the Geant4 vis manager - for a fuller
example of the use of this feature see
examples/extended/visualization/userVisAction.
System as a "standalone" graphics library and viewer, i.e, without
the overhead of the run manager and all the actions and physics.
1) Define a G4VUserVisAction that implements a Draw method. An
example is provided - see StandaloneVisAction.hh/cc.
StandaloneVisAction::Draw illustrates:
a) a simple box;
b) a Boolean solid;
c) an alternative way of drawing a solid by obtaining the
polyhedral representation.
The last is included for interest, not as a recommendation.
It makes use of the "user action" feature of the Geant4 vis manager - for
a simple example see examples/extended/visualization/userVisAction. You
have to encapsulate your drawing in a vis action so that the vis manager
can call it and re-call it as appropriate.
1) Define a G4VUserVisAction that implements a Draw method. Two
examples are provided:
- StandaloneVisAction:
- a simple box;
- a Boolean solid;
- an alternative way of drawing a solid by obtaining the
polyhedral representation (included for interest, not as a
recommendation).
- DrawGeometryVisAction:
- Shows how to visualise your geometry alone, i.e., without the
run manager and the physics stuff.
2) In the main () program (see standalone.cc), StandaloneVisAction must be instantiated and
its pointer registered with the visualization manager. You may
optionally specify an extent at this point to assist the viewers to
locate the objects.
2) In the main program, the vis actions must be instantiated and
registered with the visualization manager. You may (optionally)
specify an extent to assist the viewers to locate the objects.
3) To visualise, use the usual Geant4 vis commands to create a view
and scene, then add the vis action to the scene, optionally with an
extent - see standalone.mac.
3) To visualise, you need:
- /vis/scene/add/userAction
4) Use the usual Geant4 vis commands to create a scene
and view (including the above command) - see standalone.mac.
Note: The system needs an "extent" in order to point the virtual
camera and adjust its field of view, etc. This defines the "standard
@@ -37,5 +44,5 @@ be specified as suggested above or by using /vis/scene/add/extent.
John Allison
27th November 2014
30th December 2022
*/
@@ -5,6 +5,12 @@ which **must** added in reverse chronological order (newest at the top). It must
be used as a substitute for writing good git commit messages!
## 2022-12-30 John Allison (exam-ext-vis-standalone-V11-01-00)
- Include an example of DrawGeometry.
- DrawGeometryVisAction:
- Shows how to visualise your geometry alone, i.e., without the
run manager and the physics stuff.
## 2022-11-04 John Allison (exam-ext-vis-standalone-V11-00-01)
- Fix typo in README files
@@ -6,34 +6,41 @@
------------------------------------------
This example illustrates how one might use the Geant4 Visualization
System as a "stand alone" graphics library and viewer. It makes use
of the "user action" feature of the Geant4 vis manager - for a fuller
example of the use of this feature see
examples/extended/visualization/userVisAction.
System as a "standalone" graphics library and viewer, i.e, without
the overhead of the run manager and all the actions and physics.
1) Define a G4VUserVisAction that implements a Draw method. An
example is provided - see StandaloneVisAction.hh/cc.
StandaloneVisAction::Draw illustrates:
a) a simple box;
b) a Boolean solid;
c) an alternative way of drawing a solid by obtaining the
polyhedral representation.
The last is included for interest, not as a recommendation.
It makes use of the "user action" feature of the Geant4 vis manager - for
a simple example see examples/extended/visualization/userVisAction. You
have to encapsulate your drawing in a vis action so that the vis manager
can call it and re-call it as appropriate.
1) Define a G4VUserVisAction that implements a Draw method. Two
examples are provided:
- StandaloneVisAction:
- a simple box;
- a Boolean solid;
- an alternative way of drawing a solid by obtaining the
polyhedral representation (included for interest, not as a
recommendation).
- DrawGeometryVisAction:
- Shows how to visualise your geometry alone, i.e., without the
run manager and the physics stuff.
2) In the main program, StandaloneVisAction must be instantiated and
its pointer registered with the visualization manager. You may
optionally specify an extent at this point to assist the viewers to
locate the objects.
2) In the main program, the vis actions must be instantiated and
registered with the visualization manager. You may (optionally)
specify an extent to assist the viewers to locate the objects.
3) To visualise, use the usual Geant4 vis commands to create a view
and scene, then add the vis action to the scene, optionally with an
extent - see standalone.mac.
3) To visualise, you need:
- /vis/scene/add/userAction
4) Use the usual Geant4 vis commands to create a scene
and view (including the above command) - see standalone.mac.
Note: The system needs an "extent" in order to point the virtual
camera and adjust its field of view, etc. This defines the "standard
camera and adjust its field of view, etc. This defines the "standard
view". You may zoom, etc., from this standard view. The extent may
be specified as suggested above or by using /vis/scene/add/extent.
John Allison
27th November 2014
30th December 2022
@@ -0,0 +1,62 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
//
/// \file DetectorConstruction.hh
/// \brief Definition of the B1::DetectorConstruction class
#ifndef B1DetectorConstruction_h
#define B1DetectorConstruction_h 1
#include "G4VUserDetectorConstruction.hh"
#include "globals.hh"
class G4VPhysicalVolume;
class G4LogicalVolume;
/// Detector construction class to define materials and geometry.
namespace B1
{
class DetectorConstruction : public G4VUserDetectorConstruction
{
public:
DetectorConstruction() = default;
~DetectorConstruction() override = default;
G4VPhysicalVolume* Construct() override;
G4LogicalVolume* GetScoringVolume() const { return fScoringVolume; }
protected:
G4LogicalVolume* fScoringVolume = nullptr;
};
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#endif
@@ -0,0 +1,57 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
/// \file visualization/standalone/include/DrawGeometryVisAction.hh
/// \brief Definition of the DrawGeometryVisAction class
//
//
#ifndef DRAWGEOMETRYVISACTION_HH
#define DRAWGEOMETRYVISACTION_HH
#include "G4VUserVisAction.hh"
namespace B1 { // Taken from example/basic/B1
class DetectorConstruction;
}
class G4VPhysicalVolume;
#include "G4Transform3D.hh"
#include "G4VisExtent.hh"
class DrawGeometryVisAction: public G4VUserVisAction {
public:
DrawGeometryVisAction();
~DrawGeometryVisAction();
void Draw() override;
const G4VisExtent& GetVisxtent() const {return fExtent;}
private:
B1::DetectorConstruction* fDetectorConstruction;
G4VPhysicalVolume* fPhysicalVolume;
G4Transform3D fTransform;
G4VisExtent fExtent;
};
#endif
@@ -33,8 +33,15 @@
#include "G4VUserVisAction.hh"
class G4Polyhedron;
class StandaloneVisAction: public G4VUserVisAction {
virtual void Draw();
public:
StandaloneVisAction();
~StandaloneVisAction();
void Draw() override;
private:
G4Polyhedron* fpSubtractedPolyhedron;
};
#endif
@@ -0,0 +1,170 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
//
/// \file DetectorConstruction.cc
/// \brief Implementation of the B1::DetectorConstruction class
#include "DetectorConstruction.hh"
#include "G4RunManager.hh"
#include "G4NistManager.hh"
#include "G4Box.hh"
#include "G4Cons.hh"
#include "G4Orb.hh"
#include "G4Sphere.hh"
#include "G4Trd.hh"
#include "G4LogicalVolume.hh"
#include "G4PVPlacement.hh"
#include "G4SystemOfUnits.hh"
namespace B1
{
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4VPhysicalVolume* DetectorConstruction::Construct()
{
// Get nist material manager
G4NistManager* nist = G4NistManager::Instance();
// Envelope parameters
//
G4double env_sizeXY = 20*cm, env_sizeZ = 30*cm;
G4Material* env_mat = nist->FindOrBuildMaterial("G4_WATER");
// Option to switch on/off checking of volumes overlaps
//
G4bool checkOverlaps = true;
//
// World
//
G4double world_sizeXY = 1.2*env_sizeXY;
G4double world_sizeZ = 1.2*env_sizeZ;
G4Material* world_mat = nist->FindOrBuildMaterial("G4_AIR");
auto solidWorld = new G4Box("World", // its name
0.5 * world_sizeXY, 0.5 * world_sizeXY, 0.5 * world_sizeZ); // its size
auto logicWorld = new G4LogicalVolume(solidWorld, // its solid
world_mat, // its material
"World"); // its name
auto physWorld = new G4PVPlacement(nullptr, // no rotation
G4ThreeVector(), // at (0,0,0)
logicWorld, // its logical volume
"World", // its name
nullptr, // its mother volume
false, // no boolean operation
0, // copy number
checkOverlaps); // overlaps checking
//
// Envelope
//
auto solidEnv = new G4Box("Envelope", // its name
0.5 * env_sizeXY, 0.5 * env_sizeXY, 0.5 * env_sizeZ); // its size
auto logicEnv = new G4LogicalVolume(solidEnv, // its solid
env_mat, // its material
"Envelope"); // its name
new G4PVPlacement(nullptr, // no rotation
G4ThreeVector(), // at (0,0,0)
logicEnv, // its logical volume
"Envelope", // its name
logicWorld, // its mother volume
false, // no boolean operation
0, // copy number
checkOverlaps); // overlaps checking
//
// Shape 1
//
G4Material* shape1_mat = nist->FindOrBuildMaterial("G4_A-150_TISSUE");
G4ThreeVector pos1 = G4ThreeVector(0, 2*cm, -7*cm);
// Conical section shape
G4double shape1_rmina = 0.*cm, shape1_rmaxa = 2.*cm;
G4double shape1_rminb = 0.*cm, shape1_rmaxb = 4.*cm;
G4double shape1_hz = 3.*cm;
G4double shape1_phimin = 0.*deg, shape1_phimax = 360.*deg;
auto solidShape1 = new G4Cons("Shape1", shape1_rmina, shape1_rmaxa, shape1_rminb, shape1_rmaxb,
shape1_hz, shape1_phimin, shape1_phimax);
auto logicShape1 = new G4LogicalVolume(solidShape1, // its solid
shape1_mat, // its material
"Shape1"); // its name
new G4PVPlacement(nullptr, // no rotation
pos1, // at position
logicShape1, // its logical volume
"Shape1", // its name
logicEnv, // its mother volume
false, // no boolean operation
0, // copy number
checkOverlaps); // overlaps checking
//
// Shape 2
//
G4Material* shape2_mat = nist->FindOrBuildMaterial("G4_BONE_COMPACT_ICRU");
G4ThreeVector pos2 = G4ThreeVector(0, -1*cm, 7*cm);
// Trapezoid shape
G4double shape2_dxa = 12*cm, shape2_dxb = 12*cm;
G4double shape2_dya = 10*cm, shape2_dyb = 16*cm;
G4double shape2_dz = 6*cm;
auto solidShape2 = new G4Trd("Shape2", // its name
0.5 * shape2_dxa, 0.5 * shape2_dxb, 0.5 * shape2_dya, 0.5 * shape2_dyb,
0.5 * shape2_dz); // its size
auto logicShape2 = new G4LogicalVolume(solidShape2, // its solid
shape2_mat, // its material
"Shape2"); // its name
new G4PVPlacement(nullptr, // no rotation
pos2, // at position
logicShape2, // its logical volume
"Shape2", // its name
logicEnv, // its mother volume
false, // no boolean operation
0, // copy number
checkOverlaps); // overlaps checking
// Set Shape2 as scoring volume
//
fScoringVolume = logicShape2;
//
//always return the physical World
//
return physWorld;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
}
@@ -0,0 +1,68 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
/// \file visualization/standalone/src/DrawGeometryVisAction.cc
/// \brief Implementation of the DrawGeometryVisAction class
//
//
#include "DrawGeometryVisAction.hh"
#include "G4VVisManager.hh"
#include "DetectorConstruction.hh"
#include "G4VPhysicalVolume.hh"
#include "G4LogicalVolume.hh"
#include "G4VSolid.hh"
#include "G4SystemOfUnits.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
DrawGeometryVisAction::DrawGeometryVisAction() {
// Get a physical volume from your detector construction
fDetectorConstruction = new B1::DetectorConstruction();
// (I think, properly, we should delete this in the destructor.)
fPhysicalVolume = fDetectorConstruction->Construct();
// (I think the deletion of constructed volumes is handled by the volume stores.)
// Give this an overall transform to avoid clash with other vis action(s)
fTransform = G4Translate3D(-20*cm,20*cm,0);
fExtent = fPhysicalVolume->GetLogicalVolume()->GetSolid()->GetExtent().Transform(fTransform);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
DrawGeometryVisAction::~DrawGeometryVisAction() {
delete fDetectorConstruction;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void DrawGeometryVisAction::Draw() {
G4VVisManager* pVisManager = G4VVisManager::GetConcreteInstance();
if (pVisManager) {
pVisManager->DrawGeometry(fPhysicalVolume,fTransform);
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -39,34 +39,45 @@
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
StandaloneVisAction::StandaloneVisAction() {
auto pA = G4Box("boxA",3*cm,3*cm,3*cm).CreatePolyhedron();
auto pB = G4Box("boxB",1*cm,1*cm,1*cm).CreatePolyhedron();
pB->Transform(G4Translate3D(3*cm,3*cm,3*cm));
fpSubtractedPolyhedron = new G4Polyhedron(pA->subtract(*pB));
G4VisAttributes subVisAtts(G4Colour(0,1,1));
fpSubtractedPolyhedron->SetVisAttributes(subVisAtts);
delete pA;
delete pB;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
StandaloneVisAction::~StandaloneVisAction() {
delete fpSubtractedPolyhedron;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void StandaloneVisAction::Draw() {
G4VVisManager* pVisManager = G4VVisManager::GetConcreteInstance();
if (pVisManager) {
// Simple box...
pVisManager->Draw(G4Box("box",2*m,2*m,2*m),
pVisManager->Draw(G4Box("box",2*cm,2*cm,2*cm),
G4VisAttributes(G4Colour(1,1,0)));
// Boolean solid...
G4Box boxA("boxA",3*m,3*m,3*m);
G4Box boxB("boxB",1*m,1*m,1*m);
G4Box boxA("boxA",3*cm,3*cm,3*cm);
G4Box boxB("boxB",1*cm,1*cm,1*cm);
G4SubtractionSolid subtracted("subtracted_boxes",&boxA,&boxB,
G4Translate3D(3*m,3*m,3*m));
G4Translate3D(3*cm,3*cm,3*cm));
pVisManager->Draw(subtracted,
G4VisAttributes(G4Colour(0,1,1)),
G4Translate3D(-6*m,-6*m,-6*m));
G4Translate3D(-6*cm,-6*cm,-6*cm));
// Same, but explicit polyhedron...
G4Polyhedron* pA = G4Box("boxA",3*m,3*m,3*m).CreatePolyhedron();
G4Polyhedron* pB = G4Box("boxB",1*m,1*m,1*m).CreatePolyhedron();
pB->Transform(G4Translate3D(3*m,3*m,3*m));
G4Polyhedron* pSubtracted = new G4Polyhedron(pA->subtract(*pB));
G4VisAttributes subVisAtts(G4Colour(0,1,1));
pSubtracted->SetVisAttributes(&subVisAtts);
pVisManager->Draw(*pSubtracted,G4Translate3D(6*m,6*m,6*m));
delete pA;
delete pB;
delete pSubtracted;
// The heavy work is done in the constructor
pVisManager->Draw(*fpSubtractedPolyhedron,G4Translate3D(6*cm,6*cm,6*cm));
}
}
@@ -40,6 +40,7 @@
#include "G4SystemOfUnits.hh"
#include "StandaloneVisAction.hh"
#include "DrawGeometryVisAction.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -48,17 +49,27 @@ int main(int argc,char** argv) {
G4UIExecutive* ui = new G4UIExecutive(argc, argv);
G4VisManager* visManager = new G4VisExecutive;
visManager->RegisterRunDurationUserVisAction
("A standalone example - 3 boxes, 2 with boolean subtracted cutout",
new StandaloneVisAction,
G4VisExtent(-10*m,10*m,-10*m,10*m,-10*m,10*m));
visManager->Initialize ();
auto standaloneVisAction = new StandaloneVisAction;
visManager->RegisterRunDurationUserVisAction
("A standalone example - 3 boxes, 2 with boolean subtracted cutout",
standaloneVisAction,
G4VisExtent(-10*cm,10*cm,-10*cm,10*cm,-10*cm,10*cm));
auto geometryVisAction = new DrawGeometryVisAction;
visManager->RegisterRunDurationUserVisAction
("A detector geometry",
geometryVisAction,
geometryVisAction->GetVisxtent());
G4UImanager::GetUIpointer()->ApplyCommand ("/control/execute standalone.mac");
ui->SessionStart();
delete ui;
delete geometryVisAction;
delete standaloneVisAction;
delete visManager;
delete ui;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -7,3 +7,5 @@
/vis/scene/add/scale
/vis/sceneHandler/attach
/vis/viewer/flush
/vis/scene/list
#/vis/scene/activateModel to turn models on and off (see command guidance)