00001
00002
00003
00004
00005 #include "instrument/SiTracker.h"
00006
00007 #include "instrument/SiDetector.h"
00008 #include "xml/IFileManager.h"
00009 #include "xml/IFile.h"
00010
00011
00012 int SiTracker::num_trays;
00013 double SiTracker::tray_spacing;
00014 double SiTracker::z_first_plane;
00015 xml::IFile::doubleVector SiTracker::s_conv_rad_len;
00016 double SiTracker::si_thickness;
00017 double SiTracker::mod_width;
00018 double SiTracker::panel_thickness;
00019 double SiTracker::foot_thickness;
00020 double SiTracker::electronics_gap;
00021 const char* SiTracker::s_conv_mat;
00022 const char* SiTracker::s_color;
00023
00024 #include <string>
00025 using std::string;
00026
00027
00028 const GlastDetector::_PersistKey SiTracker::classPersistKey
00029 = GlastDetector::_PersistKey( "SiTracker" );
00030
00031 namespace {
00032
00033 bool sitrackerPersistFlag
00034 = GlastDetector::addPersistence ( SiTracker::classPersistKey,
00035 new SiTracker::_Factory );
00036 bool sitrackerParamLoad
00037 = xml::IFileManager::loadParams(SiTracker::loadParameters);
00038 };
00039
00040 SiTracker::SiTracker () {
00041 }
00042
00043 SiTracker::~SiTracker () {
00044 }
00045
00046
00047 SiTracker::SiTracker(const DOM_Element& elem) : GlastDetector(elem) {
00048 }
00049
00050
00051 DOM_Element SiTracker::persist(DOM_Element& parent) const {
00052 DOM_Element newElem = GlastDetector::persist(parent);
00053 return newElem;
00054 }
00055
00056
00057 void SiTracker::visit(SiDetector* d) {
00058 addChild(d);
00059 }
00060
00061
00062 void SiTracker::accept(DetectorVisitor& v) {
00063 v.visit(this);
00064 GlastDetector::accept(v);
00065 }
00066
00067
00068
00069 static xml::IFile::doubleVector outside_rad_len;
00070
00071 void SiTracker::loadParameters(xml::IFile& ini)
00072 {
00073 mod_width = ini.getDouble("glast", "mod_width");
00074 si_thickness = ini.getDouble("tracker", "si_thickness");
00075 tray_spacing = ini.getDouble("tracker", "tray_spacing");
00076 z_first_plane = ini.getDouble("tracker", "z_first_plane");
00077 foot_thickness = ini.getDouble("tracker", "foot_thickness");
00078 electronics_gap = ini.getDouble("tracker", "electronics_gap");
00079
00080 num_trays = ini.getInt( "tracker", "num_trays");
00081 s_conv_rad_len = ini.getDoubleVector("tracker", "conv_rad_len");
00082
00083
00084 if (ini.contains("tracker", "outside_rad_len") ){
00085 outside_rad_len = ini.getDoubleVector("tracker", "outside_rad_len");
00086 } else {
00087 outside_rad_len = ini.getDoubleVector("tracker", "conv_rad_len");
00088 }
00089
00090 int i;
00091 for (i = s_conv_rad_len.size(); i < num_trays; ++i) {
00092 s_conv_rad_len.push_back(s_conv_rad_len.back());
00093 }
00094
00095 for (i = outside_rad_len.size(); i < num_trays; ++i) {
00096 outside_rad_len.push_back(outside_rad_len.back());
00097 }
00098
00099 panel_thickness=ini.getDouble("tracker", "panel_thickness");
00100 s_conv_mat = ini.getString("tracker", "conv_mat");
00101 s_color = ini.getString("tracker", "color", "orange");
00102 }
00103
00104
00105
00106 double SiTracker::convRadLen(int layer, int tower)
00107 {
00108 bool inside = tower==5 || tower==6 || tower == 9 || tower==10;
00109 return inside? s_conv_rad_len[layer] : outside_rad_len[layer];
00110 }