BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
EventDisplay/BesVisLib/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 <TGeoArb8.h>
21#include <TGeoManager.h>
22#include <TGeoTube.h>
23#include <TMath.h>
24
25#include "BesVisLib/BesEvent.h"
26#include "BesVisLib/BesView.h"
27#include "BesVisLib/MdcROOTGeo.h"
28#include "Identifier/MdcID.h"
29#include "RawEvent/RawDataUtil.h"
30
31const int MdcROOTGeo::m_kReplica[m_kLayer] = {
32 40, 44, 48, 56, 64, 72, 80, 80, 76, 76, 88, 88, 100, 100, 112, 112, 128,
33 128, 140, 140, 160, 160, 160, 160, 176, 176, 176, 176, 208, 208, 208, 208, 240, 240,
34 240, 240, 256, 256, 256, 256, 256, 256, 256, 256, 288, 288, 288, 288, 288, 288 };
35
36const int MdcROOTGeo::m_kStereoDir[m_kTrueLayer] = {
37 1, 1, 1, 1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
38 1, 1, -1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0 };
39const int MdcROOTGeo::m_kiCorrectLayer[m_kCorrectLayer] = { 9, 11, 13, 15, 17,
40 19, 36, 38, 40, 42 };
41const int
42 // MdcROOTGeo::m_kiCorrectReplica[m_kCorrectLayer] = {38, 44, 50, 56, 65, 71, 127, 127,
43 // 144, 143};
44 MdcROOTGeo::m_kiCorrectReplica[m_kCorrectLayer] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
45
46MdcROOTGeo::MdcROOTGeo( Bool_t cgem_flag ) // Long Peixun's update: Add CGEM flag
48 m_MdcColor = 3;
49 m_segmentColor = 0;
50 m_hypeColor = 3;
51 m_tubeColor = 4;
52 // m_twistedTubsColor = kBlue;
53 m_twistedTubsColor = 9; // Long Peixun's update: Blue -> Green, as same as XY View
54 // m_replicaColor = kCyan;
55 m_replicaColor = 8; // Long Peixun's update: Grey -> Blue, as same as XY View
56
57 // Long Peixun's update: According to CGEM flag, set start wire layer
58 if ( cgem_flag ) m_StartLayer = 8;
59 else m_StartLayer = 0;
60
61 k_TFire = kTRUE;
62 k_QFire = kTRUE;
63 k_QNotOverflow = kFALSE;
64
65 // Default constructor.
66 for ( int layer = 0; layer < m_kLayer; layer++ )
67 {
68 m_NodeLayer[layer] = 0;
69 for ( int replica = 0; replica < m_kReplicaMax; replica++ )
70 {
71 m_NodeReplica[layer][replica] = 0;
72 m_PhysicalReplica[layer][replica] = 0;
73 }
74 }
75
76 for ( int i = 0; i < m_kCorrectLayer; i++ )
77 { m_CorrectMap[m_kiCorrectLayer[i]] = m_kiCorrectReplica[i]; }
78
79 for ( int layer = 0; layer < m_kTrueLayer; layer++ )
80 {
81 for ( int replica = 0; replica < m_kReplicaMax; replica++ )
82 { m_Mdc2DWire[layer][replica] = 0; }
83 }
84}
85
87 // Long Peixun's update: Add destructor
88 cout << "delete old MdcROOTGeo" << endl;
89 for ( Int_t layer = 0; layer < m_kTrueLayer; ++layer )
90 {
91 Int_t simuLayer = GetSimuLayer( layer );
92 for ( Int_t replica = 0; replica < m_kReplica[simuLayer]; ++replica )
93 { delete m_Mdc2DWire[layer][replica]; }
94 }
95 delete m_MdcXY;
96 delete m_MdcZR[0];
97 delete m_MdcZR[1];
98}
99
100void MdcROOTGeo::InitFromGDML( const char* gdmlFile, const char* setupName ) {
101 m_ROOTGeoInit = 2;
102 ReadGdml( gdmlFile, setupName );
103 SetNode();
104}
105
106void MdcROOTGeo::InitFromROOT( TGeoVolume* vol ) {
107 m_ROOTGeoInit = 1;
108 SetVolumeMdc( vol );
109 SetNode();
110}
111
113 if ( m_ROOTGeoInit != 1 && m_ROOTGeoInit != 2 )
114 {
115 cout << "MdcROOTGeo::Init2DGeometry, ROOT Geometry not Initialized yet!" << endl;
116 return;
117 }
118
119 m_2DGeoInit = 1;
120 Int_t mdcColor = 11; // 1002; // 41, 29
121 Int_t mdcLineColor = 15;
122 Int_t mdcXYStyle = 1001; // 3001;
123 Int_t mdcZRStyle = 1001; // 3007;
124 Int_t mdcStereoSuperColor = 38;
125 Int_t mdcAxialSuperColor = 4;
126
127 Double_t local[3] = { 0.0, 0.0, 0.0 };
128 Double_t master[3] = { 0.0, 0.0, 0.0 };
129 // Int_t nPoints = 4;
130 Double_t P[306] = { 0.0 }; // Long Peixun's update: 300 -> 306, at most 102 points
131 Double_t center[3] = { 0.0, 0.0, 0.0 };
132 TString name;
133
134 //----------XY-----------
135 // Mdc
136 TGeoTube* mdcShape = (TGeoTube*)GetVolumeMdc()->GetShape();
137 // Long Peixun's update: Consider CGEM detector
138 Double_t rmin = mdcShape->GetRmin();
139 if ( m_StartLayer > 0 ) // if contains CGEM
140 {
141 TGeoTube* mdcShapeOuter = (TGeoTube*)( GetLayer( m_StartLayer )->GetVolume() )->GetShape();
142 rmin = mdcShapeOuter->GetRmin();
143 }
144
145 m_MdcXY = new BesCircle2D( "Mdc", "Mdc", rmin, mdcShape->GetRmax(), &center[0] );
146 m_MdcXY->SetNSegment( 360 );
147 m_MdcXY->SetFillColor( mdcColor );
148 m_MdcXY->SetFillStyle( mdcXYStyle );
149 m_MdcXY->SetLineColor( mdcLineColor );
150
151 // Long Peixun's update: Annotate
152 /* // Mdc Supers
153 Int_t layerIn[4] = {0,
154 m_kStereoLayerIn,
155 m_kStereoLayerIn+m_kAxialLayerIn,
156 m_kStereoLayerIn+m_kAxialLayerIn+m_kStereoLayerOut
157 };
158 Int_t layerOut[4] = {m_kStereoLayerIn-1,
159 m_kStereoLayerIn+m_kAxialLayerIn-1,
160 m_kStereoLayerIn+m_kAxialLayerIn+m_kStereoLayerOut-1,
161 m_kLayer-1
162 };
163 for (Int_t i = 0; i < 4; i++) {
164 TGeoTube *mdcSuperShapeIn =
165 (TGeoTube*)(GetLayer(layerIn[i])->GetVolume())->GetShape(); TGeoTube *mdcSuperShapeOut =
166 (TGeoTube*)(GetLayer(layerOut[i])->GetVolume())->GetShape(); name = TString("MdcSuper" +
167 i); m_MdcXYSuper[i] = new BesCircle2D(name, name, mdcSuperShapeIn->GetRmin(),
168 mdcSuperShapeOut->GetRmax(), &center[0]); if (i%2 == 0)
169 m_MdcXYSuper[i]->SetFillColor(mdcStereoSuperColor); else
170 m_MdcXYSuper[i]->SetFillColor(mdcAxialSuperColor);
171 } */
172
173 // Mdc Wires
174 // Long Peixun's update: Ignore layer 0~7 if detector contains CGEM
175 for ( Int_t layer = m_StartLayer; layer < m_kTrueLayer; layer++ )
176 {
177 Int_t simuLayer = GetSimuLayer( layer );
178 for ( int replica = 0; replica < m_kReplica[simuLayer]; replica++ )
179 {
180 // cout << "layer " << layer << " replica " << replica << endl;
181 TGeoPhysicalNode* wirePhyNode = GetPhysicalReplica( simuLayer, replica );
182 name = TString( "Mdc Layer " );
183 name += layer;
184 name += " Wire ";
185 name += replica;
186
187 if ( m_kStereoDir[layer] != 0 )
188 { // stereo Layer
189 TGeoArb8* wireShape = (TGeoArb8*)wirePhyNode->GetShape();
190 Double_t *localArb8Point, masterArb8Point[24];
191 localArb8Point = wireShape->GetVertices();
192 for ( Int_t i = 0; i < 8; i++ )
193 {
194 local[0] = localArb8Point[2 * i];
195 local[1] = localArb8Point[2 * i + 1];
196 if ( i < 4 ) local[2] = wireShape->GetDz() * ( -1.0 );
197 else local[2] = wireShape->GetDz();
198
199 wirePhyNode->GetMatrix( -1 * wirePhyNode->GetLevel() )
200 ->LocalToMaster( local, &master[0] ); // transform to top
201 for ( Int_t j = 0; j < 3; j++ ) { masterArb8Point[3 * i + j] = master[j]; }
202 }
203
204 m_Mdc2DWire[layer][replica] = new Mdc2DWire( name, name, 8, &masterArb8Point[0] );
205 }
206 else
207 { // axial Layer
208
209 TGeoTubeSeg* wireShape = (TGeoTubeSeg*)wirePhyNode->GetShape();
210
211 Double_t centerR = 0.5 * ( wireShape->GetRmin() + wireShape->GetRmax() );
212 if ( layer >= m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut )
213 centerR = wireShape->GetRmax();
214 Double_t centerPhi =
215 0.5 * ( wireShape->GetPhi1() + wireShape->GetPhi2() ) * TMath::DegToRad();
216 local[0] = centerR * cos( centerPhi );
217 local[1] = centerR * sin( centerPhi );
218 local[2] = 0.0;
219 wirePhyNode->GetMatrix( -1 * wirePhyNode->GetLevel() )
220 ->LocalToMaster( local, &master[0] ); // transform to top
221
222 Double_t rmin = wireShape->GetRmin();
223 Double_t rmax = wireShape->GetRmax();
224 if ( layer >= m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut )
225 rmax = rmin + 2 * ( rmax - rmin );
226 m_Mdc2DWire[layer][replica] =
227 new Mdc2DWire( name, name, rmin, rmax, wireShape->GetDz(), centerPhi, &master[0] );
228 }
229 }
230 }
231
232 //----------ZR-----------
233 // Mdc
234 Int_t iPoint = 0;
235 TGeoTube* aMdcLayer = 0;
236
237 // Long Peixun's update: Ignore layer 0~7 if detector contains CGEM
238 for ( Int_t layer = m_StartLayer; layer < m_kLayer; layer++ )
239 {
240 aMdcLayer = (TGeoTube*)GetLayer( layer )->GetVolume()->GetShape();
241 P[3 * iPoint] = 0.0;
242 P[3 * iPoint + 1] = aMdcLayer->GetRmin();
243 P[3 * iPoint + 2] = aMdcLayer->GetDz();
244 iPoint++;
245 }
246
247 P[3 * iPoint] = 0.0;
248 P[3 * iPoint + 1] = aMdcLayer->GetRmax();
249 P[3 * iPoint + 2] = aMdcLayer->GetDz();
250 iPoint++;
251 P[3 * iPoint] = 0.0;
252 P[3 * iPoint + 1] = aMdcLayer->GetRmax();
253 P[3 * iPoint + 2] = aMdcLayer->GetDz() * ( -1.0 );
254 iPoint++;
255
256 for ( Int_t layer = m_kLayer - 1; layer >= m_StartLayer; layer-- )
257 {
258 aMdcLayer = (TGeoTube*)GetLayer( layer )->GetVolume()->GetShape();
259 P[3 * iPoint] = 0.0;
260 P[3 * iPoint + 1] = aMdcLayer->GetRmin();
261 P[3 * iPoint + 2] = aMdcLayer->GetDz() * ( -1.0 );
262 iPoint++;
263 }
264
265 m_MdcZR[0] = new BesPolygon2D( "MdcZRUp", "MdcZRUp", iPoint, &P[0] );
266
267 for ( Int_t i = 0; i < iPoint; i++ ) P[3 * i + 1] *= -1.0;
268
269 m_MdcZR[1] = new BesPolygon2D( "MdcZRDown", "MdcZRDown", iPoint, &P[0] );
270
271 for ( Int_t i = 0; i < 2; i++ )
272 {
273 m_MdcZR[i]->SetFillColor( mdcColor );
274 m_MdcZR[i]->SetFillStyle( mdcZRStyle );
275 m_MdcZR[i]->SetLineColor( mdcLineColor );
276 m_MdcZR[i]->SetRotatable( true ); // Long Peixun's update
277 }
278}
279
280void MdcROOTGeo::SetNode() {
281 if ( gDebug )
282 {
283 Int_t nDaughters = m_TopVolume->GetNodes()->GetEntries();
284 cout << "logicalMdc contains " << nDaughters << " nodes : " << endl;
285 for ( Int_t i = 0; i < nDaughters; i++ )
286 { cout << i << " : " << m_TopVolume->GetNode( i )->GetName() << endl; }
287 }
288
289 if ( m_ROOTGeoInit == 2 )
290 { // from GDML
291 m_Mdc = GetTopVolume();
292 if ( !m_Mdc ) std::cout << "m_Mdc = 0" << std::endl;
293
294 // Long Peixun's update: Ignore layer 0~7 if detector contains CGEM
295 for ( int layer = m_StartLayer; layer < m_kLayer; layer++ )
296 { // is simuLayer
297 // m_NodeReplica[layer][replica] = m_Mdc->GetNode(layer); // you could take it by id;
298 for ( int replica = 0; replica < m_kReplica[layer]; replica++ )
299 {
300 std::stringstream osname;
301 int rep = replica;
302 if ( layer >= 0 && layer < m_kStereoLayerIn )
303 {
304 // osname << "pv_" << "logical" << "Mdc" << "Stereo" << "Layer" << layer <<
305 // "TwistedTubs" << "_" << rep;
306 osname << "pv_"
307 << "logical"
308 << "Mdc"
309 << "Stereo"
310 << "Layer" << layer << "Cell"
311 << "_" << rep;
312 }
313 else if ( layer >= m_kStereoLayerIn && layer < m_kStereoLayerIn + m_kAxialLayerIn )
314 {
315 rep = CorrectReplica( layer, rep );
316 // osname << "pv_" << "logical" << "Mdc" << "Axial" << "Layer" << layer << "Replica"
317 // << "_" << rep;
318 osname << "pv_"
319 << "logical"
320 << "Mdc"
321 << "Axial"
322 << "Layer" << layer << "Cell"
323 << "_" << rep;
324 }
325 else if ( layer >= m_kStereoLayerIn + m_kAxialLayerIn &&
326 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut )
327 {
328 // osname << "pv_" << "logical" << "Mdc" << "Stereo" << "Layer" << layer <<
329 // "TwistedTubs" << "_" << rep;
330 osname << "pv_"
331 << "logical"
332 << "Mdc"
333 << "Stereo"
334 << "Layer" << layer << "Cell"
335 << "_" << rep;
336 }
337 else if ( layer >= m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut &&
338 layer < m_kLayer )
339 {
340 rep = CorrectReplica( layer, rep );
341 Int_t nBeforeAxialLayerOut = m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut;
342 Int_t iTrueLayer = nBeforeAxialLayerOut + ( layer - nBeforeAxialLayerOut ) / 2;
343 if ( layer % 2 == 0 )
344 {
345 // osname << "pv_" << "logical" << "Mdc" << "Axial" << "Layer" << iTrueLayer <<
346 // "_0" << "Replica" << "_" << rep;
347 osname << "pv_"
348 << "logical"
349 << "Mdc"
350 << "Axial"
351 << "Layer" << iTrueLayer << "_0"
352 << "Cell"
353 << "_" << rep;
354 }
355 else
356 {
357 // osname << "pv_" << "logical" << "Mdc" << "Axial" << "Layer" << iTrueLayer <<
358 // "_1" << "Replica" << "_" << rep;
359 osname << "pv_"
360 << "logical"
361 << "Mdc"
362 << "Axial"
363 << "Layer" << iTrueLayer << "_1"
364 << "Cell"
365 << "_" << rep;
366 }
367 }
368
369 m_NodeReplica[layer][replica] = GetNode( osname.str() );
370 // cout << osname.str() << endl;
371 }
372 }
373 }
374 else if ( m_ROOTGeoInit == 1 )
375 { // from ROOT object
376 // Long Peixun's update: Ignore layer 0~7 if detector contains CGEM
377 for ( int layer = m_StartLayer; layer < m_kLayer; layer++ )
378 {
379 // 0 : logicalMdcStereoLayer0_0 35 : logicalMdcStereoLayer35_35
380 // 36 : logicalMdcAxialLayer36_0_36 37 : logicalMdcAxialLayer36_1_37
381 // 49 : logicalMdcAxialLayer42_1_49 50 : logicalMdcSegment1_50
382 TGeoNode* nodeLayer = m_Mdc->GetNode( layer );
383 m_NodeLayer[layer] = nodeLayer;
384 // cout << layer << " " << m_NodeLayer[layer]->GetName() << endl;
385
386 Int_t nDaughters = nodeLayer->GetVolume()->GetNodes()->GetEntries();
387 // if (0) {
388 // cout << m_NodeLayer[layer] << " contains " << nDaughters << " nodes : " << endl;
389 // for (Int_t i = 0; i < nDaughters; i++) {
390 // cout << i << " : " << nodeLayer->GetVolume()->GetNode(i)->GetName() << endl;
391 // }
392 // } //Long Peixun's update: Annotate
393
394 for ( int replica = 0; replica < m_kReplica[layer]; replica++ )
395 {
396 m_NodeReplica[layer][replica] = nodeLayer->GetVolume()->GetNode( replica );
397 // cout << layer << " " << replica << " " << m_NodeReplica[layer][replica]->GetName()
398 // << endl;
399 }
400 }
401 }
402
403 // std::cout << "MdcROOTGeo::SetNode, end of set node" << std::endl;
404}
405
406int MdcROOTGeo::CorrectReplica( int layer, int replica ) {
407 int rep = replica;
408 for ( intMap::iterator iter = m_CorrectMap.begin(); iter != m_CorrectMap.end(); iter++ )
409 {
410 if ( layer == ( *iter ).first || ( layer >= m_kStereoLayerIn + m_kAxialLayerIn +
411 m_kStereoLayerOut + m_kAxialLayerOut &&
412 layer - m_kAxialLayerOut == ( *iter ).first ) )
413 {
414 rep -= ( *iter ).second;
415 if ( rep < 0 ) rep += m_kReplica[layer];
416 }
417 }
418
419 // std::cout << "layer" << layer << " " << replica << "->" << rep << std::endl;
420 return rep;
421}
422
424 // std::cout << "begin of set defaultvis" << std::endl;
425 m_Mdc->SetLineColor( m_MdcColor );
426 m_Mdc->SetVisibility( 0 );
427
428 for ( int segment = 1; segment <= m_kSegment; segment++ )
429 {
430 GetVolumeSegment( segment )->SetLineColor( m_segmentColor );
431 // if (segment > 3) GetVolumeSegment(segment)->SetVisibility(0);
432 GetVolumeSegment( segment )->SetVisibility( 1 );
433 }
434
435 // Long Peixun's update: Ignore layer 0~7 if detector contains CGEM
436 for ( int layer = m_StartLayer; layer < m_kLayer; layer++ )
437 {
438 if ( ( layer >= 0 && layer < m_kStereoLayerIn ) ||
439 ( layer >= m_kStereoLayerIn + m_kAxialLayerIn &&
440 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut ) )
441 {
442 GetVolumeLayer( layer )->SetLineColor( m_hypeColor );
443 GetVolumeReplica( layer )->SetLineColor( m_twistedTubsColor );
444 }
445 else
446 {
447 GetVolumeLayer( layer )->SetLineColor( m_tubeColor );
448 GetVolumeReplica( layer )->SetLineColor( m_replicaColor );
449 }
450 GetVolumeLayer( layer )->SetVisibility( 0 );
451 GetVolumeReplica( layer )->SetVisibility( 1 );
452 }
453
454 for ( int segment = 1; segment <= m_kSegment; segment++ )
455 {
456 for ( int no = 0; no < 2; no++ ) { GetSegment( segment, no )->SetVisibility( 0 ); }
457 }
458
459 // Long Peixun's update: Ignore layer 0~7 if detector contains CGEM
460 for ( int layer = m_StartLayer; layer < m_kLayer; layer++ )
461 {
462 GetLayer( layer )->SetVisibility( 0 );
463 for ( int replica = 0; replica < m_kReplica[layer]; replica++ )
464 { GetReplica( layer, replica )->SetVisibility( 0 ); }
465 }
466
467 // std::cout << "end of set defaultvis" << std::endl;
468}
469
471 // std::cout << "begin of set defaultvis" << std::endl;
472 m_Mdc->SetLineColor( m_MdcColor );
473 m_Mdc->SetVisibility( 0 );
474
475 for ( int segment = 1; segment <= m_kSegment; segment++ )
476 {
477 GetVolumeSegment( segment )->SetLineColor( m_segmentColor );
478 // if (segment > 3) GetVolumeSegment(segment)->SetVisibility(0);
479 GetVolumeSegment( segment )->SetVisibility( 1 );
480 }
481
482 // Long Peixun's update: Ignore layer 0~7 if detector contains CGEM
483 for ( int layer = m_StartLayer; layer < m_kLayer; layer++ )
484 {
485 if ( ( layer >= 0 && layer < m_kStereoLayerIn ) ||
486 ( layer >= m_kStereoLayerIn + m_kAxialLayerIn &&
487 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut ) )
488 {
489 GetVolumeLayer( layer )->SetLineColor( m_hypeColor );
490 GetVolumeReplica( layer )->SetLineColor( m_twistedTubsColor );
491 }
492 else
493 {
494 GetVolumeLayer( layer )->SetLineColor( m_tubeColor );
495 GetVolumeReplica( layer )->SetLineColor( m_replicaColor );
496 }
497 GetVolumeLayer( layer )->SetVisibility( 1 );
498 GetVolumeReplica( layer )->SetVisibility( 1 );
499 }
500
501 for ( int segment = 1; segment <= m_kSegment; segment++ )
502 {
503 for ( int no = 0; no < 2; no++ ) { GetSegment( segment, no )->SetVisibility( 1 ); }
504 }
505
506 // Long Peixun's update: Ignore layer 0~7 if detector contains CGEM
507 for ( int layer = m_StartLayer; layer < m_kLayer; layer++ )
508 {
509 GetLayer( layer )->SetVisibility( 1 );
510 for ( int replica = 0; replica < m_kReplica[layer]; replica++ )
511 { GetReplica( layer, replica )->SetVisibility( 1 ); }
512 }
513}
514
516 for ( int segment = 1; segment <= m_kSegment; segment++ )
517 { GetVolumeSegment( segment )->SetVisibility( 0 ); }
518
519 // Long Peixun's update: Ignore layer 0~7 if detector contains CGEM
520 for ( int layer = m_StartLayer; layer < m_kLayer; layer++ )
521 {
522 GetVolumeLayer( layer )->SetVisibility( 0 );
523 GetVolumeReplica( layer )->SetVisibility( 1 );
524 }
525
526 for ( int segment = 1; segment <= m_kSegment; segment++ )
527 {
528 for ( int no = 0; no < 2; no++ ) { GetSegment( segment, no )->SetVisibility( 0 ); }
529 }
530
531 // Long Peixun's update: Ignore layer 0~7 if detector contains CGEM
532 for ( int layer = m_StartLayer; layer < m_kLayer; layer++ )
533 {
534 GetLayer( layer )->SetVisibility( 0 );
535 for ( int replica = 0; replica < m_kReplica[layer]; replica++ )
536 {
537 if ( replica < m_kReplica[layer] / 4 ) GetReplica( layer, replica )->SetVisibility( 0 );
538 else GetReplica( layer, replica )->SetVisibility( 1 );
539 }
540 }
541}
542
544 for ( int segment = 1; segment <= m_kSegment; segment++ )
545 { GetVolumeSegment( segment )->SetVisibility( 0 ); }
546
547 // Long Peixun's update: Ignore layer 0~7 if detector contains CGEM
548 for ( int layer = m_StartLayer; layer < m_kLayer; layer++ )
549 {
550 GetVolumeLayer( layer )->SetVisibility( 0 );
551 GetVolumeReplica( layer )->SetVisibility( 1 );
552 }
553
554 for ( int segment = 1; segment <= m_kSegment; segment++ )
555 {
556 for ( int no = 0; no < 2; no++ ) { GetSegment( segment, no )->SetVisibility( 0 ); }
557 }
558
559 // Long Peixun's update: Ignore layer 0~7 if detector contains CGEM
560 for ( int layer = m_StartLayer; layer < m_kLayer; layer++ )
561 {
562 GetLayer( layer )->SetVisibility( 0 );
563 for ( int replica = 0; replica < m_kReplica[layer]; replica++ )
564 {
565 if ( replica < m_kReplica[layer] / 4 || replica > m_kReplica[layer] * 3 / 4 )
566 GetReplica( layer, replica )->SetVisibility( 1 );
567 else GetReplica( layer, replica )->SetVisibility( 0 );
568 }
569 }
570}
571
573 if ( gGeoManager == 0 ) std::cout << "Create gGeoManager first" << std::endl;
574 TGeoNode* bes = gGeoManager->GetTopNode();
575 TGeoNode* nodeMdc = bes->GetVolume()->GetNode( m_childNo );
576 // std::cout << "Mdc m_childNo " << m_childNo << std::endl;
577
578 if ( !m_Mdc ) std::cout << "m_Mdc = 0" << std::endl;
579
580 for ( int segment = 0; segment < 2 * m_kSegment - 2; segment++ )
581 {
582 m_PhysicalSegment[segment] = gGeoManager->MakePhysicalNode(
583 TString( "/" ) + bes->GetName() + TString( "/" ) + nodeMdc->GetName() +
584 TString( "/" ) +
585 m_Mdc->GetNode( ( m_kLayer + 2 * m_kSegment - 2 - 1 ) - segment )->GetName() );
586 m_PhysicalSegment[segment]->SetVisibility( 0 );
587 m_PhysicalSegment[segment]->SetIsVolAtt( kFALSE );
588 m_PhysicalSegment[segment]->SetLineColor( m_segmentColor );
589 // cout << m_PhysicalSegment[segment]->GetName() << endl;
590 }
591
592 // Long Peixun's update: Ignore layer 0~7 if detector contains CGEM
593 for ( int layer = m_StartLayer; layer < m_kLayer; layer++ )
594 {
595 TGeoNode* nodeLayer = GetLayer( layer );
596 // std::cout << "Layer " << layer << std::endl;
597 for ( int replica = 0; replica < m_kReplica[layer]; replica++ )
598 {
599 TGeoNode* nodeReplica = GetReplica( layer, replica );
600
601 m_PhysicalReplica[layer][replica] = gGeoManager->MakePhysicalNode(
602 TString( "/" ) + bes->GetName() + TString( "/" ) + nodeMdc->GetName() +
603 TString( "/" ) + nodeLayer->GetName() + TString( "/" ) + nodeReplica->GetName() );
604 m_PhysicalReplica[layer][replica]->SetVisibility( 0 );
605 m_PhysicalReplica[layer][replica]->SetIsVolAtt( kFALSE );
606 if ( ( layer >= 0 && layer < m_kStereoLayerIn ) ||
607 ( layer >= m_kStereoLayerIn + m_kAxialLayerIn &&
608 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut ) )
609 { m_PhysicalReplica[layer][replica]->SetLineColor( m_twistedTubsColor ); }
610 else { m_PhysicalReplica[layer][replica]->SetLineColor( m_replicaColor ); }
611 // if (m_PhysicalReplica[layer][replica]->IsVolAttributes()) std::cout << "yes " <<
612 // std::endl;
613 }
614 }
615
616 SetDetector();
617}
618
619// Long Peixun's update: Remove annotation; Reset color of replicas
621 // for (int part = 0; part < m_kPart; part++)
622 // {
623 // int nPhi = (part == 1 ? m_kPhiBr : m_kPhiEc);
624 // for (int phi = 0; phi < nPhi; phi++)
625 // {
626 // int nTheta = (part == 1 ? m_kThetaBr : m_kThetaEc);
627 // for (int theta = 0; theta < nTheta; theta++)
628 // {
629 // m_PhysicalCrystal[part][phi][theta]->SetIsVolAtt(kFALSE);
630 // if (part == 1)
631 // m_PhysicalCrystal[part][phi][theta]->SetLineColor(m_brCrystalColor); else
632 // m_PhysicalCrystal[part][phi][theta]->SetLineColor(m_ecCrystalColor);
633 // }
634 // }
635 // }
636
637 for ( int layer = m_StartLayer; layer < m_kLayer; layer++ )
638 {
639 if ( ( layer >= 0 && layer < m_kStereoLayerIn ) ||
640 ( layer >= m_kStereoLayerIn + m_kAxialLayerIn &&
641 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut ) )
642 {
643 for ( int replica = 0; replica < m_kReplica[layer]; replica++ )
644 GetPhysicalReplica( layer, replica )->SetLineColor( m_twistedTubsColor );
645 }
646 else
647 {
648 for ( int replica = 0; replica < m_kReplica[layer]; replica++ )
649 GetPhysicalReplica( layer, replica )->SetLineColor( m_replicaColor );
650 }
651 }
652 // std::cout << "end of set defaultvis" << std::endl;
653}
654
656 BesView* view = 0;
657 if ( gPad ) view = dynamic_cast<BesView*>( gPad->GetView() );
658 // if (view) cout << "viewVisFull3DMdc " << view->GetVisFull3DMdc() << endl;
659
660 m_DetectorsArray->Clear();
661 for ( int segment = 0; segment < 2 * m_kSegment - 2; segment++ )
662 {
663 TGeoPhysicalNode* phyNode = 0;
664 phyNode = m_PhysicalSegment[segment];
665 // cout << m_PhysicalSegment[segment]->GetName() << endl;
666 if ( phyNode )
667 {
668 phyNode->SetVisibility( 0 ); // set all invisible before set any visible
669 if ( ( segment >= 2 && segment <= 3 ) || segment > 59 )
670 { m_DetectorsArray->Add( phyNode ); }
671 else if ( view && view->GetVisFull3DMdc() ) { m_DetectorsArray->Add( phyNode ); }
672 }
673 }
674 /*
675 for (int part = 0; part < m_kPart; part++) {
676 int nPhi = (part == 1 ? m_kPhiBr : m_kPhiEc);
677 for (int phi = 0; phi < nPhi; phi++) {
678 int nTheta = (part == 1 ? m_kThetaBr : m_kThetaEc);
679 for (int theta = 0; theta < nTheta; theta++) {
680 // This is you detector, set it on
681 if ( (part == 1 && theta != 0 && theta != 43 && ((phi != 0 && phi != 60) || theta%2 == 0))
682 || (part != 1 && theta != 0) ) { m_PhysicalCrystal[part][phi][theta]->SetVisibility(0);
683 }
684
685 // This is you hit
686 // when you are to set fired hits to another color, say red,
687 // SetIsVolAtt(kFALSE) and to then SetLineColor(kRed);
688 if (phi == 12 && theta == 5) {
689 m_PhysicalCrystal[part][phi][theta]->SetVisibility(1);
690 m_PhysicalCrystal[part][phi][theta]->SetLineColor(2);
691 }
692 }
693 }
694 }
695 std::cout << "end of set detector on" << std::endl;
696 */
697}
698
700 // set previous event hits to default vis
701 // Long Peixun's update: Annotate cout
702 // cout << "m_HitsArray size(): " << m_HitsArray->GetEntries() << endl;
703 // cout << "m_2DHitsArray size(): " << m_2DHitsArray->GetEntries() << endl;
704 for ( int i = 0; i < m_HitsArray->GetEntries(); i++ )
705 {
706 TGeoPhysicalNode* phyNode = (TGeoPhysicalNode*)m_HitsArray->At( i );
707 phyNode->SetVisibility( 0 );
708 }
709 m_HitsArray->Clear( "C" );
710
711 // set previous event 2D hits info to default
712 for ( int i = 0; i < m_2DHitsArray->GetEntries(); i++ )
713 {
714 Mdc2DWire* aWire = (Mdc2DWire*)m_2DHitsArray->At( i );
715 aWire->ClearInfo();
716 aWire->AddInfo( aWire->GetTitle() );
717 aWire->CloseInfo();
718 }
719 m_2DHitsArray->Clear( "C" );
720
721 // set new hits
722 // Long Peixun's update: Consider gEvent == NULL
723 int NDigiCol = 0;
724 if ( gEvent )
725 {
726 m_MdcDigiCol = gEvent->GetMdcDigiCol();
727 // Long Peixun's update: Consider m_MdcDigiCol == NULL
728 if ( m_MdcDigiCol ) NDigiCol = m_MdcDigiCol->GetEntries();
729 else NDigiCol = 0;
730 }
731
732 for ( int i = 0; i < NDigiCol; i++ )
733 {
734 TMdcDigi* aMdcDigi = (TMdcDigi*)m_MdcDigiCol->At( i );
735 Identifier aMdcID( aMdcDigi->getIntId() );
736 int layer = MdcID::layer( aMdcID );
737 int wire = MdcID::wire( aMdcID );
738
739 Double_t time = RawDataUtil::MdcTime( aMdcDigi->getTimeChannel() );
740 Int_t charge = RawDataUtil::MdcCharge( aMdcDigi->getChargeChannel() );
741
742 TGeoPhysicalNode* phyNode = 0;
743 if ( layer < 36 )
744 { // number of layers in the three inner
745 phyNode = GetPhysicalReplica( layer, wire );
746 if ( phyNode ) m_HitsArray->Add( phyNode );
747 }
748 else
749 {
750 phyNode = GetPhysicalReplica( GetSimuLayer( layer ), wire );
751 if ( phyNode ) m_HitsArray->Add( phyNode );
752 phyNode = GetPhysicalReplica( GetSimuLayer( layer ) + 1, wire );
753 if ( phyNode ) m_HitsArray->Add( phyNode );
754 }
755
756 Mdc2DWire* aWire = 0;
757 aWire = m_Mdc2DWire[layer][wire];
758 if ( aWire )
759 {
760 aWire->ClearInfo();
761 aWire->AddInfo( aWire->GetTitle() );
762 double evTime = gEvent->GetHeader().GetEvTime();
763
764 char data[200]; // Long Peixun's update: 100 -> 200
765 if ( time > 1000000 ) { sprintf( data, "NO time" ); }
766 else
767 {
768 sprintf( data, "time=%-.1f ns", time );
769 if ( fabs( evTime ) > 0.0001 )
770 { sprintf( data, "%s, Tdrift(Raw)=%-.1f ns", data, time - evTime + 230 ); }
771 }
772 if ( charge > 1000000 ) { sprintf( data, "%s, NO charge", data ); }
773 else { sprintf( data, "%s, charge=%d", data, charge ); }
774 aWire->AddInfo( TString( data ) );
775 sprintf( data, "Fired" );
776 aWire->AddInfo( TString( data ) );
777
778 aWire->SetTime( time ); // yzhang
779 aWire->SetCharge( charge ); // yzhang
780 unsigned int overflow = aMdcDigi->getOverflow();
781 aWire->SetQOverflow( overflow & 2 ); // yzhang
782 aWire->SetEvTime( evTime );
783
784 // Long Peixun's update: Set raw channel data of aWire
785 aWire->SetTimeChannel( aMdcDigi->getTimeChannel() );
786 aWire->SetChargeChannel( aMdcDigi->getChargeChannel() );
787
788 aWire->CloseInfo();
789
790 m_2DHitsArray->Add( aWire );
791 }
792 }
793}
794
796 BesView* view = 0;
797 if ( gPad ) view = dynamic_cast<BesView*>( gPad->GetView() );
798
799 for ( int i = 0; i < m_DetectorsArray->GetEntries(); i++ )
800 {
801 TGeoPhysicalNode* phyNode = (TGeoPhysicalNode*)m_DetectorsArray->At( i );
802 if ( view && view->GetVisMdcGlobal() )
803 {
804 phyNode->SetVisibility( 1 );
805 continue;
806 }
807 phyNode->SetVisibility( 0 );
808 }
809}
810
812 BesView* view = 0;
813 if ( gPad ) view = dynamic_cast<BesView*>( gPad->GetView() );
814
815 for ( int i = 0; i < m_HitsArray->GetEntries(); i++ )
816 {
817 TGeoPhysicalNode* phyNode = (TGeoPhysicalNode*)m_HitsArray->At( i );
818 if ( view && view->GetVisMdcHitsGlobal() ) { phyNode->SetVisibility( 1 ); }
819 else { phyNode->SetVisibility( 0 ); }
820 }
821}
822
823void MdcROOTGeo::SetTFire( Bool_t input ) {
824 k_TFire = input;
825 // cout << "Mdc ROOT Geometry TDC Match: " << k_TMatch << endl;
826}
827
828// void
829// MdcROOTGeo::SetTOverflow(Bool_t input){
830// k_TOverflow = input;
831// //cout << "Mdc ROOT Geometry TDC Match: " << k_TMatch << endl;
832// }
833
834void MdcROOTGeo::SetQNotOverflow( Bool_t input ) {
835 k_QNotOverflow = input;
836 // cout << "Mdc ROOT Geometry TDC Match: " << k_TMatch << endl;
837}
838
839void MdcROOTGeo::SetQFire( Bool_t input ) {
840 k_QFire = input;
841 // cout << "Mdc ROOT Geometry ADC Match: " << k_QMatch << endl;
842}
843
844void MdcROOTGeo::SetColorfulWire( Bool_t input ) { k_ColorfulWire = input; }
845
846void MdcROOTGeo::SetMdcTimeSubEvTime( Bool_t input ) { k_MdcTimeSubEvTime = input; }
847
848TGeoVolume* MdcROOTGeo::GetVolumeSegment( int segment ) {
849 std::stringstream osname;
850 osname << "logical"
851 << "Mdc"
852 << "Segment" << segment;
853 return GetLogicalVolume( osname.str() );
854}
855
856TGeoVolume* MdcROOTGeo::GetVolumeLayer( int layer ) {
857 std::stringstream osname;
858 if ( layer >= 0 && layer < m_kStereoLayerIn )
859 {
860 osname << "logical"
861 << "Mdc"
862 << "Stereo"
863 << "Layer" << layer;
864 }
865 else if ( layer >= m_kStereoLayerIn && layer < m_kStereoLayerIn + m_kAxialLayerIn )
866 {
867 osname << "logical"
868 << "Mdc"
869 << "Axial"
870 << "Layer" << layer;
871 }
872 else if ( layer >= m_kStereoLayerIn + m_kAxialLayerIn &&
873 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut )
874 {
875 osname << "logical"
876 << "Mdc"
877 << "Stereo"
878 << "Layer" << layer;
879 }
880 else if ( layer >= m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut &&
881 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut + m_kAxialLayerOut )
882 {
883 osname << "logical"
884 << "Mdc"
885 << "Axial"
886 << "Layer" << layer << "_0";
887 }
888 else if ( layer >=
889 m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut + m_kAxialLayerOut &&
890 layer < m_kLayer )
891 {
892 osname << "logical"
893 << "Mdc"
894 << "Axial"
895 << "Layer" << layer - m_kAxialLayerOut << "_1";
896 }
897
898 return GetLogicalVolume( osname.str() );
899}
900
901TGeoVolume* MdcROOTGeo::GetVolumeReplica( int layer ) {
902 std::stringstream osname;
903 if ( layer >= 0 && layer < m_kStereoLayerIn )
904 {
905 osname << "logical"
906 << "Mdc"
907 << "Stereo"
908 << "Layer" << layer << "Cell";
909 }
910 else if ( layer >= m_kStereoLayerIn && layer < m_kStereoLayerIn + m_kAxialLayerIn )
911 {
912 osname << "logical"
913 << "Mdc"
914 << "Axial"
915 << "Layer" << layer << "Cell";
916 }
917 else if ( layer >= m_kStereoLayerIn + m_kAxialLayerIn &&
918 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut )
919 {
920 osname << "logical"
921 << "Mdc"
922 << "Stereo"
923 << "Layer" << layer << "Cell";
924 }
925 else if ( layer >= m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut &&
926 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut + m_kAxialLayerOut )
927 {
928 osname << "logical"
929 << "Mdc"
930 << "Axial"
931 << "Layer" << layer << "_0"
932 << "Cell";
933 }
934 else if ( layer >=
935 m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut + m_kAxialLayerOut &&
936 layer < m_kLayer )
937 {
938 osname << "logical"
939 << "Mdc"
940 << "Axial"
941 << "Layer" << layer - m_kAxialLayerOut << "_1"
942 << "Cell";
943 }
944
945 return GetLogicalVolume( osname.str() );
946}
947
948TGeoNode* MdcROOTGeo::GetSegment( int segment, int no ) {
949 std::stringstream osname;
950 if ( segment == 1 || segment == 2 )
951 {
952 osname << "pv_"
953 << "logical"
954 << "Mdc"
955 << "Segment" << segment << "_"
956 << m_kSegmentNodeOffset -
957 ( segment - 1 ); // huangsh
958 //<< (m_kLayer + (2*m_kSegment -2) -1) - (segment - 1);
959 }
960 else
961 {
962 osname << "pv_"
963 << "logical"
964 << "Mdc"
965 << "Segment" << segment << "_"
966 << m_kSegmentNodeOffset - m_kSegmentBr - 2 * ( segment - 1 - m_kSegmentBr ) -
967 no; // huangsh
968 //<< (m_kLayer + (2*m_kSegment -2) -1) - 2 - (segment - 3)*2 - no;
969 }
970
971 return GetNode( osname.str() );
972}
973
974TGeoNode* MdcROOTGeo::GetLayer( int layer ) {
975 // if m_NodeLayer[] set in SetNode(), could also return m_NodeLayer[layer]
976 if ( m_ROOTGeoInit == 2 )
977 { // from GDML
978 std::stringstream osname;
979 if ( layer >= 0 && layer < m_kStereoLayerIn )
980 {
981 osname << "pv_"
982 << "logical"
983 << "Mdc"
984 << "Stereo"
985 << "Layer" << layer << "_" << layer;
986 }
987 else if ( layer >= m_kStereoLayerIn && layer < m_kStereoLayerIn + m_kAxialLayerIn )
988 {
989 osname << "pv_"
990 << "logical"
991 << "Mdc"
992 << "Axial"
993 << "Layer" << layer << "_" << layer;
994 }
995 else if ( layer >= m_kStereoLayerIn + m_kAxialLayerIn &&
996 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut )
997 {
998 osname << "pv_"
999 << "logical"
1000 << "Mdc"
1001 << "Stereo"
1002 << "Layer" << layer << "_" << layer;
1003 }
1004 else if ( layer >= m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut &&
1005 layer < m_kLayer )
1006 {
1007 Int_t nBeforeAxialLayerOut = m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut;
1008 Int_t iTrueLayer = nBeforeAxialLayerOut + ( layer - nBeforeAxialLayerOut ) / 2;
1009 if ( layer % 2 == 0 )
1010 {
1011 osname << "pv_"
1012 << "logical"
1013 << "Mdc"
1014 << "Axial"
1015 << "Layer" << iTrueLayer << "_0"
1016 << "_" << layer;
1017 }
1018 else
1019 {
1020 osname << "pv_"
1021 << "logical"
1022 << "Mdc"
1023 << "Axial"
1024 << "Layer" << iTrueLayer << "_1"
1025 << "_" << layer;
1026 }
1027 }
1028
1029 // std::cout << osname.str() << std::endl;
1030 return GetNode( osname.str() );
1031 }
1032 else if ( m_ROOTGeoInit == 1 )
1033 { // from ROOT object
1034 if ( m_NodeLayer[layer] != 0 ) { return m_NodeLayer[layer]; }
1035 else
1036 {
1037 // std::cout << "Node: " << "Layer" << layer << " not found" << std::endl;
1038 return 0;
1039 }
1040 }
1041
1042 return 0;
1043}
1044
1045TGeoNode* MdcROOTGeo::GetReplica( int layer, int replica ) {
1046 if ( m_NodeReplica[layer][replica] != 0 )
1047 {
1048 // std::cout << " replica " << layer << " " << replica << " found " << std::endl;
1049 return m_NodeReplica[layer][replica];
1050 }
1051 else
1052 {
1053 // std::cout << "Node: " << "Layer" << layer << "Replica" << replica << " not found" <<
1054 // std::endl;
1055 return 0;
1056 }
1057}
1058
1059TGeoPhysicalNode* MdcROOTGeo::GetPhysicalSegment( int segment ) {
1060 if ( m_PhysicalSegment[segment] != 0 ) { return m_PhysicalSegment[segment]; }
1061 else
1062 {
1063 // std::cout << "PhysicalNode: " << "Segment" << segment << " not found" << std::endl;
1064 return 0;
1065 }
1066}
1067
1068TGeoPhysicalNode* MdcROOTGeo::GetPhysicalReplica( Int_t layer, Int_t replica ) {
1069 if ( m_PhysicalReplica[layer][replica] != 0 ) { return m_PhysicalReplica[layer][replica]; }
1070 else
1071 {
1072 // std::cout << "PhysicalNode: " << "Layer" << layer << "Replica" << replica << " not
1073 // found" << std::endl;
1074 return 0;
1075 }
1076}
1077
1078Mdc2DWire* MdcROOTGeo::Get2DWire( Int_t layer, Int_t wire ) {
1079 if ( m_Mdc2DWire[layer][wire] ) return m_Mdc2DWire[layer][wire];
1080 else return 0;
1081}
1082
1083Int_t MdcROOTGeo::GetSimuLayer( Int_t trueLayer ) {
1084 if ( trueLayer < 36 || trueLayer >= m_kTrueLayer ) return trueLayer;
1085 if ( trueLayer >= 36 ) return ( 36 + 2 * ( trueLayer - 36 ) );
1086 return trueLayer;
1087}
1088
1089Bool_t MdcROOTGeo::IsHit( Int_t layer, Int_t wire ) {
1090 if ( m_MdcDigiCol )
1091 {
1092 for ( int i = 0; i < m_MdcDigiCol->GetEntries(); i++ )
1093 {
1094 Identifier mdcID( ( (TMdcDigi*)m_MdcDigiCol->At( i ) )->getIntId() );
1095 if ( layer == MdcID::layer( mdcID ) && wire == MdcID::wire( mdcID ) ) { return kTRUE; }
1096 }
1097 }
1098
1099 return kFALSE;
1100}
1101
1102void MdcROOTGeo::Draw( Option_t* option ) {
1103 TString opt = option;
1104 opt.ToUpper();
1105
1106 if ( !m_2DGeoInit ) cout << "MdcROOTGeo::Draw2D(), 2D Geometry not initialized!" << endl;
1107 BesView* view = dynamic_cast<BesView*>( gPad->GetView() );
1108 if ( !view ) cout << "MdcROOTGeo::Draw(), BesView not found" << endl;
1109
1110 if ( view->GetVisMdcGlobal() )
1111 { // MdcVisGlobal
1112 if ( opt.Contains( "XY" ) )
1113 {
1114 m_MdcXY->Draw( "" );
1115 // Long Peixun's update: Annotate
1116 // for (Int_t i = 0; i < 4; i++) {
1117 // m_MdcXYSuper[i]->Draw("");
1118 // }
1119 }
1120
1121 if ( opt.Contains( "ZR" ) )
1122 {
1123 for ( Int_t i = 0; i < 2; i++ )
1124 {
1125 // m_MdcZR[i]->SetRotatable(true); //Long Peixun's update: Move to initializer
1126 m_MdcZR[i]->Draw( "" );
1127 }
1128 }
1129
1130 TString wireOpt;
1131 if ( view->GetVisMdcTubes() ) wireOpt += "TUBE";
1132 if ( view->GetVisMdcWires() ) wireOpt += ",WIRE";
1133
1134 Int_t replicaDraw = 0; // change draw sequence in a circle, (-1: 0->Max; 1: Max->0)
1135 // Long Peixun's update: Ignore layer 0~7 if detector contains CGEM
1136 for ( Int_t layer = m_StartLayer; layer < m_kTrueLayer; layer++ )
1137 {
1138 Int_t simuLayer = GetSimuLayer( layer );
1139 for ( int replica = 0; replica < m_kReplica[simuLayer]; replica++ )
1140 {
1141 if ( m_kStereoDir[layer] == -1 ) replicaDraw = replica;
1142 else if ( m_kStereoDir[layer] == 1 ) replicaDraw = m_kReplica[simuLayer] - 1 - replica;
1143 else replicaDraw = replica;
1144
1145 if ( m_Mdc2DWire[layer][replicaDraw] )
1146 {
1147 // cout << layer << " " << replicaDraw << endl;
1148 // m_Mdc2DWire[layer][replicaDraw]->SetHighlighted(false);
1149 m_Mdc2DWire[layer][replicaDraw]->SetFired( false );
1150 m_Mdc2DWire[layer][replicaDraw]->Draw( wireOpt );
1151 }
1152 }
1153 }
1154 }
1155}
1156
1157void MdcROOTGeo::DrawHits( Option_t* option ) {
1158 // cout << "Draw Hits" << endl;
1159 BesView* view = dynamic_cast<BesView*>( gPad->GetView() );
1160 if ( !view ) cout << "MdcROOTGeo::DrawHits(), BesView not found" << endl;
1161
1162 // cout << "VisMdcHitsGlobal " << view->GetVisMdcHitsGlobal() << endl;
1163 // cout << "VisMdcHits " << view->GetVisMdcHits() << endl;
1164
1165 if ( view->GetVisMdcHitsGlobal() )
1166 {
1167 TString wireOpt( "" );
1168 if ( view->GetVisMdcTubes() ) wireOpt += ",TUBE";
1169 if ( view->GetVisMdcHits() ) wireOpt += ",WIRE";
1170
1171 // Long Peixun's update: Use m_2DHitsArray which contains ready hits rather than rebuild
1172 // hits
1173 for ( int i = 0; i < m_2DHitsArray->GetEntries(); ++i )
1174 {
1175 Mdc2DWire* aWire = (Mdc2DWire*)m_2DHitsArray->At( i );
1176 if ( aWire )
1177 {
1178 if ( ( k_TFire ) && ( aWire->GetTimeChannel() == 0x7FFFFFFF ) ) continue;
1179 if ( ( k_QFire ) && ( aWire->GetChargeChannel() == 0x7FFFFFFF ) ) continue;
1180 if ( ( k_QNotOverflow ) && aWire->GetQOverflow() ) continue;
1181 aWire->SetFired( true );
1182 aWire->SetColorfulWire( k_ColorfulWire, k_MdcTimeSubEvTime );
1183 aWire->Draw( wireOpt );
1184 }
1185 }
1186
1187 /* if (m_MdcDigiCol) {
1188 for (int i = 0; i < m_MdcDigiCol->GetEntries(); i++) {
1189 TMdcDigi *aMdcDigi = (TMdcDigi*)m_MdcDigiCol->At(i);
1190
1191 Identifier aMdcID( aMdcDigi->getIntId() );
1192 int layer = MdcID::layer( aMdcID );
1193 int wire = MdcID::wire( aMdcID );
1194 unsigned int overflow = aMdcDigi->getOverflow();
1195
1196 Mdc2DWire *aWire = 0;
1197 aWire = m_Mdc2DWire[layer][wire];
1198 if (aWire){
1199 if ((k_TFire) && (aMdcDigi->getTimeChannel() == 0x7FFFFFFF)){
1200 continue;
1201 }
1202 if ((k_QFire) && (aMdcDigi->getChargeChannel() == 0x7FFFFFFF)){
1203 continue;
1204 }
1205 //if ((!k_TOverflow) && ((overflow&1)>0) ){
1206 // continue;
1207 //}
1208 if ((k_QNotOverflow) && ((overflow&2)>0) ){
1209 continue;
1210 }
1211 aWire->SetFired(true);
1212 aWire->SetColorfulWire(k_ColorfulWire,k_MdcTimeSubEvTime);
1213 aWire->Draw(wireOpt);
1214 }
1215 }
1216 } */
1217 }
1218}
double P(RecMdcKalTrack *trk)
sprintf(cut, "kal_costheta0_em>-0.93&&kal_costheta0_em<0.93&&kal_pxy0_em>=0.05+%d*0.1&&kal_" "pxy0_em<0.15+%d*0.1&&NGch>=2", j, j)
TTree * data
Double_t time
EvtStreamInputIterator< typename Generator::result_type > iter(Generator gen, int N=0)
void SetChargeChannel(UInt_t cc)
virtual void ClearInfo()
void SetQOverflow(Bool_t qOvfl)
virtual void CloseInfo()
void SetTime(Double_t time)
void SetColorfulWire(Bool_t colorfulWire, Bool_t subEvTime)
void SetEvTime(Double_t time)
void SetTimeChannel(UInt_t tc)
virtual void Draw(Option_t *option="")
virtual void SetFired(bool status=true)
void SetCharge(Double_t charge)
static int layer(const Identifier &id)
Values of different levels (failure returns 0).
Definition MdcID.cxx:47
static int wire(const Identifier &id)
Definition MdcID.cxx:52
TGeoNode * GetSegment(int segment, int no)
Get segment node;.
int CorrectReplica(int layer, int replica)
Correct some axial layer id to copyNo;.
void SetVolumeDefaultVis()
Set default visual attributes;.
TGeoVolume * GetVolumeLayer(int layer)
Get layer volume;.
TGeoPhysicalNode * GetPhysicalSegment(int segment)
Get segment physical node;.
void SetQuarterVisible()
Set quater visible;.
void SetNode()
Set the pointers to theirs nodes;.
TGeoNode * GetLayer(int layer)
Get layer node;.
void DrawHits(Option_t *option)
Draw 2D hits.
void InitFromROOT(TGeoVolume *vol)
Initialize ROOTGeo from TGeoVolume logicalMdc.
void Init2DGeometry()
Initialize 2D Geometry.
TGeoNode * GetReplica(int layer, int replica)
Get replica node;.
TGeoVolume * GetVolumeReplica(int layer)
Get replica volume;.
TGeoVolume * GetVolumeSegment(int segment)
Get segment volume;.
void Draw(Option_t *option)
Draw function.
void SetVisMdcHits()
Set Mdc hits visibility;.
void SetVisMdcDetector()
Set Mdc default detector visibility;.
Int_t GetSimuLayer(Int_t trueLayer)
Trans trueLayer to simuLayer (0~42)->(0~49).
Mdc2DWire * Get2DWire(Int_t layer, Int_t replica)
Get Mdc2DWire;.
void SetVolumeMdc(TGeoVolume *vol)
Set Mdc volume, while initializing from ROOT;.
void SetHalfVisible()
Set half visible;.
TGeoPhysicalNode * GetPhysicalReplica(int layer, int replica)
Get replica physical node;.
void SetPhysicalDefaultVis()
Set default physical node attributes;.
void SetPhysicalNode()
Set the pointers to the physical nodes;.
Bool_t IsHit(Int_t layer, Int_t wire)
Judge whether the digiCol contains (layer, wire).
void SetDetector()
Draw Detecor (what is detector depends on you).
void InitFromGDML(const char *gdmlFile, const char *setupName)
Initialize ROOTGeo from GDML.
void SetHits()
Set all physicalNodes corresponding to digiCol;.
static double MdcTime(int timeChannel)
static double MdcCharge(int chargeChannel)
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.
UInt_t getOverflow() const
Definition TMdcDigi.cxx:35
UInt_t getIntId() const
Definition TRawData.cxx:42
UInt_t getChargeChannel() const
Definition TRawData.cxx:48
UInt_t getTimeChannel() const
Definition TRawData.cxx:45