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/MucROOTGeo.h"
00023
00024 const int MucROOTGeo::m_kSeg[m_kPart] = {4, 8, 4};
00025 const int MucROOTGeo::m_kAbsorber[m_kPart] = {9, 9, 9};
00026 const int MucROOTGeo::m_kGap[m_kPart] = {8, 9, 8};
00027 const int MucROOTGeo::m_kPanel[m_kPart] = {4, 3, 4};
00028
00029 MucROOTGeo::MucROOTGeo()
00030 {
00031
00032 for (int part = 0; part < m_kPart; part++) {
00033 for (int seg = 0; seg < m_kSegMax; seg++) {
00034 for (int gap = 0; gap < m_kGapMax; gap++) {
00035 m_NodeGap[part][seg][gap] = 0;
00036 m_PhysicalGap[part][seg][gap] = 0;
00037
00038
00039 for (int strip = 0; strip < m_kStripMax; strip++) {
00040 m_NodeStrip[part][seg][gap][strip] = 0;
00041 m_PhysicalStrip[part][seg][gap][strip] = 0;
00042 }
00043 }
00044 }
00045 }
00046
00047 string GdmlManagementPath = getenv("GDMLMANAGEMENTROOT");
00048
00049 string GdmlFile = GdmlManagementPath + string("/dat/Muc.gdml");
00050
00051 cout << "GdmlFile " << GdmlFile << endl;
00052 InitFromGdml( GdmlFile.c_str(), "Muc" );
00053 }
00054
00055 MucROOTGeo::~MucROOTGeo()
00056 { }
00057
00058 void
00059 MucROOTGeo::InitFromGdml( const char *gdmlFile, const char *setupName )
00060 {
00061 ReadGdml(gdmlFile, setupName);
00062 SetNode();
00063
00064
00065 m_ROOTGeoInit = 1;
00066 }
00067
00068 void
00069 MucROOTGeo::SetNode()
00070 {
00071 m_Muc = GetTopVolume();
00072 if(!m_Muc) {
00073 m_Muc = GetLogicalVolume("logicalMuc");
00074 }
00075 if(!m_Muc) std::cout << "m_Muc = 0" << std::endl;
00076
00077 int gapCount = 0;
00078 for (int part = 0; part < m_kPart; part++) {
00079 for (int seg = 0; seg < m_kSeg[part]; seg++) {
00080 for (int gap = 0; gap < m_kGap[part]; gap++) {
00081 m_StripNum[part][seg][gap] = GetVolumeStripPlane(part, seg, gap)->GetNdaughters();
00082
00083
00084 std::stringstream osnameGap;
00085 osnameGap << "pv_" << "l" << "Muc" << "P" << part << "S" << seg << "G" << gap << "_" << gapCount;
00086 m_NodeGap[part][seg][gap] = GetNode( osnameGap.str() );
00087 gapCount++;
00088
00089
00090
00091 std::stringstream osnameBox;
00092 osnameBox << "pv_" << "l" << "Muc" << "P" << part << "S" << seg << "G" << gap << "Al" << "_" << "0";
00093
00094 TGeoNode *temp = GetNode( osnameBox.str() );
00095
00096 int segment = 0; if(part==1&&seg==2) segment = 2;
00097 std::stringstream osnameStripPlane;
00098 osnameStripPlane << "pv_" << "l" << "Muc" << "P" << part << "S" << segment << "G" << gap << "SP" << "_" << "0";
00099 m_NodeStripPlane[part][seg][gap] = GetNode( osnameStripPlane.str() );
00100
00101 for (int strip = 0; strip < m_StripNum[part][seg][gap]; strip++) {
00102 std::stringstream osnameStrip;
00103 if(strip < 10) {
00104 osnameStrip << "pv_" << "l" << "Muc" << "P" << part << "S" << segment << "G" << gap << "s" << "00" << strip << "_" << strip;
00105 }
00106 else if(strip < 100) {
00107 osnameStrip << "pv_" << "l" << "Muc" << "P" << part << "S" << segment << "G" << gap << "s" << "0" << strip << "_" << strip;
00108 }
00109 else {
00110 osnameStrip << "pv_" << "l" << "Muc" << "P" << part << "S" << segment << "G" << gap << "s" << strip << "_" << strip;
00111 }
00112
00113 m_NodeStrip[part][seg][gap][strip] = GetNode( osnameStrip.str() );
00114 }
00115 }
00116 }
00117 }
00118 }
00119
00120 void
00121 MucROOTGeo::SetDefaultVis()
00122 {
00123
00124 int mucColor = 2;
00125 int absorberColor = 2;
00126 int gapColor = 8;
00127 int gasChamberColor = 8;
00128 int bakeliteColor = 8;
00129 int stripColor = 6;
00130
00131 m_Muc->SetLineColor(mucColor);
00132 m_Muc->SetVisibility(0);
00133
00134 for (int part = 0; part < m_kPart; part++) {
00135 for (int seg = 0; seg < m_kSeg[part]; seg++) {
00136 for (int absorber = 0; absorber < m_kAbsorber[part]; absorber++) {
00137 GetVolumeAbsorber(part, seg, absorber)->SetLineColor(absorberColor);
00138 GetVolumeAbsorber(part, seg, absorber)->SetVisibility(0);
00139 if (part != 1) {
00140 for (int panel = 0; panel < m_kPanel[part]; panel++) {
00141 GetVolumeAbsorberPanel(part, seg, absorber, panel)->SetLineColor(absorberColor);
00142 GetVolumeAbsorberPanel(part, seg, absorber, panel)->SetVisibility(0);
00143 }
00144 }
00145 }
00146
00147 for (int gap = 0; gap < m_kGap[part]; gap++) {
00148 GetVolumeGap(part, seg, gap)->SetLineColor(gapColor);
00149 GetVolumeGap(part, seg, gap)->SetVisibility(0);
00150 GetVolumeStripPlane(part, seg, gap)->SetLineColor(gapColor);
00151 GetVolumeStripPlane(part, seg, gap)->SetVisibility(0);
00152
00153 for (int strip = 0; strip < m_StripNum[part][seg][gap]; strip++) {
00154 GetVolumeStrip(part, seg, gap, strip)->SetLineColor(stripColor);
00155 GetVolumeStrip(part, seg, gap, strip)->SetVisibility(1);
00156 }
00157
00158 for (int panel = 0; panel < m_kPanel[part]; panel++) {
00159 for(int bakelite = 0; bakelite < m_kBakelite; bakelite++) {
00160 GetVolumeBakelite(part, seg, gap, panel, bakelite)->SetLineColor(bakeliteColor);
00161 GetVolumeBakelite(part, seg, gap, panel, bakelite)->SetVisibility(0);
00162 }
00163 for (int gasChamber = 0; gasChamber < m_kGasChamber; gasChamber++) {
00164 GetVolumeGasChamber(part, seg, gap, panel, gasChamber)->SetLineColor(gasChamberColor);
00165 GetVolumeGasChamber(part, seg, gap, panel, gasChamber)->SetVisibility(0);
00166 }
00167 }
00168 }
00169 }
00170 }
00171
00172 for (int part = 0; part < m_kPart; part++) {
00173 for (int seg = 0; seg < m_kSeg[part]; seg++) {
00174 for (int gap = 0; gap < m_kGap[part]; gap++) {
00175 GetGap(part, seg, gap)->SetVisibility(0);
00176 for (int strip = 0; strip < m_StripNum[part][seg][gap]; strip++) {
00177 GetStrip(part, seg, gap, strip)->SetVisibility(0);
00178 }
00179 }
00180 }
00181 }
00182
00183
00184 }
00185
00186 void
00187 MucROOTGeo::SetAllVisible()
00188 {
00189 for (int part = 0; part < m_kPart; part++) {
00190 for (int seg = 0; seg < m_kSeg[part]; seg++) {
00191 for (int absorber = 0; absorber < m_kAbsorber[part]; absorber++) {
00192 if(part == 1) {
00193 GetVolumeAbsorber(part, seg, absorber)->SetVisibility(1);
00194 }
00195 else {
00196 GetVolumeAbsorber(part, seg, absorber)->SetVisibility(0);
00197 for (int panel = 0; panel < m_kPanel[part]; panel++) {
00198 GetVolumeAbsorberPanel(part, seg, absorber, panel)->SetVisibility(1);
00199 }
00200 }
00201 }
00202
00203 for (int gap = 0; gap < m_kGap[part]; gap++) {
00204 GetVolumeGap(part, seg, gap)->SetVisibility(0);
00205 for (int strip = 0; strip < m_StripNum[part][seg][gap]; strip++) {
00206 GetVolumeStrip(part, seg, gap, strip)->SetVisibility(0);
00207 }
00208
00209 for (int panel = 0; panel < m_kPanel[part]; panel++) {
00210 for(int bakelite = 0; bakelite < m_kBakelite; bakelite++) {
00211 GetVolumeBakelite(part, seg, gap, panel, bakelite)->SetVisibility(1);
00212 }
00213 for (int gasChamber = 0; gasChamber < m_kGasChamber; gasChamber++) {
00214 GetVolumeGasChamber(part, seg, gap, panel, gasChamber)->SetVisibility(1);
00215 }
00216 }
00217 }
00218 }
00219 }
00220
00221 for (int part = 0; part < m_kPart; part++) {
00222 for (int seg = 0; seg < m_kSeg[part]; seg++) {
00223 for (int gap = 0; gap < m_kGap[part]; gap++) {
00224 GetGap(part, seg, gap)->SetVisibility(1);
00225 for (int strip = 0; strip < m_StripNum[part][seg][gap]; strip++) {
00226 GetStrip(part, seg, gap, strip)->SetVisibility(0);
00227 }
00228 }
00229 }
00230 }
00231 }
00232
00233 void
00234 MucROOTGeo::SetQuarterVisible()
00235 {
00236 for (int part = 0; part < m_kPart; part++) {
00237 for (int seg = 0; seg < m_kSeg[part]; seg++) {
00238 for (int absorber = 0; absorber < m_kAbsorber[part]; absorber++) {
00239 if(part == 1) {
00240 if(seg > 2) GetVolumeAbsorber(part, seg, absorber)->SetVisibility(1);
00241 }
00242 else {
00243 GetVolumeAbsorber(part, seg, absorber)->SetVisibility(0);
00244 for (int panel = 0; panel < m_kPanel[part]; panel++) {
00245 if(seg > 0 && seg < 3) GetVolumeAbsorberPanel(part, seg, absorber, panel)->SetVisibility(1);
00246 }
00247 }
00248 }
00249
00250 for (int gap = 0; gap < m_kGap[part]; gap++) {
00251 if (part == 1 && seg > 2) {
00252 GetVolumeGap(part, seg, gap)->SetVisibility(1);
00253 GetGap(part, seg, gap)->SetVisibility(1);
00254 }
00255 else {
00256 GetVolumeGap(part, seg, gap)->SetVisibility(0);
00257 GetGap(part, seg, gap)->SetVisibility(0);
00258 }
00259 for (int strip = 0; strip < m_StripNum[part][seg][gap]; strip++) {
00260 GetVolumeStrip(part, seg, gap, strip)->SetVisibility(0);
00261 }
00262
00263 for (int panel = 0; panel < m_kPanel[part]; panel++) {
00264 for (int bakelite = 0; bakelite < m_kBakelite; bakelite++) {
00265 if ((part != 1 && seg > 0 && seg < 3) || (part == 1 && seg > 2)) GetVolumeBakelite(part, seg, gap, panel, bakelite)->SetVisibility(1);
00266 }
00267 for (int gasChamber = 0; gasChamber < m_kGasChamber; gasChamber++) {
00268 if ((part != 1 && seg > 0 && seg < 3) || (part == 1 && seg > 2)) GetVolumeGasChamber(part, seg, gap, panel, gasChamber)->SetVisibility(1);
00269 }
00270 }
00271 }
00272 }
00273 }
00274
00275 }
00276
00277 void
00278 MucROOTGeo::SetPhysicalNode()
00279 {
00280 int stripColor = 2;
00281
00282 if (gGeoManager == 0) std::cout << "Create gGeoManager first" << std::endl;
00283 TGeoNode *bes = gGeoManager->GetTopNode();
00284 TGeoNode *muc = bes->GetDaughter(m_childNo);
00285
00286 for (int part = 0; part < m_kPart; part++) {
00287 for (int seg = 0; seg < m_kSeg[part]; seg++) {
00288 for (int gap = 0; gap < m_kGap[part]; gap++) {
00289 TGeoNode *nodeGap = GetGap(part, seg, gap);
00290 m_PhysicalGap[part][seg][gap] = gGeoManager->MakePhysicalNode( TString("/") + bes->GetName() +
00291 TString("/") + muc->GetName() +
00292 TString("/") + nodeGap->GetName() +
00293 TString("/") + nodeGap->GetDaughter(0)->GetName());
00294 m_PhysicalGap[part][seg][gap]->SetVisibility(0);
00295 m_PhysicalGap[part][seg][gap]->SetIsVolAtt(kFALSE);
00296
00297 TGeoNode *nodeStripPlane = GetStripPlane(part, seg, gap);
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307 for (int strip = 0; strip < m_StripNum[part][seg][gap]; strip++) {
00308 TGeoNode *nodeStrip = GetStrip(part, seg, gap, strip);
00309 m_PhysicalStrip[part][seg][gap][strip] = gGeoManager->MakePhysicalNode( TString("/") + bes->GetName() +
00310 TString("/") + muc->GetName() +
00311 TString("/") + nodeGap->GetName() +
00312 TString("/") + nodeGap->GetDaughter(0)->GetName() +
00313 TString("/") + nodeStripPlane->GetName() +
00314 TString("/") + nodeStrip->GetName() );
00315 m_PhysicalStrip[part][seg][gap][strip]->SetVisibility(0);
00316 m_PhysicalStrip[part][seg][gap][strip]->SetIsVolAtt(kFALSE);
00317 m_PhysicalStrip[part][seg][gap][strip]->SetLineColor(stripColor);
00318 }
00319 }
00320 }
00321 }
00322 }
00323
00324 int
00325 MucROOTGeo::GetPartNum()
00326 {
00327 int part = m_kPart;
00328 return part;
00329 }
00330
00331 int
00332 MucROOTGeo::GetSegNum(int part)
00333 {
00334 int seg = m_kSeg[part];
00335 return seg;
00336 }
00337
00338 int
00339 MucROOTGeo::GetGapNum(int part)
00340 {
00341 int gap = m_kGap[part];
00342 return gap;
00343 }
00344
00345 int
00346 MucROOTGeo::GetStripNum(int part, int seg, int gap)
00347 {
00348 int strip = m_StripNum[part][seg][gap];
00349 return strip;
00350 }
00351
00352 TGeoVolume*
00353 MucROOTGeo::GetVolumeAbsorber( int part, int seg, int absorber )
00354 {
00355 std::stringstream osname;
00356 osname << "l" << "Muc" << "P" << part << "S" << seg << "Ab" << absorber;
00357
00358 return GetLogicalVolume( osname.str() );
00359 }
00360
00361 float
00362 MucROOTGeo::GetAbsorberThickness( int part, int seg, int absorber )
00363 {
00364 float thickness = 0.0;
00365 TGeoVolume *vol = GetVolumeAbsorber(part, seg, absorber);
00366 if (vol) {
00367 thickness = 2.0*((TGeoBBox*)vol->GetShape())->GetDZ();
00368 }
00369
00370 return thickness;
00371 }
00372
00373 TGeoVolume*
00374 MucROOTGeo::GetVolumeAbsorberPanel( int part, int seg, int absorber, int panel )
00375 {
00376 std::stringstream osname;
00377 osname << "l" << "Muc" << "P" << part << "S" << seg << "Ab" << absorber << "Pn" << panel;
00378
00379 return GetLogicalVolume( osname.str() );
00380 }
00381
00382 TGeoVolume*
00383 MucROOTGeo::GetVolumeGap( int part, int seg, int gap )
00384 {
00385 std::stringstream osname;
00386 osname << "l" << "Muc" << "P" << part << "S" << seg << "G" << gap;
00387
00388 return GetLogicalVolume( osname.str() );
00389 }
00390
00391 TGeoVolume*
00392 MucROOTGeo::GetVolumeAluminumBox( int part, int seg, int gap )
00393 {
00394 std::stringstream osname;
00395 osname <<"l" << "Muc" << "P" << part << "S" << seg << "G" << gap <<"Al";
00396
00397 return GetLogicalVolume( osname.str() );
00398 }
00399
00400 TGeoVolume*
00401 MucROOTGeo::GetVolumeStripPlane( int part, int seg, int gap )
00402 {
00403 int segment = 0; if(part==1&&seg==2) segment = 2;
00404 std::stringstream osname;
00405 osname << "l" << "Muc" << "P" << part << "S" << segment << "G" << gap << "SP";
00406
00407 return GetLogicalVolume( osname.str() );
00408 }
00409
00410 TGeoVolume*
00411 MucROOTGeo::GetVolumeStrip( int part, int seg, int gap, int strip )
00412 {
00413 std::stringstream osname;
00414 if(strip < 10) {
00415 osname << "l" << "Muc" << "P" << part << "S" << "0" << "G" << gap << "s" << "00" << strip;
00416 }
00417 else if(strip<100){
00418 osname << "l" << "Muc" << "P" << part << "S" << "0" << "G" << gap << "s" << "0" << strip;
00419 }
00420 else {
00421 osname << "l" << "Muc" << "P" << part << "S" << "0" << "G" << gap << "s" << strip;
00422 }
00423
00424 return GetLogicalVolume( osname.str() );
00425 }
00426
00427 TGeoVolume*
00428 MucROOTGeo::GetVolumeGasChamber( int part, int seg, int gap, int panel, int gasChamber )
00429 {
00430 std::stringstream osname;
00431 osname << "l" << "Muc" << "P" << part << "S" << "0" << "G" << gap << "R" << gasChamber << "Pn" << panel << "C";
00432
00433 return GetLogicalVolume( osname.str() );
00434 }
00435
00436 TGeoVolume*
00437 MucROOTGeo::GetVolumeBakelite( int part, int seg, int gap, int panel, int bakelite )
00438 {
00439 std::stringstream osname;
00440 osname << "l" << "Muc" << "P" << part << "S" << "0" << "G" << gap << "R" << panel << "B" << bakelite;
00441
00442 return GetLogicalVolume( osname.str() );
00443 }
00444
00445 TGeoNode*
00446 MucROOTGeo::GetGap( int part, int seg, int gap )
00447 {
00448 if (m_NodeGap[part][seg][gap] != 0) {
00449 return m_NodeGap[part][seg][gap];
00450 }
00451 else {
00452 std::cout << "Node: " << "Part" << part << "Seg" << seg << "Gap" << gap << " not found" << std::endl;
00453 return 0;
00454 }
00455 }
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470 TGeoNode*
00471 MucROOTGeo::GetStripPlane( int part, int seg, int gap )
00472 {
00473 if (m_NodeStripPlane[part][seg][gap] != 0) {
00474 return m_NodeStripPlane[part][seg][gap];
00475 }
00476 else {
00477 std::cout << "Node: " << "Part" << part << "Seg" << seg << "Gap" << gap << "StripPlane" << " not found" << std::endl;
00478 return 0;
00479 }
00480 }
00481
00482 TGeoNode*
00483 MucROOTGeo::GetStrip( int part, int seg, int gap, int strip )
00484 {
00485 if (m_NodeStrip[part][seg][gap][strip] != 0) {
00486 return m_NodeStrip[part][seg][gap][strip];
00487 }
00488 else {
00489 std::cout << "Node: " << "Part" << part << "Seg" << "0" << "Gap" << gap << "Strip" << strip << " not found" << std::endl;
00490 return 0;
00491 }
00492 }
00493
00494 TGeoPhysicalNode*
00495 MucROOTGeo::GetPhysicalGap( int part, int seg, int gap )
00496 {
00497 if (m_PhysicalGap[part][seg][gap] != 0) {
00498 return m_PhysicalGap[part][seg][gap];
00499 }
00500 else {
00501 std::cout << "PhysicalNode: " << "Part" << part << "Seg" << seg << "Gap" << gap << " not found" << std::endl;
00502 return 0;
00503 }
00504 }
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518 TGeoPhysicalNode*
00519 MucROOTGeo::GetPhysicalStrip( int part, int seg, int gap, int strip )
00520 {
00521 if (m_PhysicalStrip[part][seg][gap][strip] != 0) {
00522 return m_PhysicalStrip[part][seg][gap][strip];
00523 }
00524 else {
00525 std::cout << "PhysicalNode: " << "Part" << part << "Seg" << seg << "Gap" << gap << "Strip" << strip << " not found" << std::endl;
00526 return 0;
00527 }
00528 }