// // $Id: MaterialGeometer.cpp,v 1.8 2005/05/19 23:16:50 shfu Exp $ // // File: MaterialGeometer.cpp // Purpose: Solenoid and beampipe material in d0_geometry // Created: 03-MAR-1999, Abid Patwa, John Hobbs // // Modified: 20-May-2005, Shaohua Fu // Added a rcp option to swich from RunIIa to RunIIb beampipe // RunIIb beampipe is smaller than RunIIa one because of Layer0 detector // // $Revision: 1.8 $ // // // Include files #include #include #include #include "MaterialGeometer.hpp" #include #include #include #include "BareCylindricalSurface.hpp" #include #include #include using namespace edm; using namespace std; using D0Material::Material; using namespace dgs; // Global Definitions enum HandleIDs{BEAMPIPE,SOLENOID}; MaterialGeometer* MaterialGeometer::d_theGeometer=(MaterialGeometer*)0; // Constructor/Destructors MaterialGeometer::MaterialGeometer(): _bpshell(0), _solndshell(0) { } MaterialGeometer::~MaterialGeometer() { delete _bpshell; delete _solndshell; _bpshell=0; _solndshell=0; } // Accessors //////////////////////////////////////////////////////////////////////// MaterialGeometer* MaterialGeometer::get_instance() // // Purpose: Return a pointer to the ONE MaterialGeometer which is allowed // to exist. { if ( !d_theGeometer ) d_theGeometer = new MaterialGeometer; return d_theGeometer; } ///////////////////////////////////////////////////////////////////////// void MaterialGeometer::build(edm::RCP* mainrcp, BaseGeometry* d0det) { //cout << "WARNING: Call to obsolete function MaterialGeometer::build." << endl // << " Routing call through absRefresh. Replace build with absRefresh" // << endl; _d0det=d0det; absRefresh(mainrcp); } bool MaterialGeometer::refresh( const edm::RCP* mainrcp ) { // // Purpose: Create Beampipe & Solenoid material geometry // // // This isn't actually refreshable yet. It can only be built once // if( _bpshell ) return false; if( !_d0det ) { return false; } // Extract beampipe (bp) material info from rcp. // modified SFL0_May_2005 // string bp_matName = mainrcp->getString("bp_MatName"); // string bp_matSym = mainrcp->getString("bp_MatSymbol"); // float bp_matA = mainrcp->getFloat("bp_MatA"); // float bp_matZ = mainrcp->getFloat("bp_MatZ"); // float bp_matRho = mainrcp->getFloat("bp_MatRho"); // float bp_matX0 = mainrcp->getFloat("bp_MatX0"); // float bp_matThick = mainrcp->getFloat("bp_MatThick"); // float bp_r = mainrcp->getFloat("bp_Radius"); // float bp_z = mainrcp->getFloat("bp_Halflength"); string bp_matName; string bp_matSym; float bp_matA; float bp_matZ; float bp_matRho; float bp_matX0; float bp_matThick; float bp_r; float bp_z; bool UseRunIIbBeampipe = mainrcp->getBool("UseRunIIbBeampipe"); if (!UseRunIIbBeampipe) { // RunIIa beampipe bp_matName = mainrcp->getString("bp_MatName"); bp_matSym = mainrcp->getString("bp_MatSymbol"); bp_matA = mainrcp->getFloat("bp_MatA"); bp_matZ = mainrcp->getFloat("bp_MatZ"); bp_matRho = mainrcp->getFloat("bp_MatRho"); bp_matX0 = mainrcp->getFloat("bp_MatX0"); bp_matThick = mainrcp->getFloat("bp_MatThick"); bp_r = mainrcp->getFloat("bp_Radius"); bp_z = mainrcp->getFloat("bp_Halflength"); } else { // RunIIb beampipe (with Layer0 detector) bp_matName = mainrcp->getString("run2b_bp_MatName"); bp_matSym = mainrcp->getString("run2b_bp_MatSymbol"); bp_matA = mainrcp->getFloat("run2b_bp_MatA"); bp_matZ = mainrcp->getFloat("run2b_bp_MatZ"); bp_matRho = mainrcp->getFloat("run2b_bp_MatRho"); bp_matX0 = mainrcp->getFloat("run2b_bp_MatX0"); bp_matThick = mainrcp->getFloat("run2b_bp_MatThick"); bp_r = mainrcp->getFloat("run2b_bp_Radius"); bp_z = mainrcp->getFloat("run2b_bp_Halflength"); } // end of SFL0_May_2005 // Build beampipe with appropriate material and thickness Material bp_material(bp_matName, bp_matSym, bp_matZ, bp_matA, bp_matRho, bp_matX0); // Create the surface representing the bp and position relative to // d0 Base Geometry BareCylindricalSurface* bp=new BareCylindricalSurface(bp_r,bp_z); bp->set_position(_d0det->get_position()); Handle bph = d_cache.create_handle(BEAMPIPE, bp); _bpshell = new CylindricalShell(bph, bp_material, bp_matThick); // Build Solenoid Coil with appropriate material and thickness // Extract solenoid (solnd) material info from rcp. string solnd_matName = mainrcp->getString("solnd_MatName"); string solnd_matSym = mainrcp->getString("solnd_MatSymbol"); float solnd_matA = mainrcp->getFloat("solnd_MatA"); float solnd_matZ = mainrcp->getFloat("solnd_MatZ"); float solnd_matRho = mainrcp->getFloat("solnd_MatRho"); float solnd_matX0 = mainrcp->getFloat("solnd_MatX0"); float solnd_matThick = mainrcp->getFloat("solnd_MatThick"); float solnd_r = mainrcp->getFloat("solnd_Radius"); float solnd_z = mainrcp->getFloat("solnd_Halflength"); // Build solenoid with appropriate material and thickness but: // represent solenoid similar to beampipe with different radius and length, z Material solnd_material(solnd_matName, solnd_matSym, solnd_matZ, solnd_matA, solnd_matRho, solnd_matX0); // Create the surface representing the solnd and position relative to // d0 Base Geometry BareCylindricalSurface* solnd=new BareCylindricalSurface(solnd_r,solnd_z); solnd->set_position(_d0det->get_position()); Handle solndh = d_cache.create_handle(SOLENOID, solnd); _solndshell = new CylindricalShell(solndh, solnd_material, solnd_matThick); // Done. Clear out d0det and return _d0det = 0; return true; } const CylindricalShell* MaterialGeometer::get_beampipe() { return _bpshell; } const CylindricalShell* MaterialGeometer::get_solenoid() { return _solndshell; }