00001
00002
00003
00004
00005
00006 #include "instrument/Tower.h"
00007
00008 #include "instrument/SiTracker.h"
00009 #include "instrument/Calorimeter.h"
00010 #include "instrument/DetectorConverter.h"
00011 #include "xml/IFileManager.h"
00012 #include "xml/IFile.h"
00013 #include "xml/Dom.h"
00014
00015 #include <strstream>
00016 #include <iomanip>
00017
00018 typedef std::vector<double> doubleVector;
00019
00020
00021 double Tower::mod_width;
00022 double Tower::wall_thickness;
00023 double Tower::wall_width;
00024 double Tower::wall_gap;
00025 const char* Tower::wall_material;
00026 const char* Tower::wall_color;
00027 double Tower::tray_spacing;
00028 double Tower::cal_tracker_gap;
00029 int Tower::num_trays;
00030 int Tower::align;
00031 const GlastDetector::_PersistKey Tower::classPersistKey = GlastDetector::_PersistKey("Tower");
00032
00033
00034 namespace {
00035 bool towerLoadParams = xml::IFileManager::loadParams(Tower::loadParameters);
00036 bool towerPersistFlag =
00037 xml::PersistentObject::addPersistence(
00038 Tower::classPersistKey,
00039 new Tower::_Factory);
00040 };
00041
00042
00043
00044 Tower::Tower ()
00045 : m_module_id(0), m_tracker(0), m_calorimeter(0)
00046 {}
00047
00048 Tower::Tower (idents::ModuleId id)
00049 : m_module_id(id), m_tracker(0), m_calorimeter(0)
00050 {}
00051
00052
00053 Tower::Tower (const Tower& t)
00054 : m_module_id(t.m_module_id), m_tracker(new SiTracker(*t.m_tracker))
00055 , m_calorimeter(new Calorimeter(*t.m_calorimeter))
00056 {
00057 addChild(m_tracker);
00058 addChild(m_calorimeter);
00059 }
00060
00061
00062 Tower::Tower (const DOM_Element& elem)
00063 : GlastDetector(elem) {
00064 m_module_id =
00065 idents::ModuleId(atoi(xml::Dom::transToChar(elem.getAttribute("module_id"))));
00066 for (iterator it = begin(); it != end(); ++it) (*it)->accept(*this);
00067 }
00068
00069
00070 DOM_Element Tower::persist(DOM_Element& parent) const {
00071 DOM_Element newElem = GlastDetector::persist(parent);
00072 xml::Dom::addAttribute(newElem, "module_id", m_module_id);
00073 return newElem;
00074 }
00075
00076
00077 Tower::~Tower () {
00078 }
00079
00080
00081 void Tower::visit(Calorimeter* c) {
00082 m_calorimeter = c;
00083 addChild(c);
00084 }
00085 void Tower::visit(SiTracker* s) {
00086 m_tracker = s;
00087 addChild(s);
00088 }
00089
00090 void
00091 Tower::printOn(std::ostream& out) const {
00092 out << "\nTower id : " << m_module_id;
00093 out << "\nTracker : ";
00094 m_tracker->printOn(out);
00095 out << "\nCalorimeter : ";
00096 m_calorimeter->printOn(out);
00097 }
00098
00099 void
00100 Tower::accept(DetectorVisitor &v) {
00101 v.visit(this);
00102 GlastDetector::accept(v);
00103 }
00104
00105
00106 void Tower::accept(DetectorConverter &v) const{
00107 v.forward(*this);
00108 GlastDetector::accept(v);
00109 }
00110
00111
00112 void
00113 Tower::loadParameters (xml::IFile& ini){
00114 mod_width = ini.getDouble("glast", "mod_width");
00115 wall_gap = ini.getDouble("walls", "gap");
00116 wall_thickness = ini.getDouble("walls", "thickness");
00117 wall_width = ini.getDouble("walls", "width");
00118 wall_material = ini.getString("walls", "material");
00119 wall_color = ini.getString("walls", "color", "black");
00120 cal_tracker_gap = ini.getDouble("glast", "cal_tracker_gap");
00121 tray_spacing = ini.getDouble("tracker", "tray_spacing");
00122 num_trays = ini.getInt("tracker", "num_trays");
00123 align = ini.getInt("veto", "align", 0);
00124 }