00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 using namespace std;
00012
00013 #include <string>
00014 #include <fstream>
00015 #include <iostream>
00016 #include <sstream>
00017 #include <vector>
00018 #include <iomanip>
00019
00020 #include <TGeoManager.h>
00021
00022 #include "ROOTGeo/MdcROOTGeo.h"
00023
00024 const int
00025 MdcROOTGeo::m_kReplica[m_kLayer] = { 40, 44, 48, 56, 64, 72, 80, 80,
00026 76, 76, 88, 88, 100, 100, 112, 112, 128, 128, 140, 140,
00027 160, 160, 160, 160, 192, 192, 192, 192, 208, 208, 208, 208, 240, 240, 240, 240,
00028 256, 256, 256, 256, 288, 288, 288,
00029 256, 256, 256, 256, 288, 288, 288 };
00030 const int
00031 MdcROOTGeo::m_kiCorrectLayer[m_kCorrectLayer] = {9, 11, 13, 15, 17, 19, 36, 38, 40, 42};
00032 const int
00033
00034 MdcROOTGeo::m_kiCorrectReplica[m_kCorrectLayer] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
00035
00036 MdcROOTGeo::MdcROOTGeo()
00037 {
00038
00039 for (int layer = 0; layer < m_kLayer; layer++) {
00040 for (int replica = 0; replica < m_kReplicaMax; replica++) {
00041 m_NodeReplica[layer][replica] = 0;
00042 m_PhysicalReplica[layer][replica] = 0;
00043 }
00044 }
00045
00046 for (int i = 0; i < m_kCorrectLayer; i++) {
00047 m_CorrectMap[m_kiCorrectLayer[i]] = m_kiCorrectReplica[i];
00048 }
00049 }
00050
00051 MdcROOTGeo::~MdcROOTGeo()
00052 { }
00053
00054 void
00055 MdcROOTGeo::InitFromGdml( const char *gdmlFile, const char *setupName )
00056 {
00057 ReadGdml(gdmlFile, setupName);
00058 SetNode();
00059 SetDefaultVis();
00060
00061 m_ROOTGeoInit = 1;
00062 }
00063
00064 void
00065 MdcROOTGeo::SetNode()
00066 {
00067 m_Mdc = GetTopVolume();
00068 if(!m_Mdc) std::cout << "m_Mdc = 0" << std::endl;
00069
00070 for (int layer = 0; layer < m_kLayer; layer++) {
00071
00072 for (int replica = 0; replica < m_kReplica[layer]; replica++) {
00073 std::stringstream osname;
00074 int rep = replica;
00075 if (layer >= 0 && layer < m_kStereoLayerIn) {
00076 osname << "pv_" << "logical" << "Mdc" << "Stereo" << "Layer" << layer << "TwistedTubs" << "_" << rep;
00077 }
00078 else if (layer >= m_kStereoLayerIn && layer < m_kStereoLayerIn + m_kAxialLayerIn) {
00079 rep = CorrectReplica(layer, rep);
00080 osname << "pv_" << "logical" << "Mdc" << "Axial" << "Layer" << layer << "Replica" << "_" << rep;
00081 }
00082 else if (layer >= m_kStereoLayerIn + m_kAxialLayerIn &&
00083 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut) {
00084 osname << "pv_" << "logical" << "Mdc" << "Stereo" << "Layer" << layer << "TwistedTubs" << "_" << rep;
00085 }
00086 else if (layer >= m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut &&
00087 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut + m_kAxialLayerOut) {
00088 rep = CorrectReplica(layer, rep);
00089 osname << "pv_" << "logical" << "Mdc" << "Axial" << "Layer" << layer << "_0" << "Replica" << "_" << rep;
00090 }
00091 else if (layer >= m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut + m_kAxialLayerOut &&
00092 layer < m_kLayer) {
00093 rep = CorrectReplica(layer, rep);
00094 osname << "pv_" << "logical" << "Mdc" << "Axial" << "Layer" << layer - m_kAxialLayerOut << "_1" << "Replica" << "_" << rep;
00095 }
00096
00097 m_NodeReplica[layer][replica] = GetNode( osname.str() );
00098 }
00099 }
00100 }
00101
00102 int
00103 MdcROOTGeo::CorrectReplica(int layer, int replica)
00104 {
00105 int rep = replica;
00106 for (intMap::iterator iter = m_CorrectMap.begin(); iter != m_CorrectMap.end(); iter++) {
00107 if (layer == (*iter).first ||
00108 (layer >= m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut + m_kAxialLayerOut &&
00109 layer - m_kAxialLayerOut == (*iter).first)) {
00110 rep -= (*iter).second;
00111 if (rep < 0) rep += m_kReplica[layer];
00112 }
00113 }
00114
00115
00116 return rep;
00117 }
00118
00119 void
00120 MdcROOTGeo::SetDefaultVis()
00121 {
00122
00123 int mdcColor = 3;
00124 int segmentColor = 0;
00125 int hypeColor = 3;
00126 int tubeColor = 4;
00127 int twistedTubsColor = 3;
00128 int replicaColor = 4;
00129
00130 m_Mdc->SetLineColor(mdcColor);
00131 m_Mdc->SetVisibility(0);
00132
00133 for (int segment = 1; segment <= m_kSegment; segment++) {
00134 GetVolumeSegment(segment)->SetLineColor(segmentColor);
00135 GetVolumeSegment(segment)->SetVisibility(0);
00136 }
00137
00138 for (int layer =0; layer < m_kLayer; layer++) {
00139 if ( (layer >= 0 && layer < m_kStereoLayerIn) ||
00140 (layer >= m_kStereoLayerIn + m_kAxialLayerIn &&
00141 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut) ) {
00142 GetVolumeLayer(layer)->SetLineColor(hypeColor);
00143 GetVolumeReplica(layer)->SetLineColor(twistedTubsColor);
00144 }
00145 else {
00146 GetVolumeLayer(layer)->SetLineColor(tubeColor);
00147 GetVolumeReplica(layer)->SetLineColor(replicaColor);
00148 }
00149 GetVolumeLayer(layer)->SetVisibility(0);
00150 GetVolumeReplica(layer)->SetVisibility(1);
00151 }
00152
00153 for (int segment = 1; segment <= m_kSegment; segment++) {
00154 for (int no = 0; no < 2; no++) {
00155 GetSegment(segment, no)->SetVisibility(0);
00156 }
00157 }
00158
00159 for (int layer = 0; layer < m_kLayer; layer++) {
00160 GetLayer(layer)->SetVisibility(0);
00161 for (int replica = 0; replica < m_kReplica[layer]; replica++) {
00162 GetReplica(layer, replica)->SetVisibility(0);
00163 }
00164 }
00165
00166
00167 }
00168
00169 void
00170 MdcROOTGeo::SetAllVisible()
00171 {
00172 for (int segment = 1; segment <= m_kSegment; segment++) {
00173 GetVolumeSegment(segment)->SetVisibility(0);
00174 }
00175
00176 for (int layer = 0; layer < m_kLayer; layer++) {
00177 GetVolumeLayer(layer)->SetVisibility(1);
00178 GetVolumeReplica(layer)->SetVisibility(0);
00179 }
00180
00181 for (int segment = 1; segment <= m_kSegment; segment++) {
00182 for (int no = 0; no < 2; no++) {
00183 GetSegment(segment, no)->SetVisibility(1);
00184 }
00185 }
00186
00187 for (int layer = 0; layer < m_kLayer; layer++) {
00188 GetLayer(layer)->SetVisibility(1);
00189 for (int replica = 0; replica < m_kReplica[layer]; replica++) {
00190 GetReplica(layer, replica)->SetVisibility(0);
00191 }
00192 }
00193 }
00194
00195 void
00196 MdcROOTGeo::SetQuarterVisible()
00197 {
00198 for (int segment = 1; segment <= m_kSegment; segment++) {
00199 GetVolumeSegment(segment)->SetVisibility(0);
00200 }
00201
00202 for (int layer = 0; layer < m_kLayer; layer++) {
00203 GetVolumeLayer(layer)->SetVisibility(0);
00204 GetVolumeReplica(layer)->SetVisibility(1);
00205 }
00206
00207 for (int segment = 1; segment <= m_kSegment; segment++) {
00208 for (int no = 0; no < 2; no++) {
00209 GetSegment(segment, no)->SetVisibility(0);
00210 }
00211 }
00212
00213 for (int layer = 0; layer < m_kLayer; layer++) {
00214 GetLayer(layer)->SetVisibility(0);
00215 for (int replica = 0; replica < m_kReplica[layer]; replica++) {
00216 if (replica < m_kReplica[layer]/4) GetReplica(layer, replica)->SetVisibility(0);
00217 else GetReplica(layer, replica)->SetVisibility(1);
00218 }
00219 }
00220 }
00221
00222 void
00223 MdcROOTGeo::SetPhysicalNode()
00224 {
00225 int twistedTubsColor = 3;
00226 int replicaColor = 4;
00227
00228 if (gGeoManager == 0) std::cout << "Create gGeoManager first" << std::endl;
00229 TGeoNode *bes = gGeoManager->GetTopNode();
00230
00231 TGeoNode *mdc = bes->GetDaughter(m_childNo);
00232
00233
00234
00235 for (int layer = 0; layer < m_kLayer; layer++) {
00236 TGeoNode *nodeLayer = GetLayer(layer);
00237
00238 for (int replica = 0; replica < m_kReplica[layer]; replica++) {
00239 TGeoNode *nodeReplica = GetReplica(layer, replica);
00240 m_PhysicalReplica[layer][replica] = gGeoManager->MakePhysicalNode( TString("/") + bes->GetName() +
00241 TString("/") + mdc->GetName() +
00242 TString("/") + nodeLayer->GetName() +
00243 TString("/") + nodeReplica->GetName());
00244 m_PhysicalReplica[layer][replica]->SetVisibility(0);
00245 m_PhysicalReplica[layer][replica]->SetIsVolAtt(kFALSE);
00246 if ( (layer >= 0 && layer < m_kStereoLayerIn) ||
00247 (layer >= m_kStereoLayerIn + m_kAxialLayerIn &&
00248 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut) ) {
00249 m_PhysicalReplica[layer][replica]->SetLineColor(twistedTubsColor);
00250 }
00251 else {
00252 m_PhysicalReplica[layer][replica]->SetLineColor(replicaColor);
00253 }
00254
00255 }
00256 }
00257 }
00258
00259 TGeoVolume*
00260 MdcROOTGeo::GetVolumeSegment( int segment )
00261 {
00262 std::stringstream osname;
00263 osname << "logical" << "Mdc" << "Segment" << segment;
00264 return GetLogicalVolume( osname.str() );
00265 }
00266
00267 TGeoVolume*
00268 MdcROOTGeo::GetVolumeLayer( int layer )
00269 {
00270 std::stringstream osname;
00271 if (layer >= 0 && layer < m_kStereoLayerIn) {
00272 osname << "logical" << "Mdc" << "Stereo" << "Layer" << layer;
00273 }
00274 else if (layer >= m_kStereoLayerIn && layer < m_kStereoLayerIn + m_kAxialLayerIn) {
00275 osname << "logical" << "Mdc" << "Axial" << "Layer" << layer;
00276 }
00277 else if (layer >= m_kStereoLayerIn + m_kAxialLayerIn &&
00278 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut) {
00279 osname << "logical" << "Mdc" << "Stereo" << "Layer" << layer;
00280 }
00281 else if (layer >= m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut &&
00282 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut + m_kAxialLayerOut) {
00283 osname << "logical" << "Mdc" << "Axial" << "Layer" << layer << "_0";
00284 }
00285 else if (layer >= m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut + m_kAxialLayerOut &&
00286 layer < m_kLayer) {
00287 osname << "logical" << "Mdc" << "Axial" << "Layer" << layer - m_kAxialLayerOut << "_1";
00288 }
00289
00290 return GetLogicalVolume( osname.str() );
00291 }
00292
00293 TGeoVolume*
00294 MdcROOTGeo::GetVolumeReplica( int layer )
00295 {
00296 std::stringstream osname;
00297 if (layer >= 0 && layer < m_kStereoLayerIn) {
00298 osname << "logical" << "Mdc" << "Stereo" << "Layer" << layer << "TwistedTubs";
00299 }
00300 else if (layer >= m_kStereoLayerIn && layer < m_kStereoLayerIn + m_kAxialLayerIn) {
00301 osname << "logical" << "Mdc" << "Axial" << "Layer" << layer << "Replica";
00302 }
00303 else if (layer >= m_kStereoLayerIn + m_kAxialLayerIn &&
00304 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut) {
00305 osname << "logical" << "Mdc" << "Stereo" << "Layer" << layer << "TwistedTubs";
00306 }
00307 else if (layer >= m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut &&
00308 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut + m_kAxialLayerOut) {
00309 osname << "logical" << "Mdc" << "Axial" << "Layer" << layer << "_0" << "Replica";
00310 }
00311 else if (layer >= m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut + m_kAxialLayerOut &&
00312 layer < m_kLayer) {
00313 osname << "logical" << "Mdc" << "Axial" << "Layer" << layer - m_kAxialLayerOut << "_1" << "Replica";
00314 }
00315
00316 return GetLogicalVolume( osname.str() );
00317 }
00318
00319 TGeoNode*
00320 MdcROOTGeo::GetSegment( int segment, int no )
00321 {
00322 std::stringstream osname;
00323 if (segment == 1 || segment == 2) {
00324 osname << "pv_" << "logical" << "Mdc" << "Segment" << segment << "_" << m_kLayer + segment - 1;
00325 }
00326 else {
00327 osname << "pv_" << "logical" << "Mdc" << "Segment" << segment << "_" << m_kLayer + 2 + (segment - 3)*2 + no;
00328 }
00329
00330 return GetNode( osname.str() );
00331 }
00332
00333 TGeoNode*
00334 MdcROOTGeo::GetLayer( int layer )
00335 {
00336 std::stringstream osname;
00337 if (layer >= 0 && layer < m_kStereoLayerIn) {
00338 osname << "pv_" << "logical" << "Mdc" << "Stereo" << "Layer" << layer << "_" << layer;
00339 }
00340 else if (layer >= m_kStereoLayerIn && layer < m_kStereoLayerIn + m_kAxialLayerIn) {
00341 osname << "pv_" << "logical" << "Mdc" << "Axial" << "Layer" << layer << "_" << layer;
00342 }
00343 else if (layer >= m_kStereoLayerIn + m_kAxialLayerIn &&
00344 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut) {
00345 osname << "pv_" << "logical" << "Mdc" << "Stereo" << "Layer" << layer << "_" << layer;
00346 }
00347 else if (layer >= m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut &&
00348 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut + m_kAxialLayerOut) {
00349 osname << "pv_" << "logical" << "Mdc" << "Axial" << "Layer" << layer << "_0" << "_"
00350 << 2*layer - m_kStereoLayerIn - m_kAxialLayerIn - m_kStereoLayerOut;
00351 }
00352 else if (layer >= m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut + m_kAxialLayerOut &&
00353 layer < m_kLayer) {
00354 osname << "pv_" << "logical" << "Mdc" << "Axial" << "Layer" << layer - m_kAxialLayerOut << "_1" << "_"
00355 << 2*(layer - m_kAxialLayerOut) - m_kStereoLayerIn - m_kAxialLayerIn - m_kStereoLayerOut + 1;
00356 }
00357
00358
00359 return GetNode( osname.str() );
00360 }
00361
00362 TGeoNode*
00363 MdcROOTGeo::GetReplica( int layer, int replica )
00364 {
00365 if (m_NodeReplica[layer][replica] != 0) {
00366
00367 return m_NodeReplica[layer][replica];
00368 }
00369 else {
00370 std::cout << "Node: " << "Layer" << layer << "Replica" << replica << " not found" << std::endl;
00371 return 0;
00372 }
00373 }
00374
00375 TGeoPhysicalNode*
00376 MdcROOTGeo::GetPhysicalReplica( int layer, int replica )
00377 {
00378 if (m_PhysicalReplica[layer][replica] != 0) {
00379 return m_PhysicalReplica[layer][replica];
00380 }
00381 else {
00382 std::cout << "PhysicalNode: " << "Layer" << layer << "Replica" << replica << " not found" << std::endl;
00383 return 0;
00384 }
00385 }