// // $Id: SiBaseGeometry.cpp,v 1.15 2005/04/03 15:36:36 shfu Exp $ // // File: SiBaseGeometry.cc // Purpose: // Created: 09-OCT-1997 John Hobbs // // Jan 31, 2005 by Shaohua Fu // added Layer0 // SFL0_Jan_2005 // // $Revision: 1.15 $ // // Include files #include #include "SiBaseGeometry.hpp" #include #include #include "d0_util/formatting.hpp" // Global definitions using namespace std; using namespace dgs; using edm::RCP; // SiBaseGeometry::SiBaseGeometry(int nc, const float* center_zpos, // cmt.out SFL0_Jan_2005 // const SiCenter* proto_center, // int ne, const float* end_zpos, // const SiEnd* proto_end) // { // const SiCenter* use_center; // const SiEnd* use_end; // // Position the center tracker. // int i; // if( proto_center ) use_center = proto_center; // else use_center = new SiCenter; // for( i=0 ; i& centers, // int ne, const float* end_zpos, // const vector& ends) // { // // Position the center. // int i; // for( i=0 ; i& centers, int ne, const float* end_zpos, const vector& ends, int nl0, const float* l0_zpos, // added SFL0_Jan_2005 const vector& l0s) // added SFL0_Jan_2005 { // Position the center. int i; for( i=0 ; i SiBaseGeometry::get_children() { list kids; for( i=0 ; i<_centers.size() ; i++ ) kids.push_back( &_centers[i] ); for( i=0 ; i<_ends.size() ; i++ ) kids.push_back( &_ends[i] ); for( i=0 ; i<_l0s.size() ; i++ ) kids.push_back( &_l0s[i] ); // added SFL0_Jan_2005 return kids; } std::ostream& operator <<(std::ostream& os, const SiBaseGeometry& me) { os << "SiBaseGeometry at " << me.get_position() << endl << " has " << me.get_center_count() << " centers and " << me.get_end_count() << " ends." << endl; os << " and " << me.get_l0_count() << " layer0." << endl; // added SFL0_Jan_2005 for( i=0 ; i SiBaseGeometry::build_default(RCP* RCPinit/*NULL*/) // // Purpose: Construct the default geometry described by RCPinit. // { int i; // Is this just a dummy call? if( RCPinit == (RCP*)NULL ) return new SiBaseGeometry; cout << "Constructing default silicon detector from RCP" << endl; // First define the necessary ladder types int nladder_types = RCPinit->getInt("nladder_types"); vector ladderTypes; for( i=0 ; igetInt("nlayer_types"); vector layerTypes; for( i=0 ; igetInt("nbarrel_types"); vector barrelTypes; for( i=0 ; igetInt("nwedge_types"); vector wedgeTypes; for( i=0 ; igetInt("nwedgeholder_types"); vector wedgeholderTypes; for( i=0 ; igetInt("ndisk_types"); vector diskTypes; for( i=0 ; igetInt("ncentral_types"); vector centralTypes; for( i=0 ; igetInt("ncenter_types"); vector centerTypes; for( i=0 ; igetInt("nend_types"); vector endTypes; for( i=0 ; igetInt("nl0_types"); vector l0Types; for( i=0 ; igetInt("ncenters"); // Center vector theCenters; float* zpos_c = new float[ncenters]; for(i=0 ; igetFloat(baseid+"z"); int cid = RCPinit->getInt(baseid+"type"); if( cid>0 && cid<=centerTypes.size() ) { const SiCenter* requestedCenter = (centerTypes[cid-1]).instance(); if( requestedCenter ) theCenters.push_back(*requestedCenter); else std::cerr << "ERROR: Center ID = "<getInt("nends"); // End vector theEnds; float* zpos_e = new float[nends]; for( i=0 ; igetFloat(baseid+"z"); int eid = RCPinit->getInt(baseid+"type"); if( eid>0 && eid<=endTypes.size() ) { const SiEnd* requestedEnd = (endTypes[eid-1]).instance(); if( requestedEnd ) theEnds.push_back(*requestedEnd); else std::cerr << "ERROR: End ID = "<getInt("nlayer0s"); // Layer0 vector theL0s; float* zpos_l0 = new float[nl0s]; for( i=0 ; igetFloat(baseid+"z"); int l0id = RCPinit->getInt(baseid+"type"); if( l0id>0 && l0id<=l0Types.size() ) { const SiL0* requestedL0 = (l0Types[l0id-1]).instance(); if( requestedL0 ) theL0s.push_back(*requestedL0); else std::cerr << "ERROR: L0 ID = "< defaultGeometry = new SiBaseGeometry; // defaultGeometry = new SiBaseGeometry(ncenters,zpos_c,theCenters, // cmt.out SFL0_Jan_2005 // nends,zpos_e,theEnds); defaultGeometry = new SiBaseGeometry(ncenters,zpos_c,theCenters, // added SFL0_Jan_2005 nends,zpos_e,theEnds, nl0s,zpos_l0,theL0s); // added SFL0_Jan_2005 delete zpos_c; delete zpos_e; delete zpos_l0; // added SFL0_Jan_2005 // Well... return defaultGeometry; } bool operator==(const SiBaseGeometry& lhs, const SiBaseGeometry &rhs) { if( lhs.get_position() != rhs.get_position() ) return false; if( lhs._centers.size() != rhs._centers.size() ) return false; if( lhs._ends.size() != rhs._ends.size() ) return false; if( lhs._l0s.size() != rhs._l0s.size() ) return false; // added SFL0_Jan_2005 return true; } bool operator!=(const SiBaseGeometry& lhs, const SiBaseGeometry &rhs) { return !(rhs==lhs); }