void fw_simGeo_set_material_titles(Double_t fraction=0, Bool_t long_names=false) { TGeoMaterial *m; TIter it(FWGeometryTableViewManager_GetGeoManager()->GetListOfMaterials()); while ((m = (TGeoMaterial*) it()) != 0) { TString tit(":"); TGeoMixture *mix = dynamic_cast<TGeoMixture*>(m); if (mix == 0) { TGeoElement *e = m->GetBaseElement(); tit += long_names ? e->GetTitle() : e->GetName(); tit += ":"; } else { Double_t *ww = mix->GetWmixt(); for (Int_t i = 0; i < mix->GetNelements(); ++i) { if (ww[i] >= fraction) { TGeoElement *e = mix->GetElement(i); tit += long_names ? e->GetTitle() : e->GetName(); tit += ":"; } } } if (tit == ":") tit += ":"; m->SetTitle(tit); } }
void fw_simGeo_dump_materials(Bool_t dump_components=false) { TGeoMaterial *m; TIter it(FWGeometryTableViewManager_GetGeoManager()->GetListOfMaterials()); while ((m = (TGeoMaterial*) it()) != 0) { TGeoMixture *mix = dynamic_cast<TGeoMixture*>(m); printf("%-50s | %-40s | %2d | %.3f\n", m->GetName(), m->GetTitle(), mix ? mix->GetNelements() : 0, m->GetZ()); if (dump_components) { if (mix == 0) { printf(" %4d %6s %s\n", m->GetBaseElement()->Z(), m->GetBaseElement()->GetName(), m->GetBaseElement()->GetTitle()); } else { Double_t *ww = mix->GetWmixt(); for (Int_t i = 0; i < mix->GetNelements(); ++i) { TGeoElement *e = mix->GetElement(i); printf(" %4d %-4s %f\n", e->Z(), e->GetName(), ww[i]); } } } } }
void OpNoviceGeom() { // Create root geometry corresponding to OpNovice example double fExpHall_x, fExpHall_y, fExpHall_z; double fTank_x, fTank_y, fTank_z; double fBubble_x, fBubble_y, fBubble_z; double a, z, density; int nelements; fExpHall_x = fExpHall_y = fExpHall_z = 10000.0; fTank_x = fTank_y = fTank_z = 5000.0; fBubble_x = fBubble_y = fBubble_z = 500.0; TGeoManager *geom = new TGeoManager("OpNoviceGeom", "GEANT4 OpNovice example"); // Air // TGeoElement *N = new TGeoElement("Nitrogen", "N", z=7 , a=14.01); TGeoElement *O = new TGeoElement("Oxygen" , "O", z=8 , a=16.00); TGeoMixture *air = new TGeoMixture("Air", 2, density=1.29E-3); air->AddElement(N, 0.7); air->AddElement(O, 0.3); TGeoMedium *medair = new TGeoMedium("Air", 1, air); // Water // TGeoElement *H = new TGeoElement("Hydrogen", "H", z=1 , a=1.01); TGeoMixture *water = new TGeoMixture("Water", 2, density=1.0); water->AddElement(H,2); water->AddElement(O,1); TGeoMedium *medwater = new TGeoMedium("Water", 2, water); // The experimental Hall // TGeoBBox *expHall_box = new TGeoBBox("World",fExpHall_x,fExpHall_y,fExpHall_z); TGeoVolume *expHall_log = new TGeoVolume("World", expHall_box, medair); expHall_log->SetLineColor(1); expHall_log->SetVisContainers(); geom->SetTopVolume(expHall_log); // The Water Tank // TGeoBBox *waterTank_box = new TGeoBBox("Tank",fTank_x,fTank_y,fTank_z); TGeoVolume *waterTank_log = new TGeoVolume("Tank", waterTank_box, medwater); waterTank_log->SetLineColor(kBlue); waterTank_log->SetTransparency(70); waterTank_log->SetVisContainers(); expHall_log->AddNode(waterTank_log, 0); // The Air Bubble // TGeoBBox *bubbleAir_box = new TGeoBBox("Bubble",fBubble_x,fBubble_y,fBubble_z); TGeoVolume *bubbleAir_log = new TGeoVolume("Bubble", bubbleAir_box, medair); bubbleAir_log->SetLineColor(kCyan); bubbleAir_log->SetTransparency(70); waterTank_log->AddNode(bubbleAir_log, 0, new TGeoTranslation(0,2500,0)); geom->CloseGeometry(); geom->SetTopVisible(true); geom->Export("OpNoviceGeom.root"); }
/** * Initialise ROOT geometry objects from GEAR objects * * @param geomName name of ROOT geometry object * @param dumpRoot dump automatically generated ROOT geometry file for further inspection */ void EUTelGeometryTelescopeGeoDescription::initializeTGeoDescription( std::string const & geomName, bool dumpRoot = false ) { if( _isGeoInitialized ) { streamlog_out( WARNING3 ) << "EUTelGeometryTelescopeGeoDescription: Geometry already initialized, using old initialization" << std::endl; return; } else { _geoManager = std::make_unique<TGeoManager>("Telescope", "v0.1"); _geoManager->SetBit(kCanDelete); } if( !_geoManager ) { streamlog_out( ERROR3 ) << "Can't instantiate ROOT TGeoManager " << std::endl; return; } // Create top world volume containing telescope geometry // Create air mixture // see http://pdg.lbl.gov/2013/AtomicNuclearProperties/HTML_PAGES/104.html double air_density = 1.2e-3; // g/cm^3 double air_radlen = 36.62; // g/cm^2 //Must be -ve to use this value rather than internal one calculated. TGeoMixture* pMatAir = new TGeoMixture("AIR",3,air_density); pMatAir->DefineElement(0, 14.007, 7., 0.755267 ); //Nitrogen pMatAir->DefineElement(1, 15.999, 8., 0.231781 ); //Oxygen pMatAir->DefineElement(2, 39.948, 18., 0.012827 ); //Argon pMatAir->DefineElement(3, 12.011, 6., 0.000124 ); //Carbon pMatAir->SetRadLen( air_radlen ); // Medium: medium_World_AIR TGeoMedium* pMedAir = new TGeoMedium("medium_World_AIR", 3, pMatAir ); // The World is the 10 x 10m x 10m box filled with air mixture Double_t dx,dy,dz; dx = 5000.000000; // [mm] dy = 5000.000000; // [mm] dz = 5000.000000; // [mm] TGeoShape *pBoxWorld = new TGeoBBox("Box_World", dx,dy,dz); // Volume: volume_World TGeoVolume* pvolumeWorld = new TGeoVolume("volume_World",pBoxWorld, pMedAir); pvolumeWorld->SetLineColor(4); pvolumeWorld->SetLineWidth(3); pvolumeWorld->SetVisLeaves(kTRUE); // Set top volume of geometry gGeoManager->SetTopVolume( pvolumeWorld ); IntVec::const_iterator itrPlaneId; for ( itrPlaneId = _sensorIDVec.begin(); itrPlaneId != _sensorIDVec.end(); ++itrPlaneId ) { translateSiPlane2TGeo(pvolumeWorld, *itrPlaneId ); } _geoManager->CloseGeometry(); _isGeoInitialized = true; // Dump ROOT TGeo object into file if ( dumpRoot ) _geoManager->Export( geomName.c_str() ); for(auto& mapEntry: _planePath) { auto pathName = mapEntry.second; auto sensorID = mapEntry.first; _geoManager->cd( pathName.c_str() ); _TGeoMatrixMap[sensorID] = _geoManager->GetCurrentNode()->GetMatrix(); } return; }
/** * Initialise ROOT geometry objects from GEAR objects * * @param geomName name of ROOT geometry object * @param dumpRoot dump automatically generated ROOT geometry file for further inspection */ void EUTelGeometryTelescopeGeoDescription::initializeTGeoDescription( std::string& geomName, bool dumpRoot = false ) { // #ifdef USE_TGEO // get access to ROOT's geometry manager if( _isGeoInitialized ) { streamlog_out( WARNING3 ) << "EUTelGeometryTelescopeGeoDescription: Geometry already initialized, using old initialization" << std::endl; return; } else { _geoManager = new TGeoManager("Telescope", "v0.1"); } if( !_geoManager ) { streamlog_out( ERROR3 ) << "Can't instantiate ROOT TGeoManager " << std::endl; return; } // Create top world volume containing telescope/DUT geometry // Create air mixture // see http://pdg.lbl.gov/2013/AtomicNuclearProperties/HTML_PAGES/104.html double air_density = 1.2e-3; // g/cm^3 double air_radlen = 36.62; // g/cm^2 TGeoMixture* pMatAir = new TGeoMixture("AIR",3,air_density); pMatAir->DefineElement(0, 14.007, 7., 0.755267 ); //Nitrogen pMatAir->DefineElement(1, 15.999, 8., 0.231781 ); //Oxygen pMatAir->DefineElement(2, 39.948, 18., 0.012827 ); //Argon pMatAir->DefineElement(3, 12.011, 6., 0.000124 ); //Carbon pMatAir->SetRadLen( air_radlen ); // Medium: medium_World_AIR TGeoMedium* pMedAir = new TGeoMedium("medium_World_AIR", 3, pMatAir ); // The World is the 10 x 10m x 10m box filled with air mixture Double_t dx,dy,dz; dx = 5000.000000; // [mm] dy = 5000.000000; // [mm] dz = 5000.000000; // [mm] TGeoShape *pBoxWorld = new TGeoBBox("Box_World", dx,dy,dz); // Volume: volume_World TGeoVolume* pvolumeWorld = new TGeoVolume("volume_World",pBoxWorld, pMedAir); pvolumeWorld->SetLineColor(4); pvolumeWorld->SetLineWidth(3); pvolumeWorld->SetVisLeaves(kTRUE); // Set top volume of geometry gGeoManager->SetTopVolume( pvolumeWorld ); // Iterate over registered GEAR objects and construct their TGeo representation const Double_t PI = 3.141592653589793; const Double_t DEG = 180./PI; double xc, yc, zc; // volume center position double alpha, beta, gamma; IntVec::const_iterator itrPlaneId; for ( itrPlaneId = _sensorIDVec.begin(); itrPlaneId != _sensorIDVec.end(); ++itrPlaneId ) { std::stringstream strId; strId << *itrPlaneId; // Get sensor center position xc = siPlaneXPosition( *itrPlaneId ); yc = siPlaneYPosition( *itrPlaneId ); zc = siPlaneZPosition( *itrPlaneId ); // Get sensor orientation alpha = siPlaneXRotation( *itrPlaneId ); // [rad] beta = siPlaneYRotation( *itrPlaneId ); // [rad] gamma = siPlaneZRotation( *itrPlaneId ); // [rad] // Spatial translations of the sensor center string stTranslationName = "matrixTranslationSensor"; stTranslationName.append( strId.str() ); TGeoTranslation* pMatrixTrans = new TGeoTranslation( stTranslationName.c_str(), xc, yc, zc ); //ALL clsses deriving from TGeoMatrix are not owned by the ROOT geometry manager, invoking RegisterYourself() transfers //ownership and thus ROOT will clean up pMatrixTrans->RegisterYourself(); // Spatial rotation around sensor center // TGeoRotation requires Euler angles in degrees string stRotationName = "matrixRotationSensorX"; stRotationName.append( strId.str() ); TGeoRotation* pMatrixRotX = new TGeoRotation( stRotationName.c_str(), 0., alpha*DEG, 0.); // around X axis stRotationName = "matrixRotationSensorY"; stRotationName.append( strId.str() ); TGeoRotation* pMatrixRotY = new TGeoRotation( stRotationName.c_str(), 90., beta*DEG, 0.); // around Y axis (combination of rotation around Z axis and new X axis) stRotationName = "matrixRotationSensorBackY"; stRotationName.append( strId.str() ); TGeoRotation* pMatrixRotY1 = new TGeoRotation( stRotationName.c_str(), -90., 0., 0.); // restoration of original orientation (valid in small angle approximataion ~< 15 deg) stRotationName = "matrixRotationSensorZ"; stRotationName.append( strId.str() ); TGeoRotation* pMatrixRotZ = new TGeoRotation( stRotationName.c_str(), 0. , 0., gamma*DEG); // around Z axis // Combined rotation in several steps TGeoRotation* pMatrixRot = new TGeoRotation( *pMatrixRotX ); pMatrixRot->MultiplyBy( pMatrixRotY ); pMatrixRot->MultiplyBy( pMatrixRotY1 ); pMatrixRot->MultiplyBy( pMatrixRotZ ); pMatrixRot->RegisterYourself(); pMatrixRotX->RegisterYourself(); pMatrixRotY->RegisterYourself(); pMatrixRotY1->RegisterYourself(); pMatrixRotZ->RegisterYourself(); // Combined translation and orientation TGeoCombiTrans* combi = new TGeoCombiTrans( *pMatrixTrans, *pMatrixRot ); combi->RegisterYourself(); // Construction of sensor objects // Construct object medium. Required for radiation length determination // assume SILICON, though all information except of radiation length is ignored double a = 28.085500; double z = 14.000000; double density = 2.330000; double radl = siPlaneMediumRadLen( *itrPlaneId ); double absl = 45.753206; string stMatName = "materialSensor"; stMatName.append( strId.str() ); TGeoMaterial* pMat = new TGeoMaterial( stMatName.c_str(), a, z, density, radl, absl ); pMat->SetIndex( 1 ); // Medium: medium_Sensor_SILICON int numed = 0; // medium number double par[8]; par[0] = 0.000000; // isvol par[1] = 0.000000; // ifield par[2] = 0.000000; // fieldm par[3] = 0.000000; // tmaxfd par[4] = 0.000000; // stemax par[5] = 0.000000; // deemax par[6] = 0.000000; // epsil par[7] = 0.000000; // stmin string stMedName = "mediumSensor"; stMedName.append( strId.str() ); TGeoMedium* pMed = new TGeoMedium( stMedName.c_str(), numed, pMat, par ); // Construct object shape // Shape: Box type: TGeoBBox // TGeo requires half-width of box side dx = siPlaneXSize( *itrPlaneId ) / 2.; dy = siPlaneYSize( *itrPlaneId ) / 2.; dz = siPlaneZSize( *itrPlaneId ) / 2.; TGeoShape *pBoxSensor = new TGeoBBox( "BoxSensor", dx, dy, dz ); // Volume: volume_Sensor1 // Geometry navigation package requires following names for objects that have an ID // name:ID string stVolName = "volume_SensorID:"; stVolName.append( strId.str() ); _planePath.insert( std::make_pair(*itrPlaneId, "/volume_World_1/"+stVolName+"_1") ); TGeoVolume* pvolumeSensor = new TGeoVolume( stVolName.c_str(), pBoxSensor, pMed ); pvolumeSensor->SetVisLeaves( kTRUE ); pvolumeWorld->AddNode(pvolumeSensor, 1/*(*itrPlaneId)*/, combi); //this line tells the pixel geometry manager to load the pixel geometry into the plane _pixGeoMgr->addPlane( *itrPlaneId, geoLibName( *itrPlaneId), stVolName); } // loop over sensorID _geoManager->CloseGeometry(); _isGeoInitialized = true; // Dump ROOT TGeo object into file if ( dumpRoot ) _geoManager->Export( geomName.c_str() ); // #endif //USE_TGEO return; }