BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
DetectorDescription/ROOTGeo/src/MdcROOTGeo.cxx
Go to the documentation of this file.
1//$id$
2/*
3 * 2004/11/29 Zhengyun You Peking University
4 * Tof Geometry General for EventDisplay
5 *
6 * 2004/12/10 Zhengyun You Peking University
7 * named from MdcGeo to MdcROOTGeo
8 * inherit from class SubDetectorROOTGeo
9 */
10
11using namespace std;
12
13#include <fstream>
14#include <iomanip>
15#include <iostream>
16#include <sstream>
17#include <string>
18#include <vector>
19
20#include "TGeoManager.h"
21
22#include "ROOTGeo/MdcROOTGeo.h"
23
24const int MdcROOTGeo::m_kReplica[m_kLayer] = {
25 40, 44, 48, 56, 64, 72, 80, 80, 76, 76, 88, 88, 100, 100, 112, 112, 128,
26 128, 140, 140, 160, 160, 160, 160, 192, 192, 192, 192, 208, 208, 208, 208, 240, 240,
27 240, 240, 256, 256, 256, 256, 288, 288, 288, 256, 256, 256, 256, 288, 288, 288 };
28const int MdcROOTGeo::m_kiCorrectLayer[m_kCorrectLayer] = { 9, 11, 13, 15, 17,
29 19, 36, 38, 40, 42 };
30const int
31 // MdcROOTGeo::m_kiCorrectReplica[m_kCorrectLayer] = {38, 44, 50, 56, 65, 71, 127, 127,
32 // 144, 143};
33 MdcROOTGeo::m_kiCorrectReplica[m_kCorrectLayer] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
34
36 // Default constructor.
37 for ( int layer = 0; layer < m_kLayer; layer++ )
38 {
39 for ( int replica = 0; replica < m_kReplicaMax; replica++ )
40 {
41 m_NodeReplica[layer][replica] = 0;
42 m_PhysicalReplica[layer][replica] = 0;
43 }
44 }
45
46 for ( int i = 0; i < m_kCorrectLayer; i++ )
47 { m_CorrectMap[m_kiCorrectLayer[i]] = m_kiCorrectReplica[i]; }
48}
49
51
52void MdcROOTGeo::InitFromGdml( const char* gdmlFile, const char* setupName ) {
53 ReadGdml( gdmlFile, setupName );
54 SetNode();
56
57 m_ROOTGeoInit = 1;
58}
59
61 m_Mdc = GetTopVolume();
62 if ( !m_Mdc ) std::cout << "m_Mdc = 0" << std::endl;
63
64 for ( int layer = 0; layer < m_kLayer; layer++ )
65 {
66 // std::cout << "Layer " << layer << std::endl;
67 for ( int replica = 0; replica < m_kReplica[layer]; replica++ )
68 {
69 std::stringstream osname;
70 int rep = replica;
71 if ( layer >= 0 && layer < m_kStereoLayerIn )
72 {
73 osname << "pv_"
74 << "logical"
75 << "Mdc"
76 << "Stereo"
77 << "Layer" << layer << "TwistedTubs"
78 << "_" << rep;
79 }
80 else if ( layer >= m_kStereoLayerIn && layer < m_kStereoLayerIn + m_kAxialLayerIn )
81 {
82 rep = CorrectReplica( layer, rep );
83 osname << "pv_"
84 << "logical"
85 << "Mdc"
86 << "Axial"
87 << "Layer" << layer << "Replica"
88 << "_" << rep;
89 }
90 else if ( layer >= m_kStereoLayerIn + m_kAxialLayerIn &&
91 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut )
92 {
93 osname << "pv_"
94 << "logical"
95 << "Mdc"
96 << "Stereo"
97 << "Layer" << layer << "TwistedTubs"
98 << "_" << rep;
99 }
100 else if ( layer >= m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut &&
101 layer <
102 m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut + m_kAxialLayerOut )
103 {
104 rep = CorrectReplica( layer, rep );
105 osname << "pv_"
106 << "logical"
107 << "Mdc"
108 << "Axial"
109 << "Layer" << layer << "_0"
110 << "Replica"
111 << "_" << rep;
112 }
113 else if ( layer >= m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut +
114 m_kAxialLayerOut &&
115 layer < m_kLayer )
116 {
117 rep = CorrectReplica( layer, rep );
118 osname << "pv_"
119 << "logical"
120 << "Mdc"
121 << "Axial"
122 << "Layer" << layer - m_kAxialLayerOut << "_1"
123 << "Replica"
124 << "_" << rep;
125 }
126
127 m_NodeReplica[layer][replica] = GetNode( osname.str() );
128 }
129 }
130}
131
132int MdcROOTGeo::CorrectReplica( int layer, int replica ) {
133 int rep = replica;
134 for ( intMap::iterator iter = m_CorrectMap.begin(); iter != m_CorrectMap.end(); iter++ )
135 {
136 if ( layer == ( *iter ).first || ( layer >= m_kStereoLayerIn + m_kAxialLayerIn +
137 m_kStereoLayerOut + m_kAxialLayerOut &&
138 layer - m_kAxialLayerOut == ( *iter ).first ) )
139 {
140 rep -= ( *iter ).second;
141 if ( rep < 0 ) rep += m_kReplica[layer];
142 }
143 }
144
145 // std::cout << "layer" << layer << " " << replica << "->" << rep << std::endl;
146 return rep;
147}
148
150 // std::cout << "begin of set defaultvis" << std::endl;
151 int mdcColor = 3;
152 int segmentColor = 0;
153 int hypeColor = 3;
154 int tubeColor = 4;
155 int twistedTubsColor = 3;
156 int replicaColor = 4;
157
158 m_Mdc->SetLineColor( mdcColor );
159 m_Mdc->SetVisibility( 0 );
160
161 for ( int segment = 1; segment <= m_kSegment; segment++ )
162 {
163 GetVolumeSegment( segment )->SetLineColor( segmentColor );
164 GetVolumeSegment( segment )->SetVisibility( 0 );
165 }
166
167 for ( int layer = 0; layer < m_kLayer; layer++ )
168 {
169 if ( ( layer >= 0 && layer < m_kStereoLayerIn ) ||
170 ( layer >= m_kStereoLayerIn + m_kAxialLayerIn &&
171 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut ) )
172 {
173 GetVolumeLayer( layer )->SetLineColor( hypeColor );
174 GetVolumeReplica( layer )->SetLineColor( twistedTubsColor );
175 }
176 else
177 {
178 GetVolumeLayer( layer )->SetLineColor( tubeColor );
179 GetVolumeReplica( layer )->SetLineColor( replicaColor );
180 }
181 GetVolumeLayer( layer )->SetVisibility( 0 );
182 GetVolumeReplica( layer )->SetVisibility( 1 );
183 }
184
185 for ( int segment = 1; segment <= m_kSegment; segment++ )
186 {
187 for ( int no = 0; no < 2; no++ ) { GetSegment( segment, no )->SetVisibility( 0 ); }
188 }
189
190 for ( int layer = 0; layer < m_kLayer; layer++ )
191 {
192 GetLayer( layer )->SetVisibility( 0 );
193 for ( int replica = 0; replica < m_kReplica[layer]; replica++ )
194 { GetReplica( layer, replica )->SetVisibility( 0 ); }
195 }
196
197 // std::cout << "end of set defaultvis" << std::endl;
198}
199
201 for ( int segment = 1; segment <= m_kSegment; segment++ )
202 { GetVolumeSegment( segment )->SetVisibility( 0 ); }
203
204 for ( int layer = 0; layer < m_kLayer; layer++ )
205 {
206 GetVolumeLayer( layer )->SetVisibility( 1 );
207 GetVolumeReplica( layer )->SetVisibility( 0 );
208 }
209
210 for ( int segment = 1; segment <= m_kSegment; segment++ )
211 {
212 for ( int no = 0; no < 2; no++ ) { GetSegment( segment, no )->SetVisibility( 1 ); }
213 }
214
215 for ( int layer = 0; layer < m_kLayer; layer++ )
216 {
217 GetLayer( layer )->SetVisibility( 1 );
218 for ( int replica = 0; replica < m_kReplica[layer]; replica++ )
219 { GetReplica( layer, replica )->SetVisibility( 0 ); }
220 }
221}
222
224 for ( int segment = 1; segment <= m_kSegment; segment++ )
225 { GetVolumeSegment( segment )->SetVisibility( 0 ); }
226
227 for ( int layer = 0; layer < m_kLayer; layer++ )
228 {
229 GetVolumeLayer( layer )->SetVisibility( 0 );
230 GetVolumeReplica( layer )->SetVisibility( 1 );
231 }
232
233 for ( int segment = 1; segment <= m_kSegment; segment++ )
234 {
235 for ( int no = 0; no < 2; no++ ) { GetSegment( segment, no )->SetVisibility( 0 ); }
236 }
237
238 for ( int layer = 0; layer < m_kLayer; layer++ )
239 {
240 GetLayer( layer )->SetVisibility( 0 );
241 for ( int replica = 0; replica < m_kReplica[layer]; replica++ )
242 {
243 if ( replica < m_kReplica[layer] / 4 ) GetReplica( layer, replica )->SetVisibility( 0 );
244 else GetReplica( layer, replica )->SetVisibility( 1 );
245 }
246 }
247}
248
250 int twistedTubsColor = 3;
251 int replicaColor = 4;
252
253 if ( gGeoManager == 0 ) std::cout << "Create gGeoManager first" << std::endl;
254 TGeoNode* bes = gGeoManager->GetTopNode();
255 // std::cout << "m_childNo " << m_childNo << std::endl;
256 TGeoNode* mdc = bes->GetDaughter( m_childNo );
257
258 // if(!m_Mdc) std::cout << "m_Mdc = 0" << std::endl;
259
260 for ( int layer = 0; layer < m_kLayer; layer++ )
261 {
262 TGeoNode* nodeLayer = GetLayer( layer );
263 // std::cout << "Layer " << layer << std::endl;
264 for ( int replica = 0; replica < m_kReplica[layer]; replica++ )
265 {
266 TGeoNode* nodeReplica = GetReplica( layer, replica );
267 m_PhysicalReplica[layer][replica] = gGeoManager->MakePhysicalNode(
268 TString( "/" ) + bes->GetName() + TString( "/" ) + mdc->GetName() + TString( "/" ) +
269 nodeLayer->GetName() + TString( "/" ) + nodeReplica->GetName() );
270 m_PhysicalReplica[layer][replica]->SetVisibility( 0 );
271 m_PhysicalReplica[layer][replica]->SetIsVolAtt( kFALSE );
272 if ( ( layer >= 0 && layer < m_kStereoLayerIn ) ||
273 ( layer >= m_kStereoLayerIn + m_kAxialLayerIn &&
274 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut ) )
275 { m_PhysicalReplica[layer][replica]->SetLineColor( twistedTubsColor ); }
276 else { m_PhysicalReplica[layer][replica]->SetLineColor( replicaColor ); }
277 // if (m_PhysicalReplica[layer][replica]->IsVolAttributes()) std::cout << "yes " <<
278 // std::endl;
279 }
280 }
281}
282
283TGeoVolume* MdcROOTGeo::GetVolumeSegment( int segment ) {
284 std::stringstream osname;
285 osname << "logical"
286 << "Mdc"
287 << "Segment" << segment;
288 return GetLogicalVolume( osname.str() );
289}
290
291TGeoVolume* MdcROOTGeo::GetVolumeLayer( int layer ) {
292 std::stringstream osname;
293 if ( layer >= 0 && layer < m_kStereoLayerIn )
294 {
295 osname << "logical"
296 << "Mdc"
297 << "Stereo"
298 << "Layer" << layer;
299 }
300 else if ( layer >= m_kStereoLayerIn && layer < m_kStereoLayerIn + m_kAxialLayerIn )
301 {
302 osname << "logical"
303 << "Mdc"
304 << "Axial"
305 << "Layer" << layer;
306 }
307 else if ( layer >= m_kStereoLayerIn + m_kAxialLayerIn &&
308 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut )
309 {
310 osname << "logical"
311 << "Mdc"
312 << "Stereo"
313 << "Layer" << layer;
314 }
315 else if ( layer >= m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut &&
316 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut + m_kAxialLayerOut )
317 {
318 osname << "logical"
319 << "Mdc"
320 << "Axial"
321 << "Layer" << layer << "_0";
322 }
323 else if ( layer >=
324 m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut + m_kAxialLayerOut &&
325 layer < m_kLayer )
326 {
327 osname << "logical"
328 << "Mdc"
329 << "Axial"
330 << "Layer" << layer - m_kAxialLayerOut << "_1";
331 }
332
333 return GetLogicalVolume( osname.str() );
334}
335
336TGeoVolume* MdcROOTGeo::GetVolumeReplica( int layer ) {
337 std::stringstream osname;
338 if ( layer >= 0 && layer < m_kStereoLayerIn )
339 {
340 osname << "logical"
341 << "Mdc"
342 << "Stereo"
343 << "Layer" << layer << "TwistedTubs";
344 }
345 else if ( layer >= m_kStereoLayerIn && layer < m_kStereoLayerIn + m_kAxialLayerIn )
346 {
347 osname << "logical"
348 << "Mdc"
349 << "Axial"
350 << "Layer" << layer << "Replica";
351 }
352 else if ( layer >= m_kStereoLayerIn + m_kAxialLayerIn &&
353 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut )
354 {
355 osname << "logical"
356 << "Mdc"
357 << "Stereo"
358 << "Layer" << layer << "TwistedTubs";
359 }
360 else if ( layer >= m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut &&
361 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut + m_kAxialLayerOut )
362 {
363 osname << "logical"
364 << "Mdc"
365 << "Axial"
366 << "Layer" << layer << "_0"
367 << "Replica";
368 }
369 else if ( layer >=
370 m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut + m_kAxialLayerOut &&
371 layer < m_kLayer )
372 {
373 osname << "logical"
374 << "Mdc"
375 << "Axial"
376 << "Layer" << layer - m_kAxialLayerOut << "_1"
377 << "Replica";
378 }
379
380 return GetLogicalVolume( osname.str() );
381}
382
383TGeoNode* MdcROOTGeo::GetSegment( int segment, int no ) {
384 std::stringstream osname;
385 if ( segment == 1 || segment == 2 )
386 {
387 osname << "pv_"
388 << "logical"
389 << "Mdc"
390 << "Segment" << segment << "_" << m_kLayer + segment - 1;
391 }
392 else
393 {
394 osname << "pv_"
395 << "logical"
396 << "Mdc"
397 << "Segment" << segment << "_" << m_kLayer + 2 + ( segment - 3 ) * 2 + no;
398 }
399
400 return GetNode( osname.str() );
401}
402
403TGeoNode* MdcROOTGeo::GetLayer( int layer ) {
404 std::stringstream osname;
405 if ( layer >= 0 && layer < m_kStereoLayerIn )
406 {
407 osname << "pv_"
408 << "logical"
409 << "Mdc"
410 << "Stereo"
411 << "Layer" << layer << "_" << layer;
412 }
413 else if ( layer >= m_kStereoLayerIn && layer < m_kStereoLayerIn + m_kAxialLayerIn )
414 {
415 osname << "pv_"
416 << "logical"
417 << "Mdc"
418 << "Axial"
419 << "Layer" << layer << "_" << layer;
420 }
421 else if ( layer >= m_kStereoLayerIn + m_kAxialLayerIn &&
422 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut )
423 {
424 osname << "pv_"
425 << "logical"
426 << "Mdc"
427 << "Stereo"
428 << "Layer" << layer << "_" << layer;
429 }
430 else if ( layer >= m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut &&
431 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut + m_kAxialLayerOut )
432 {
433 osname << "pv_"
434 << "logical"
435 << "Mdc"
436 << "Axial"
437 << "Layer" << layer << "_0"
438 << "_" << 2 * layer - m_kStereoLayerIn - m_kAxialLayerIn - m_kStereoLayerOut;
439 }
440 else if ( layer >=
441 m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut + m_kAxialLayerOut &&
442 layer < m_kLayer )
443 {
444 osname << "pv_"
445 << "logical"
446 << "Mdc"
447 << "Axial"
448 << "Layer" << layer - m_kAxialLayerOut << "_1"
449 << "_"
450 << 2 * ( layer - m_kAxialLayerOut ) - m_kStereoLayerIn - m_kAxialLayerIn -
451 m_kStereoLayerOut + 1;
452 }
453
454 // std::cout << osname.str() << std::endl;
455 return GetNode( osname.str() );
456}
457
458TGeoNode* MdcROOTGeo::GetReplica( int layer, int replica ) {
459 if ( m_NodeReplica[layer][replica] != 0 )
460 {
461 // std::cout << " replica " << layer << " " << replica << " found " << std::endl;
462 return m_NodeReplica[layer][replica];
463 }
464 else
465 {
466 std::cout << "Node: "
467 << "Layer" << layer << "Replica" << replica << " not found" << std::endl;
468 return 0;
469 }
470}
471
472TGeoPhysicalNode* MdcROOTGeo::GetPhysicalReplica( int layer, int replica ) {
473 if ( m_PhysicalReplica[layer][replica] != 0 ) { return m_PhysicalReplica[layer][replica]; }
474 else
475 {
476 std::cout << "PhysicalNode: "
477 << "Layer" << layer << "Replica" << replica << " not found" << std::endl;
478 return 0;
479 }
480}
std::string mdc
EvtStreamInputIterator< typename Generator::result_type > iter(Generator gen, int N=0)
TGeoNode * GetSegment(int segment, int no)
Get segment node;.
int CorrectReplica(int layer, int replica)
Correct some axial layer id to copyNo;.
TGeoVolume * GetVolumeLayer(int layer)
Get layer volume;.
void SetQuarterVisible()
Set quater visible;.
void SetNode()
Set the pointers to theirs nodes;.
TGeoNode * GetLayer(int layer)
Get layer node;.
TGeoNode * GetReplica(int layer, int replica)
Get replica node;.
void SetDefaultVis()
Set default visual attributes;.
TGeoVolume * GetVolumeReplica(int layer)
Get replica volume;.
TGeoVolume * GetVolumeSegment(int segment)
Get segment volume;.
TGeoPhysicalNode * GetPhysicalReplica(int layer, int replica)
Get replica physical node;.
void SetPhysicalNode()
Set the pointers to the physical nodes;.
void InitFromGdml(const char *gdmlFile, const char *setupName)
Initialize the instance of ROOTGeo.
TGeoNode * GetNode(const std::string &nn)
Get a node(physical volume) by name;.
TGeoVolume * GetLogicalVolume(const std::string &vn)
Get a logical volume by name;.
void ReadGdml(const char *gdmlFile, const char *setupName)
Initialize the instance of ROOTGeo.