Skip to content
Snippets Groups Projects
Commit 53e95434 authored by Riccardo Maria Bianchi's avatar Riccardo Maria Bianchi :sunny:
Browse files

Update example

parent 8cacb770
No related branches found
No related tags found
1 merge request!199Update GeoModelExamples
// Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
// Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
/*
* HelloGeo.cpp
* HelloGeoRead.cpp
*
* Author: Riccardo Maria BIANCHI @ CERN
* Created on: Nov, 2018
* Updated on: Jul, 2023
*
*/
// GeoModel includes
#include "GeoModelDBManager/GMDBManager.h"
#include "GeoModelRead/ReadGeoModel.h"
#include "GeoModelKernel/GeoBox.h"
#include "GeoModelKernel/GeoPhysVol.h"
#include "GeoModelKernel/GeoFullPhysVol.h"
#include "GeoModelKernel/GeoNameTag.h"
#include "GeoModelKernel/GeoPhysVol.h"
#include "GeoModelRead/ReadGeoModel.h"
// C++ includes
#include <iostream>
#include <cstdlib> // EXIT_FAILURE
#include <fstream>
#include <cstdlib> // EXIT_FAILURE
#include <iostream>
// Units
#include "GeoModelKernel/Units.h"
#define SYSTEM_OF_UNITS GeoModelKernelUnits // so we will get, e.g., 'GeoModelKernelUnits::cm'
GeoPhysVol* createTheWorld(GeoPhysVol* world)
{
if (world == nullptr)
{
//-----------------------------------------------------------------------------------//
// Define the materials that we shall use. //
// ----------------------------------------------------------------------------------//
// Define the units
#define gr SYSTEM_OF_UNITS::gram
#define mole SYSTEM_OF_UNITS::mole
#define cm3 SYSTEM_OF_UNITS::cm3
// Define the chemical elements
GeoElement* Nitrogen = new GeoElement ("Nitrogen" ,"N" , 7.0 , 14.0067 *gr/mole);
GeoElement* Oxygen = new GeoElement ("Oxygen" ,"O" , 8.0 , 15.9995 *gr/mole);
GeoElement* Argon = new GeoElement ("Argon" ,"Ar" , 18.0 , 39.948 *gr/mole);
GeoElement* Hydrogen = new GeoElement ("Hydrogen" ,"H" , 1.0 , 1.00797 *gr/mole);
// Define the materials
double densityOfAir=0.001214 *gr/cm3;
GeoMaterial *air = new GeoMaterial("Air", densityOfAir);
air->add(Nitrogen , 0.7494);
air->add(Oxygen, 0.2369);
air->add(Argon, 0.0129);
air->add(Hydrogen, 0.0008);
air->lock();
const GeoBox* worldBox = new GeoBox(1000*SYSTEM_OF_UNITS::cm, 1000*SYSTEM_OF_UNITS::cm, 1000*SYSTEM_OF_UNITS::cm);
const GeoLogVol* worldLog = new GeoLogVol("WorldLog", worldBox, air);
world = new GeoPhysVol(worldLog);
}
return world;
#define SYSTEM_OF_UNITS \
GeoModelKernelUnits // so we will get, e.g., 'GeoModelKernelUnits::cm'
GeoPhysVol* createTheWorld(GeoPhysVol* world) {
if (world == nullptr) {
//-----------------------------------------------------------------------------------//
// Define the materials that we shall use. //
// ----------------------------------------------------------------------------------//
// Define the units
#define gr SYSTEM_OF_UNITS::gram
#define mole SYSTEM_OF_UNITS::mole
#define cm3 SYSTEM_OF_UNITS::cm3
// Define the chemical elements
GeoElement* Nitrogen =
new GeoElement("Nitrogen", "N", 7.0, 14.0067 * gr / mole);
GeoElement* Oxygen =
new GeoElement("Oxygen", "O", 8.0, 15.9995 * gr / mole);
GeoElement* Argon =
new GeoElement("Argon", "Ar", 18.0, 39.948 * gr / mole);
GeoElement* Hydrogen =
new GeoElement("Hydrogen", "H", 1.0, 1.00797 * gr / mole);
// Define the materials
double densityOfAir = 0.001214 * gr / cm3;
GeoMaterial* air = new GeoMaterial("Air", densityOfAir);
air->add(Nitrogen, 0.7494);
air->add(Oxygen, 0.2369);
air->add(Argon, 0.0129);
air->add(Hydrogen, 0.0008);
air->lock();
const GeoBox* worldBox =
new GeoBox(1000 * SYSTEM_OF_UNITS::cm, 1000 * SYSTEM_OF_UNITS::cm,
1000 * SYSTEM_OF_UNITS::cm);
const GeoLogVol* worldLog = new GeoLogVol("WorldLog", worldBox, air);
world = new GeoPhysVol(worldLog);
}
return world;
}
int main(int argc, char *argv[])
{
if(argc != 2)
{
fprintf(stderr, "\nERROR!\nUsage: %s geometry.db\n\n", argv[0]);
int main(int argc, char* argv[]) {
if (argc != 2) {
fprintf(stderr, "\nERROR!\nUsage: %s <geometry.db>\n\n", argv[0]);
return 1;
}
// Get the input SQLite '.db' file containing the geometry
std::string line;
std::string fileName;
fileName = argv[1];
std::cout << "Using this SQLite '.db' file:" << fileName << std::endl;
// check if DB file exists. If not, return.
// FIXME: TODO: this check should go in the 'GMDBManager' constructor.
std::ifstream infile(fileName.c_str());
if (!infile.good()) {
std::cout << "\n\tERROR!! A '" << fileName
<< "' file does not exist!! Please, check the path of the "
"input file before running this program. Exiting...";
exit(EXIT_FAILURE);
}
infile.close();
// GET GEOMETRY FROM LOCAL DB
// open the DB
GMDBManager* db = new GMDBManager(fileName);
/* Open database */
if (db->checkIsDBOpen()) {
std::cout << "OK! Database is open!\n";
} else {
std::cout << "Database is not open!\n";
// return;
throw;
}
// -- testing the input database
// std::cout << "Printing the list of all GeoMaterial nodes" << std::endl;
// db->printAllMaterials();
// std::cout << "Printing the list of all GeoElement nodes" << std::endl;
// db->printAllElements();
/* setup the GeoModel reader */
GeoModelIO::ReadGeoModel geoReader = GeoModelIO::ReadGeoModel(db);
std::cout << "OK! ReadGeoModel is set." << std::endl;
/* build the GeoModel geometry */
GeoPhysVol* dbPhys =
geoReader.buildGeoModel(); // builds the whole GeoModel tree in memory
std::cout << "ReadGeoModel::buildGeoModel() done." << std::endl;
std::cout << "Reading records from the imported geometry DB file..."
<< std::endl;
geoReader.printDBTable("SerialIdentifiers");
geoReader.printDBTable("IdentifierTags");
// create the world volume container and
// get the 'world' volume, i.e. the root volume of the GeoModel tree
std::cout << "Getting the 'world' GeoPhysVol, i.e. the root volume of the "
"GeoModel tree"
<< std::endl;
GeoPhysVol* world = createTheWorld(dbPhys);
std::cout << "Getting the GeoLogVol used by the 'world' volume"
<< std::endl;
const GeoLogVol* logVol = world->getLogVol();
std::cout << "'world' GeoLogVol name: " << logVol->getName() << std::endl;
std::cout << "'world' GeoMaterial name: "
<< logVol->getMaterial()->getName() << std::endl;
// --- testing the imported Geometry
// get number of children volumes
unsigned int nChil = world->getNChildVols();
std::cout << "'world' number of children: " << nChil << std::endl;
// loop over all children nodes
std::cout << "Looping over all 'volume' children (i.e., GeoPhysVol and "
"GeoFullPhysVol)..."
<< std::endl;
for (unsigned int idx = 0; idx < nChil; ++idx) {
PVConstLink nodeLink = world->getChildVol(idx);
if (dynamic_cast<const GeoVPhysVol*>(&(*(nodeLink)))) {
std::cout << "\t"
<< "the child n. " << idx << " ";
const GeoVPhysVol* childVolV = &(*(nodeLink));
if (dynamic_cast<const GeoPhysVol*>(childVolV)) {
const GeoPhysVol* childVol =
dynamic_cast<const GeoPhysVol*>(childVolV);
std::cout << "is a GeoPhysVol, whose GeoLogVol name is: "
<< childVol->getLogVol()->getName();
std::cout << " and it has " << childVol->getNChildVols()
<< " child volumes" << std::endl;
} else if (dynamic_cast<const GeoFullPhysVol*>(childVolV)) {
const GeoFullPhysVol* childVol =
dynamic_cast<const GeoFullPhysVol*>(childVolV);
std::cout << "is a GeoFullPhysVol, whose GeoLogVol name is: "
<< childVol->getLogVol()->getName();
std::cout << " and it has " << childVol->getNChildVols()
<< " child volumes" << std::endl;
}
} else if (dynamic_cast<const GeoNameTag*>(&(*(nodeLink)))) {
std::cout << "\t"
<< "the child n. " << idx << " is a GeoNameTag"
<< std::endl;
const GeoNameTag* childVol =
dynamic_cast<const GeoNameTag*>(&(*(nodeLink)));
std::cout << "\t\t GeoNameTag's name: " << childVol->getName()
<< std::endl;
} else if (dynamic_cast<const GeoMaterial*>(&(*(nodeLink)))) {
std::cout << "\t"
<< "the child n. " << idx << " is a GeoMaterial"
<< std::endl;
const GeoMaterial* childVol =
dynamic_cast<const GeoMaterial*>(&(*(nodeLink)));
std::cout << "\t\t GeoMaterial's name: " << childVol->getName()
<< std::endl;
std::cout << "\t\t GeoMaterial's number of elements: "
<< childVol->getNumElements() << std::endl;
}
}
std::cout << "Everything done." << std::endl;
// check if DB file exists. If not, return.
// FIXME: TODO: this check should go in the 'GMDBManager' constructor.
std::ifstream infile(fileName.c_str());
if ( ! infile.good() ) {
std::cout << "\n\tERROR!! A '" << fileName << "' file does not exist!! Please, check the path of the input file before running this program. Exiting...";
exit(EXIT_FAILURE);
}
infile.close();
// GET GEOMETRY FROM LOCAL DB
// open the DB
GMDBManager* db = new GMDBManager(fileName);
/* Open database */
if (db->checkIsDBOpen()) {
std::cout << "OK! Database is open!\n";
}
else {
std::cout << "Database is not open!\n";
// return;
throw;
}
// -- testing the input database
// std::cout << "Printing the list of all GeoMaterial nodes" << std::endl;
// db->printAllMaterials();
// std::cout << "Printing the list of all GeoElement nodes" << std::endl;
// db->printAllElements();
/* setup the GeoModel reader */
GeoModelIO::ReadGeoModel geoReader = GeoModelIO::ReadGeoModel(db);
std::cout << "OK! ReadGeoModel is set." << std::endl;
/* build the GeoModel geometry */
GeoPhysVol* dbPhys = geoReader.buildGeoModel(); // builds the whole GeoModel tree in memory
std::cout << "ReadGeoModel::buildGeoModel() done." << std::endl;
std::cout << "Reading records from the imported geometry DB file..." << std::endl;
geoReader.printDBTable("SerialIdentifiers");
geoReader.printDBTable("IdentifierTags");
// create the world volume container and
// get the 'world' volume, i.e. the root volume of the GeoModel tree
std::cout << "Getting the 'world' GeoPhysVol, i.e. the root volume of the GeoModel tree" << std::endl;
GeoPhysVol* world = createTheWorld(dbPhys);
std::cout << "Getting the GeoLogVol used by the 'world' volume" << std::endl;
const GeoLogVol* logVol = world->getLogVol();
std::cout << "'world' GeoLogVol name: " << logVol->getName() << std::endl;
std::cout << "'world' GeoMaterial name: " << logVol->getMaterial()->getName() << std::endl;
// --- testing the imported Geometry
// get number of children volumes
unsigned int nChil = world->getNChildVols();
std:: cout << "'world' number of children: " << nChil << std::endl;
// loop over all children nodes
std::cout << "Looping over all 'volume' children (i.e., GeoPhysVol and GeoFullPhysVol)..." << std::endl;
for (unsigned int idx=0; idx<nChil; ++idx) {
PVConstLink nodeLink = world->getChildVol(idx);
if ( dynamic_cast<const GeoVPhysVol*>( &(*( nodeLink ))) ) {
std::cout << "\t" << "the child n. " << idx << " ";
const GeoVPhysVol *childVolV = &(*( nodeLink ));
if ( dynamic_cast<const GeoPhysVol*>(childVolV) ) {
const GeoPhysVol* childVol = dynamic_cast<const GeoPhysVol*>(childVolV);
std::cout << "is a GeoPhysVol, whose GeoLogVol name is: " << childVol->getLogVol()->getName();
std::cout<< " and it has "<<childVol->getNChildVols()<<" child volumes" << std::endl;
}
else if ( dynamic_cast<const GeoFullPhysVol*>(childVolV) ) {
const GeoFullPhysVol* childVol = dynamic_cast<const GeoFullPhysVol*>(childVolV);
std::cout << "is a GeoFullPhysVol, whose GeoLogVol name is: " << childVol->getLogVol()->getName();
std::cout<< " and it has "<<childVol->getNChildVols()<<" child volumes" << std::endl;
}
}
else if ( dynamic_cast<const GeoNameTag*>( &(*( nodeLink ))) ) {
std::cout << "\t" << "the child n. " << idx << " is a GeoNameTag" << std::endl;
const GeoNameTag *childVol = dynamic_cast<const GeoNameTag*>(&(*( nodeLink )));
std::cout << "\t\t GeoNameTag's name: " << childVol->getName() << std::endl;
}
else if ( dynamic_cast<const GeoMaterial*>( &(*( nodeLink ))) ) {
std::cout << "\t" << "the child n. " << idx << " is a GeoMaterial" << std::endl;
const GeoMaterial *childVol = dynamic_cast<const GeoMaterial*>(&(*( nodeLink )));
std::cout << "\t\t GeoMaterial's name: " << childVol->getName() << std::endl;
std::cout << "\t\t GeoMaterial's number of elements: " << childVol->getNumElements() << std::endl;
}
}
std::cout << "Everything done." << std::endl;
// return app.exec();
return 0;
// return app.exec();
return 0;
}
# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
# Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
################################################################################
# Package: HelloGeoRead2G4
# author: Riccardo Maria BIANCHI @ CERN - Nov, 2018
# update: Riccardo Maria BIANCHI @ CERN - Jul, 2023
################################################################################
cmake_minimum_required(VERSION 3.16...3.26)
#project(HelloGeoRead2G4)
project(HelloGeoRead2G4)
# Find includes in current dir
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# Find the needed dependencies, when building individually
if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
message(STATUS "Compiling the example '${PROJECT_NAME}' as a standalone project...")
find_package( GeoModelCore REQUIRED )
find_package( GeoModelIO REQUIRED )
find_package( GeoModelG4 REQUIRED )
find_package( Eigen3 REQUIRED )
endif()
## External dependencies.
......@@ -24,10 +28,10 @@ find_package( Geant4 REQUIRED )
include(${Geant4_USE_FILE})
# Populate a CMake variable with the sources
set( SRCS main.cpp )
set( SRCS HelloGeoReadG4.cpp )
# Tell CMake to create the helloworld executable
add_executable( hellogeoRead2G4 ${SRCS} )
# Link all needed libraries
target_link_libraries( hellogeoRead2G4 GeoModelDBManager GeoModelRead GeoModelKernel GeoModel2G4 ${Geant4_LIBRARIES})
target_link_libraries( hellogeoRead2G4 GeoModelIO::GeoModelDBManager GeoModelIO::GeoModelRead GeoModelCore::GeoModelKernel GeoModel2G4 Eigen3::Eigen ${Geant4_LIBRARIES})
// Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
/*
* HelloGeoReadG4.cpp
*
* Author: Riccardo Maria BIANCHI @ CERN
* Created on: Nov, 2018
*
*/
// GeoModel includes
#include "GeoModel2G4/ExtParameterisedVolumeBuilder.h"
#include "GeoModelDBManager/GMDBManager.h"
#include "GeoModelKernel/GeoBox.h"
#include "GeoModelKernel/GeoFullPhysVol.h"
#include "GeoModelKernel/GeoNameTag.h"
#include "GeoModelKernel/GeoPhysVol.h"
#include "GeoModelRead/ReadGeoModel.h"
// Geant4 includes
#include "G4LogicalVolume.hh"
// C++ includes
#include <cstdlib> // EXIT_FAILURE
#include <fstream>
#include <iostream>
// Units
#include "GeoModelKernel/Units.h"
#define SYSTEM_OF_UNITS \
GeoModelKernelUnits // so we will get, e.g., 'GeoModelKernelUnits::cm'
/*
// TODO: int main(int argc, char *argv[])
int main() {
// Set a valid local geometry db path before first run
static const std::string path = "../geometry.db";
std::cout << "Using this DB file:" << path << std::endl;
// check if DB file exists. If not, return.
// FIXME: TODO: this check should go in the 'GMDBManager' constructor.
std::ifstream infile(path.c_str());
if (infile.good()) {
std::cout << "\n\tERROR!! A '" << path
<< "' file exists already!! Please, remove, move, or rename "
"it before running this program. Exiting...";
exit(EXIT_FAILURE);
}
infile.close();
*/
int main(int argc, char* argv[]) {
if (argc != 2) {
fprintf(stderr, "\nERROR!\nusage: %s <input_database.db>\n\n", argv[0]);
return 1;
}
// Get the input SQLite '.db' file containing the geometry
std::string line;
std::string fileName;
fileName = argv[1];
std::cout << "Using this SQLite '.db' file:" << fileName << std::endl;
// check if DB file exists. If not, return.
// FIXME: TODO: this check should go in the 'GMDBManager' constructor.
std::ifstream infile(fileName.c_str());
if (!infile.good()) {
std::cout << "\n\tERROR!! A '" << fileName
<< "' file does not exist!! Please, check the path of the "
"input file before running this program. Exiting...";
exit(EXIT_FAILURE);
}
infile.close();
// open the DB
GMDBManager* db = new GMDBManager(fileName);
/* Open database */
if (db->checkIsDBOpen()) {
std::cout << "OK! Database is open!\n";
} else {
std::cout << "Database is not open!\n";
exit(EXIT_FAILURE);
}
// -- testing the input database
std::cout << "\n=== Printing the list of all tables in the input DB:"
<< std::endl;
db->printAllDBTables();
std::cout << "\n=== Printing the list of all GeoMaterial nodes:"
<< std::endl;
db->printAllMaterials();
std::cout << "\n=== Printing the list of all GeoLogVol nodes:" << std::endl;
db->printAllLogVols();
/* setup the GeoModel reader */
GeoModelIO::ReadGeoModel readInGeo = GeoModelIO::ReadGeoModel(db);
std::cout << "ReadGeoModel set.\n";
/* build the GeoModel geometry */
GeoPhysVol* world =
readInGeo.buildGeoModel(); // builds the whole GeoModel tree in memory
// and get an handle to the 'world' volume
std::cout << "ReadGeoModel::buildGeoModel() done.\n";
// --- testing the imported ATLAS Geometry
// get the GeoLogVol used for the 'world' volume
std::cout << "Getting the GeoLogVol used by the 'world' volume"
<< std::endl;
const GeoLogVol* logVol = world->getLogVol();
std::cout << "'world' GeoLogVol name: " << logVol->getName() << std::endl;
std::cout << "'world' GeoMaterial name: "
<< logVol->getMaterial()->getName() << std::endl;
// get number of children volumes
unsigned int nChil = world->getNChildVols();
std::cout << "'world' number of children: " << nChil << std::endl;
// loop over all children nodes
std::cout << "Looping over all 'volume' children (i.e., GeoPhysVol and "
"GeoFullPhysVol)..."
<< std::endl;
for (unsigned int idx = 0; idx < nChil; ++idx) {
PVConstLink nodeLink = world->getChildVol(idx);
if (dynamic_cast<const GeoVPhysVol*>(&(*(nodeLink)))) {
std::cout << "\t"
<< "the child n. " << idx << " ";
const GeoVPhysVol* childVolV = &(*(nodeLink));
if (dynamic_cast<const GeoPhysVol*>(childVolV))
{
const GeoPhysVol* childVol =
dynamic_cast<const GeoPhysVol*>(childVolV);
std::cout << "is a GeoPhysVol, whose GeoLogVol name is: "
<< childVol->getLogVol()->getName() << std::endl;
std::cout << " and it has " << childVol->getNChildVols()
<< " child volumes\n";
} else if (dynamic_cast<const GeoFullPhysVol*>(childVolV)) {
const GeoFullPhysVol* childVol =
dynamic_cast<const GeoFullPhysVol*>(childVolV);
std::cout << "is a GeoFullPhysVol, whose GeoLogVol name is: "
<< childVol->getLogVol()->getName() << std::endl;
std::cout << " and it has " << childVol->getNChildVols()
<< " child volumes\n";
}
} else if (dynamic_cast<const GeoNameTag*>(&(*(nodeLink)))) {
std::cout << "\t"
<< "the child n. " << idx << " is a GeoNameTag\n";
const GeoNameTag* childVol =
dynamic_cast<const GeoNameTag*>(&(*(nodeLink)));
std::cout << "\t\tGeoNameTag's name: " << childVol->getName()
<< std::endl;
// std::cout<< " and it has "<<childVol->getNChildVols()<<" child
// volumes\n";
}
}
// build the Geant4 geometry and get an hanlde to the world' volume
ExtParameterisedVolumeBuilder* builder =
new ExtParameterisedVolumeBuilder("ATLAS");
std::cout << "Building G4 geometry." << std::endl;
G4LogicalVolume* g4World = builder->Build(world);
std::cout << "This is the newly-created Geant4 G4LogicalVolume, ready to "
"be used: "
<< g4World << std::endl;
std::cout << "Everything done.\n";
return 0;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment