CGEM BOSS 6.6.5.f
BESIII Offline Software System
Loading...
Searching...
No Matches
EventDisplay/BesVisLib/BesVisLib-00-06-08/src/EmcROOTGeo.cxx
Go to the documentation of this file.
1//$id$
2/*
3 * 2004/11/29 Zhengyun You Peking University
4 * Emc Geometry General for EventDisplay
5 *
6 * 2004/12/11 Zhengyun You Peking University
7 * named from EmcGeo to EmcROOTGeo
8 * inherit from class SubDetectorROOTGeo
9 *
10 * 2005/04/04 Zhengyun You Peking University
11 * Emc End geometry added
12 */
13
14using namespace std;
15
16#include <string>
17#include <fstream>
18#include <iostream>
19#include <sstream>
20#include <vector>
21#include <iomanip>
22
23#include <TGeoManager.h>
24#include <TGeoArb8.h>
25#include <TMath.h>
26
27#include "BesVisLib/EmcROOTGeo.h"
28#include "Identifier/EmcID.h"
29#include "BesVisLib/BesEvent.h"
30#include "BesVisLib/BesView.h"
31#include "RawEvent/RawDataUtil.h"
32
33
36{
37 // Default constructor.
38 m_kPhiEc = 96;
39 m_kThetaEc = 6;
40 m_kSectorEc = 16;
41 m_kNbEc = 35;
42 m_kRealNbEc = 30;
43
44 for (int part = 0; part < m_kPart; part++) {
45 for (int phi = 0; phi < m_kPhiBr; phi++) {
46 m_NodePhi[part][phi] = 0;
47 for (int theta = 0; theta < m_kThetaBr; theta++) {
48 m_NodeTheta[part][phi][theta] = 0;
49 m_NodeTheta2[part][phi][theta] = 0;
50 m_PhysicalCrystal[part][phi][theta] = 0;
51 m_PhysicalCrystal2[part][phi][theta] = 0;
52 m_Emc2DCrystal[part][phi][theta] = 0;
53 }
54 }
55 }
56 m_PhyNodeOrgArray = new TObjArray();
57
58 m_EmcColor = 4;
59 m_partColor = 4;
60 m_phiColor = 4;
61 m_thetaColor = 4;
62 m_brCrystalColor = 861; //Long Peixun's update: deep blue -> azure
63 m_ecCrystalColor = 866; //Long Peixun's update: cyan -> light blue
64}
65
67{
68 //Long Peixun's update: Add destructor
69 cout << "delete old EmcROOTGeo" << endl;
70 for (int part = 0; part < GetPartNb(); part++)
71 {
72 for (int theta = 0; theta < GetThetaNb(part); theta++)
73 {
74 for (int phi = 0; phi < GetPhiNb(part, theta); phi++)
75 {
76 delete m_Emc2DCrystal[part][phi][theta];
77 }
78 }
79 }
80 delete m_PhyNodeOrgArray;
81}
82
83void
84EmcROOTGeo::InitFromGDML( const char *gdmlFile, const char *setupName )
85{
86 m_ROOTGeoInit = 2;
87
88 ReadGdml(gdmlFile, setupName);
89 SetNode();
90}
91
92void
93EmcROOTGeo::InitFromROOT( TGeoVolume *vol )
94{
95 m_ROOTGeoInit = 1;
96
97 SetVolumeEmc(vol);
98 SetNode();
99}
100
101void
103{
104 if (m_ROOTGeoInit != 1 && m_ROOTGeoInit != 2) {
105 cout << "EmcROOTGeo::Init2DGeometry, ROOT Geometry not Initialized yet!" << endl;
106 return;
107 }
108 m_2DGeoInit = 1;
109
110 Double_t local[3] = {0.0, 0.0, 0.0};
111 Double_t master[3] = {0.0, 0.0, 0.0};
112 //Int_t nPoints = 8;
113 //Double_t P[300] = {0.0};
114 //Double_t center[3] = {0.0, 0.0, 0.0};
115 TString name;
116 TString title;
117
118 // Emc crystals
119 for (int part = 0; part < GetPartNb(); part++) {
120 for (int theta = 0; theta < GetThetaNb(part); theta++) {
121 for (int phi = 0; phi < GetPhiNb(part, theta); phi++) {
122 TGeoPhysicalNode *phyNode = 0;
123 phyNode = GetPhysicalCrystal(part, phi, theta);
124 if (part == 1) name = TString("Barrel");
125 else {
126 if (part == 0) name = TString("EastEc");
127 else if (part == 2) name = TString("WestEc");
128 }
129 name = TString("Emc Part");
130 name += part;
131 name += " Theta";
132 if (part == 1) name += m_kThetaBr - 1 - theta;
133 else name += theta;
134 name += " Phi";
135 name += phi;
136
137 char data[100];
138 sprintf(data, "Emc part %i, #theta %i, #phi %i", part, theta, phi);
139 title = TString( data );
140
141 TGeoArb8 *crystalShape = (TGeoArb8*)phyNode->GetShape();
142 Double_t *localArb8Point, masterArb8Point[24*2];
143 localArb8Point = crystalShape->GetVertices();
144 for (Int_t i = 0; i < 8; i++) {
145 local[0] = localArb8Point[2*i];
146 local[1] = localArb8Point[2*i+1];
147 if (i < 4) local[2] = crystalShape->GetDz() * (-1.0);
148 else local[2] = crystalShape->GetDz();
149
150 phyNode->GetMatrix(-1*phyNode->GetLevel())->LocalToMaster(local, &master[0]);
151 // transform to top
152 for (Int_t j = 0; j < 3; j++) {
153 masterArb8Point[3*i+j] = master[j];
154 }
155 }
156
157 TGeoPhysicalNode *phyNode2 = 0;
158 phyNode2 = GetPhysicalCrystal2(part, phi, theta);
159 if (phyNode2 != 0) {
160 crystalShape = (TGeoArb8*)phyNode2->GetShape();
161 localArb8Point = crystalShape->GetVertices();
162 for (Int_t i = 0; i < 8; i++) {
163 local[0] = localArb8Point[2*i];
164 local[1] = localArb8Point[2*i+1];
165 if (i < 4) local[2] = crystalShape->GetDz() * (-1.0);
166 else local[2] = crystalShape->GetDz();
167 phyNode2->GetMatrix(-1*phyNode->GetLevel())
168 ->LocalToMaster(local, &master[0]); // transform to top
169 for (Int_t j = 0; j < 3; j++) {
170 masterArb8Point[24+3*i+j] = master[j];
171 }
172 }
173 }
174
175 if (phyNode2 == 0)
176 m_Emc2DCrystal[part][phi][theta] =
177 new Emc2DCrystal(name, title, 8, &masterArb8Point[0], part, theta);
178 else
179 m_Emc2DCrystal[part][phi][theta] =
180 new Emc2DCrystal(name, title, 16, &masterArb8Point[0], part, theta);
181 }
182 }
183 }
184}
185
186void
188{
189 // Set NodePhi
190 if (m_ROOTGeoInit == 2) { // from GDML
191
192 m_Emc = GetTopVolume();
193 if (!m_Emc) std::cout << "m_Emc = 0" << std::endl;
194
195 }
196 else if (m_ROOTGeoInit == 1) { // from ROOT object
197
198 for (int part = 0; part < m_kPart; part++) {
199 int ipart = 0;
200 if (part == 1) ipart = 2;
201 if (part == 0) ipart = 1;
202
203 m_NodePart[part] = m_Emc->GetNode(ipart);
204
205 if (part == 1) {
206 for (int phi = 0; phi < m_kPhiBr; phi++) {
207 int iphi = 0;
208 iphi = 308 - phi;
209
210 m_NodePhi[part][phi] = GetPart(part)->GetVolume()->GetNode(iphi);
211 }
212 }
213 else {
214 int endphilist[16]= {15,7,14,6,13,12,11,10,9,8,5,4,3,2,1,0};
215 int endphipos[16] = {15,14,13,12,11,10,3,1,9,8,7,6,5,4,2,0};
216 //pos of phi in endworld
217 for (int sector = 0; sector < m_kSectorEc; sector++) {
218 m_NodePhi[part][sector] =
219 GetPart(part)->GetVolume()->GetNode(endphipos[sector]);
220 }
221 }
222 }
223 }
224
225 // Set NodeTheta
226 for (int phi = 0; phi < m_kPhiBr; phi++) {
227 int theta=0;
228 for (int idaughter = 0; idaughter< GetPhi(1, phi)->GetNdaughters(); idaughter++) {
229 TString name = GetPhi(1, phi)->GetDaughter(idaughter)->GetName();
230 if (name.Contains("logicalBSCCasing")){
231
232 m_NodeTheta[1][phi][theta] = GetPhi(1, phi)->GetDaughter(idaughter);
233 theta++;
234 }
235 }
236 }
237
238 for (int part = 0; part < m_kPart; part++) {
239 if (part == 1) continue;
240 for (int sector = 0; sector < m_kSectorEc; sector++) {
241 for (int nb = 0; nb < m_kNbEc; nb++) {
242 int theta, phi;
243 if (nb < m_kRealNbEc) {
244 ComputeThetaPhi(part, sector, nb, theta, phi);
245 m_NodeTheta[part][phi][theta] = GetPhi(part, sector)->GetDaughter(nb);
246// std::cout << part << " sector " << sector << " nb " << nb
247// << " phi " << phi << " theta " << theta
248// << " name " << m_NodeTheta[part][phi][theta]->GetName() << std::endl;
249 }
250 else {
251 ComputeThetaPhi(part, sector, ComputeEndCopyNb(nb), theta, phi);
252 m_NodeTheta2[part][phi][theta] = GetPhi(part, sector)->GetDaughter(nb);
253// std::cout << "Additional " << part << " sector " << sector << " nb " << nb
254// << " phi " << phi << " theta " << theta
255// << " name " << m_NodeTheta2[part][phi][theta]->GetName() << std::endl;
256 }
257 }
258 }
259 }
260
261 //std::cout << "EmcROOTGeo::SetNode, end of set node" << std::endl;
262}
263
264void
266{
267
268 //-------------------------------------------------------------
269 //Barrel
270 //GetLogicalVolume
271 TGeoVolume *logicRear,*logicOrgGlass,*logicRearCasing,*logicAlPlate,*logicPD,*logicPreAmpBox,*logicAirInPABox,*logicHangingPlate,*logicWaterPipe;
272 TGeoVolume *logicCable,*logicOCGirder,*logicSupportBar,*logicSupportBar1,*logicEndRing,*logicGear,*logicTaperRing1,*logicTaperRing2,*logicTaperRing3;
273
274
275 logicRear = GetLogicalVolume("logicalRearBox");
276 logicOrgGlass = GetLogicalVolume("logicalOrganicGlass");
277 logicRearCasing = GetLogicalVolume("logicalRearCasing");
278 logicAlPlate = GetLogicalVolume("logicalAlPlate");
279 logicPD = GetLogicalVolume("logicalPD");
280 logicPreAmpBox = GetLogicalVolume("logicalPreAmpBox");
281 logicAirInPABox = GetLogicalVolume("logicalAirInPABox");
282 logicHangingPlate = GetLogicalVolume("logicalHangingPlate");
283 logicWaterPipe = GetLogicalVolume("logicalWaterPipe");
284
285 for (int i = 0; i < 44; i++){
286
287 std::ostringstream osnameBSCCable1;
288 osnameBSCCable1 << "logicalBSCCable_1_"<<i;
289 logicCable = GetLogicalVolume( osnameBSCCable1.str() );
290 if (logicCable)
291 logicCable->SetVisibility(0);
292
293 std::ostringstream osnameBSCCable2;
294 osnameBSCCable2 << "logicalBSCCable_2_"<<i;
295 logicCable = GetLogicalVolume( osnameBSCCable2.str() );
296 if (logicCable)
297 logicCable->SetVisibility(0);
298
299 std::ostringstream osnameOCGirder1;
300 osnameOCGirder1 <<"logicalOpenningCutGirder_1_"<<i;
301 logicOCGirder = GetLogicalVolume( osnameOCGirder1.str() );
302 if (logicOCGirder)
303 logicOCGirder->SetVisibility(0);
304
305 std::ostringstream osnameOCGirder2;
306 osnameOCGirder2 <<"logicalOpenningCutGirder_2_"<<i;
307 logicOCGirder = GetLogicalVolume( osnameOCGirder2.str() );
308 if (logicOCGirder)
309 logicOCGirder->SetVisibility(0);
310
311 std::ostringstream osnameOCGirder3;
312 osnameOCGirder3 <<"logicalOpenningCutGirder_3_"<<i;
313 logicOCGirder = GetLogicalVolume( osnameOCGirder3.str() );
314 if (logicOCGirder)
315 logicOCGirder->SetVisibility(0);
316
317 std::ostringstream osnameOCGirder4;
318 osnameOCGirder4 <<"logicalOpenningCutGirder_4_"<<i;
319 logicOCGirder = GetLogicalVolume( osnameOCGirder4.str() );
320 if (logicOCGirder)
321 logicOCGirder->SetVisibility(0);
322 }
323
324 //-------------------------------------------------------------
325 //Support system
326 logicSupportBar = GetLogicalVolume("logicalSupportBar0");
327 logicSupportBar1 = GetLogicalVolume("logicalSupportBar1");
328 logicEndRing = GetLogicalVolume("logicalEndRing");
329 logicGear = GetLogicalVolume("logicalGear");
330 logicTaperRing1 = GetLogicalVolume("logicalTaperRing1");
331 logicTaperRing2 = GetLogicalVolume("logicalTaperRing2");
332 logicTaperRing3 = GetLogicalVolume("logicalTaperRing3");
333
334 if (logicRear)
335 logicRear->SetVisibility(0);
336 if (logicOrgGlass)
337 logicOrgGlass->SetVisibility(0);
338 if (logicRearCasing)
339 logicRearCasing->SetVisibility(0);
340 if (logicAlPlate)
341 logicAlPlate->SetVisibility(0);
342 if (logicPD)
343 logicPD->SetVisibility(0);
344 if (logicPreAmpBox)
345 logicPreAmpBox->SetVisibility(0);
346 if (logicAirInPABox)
347 logicAirInPABox->SetVisibility(0);
348 if (logicHangingPlate)
349 logicHangingPlate->SetVisibility(0);
350 if (logicWaterPipe)
351 logicWaterPipe->SetVisibility(0);
352 if (logicGear)
353 logicGear->SetVisibility(0);
354 if (logicTaperRing1)
355 logicTaperRing1->SetVisibility(0);
356 if (logicTaperRing2)
357 logicTaperRing2->SetVisibility(0);
358 if (logicTaperRing3)
359 logicTaperRing3->SetVisibility(0);
360 if (logicSupportBar)
361 logicSupportBar->SetVisibility(0);
362 if (logicSupportBar1)
363 logicSupportBar1->SetVisibility(0);
364 if (logicEndRing)
365 logicEndRing->SetVisibility(0);
366}
367
368void
370{
371
373
374
375 //std::cout << "begin of set defaultvis" << std::endl;
376 m_Emc->SetLineColor(m_EmcColor);
377 m_Emc->SetVisibility(0);
378
379 for (int part = 0; part < m_kPart-1; part++) {
380 GetVolumePart(part)->SetLineColor(m_partColor);
381 int nPhi = (part == 1 ? m_kPhiBr : m_kSectorEc);
382 for (int phi = 0; phi < nPhi; phi++) {
383 GetVolumePhi(part, phi)->SetLineColor(m_phiColor);
384 GetVolumePhi(part, phi)->SetVisibility(0);
385 }
386 if (part == 1) {
387 for (int theta = 0; theta < m_kThetaBr; theta++) {
388 GetVolumeTheta(part, 0, theta)->SetLineColor(m_thetaColor);
389 GetVolumeTheta(part, 0, theta)->SetVisibility(0);
390 GetVolumeCrystal(part, 0, theta)->SetLineColor(m_brCrystalColor);
391 GetVolumeCrystal(part, 0, theta)->SetVisibility(0);
392 }
393 }
394 else if (part == 0) {
395 int iPhi[3] = {0,1,2};
396 for (int i = 0; i < 3; i++) {
397 int phi = iPhi[i];
398 int nTheta = (part == 1 ? m_kThetaBr : m_kNbEc);
399 for (int theta = 0; theta < nTheta; theta++) {
400 GetVolumeTheta(part, phi, theta)->SetLineColor(m_thetaColor);
401 GetVolumeTheta(part, phi, theta)->SetVisibility(0);
402 GetVolumeCrystal(part, phi, theta)->SetLineColor(m_ecCrystalColor);
403 GetVolumeCrystal(part, phi, theta)->SetVisibility(0);
404 }
405 }
406 }
407 }
408
409 // phi and sector
410 for (int part = 0; part < m_kPart; part++) {
411 GetPart(part)->SetVisibility(0);
412 int nPhi = (part == 1 ? m_kPhiBr : m_kSectorEc);
413 for (int phi = 0; phi < nPhi; phi++) {
414 GetPhi(part, phi)->SetVisibility(0);
415 }
416 }
417
418 // theta with real phi
419 for (int part = 0; part < m_kPart; part++) {
420 for (int theta = 0; theta < GetThetaNb(part); theta++) {
421 for (int phi = 0; phi < GetPhiNb(part, theta); phi++) {
422 //cout << "part " << part << " theta " << theta << " phi " << phi << endl;
423 TGeoNode *nodeTheta = GetTheta(part, phi, theta);
424 if (nodeTheta) nodeTheta->SetVisibility(0);
425 TGeoNode *nodeCrystal = GetCrystal(part, phi, theta);
426 if (nodeCrystal) nodeCrystal->SetVisibility(0);
427
428 TGeoNode *nodeTheta2 = GetTheta2(part, phi, theta);
429 if (nodeTheta2) nodeTheta2->SetVisibility(0);
430 TGeoNode *nodeCrystal2 = GetCrystal2(part, phi, theta);
431 if (nodeCrystal2) nodeCrystal2->SetVisibility(0);
432 }
433 }
434 }
435 //std::cout << "end of set defaultvis" << std::endl;
436
437}
438
439void
441{
442
444
445
446 //std::cout << "begin of set defaultvis" << std::endl;
447 m_Emc->SetLineColor(m_EmcColor);
448 m_Emc->SetVisibility(0);
449
450 for (int part = 0; part < m_kPart-1; part++) {
451 GetVolumePart(part)->SetLineColor(m_partColor);
452 int nPhi = (part == 1 ? m_kPhiBr : m_kSectorEc);
453 for (int phi = 0; phi < nPhi; phi++) {
454 GetVolumePhi(part, phi)->SetLineColor(m_phiColor);
455 GetVolumePhi(part, phi)->SetVisibility(1);
456 }
457 if (part == 1) {
458 for (int theta = 0; theta < m_kThetaBr; theta++) {
459 GetVolumeTheta(part, 0, theta)->SetLineColor(m_thetaColor);
460 GetVolumeTheta(part, 0, theta)->SetVisibility(1);
461 GetVolumeCrystal(part, 0, theta)->SetLineColor(m_brCrystalColor);
462 GetVolumeCrystal(part, 0, theta)->SetVisibility(1);
463 }
464 }
465 else if (part == 0) {
466 int iPhi[3] = {0,1,2};
467 for (int i = 0; i < 3; i++) {
468 int phi = iPhi[i];
469 int nTheta = (part == 1 ? m_kThetaBr : m_kNbEc);
470 for (int theta = 0; theta < nTheta; theta++) {
471 GetVolumeTheta(part, phi, theta)->SetLineColor(m_thetaColor);
472 GetVolumeTheta(part, phi, theta)->SetVisibility(1);
473 GetVolumeCrystal(part, phi, theta)->SetLineColor(m_ecCrystalColor);
474 GetVolumeCrystal(part, phi, theta)->SetVisibility(1);
475 }
476 }
477 }
478 }
479
480 // phi and sector
481 for (int part = 0; part < m_kPart; part++) {
482 GetPart(part)->SetVisibility(1);
483 int nPhi = (part == 1 ? m_kPhiBr : m_kSectorEc);
484 for (int phi = 0; phi < nPhi; phi++) {
485 GetPhi(part, phi)->SetVisibility(1);
486 }
487 }
488
489 // theta with real phi
490 for (int part = 0; part < m_kPart; part++) {
491 for (int theta = 0; theta < GetThetaNb(part); theta++) {
492 for (int phi = 0; phi < GetPhiNb(part, theta); phi++) {
493 //cout << "part " << part << " theta " << theta << " phi " << phi << endl;
494 TGeoNode *nodeTheta = GetTheta(part, phi, theta);
495 if (nodeTheta) nodeTheta->SetVisibility(1);
496 TGeoNode *nodeCrystal = GetCrystal(part, phi, theta);
497 if (nodeCrystal) nodeCrystal->SetVisibility(1);
498
499 TGeoNode *nodeTheta2 = GetTheta2(part, phi, theta);
500 if (nodeTheta2) nodeTheta2->SetVisibility(1);
501 TGeoNode *nodeCrystal2 = GetCrystal2(part, phi, theta);
502 if (nodeCrystal2) nodeCrystal2->SetVisibility(1);
503 }
504 }
505 }
506 //std::cout << "end of set defaultvis" << std::endl;
507
508}
509
510void
512{
513 /*
514 for (int part = 0; part < m_kPart; part++) {
515 GetPart(part)->SetVisibility(0);
516 int nPhi = (part == 1 ? m_kPhiBr : m_kPhiEc);
517 for (int phi = 0; phi < nPhi; phi++) {
518 GetPhi(part, phi)->SetVisibility(0);
519 int nTheta = (part == 1 ? m_kThetaBr : m_kThetaEc);
520 for (int theta = 0; theta < nTheta; theta++) {
521 GetTheta(part, phi, theta)->SetVisibility(0);
522 if ( (part == 1 && (phi >= 0 && phi < nPhi/4)) ||
523 (part != 1) ) {
524 GetCrystal(part, phi, theta)->SetVisibility(1);
525 }
526 else {
527 GetCrystal(part, phi, theta)->SetVisibility(0);
528 }
529 }
530 }
531 }
532
533
534 for (int phi = GetPhiNb(1)/4; phi < GetPhiNb(1); phi++) {
535 for (int theta = 0; theta < GetThetaNb(1); theta++) {
536 GetPhysicalCrystal(1, phi, theta)->SetVisibility(1);
537 }
538 }
539
540 for (int theta = 0; theta < GetThetaNb(0); theta++) {
541 for (int i = 0; i < 3; i++) {
542 GetPhysicalCrystal(0, i, theta)->SetVisibility(1);
543 }
544 for (int i = 7; i < 16; i++) {
545 GetPhysicalCrystal(0, i, theta)->SetVisibility(1);
546 }
547 for (int i = 0; i < 7; i++) {
548 GetPhysicalCrystal(2, i, theta)->SetVisibility(1);
549 }
550 for (int i = 11; i < 16; i++) {
551 GetPhysicalCrystal(2, i, theta)->SetVisibility(1);
552 }
553 }
554 */
555}
556
557void
559{
560 /*
561 for (int theta = 0; theta < GetThetaNb(1); theta++) {
562 for (int phi = 0; phi < GetPhiNb(1); phi++) {
563 if (phi >= GetPhiNb(1)/4 && phi < GetPhiNb(1)*3/4) {
564 GetPhysicalCrystal(1, phi, theta)->SetVisibility(0);
565 }
566 else {
567 GetPhysicalCrystal(1, phi, theta)->SetVisibility(1);
568 }
569 }
570 }
571
572 for (int theta = 0; theta < GetThetaNb(0); theta++) {
573 for (int i = 0; i < 16; i++) {
574 if (i >= 7 && i <= 14) {
575 GetPhysicalCrystal(0, i, theta)->SetVisibility(0);
576 }
577 else {
578 GetPhysicalCrystal(0, i, theta)->SetVisibility(1);
579 }
580 }
581 }
582
583 for (int theta = 0; theta < GetThetaNb(2); theta++) {
584 for (int i = 0; i < 16; i++) {
585 if ((i >= 0 && i < 7) || i == 15) {
586 GetPhysicalCrystal(2, i, theta)->SetVisibility(0);
587 }
588 else {
589 GetPhysicalCrystal(2, i, theta)->SetVisibility(1);
590 }
591 }
592 }
593 */
594}
595
596void
598{
599 /*
600 for (int theta = 0; theta < GetThetaNb(1); theta++) {
601 for (int phi = 0; phi < GetPhiNb(1); phi++) {
602 GetPhysicalCrystal(1, phi, theta)->SetVisibility(1);
603 }
604 }
605 */
606}
607
608void
610{
611 if (gGeoManager == 0) std::cout << "Create gGeoManager first" << std::endl;
612 TGeoNode *bes = gGeoManager->GetTopNode();
613 std::cout << "Emc m_childNo " << m_childNo << std::endl;
614 TGeoNode *emc = bes->GetDaughter(2); //2->0
615
616 // Barrel
617 int part = 1;
618 TGeoNode *nodePart = GetPart(part);
619 for (int phi = 0; phi < GetPhiNb(part, 0); phi++) {
620 TGeoNode *nodePhi = GetPhi(part, phi);
621 for (int theta = 0; theta < GetThetaNb(part); theta++) {
622 TGeoNode *nodeTheta = GetTheta(part, phi, theta);
623 TGeoNode *nodeCrystal = GetCrystal(part, phi, theta);
624 m_PhysicalCrystal[part][phi][theta] = gGeoManager->MakePhysicalNode( TString("/") + bes->GetName() +
625 TString("/") + emc->GetName() +
626 TString("/") + nodePart->GetName() +
627 TString("/") + nodePhi->GetName() +
628 TString("/") + nodeTheta->GetName() +
629 TString("/") + nodeCrystal->GetName() );
630 m_PhysicalCrystal[part][phi][theta]->SetVisibility(0);
631 m_PhysicalCrystal[part][phi][theta]->SetIsVolAtt(kFALSE);
632 m_PhysicalCrystal[part][phi][theta]->SetLineColor(m_brCrystalColor);
633
634 }
635 }
636
637 // EC
638 for (part = 0; part < m_kPart; part++) {
639 if (part == 1) continue;
640 nodePart = GetPart(part);
641 for (int sector = 0; sector < m_kSectorEc; sector++) {
642 TGeoNode *nodeSector = GetPhi(part, sector);
643 for (int nb = 0; nb < m_kNbEc; nb++) {
644 TGeoNode *nodeNb = nodeSector->GetDaughter(nb);
645 TGeoNode *nodeCrystal = nodeNb->GetDaughter(0);
646
647 int theta, phi;
648 if (nb < m_kRealNbEc) {
649 ComputeThetaPhi(part, sector, nb, theta, phi);
650 m_PhysicalCrystal[part][phi][theta] = gGeoManager->MakePhysicalNode( TString("/") + bes->GetName() +
651 TString("/") + emc->GetName() +
652 TString("/") + nodePart->GetName() +
653 TString("/") + nodeSector->GetName() +
654 TString("/") + nodeNb->GetName() +
655 TString("/") + nodeCrystal->GetName() );
656 m_PhysicalCrystal[part][phi][theta]->SetVisibility(0);
657 m_PhysicalCrystal[part][phi][theta]->SetIsVolAtt(kFALSE);
658 m_PhysicalCrystal[part][phi][theta]->SetLineColor(m_ecCrystalColor);
659 //std::cout << part << " " << phi << " " << theta << " " << m_PhysicalCrystal[part][phi][theta]->GetName() << std::endl;
660 }
661 else {
662 ComputeThetaPhi(part, sector, ComputeEndCopyNb(nb), theta, phi);
663 m_PhysicalCrystal2[part][phi][theta] = gGeoManager->MakePhysicalNode( TString("/") + bes->GetName() +
664 TString("/") + emc->GetName() +
665 TString("/") + nodePart->GetName() +
666 TString("/") + nodeSector->GetName() +
667 TString("/") + nodeNb->GetName() +
668 TString("/") + nodeCrystal->GetName() );
669 m_PhysicalCrystal2[part][phi][theta]->SetVisibility(0);
670 m_PhysicalCrystal2[part][phi][theta]->SetIsVolAtt(kFALSE);
671 m_PhysicalCrystal2[part][phi][theta]->SetLineColor(m_ecCrystalColor);
672 //std::cout << "Additional " << part << " " << phi << " " << theta << " " << m_PhysicalCrystal2[part][phi][theta]->GetName() << std::endl;
673 }
674 }
675 }
676 }
677
678 SetDetector();
679}
680
681//Long Peixun's update: Remove annotation
682void
684{
685 for (int part = 0; part < m_kPart; part++)
686 {
687 for (int theta = 0; theta < GetThetaNb(part); theta++)
688 {
689 for (int phi = 0; phi < GetPhiNb(part, theta); phi++)
690 {
691 TGeoPhysicalNode *phyCrystal = GetPhysicalCrystal(part, phi, theta);
692 TGeoPhysicalNode *phyCrystal2 = GetPhysicalCrystal2(part, phi, theta);
693 if (part == 1)
694 {
695 if (phyCrystal)
696 {
697 phyCrystal->SetIsVolAtt(kFALSE);
698 phyCrystal->SetLineColor(m_brCrystalColor);
699 }
700 }
701 else
702 {
703 if (phyCrystal)
704 {
705 phyCrystal->SetIsVolAtt(kFALSE);
706 phyCrystal->SetLineColor(m_ecCrystalColor);
707 }
708 if (phyCrystal2)
709 {
710 phyCrystal2->SetIsVolAtt(kFALSE);
711 phyCrystal2->SetLineColor(m_ecCrystalColor);
712 }
713 }
714 }
715 }
716 }
717 //std::cout << "end of set defaultvis" << std::endl;
718}
719
720
721void
723{
724 BesView *view = 0;
725 if (gPad) view = dynamic_cast<BesView*>(gPad->GetView());
726 //if (view) cout << "viewVisFull3DEmc " << view->GetVisFull3DEmc() << endl;
727
728 m_DetectorsArray->Clear();
729
730 // Barrel
731 int part = 1;
732 for (int theta = 0; theta < GetThetaNb(part); theta++) {
733 for (int phi = 0; phi < GetPhiNb(part, theta); phi++) {
734 TGeoPhysicalNode *phyNode = GetPhysicalCrystal(part, phi, theta);
735 if (phyNode) {
736 phyNode->SetVisibility(0); // set all invisible before set any visible
737 if ( phi >= 0 && phi < m_kPhiBr*4/4
738 //|| (theta == 0 || theta == 43) && phi >= m_kPhiBr/4 || phi == 0
739 ) {
740 m_DetectorsArray->Add( phyNode );
741 }
742 else if (view && view->GetVisFull3DEmc()) {
743 m_DetectorsArray->Add( phyNode );
744 }
745 }
746 }
747 }
748
749 // End cap
750 for (int part = 0; part < m_kPart; part++) {
751 if (part == 1) continue;
752 for (int theta = 0; theta < GetThetaNb(part); theta++) {
753 for (int phi = 0; phi < GetPhiNb(part, theta); phi++) {
754 TGeoPhysicalNode *phyNode = GetPhysicalCrystal(part, phi, theta);
755 if (phyNode) {
756 phyNode->SetVisibility(0); // set all invisible before set any visible
757 if (part == 2 && phi <= GetPhiNb(part, theta)||
758 part == 0 && phi <= GetPhiNb(part, theta) ) {
759 m_DetectorsArray->Add( phyNode );
760 }
761 else if (view && view->GetVisFull3DEmc()) {
762 m_DetectorsArray->Add( phyNode );
763 }
764 }
765
766 phyNode = 0;
767 phyNode = GetPhysicalCrystal2(part, phi, theta);
768 if (phyNode) {
769 phyNode->SetVisibility(0); // set all invisible before set any visible
770 if (part == 2 && phi <= GetPhiNb(part, theta)||
771 part == 0 && phi <= GetPhiNb(part, theta) ) {
772 m_DetectorsArray->Add( phyNode );
773 }
774 else if (view && view->GetVisFull3DEmc()) {
775 m_DetectorsArray->Add( phyNode );
776 }
777 }
778 }
779 }
780 }
781
782 //std::cout << "EmcROOTGeo::SetDetector(), end of set detector " << std::endl;
783}
784
785//Long Peixun's update: Clear all hits
787{
788 //cout << "m_HitsArray->GetEntries(): " << m_HitsArray->GetEntries() << endl;
789 //cout << "m_PhyNodeOrgArray->GetEntries(): " << m_PhyNodeOrgArray->GetEntries() << endl;
790 //cout << "m_2DHitsArray->GetEntries(): " << m_2DHitsArray->GetEntries() << endl;
791 for (int i = 0; i < m_HitsArray->GetEntries(); i++) {
792 TGeoPhysicalNode *phyNode = (TGeoPhysicalNode*)m_HitsArray->At(i);
793 //cout << phyNode->GetName() << endl;
794 int color = m_brCrystalColor;
795 int part = GetPart(phyNode);
796 if (part == 0 || part == 2)
797 color = m_ecCrystalColor;
798
799 phyNode->SetLineColor(color);
800 phyNode->SetVisibility(0);
801
802 RestorePhyNode(phyNode, (TGeoNode*)m_PhyNodeOrgArray->At(i));
803 }
804 m_PhyNodeOrgArray->Clear("C");
805 m_HitsArray->Clear("C");
806
807 // set previous event 2D hits info to default
808 for (int i = 0; i < m_2DHitsArray->GetEntries(); i++) {
809 Emc2DCrystal *aCrystal = (Emc2DCrystal*)m_2DHitsArray->At(i);
810 aCrystal->ClearInfo();
811 aCrystal->AddInfo(aCrystal->GetTitle());
812 aCrystal->CloseInfo();
813 }
814 m_2DHitsArray->Clear("C");
815}
816
817void
819{
820 // set previous event hits to default vis
821 //Long Peixun's update: move to ClearHits()
822 ClearHits();
823
824 // set new hits
825 //Long Peixun's update: Consider gEvent == NULL
826 int NDigiCol = 0;
827 if (gEvent)
828 {
829 m_EmcDigiCol = gEvent->GetEmcDigiCol();
830 //Long Peixun's update: Consider m_EmcDigiCol == NULL
831 if (m_EmcDigiCol) NDigiCol = m_EmcDigiCol->GetEntries();
832 else NDigiCol = 0;
833 }
834
835 for (int i = 0; i < NDigiCol; i++) {
836 TEmcDigi *aEmcDigi = (TEmcDigi*)m_EmcDigiCol->At(i);
837 Identifier aEmcID( aEmcDigi->getIntId() );
838 int part = EmcID::barrel_ec( aEmcID );
839 int theta = EmcID::theta_module( aEmcID );
840 int phi = EmcID::phi_module( aEmcID );
841
842 Double_t charge = RawDataUtil::EmcCharge(aEmcDigi->getMeasure(),
843 aEmcDigi->getChargeChannel());
844 Double_t time = RawDataUtil::EmcTime(aEmcDigi->getTimeChannel());
845
846 TGeoPhysicalNode *phyNode = 0;
847 phyNode = GetPhysicalCrystal( part, phi, theta );
848 if (phyNode) {
849 m_PhyNodeOrgArray->Add ( phyNode->GetNode() );
850
851 //Double_t *P; // = new Double_t[16];
852 //TGeoArb8 *oldArb8 = (TGeoArb8*)phyNode->GetShape();
853 //P = oldArb8->GetVertices();
854 //TGeoArb8 *newArb8 = new TGeoArb8(charge, &P[0]);
855
856 //TGeoTranslation *newmat =
857 // new TGeoTranslation(0.0, 0.0, oldArb8->GetDz()+newArb8->GetDz());
858 //newmat->RegisterYourself();
859
860 //Align(phyNode, newmat, newArb8);
861
862 m_HitsArray->Add(phyNode); //Long Peiuxn's update: Remove annotation
863 ////delete newArb8;
864 ////delete newmat;
865 }
866
867 phyNode = GetPhysicalCrystal2( part, phi, theta );
868 if (phyNode) {
869 m_PhyNodeOrgArray->Add ( phyNode->GetNode() );
870
871 //Double_t *P; // = new Double_t[16];
872 //TGeoArb8 *oldArb8 = (TGeoArb8*)phyNode->GetShape();
873 //P = oldArb8->GetVertices();
874 //TGeoArb8 *newArb8 = new TGeoArb8(charge, &P[0]);
875
876 //TGeoTranslation *newmat =
877 // new TGeoTranslation(0.0, 0.0, oldArb8->GetDz()+newArb8->GetDz());
878 //newmat->RegisterYourself();
879
880 //Align(phyNode, newmat, newArb8);
881
882 //m_HitsArray->Add( phyNode );
883 ////delete newArb8;
884 ////delete newmat;
885 }
886
887 Emc2DCrystal *aCrystal = 0;
888 aCrystal = m_Emc2DCrystal[part][phi][theta];
889 if (aCrystal) {
890 aCrystal->SetTime(time); //Long Peixun's update: Set Emc crystals' time and charge
891 aCrystal->SetCharge(charge);
892
893 aCrystal->ClearInfo();
894 aCrystal->AddInfo(aCrystal->GetTitle());
895
896 char data[100];
897 sprintf(data, "time = %-.3f ns, charge = %-.3f MeV", time, charge);
898 aCrystal->AddInfo( TString(data) );
899 sprintf(data, "Fired");
900 aCrystal->AddInfo( TString(data) );
901
902 aCrystal->CloseInfo();
903
904 m_2DHitsArray->Add(aCrystal);
905 }
906 }
907}
908
909void
911{
912 BesView *view = 0;
913 if (gPad) view = dynamic_cast<BesView*>(gPad->GetView());
914
915 for (int i = 0; i < m_DetectorsArray->GetEntries(); i++) {
916 TGeoPhysicalNode *phyNode = (TGeoPhysicalNode*)m_DetectorsArray->At(i);
917 phyNode->SetVisibility(0);
918 if (view && view->GetVisEmcGlobal()) {
919 int part = GetPart(phyNode);
920 if (part == 0 && view->GetVisEmcEast() ||
921 part == 1 && view->GetVisEmcBarrel() ||
922 part == 2 && view->GetVisEmcWest() )
923 phyNode->SetVisibility(1);
924 }
925 }
926}
927
928void
930{
931 BesView *view = 0;
932 if (gPad) view = dynamic_cast<BesView*>(gPad->GetView());
933
934 for (int i = 0; i < m_HitsArray->GetEntries(); i++) {
935 TGeoPhysicalNode *phyNode = (TGeoPhysicalNode*)m_HitsArray->At(i);
936 int part = GetPart(phyNode);
937 if (view && view->GetVisEmcHitsGlobal()) {
938 if (part == 0 && view->GetVisEmcHitsEast() ||
939 part == 1 && view->GetVisEmcHitsBarrel() ||
940 part == 2 && view->GetVisEmcHitsWest() ) {
941 phyNode->SetVisibility(1);
942 phyNode->SetLineColor(881); //Long Peixun's update: Magenta -> Violet
943 continue;
944 }
945 }
946 //Long Peixun's update: Unfired visibility should be determined by Detector option rather than His option
947 //phyNode->SetVisibility(0);
948 if (part == 1) phyNode->SetLineColor(m_brCrystalColor);
949 else phyNode->SetLineColor(m_ecCrystalColor);
950 }
951}
952
953int
955{
956 return m_kPart; //Long Peixun's update: code optimization
957}
958
959int
960EmcROOTGeo::GetThetaNb(int part) // real theta number
961{
962 //Long Peixun's update: code optimization
963 if (part == 1) return m_kThetaBr;
964 else return m_kThetaEc;
965}
966
967int
968EmcROOTGeo::GetPhiNb(int part, int theta) // real phi number
969{
970 int phiNb = m_kPhiBr;
971 if (part != 1) {
972 if (theta < 2) phiNb = 4*m_kSectorEc;
973 else if (theta >= 2 && theta < 4) phiNb = 5*m_kSectorEc;
974 else if (theta >= 4 && theta < m_kThetaEc) phiNb = 6*m_kSectorEc;
975 }
976
977 return phiNb;
978}
979
980TGeoVolume*
982{
983 // only part0 and part1 logical volume.
984 std::stringstream osname;
985 if (part != 1) osname <<"logicalEndWorld";
986 else osname <<"logicalBSCWorld";
987
988 //osname << "logical" << "Emc" << "Part" << part;
989 if (part == 0 || part == 1) {
990 return GetLogicalVolume( osname.str() );
991 }
992 else {
993 std::cout << "No volume " << osname.str() << std::endl;
994 return 0;
995 }
996}
997
998TGeoVolume*
999EmcROOTGeo::GetVolumePhi( int part, int phi )
1000{
1001 // only part0phi0-15, part1phi0-119
1002 std::stringstream osname;
1003 //osname << "logical" << "Emc" << "Part" << part << "Phi" << phi;
1004 if (part == 1) osname << "logicalBSCPhi" ;
1005 else{
1006 if (phi == 15 || phi == 7) osname << "logicalEndPhi2" ;
1007 else if (phi == 14 || phi == 6) osname << "logicalEndPhi1" ;
1008 else osname << "logicalEndPhi0" ;
1009 }
1010
1011
1012 if ( (part == 0 && phi >= 0 && phi < 16) ||
1013 (part == 1 && phi >= 0 && phi < 120) ) {
1014 return GetLogicalVolume( osname.str() );
1015 }
1016 else {
1017 std::cout << "No volume " << osname.str() << std::endl;
1018 return 0;
1019 }
1020}
1021
1022TGeoVolume*
1023EmcROOTGeo::GetVolumeTheta( int part, int phi, int theta )
1024{
1025 // part0phi0theta0-34, part0phi6theta0-34, part0phi7theta0-34
1026 // part1theta0-43
1027 std::stringstream osname;
1028 if (part == 1 && theta >= 0 && theta < 44) {
1029 //osname << "logical" << "Emc" << "Part" << part << "Theta" << theta;
1030 osname << "logicalBSCCasing" << theta;
1031 return GetLogicalVolume( osname.str() );
1032 }
1033 else if ( part != 1 && theta >= 0 && theta < 35 &&
1034 (phi < 3) ) {
1035 //osname << "logical" << "Emc" << "Part" << part << "Phi" << phi << "Theta" << theta;
1036 osname << "logicalEndCasing_" << phi << "_" << theta;
1037 return GetLogicalVolume( osname.str() );
1038 }
1039 else {
1040 std::cout << "No volume " << osname.str() << std::endl;
1041 return 0;
1042 }
1043}
1044
1045TGeoVolume*
1046EmcROOTGeo::GetVolumeCrystal( int part, int phi, int theta )
1047{
1048 // part0phi0theta0-34, part0phi6theta0-34, part0phi8theta0-34, part0phi7theta0-34
1049 // part1theta0-43
1050 std::stringstream osname;
1051 if (part == 1 && theta >= 0 && theta < 44) {
1052 //osname << "logical" << "Emc" << "Part" << part << "Theta" << theta << "Crystal";
1053 osname << "logicalCrystal";
1054 return GetLogicalVolume( osname.str() );
1055 }
1056 else if ( part == 0 && theta >= 0 && theta < 35 &&
1057 (phi < 3) ) {
1058 //osname << "logical" << "Emc" << "Part" << part << "Phi" << phi << "Theta" << theta << "Crystal";
1059 osname << "logicalEndCrystal_" << phi << "_" << theta;
1060 return GetLogicalVolume( osname.str() );
1061 }
1062 else {
1063 std::cout << "No volume " << osname.str() << std::endl;
1064 return 0;
1065 }
1066}
1067
1068TGeoNode*
1069EmcROOTGeo::GetPart( int part )
1070{
1071 if (m_ROOTGeoInit == 2) { // from GDML
1072 std::stringstream osname;
1073 //osname << "pv_" << "logical" << "Emc" << "Part" << (part == 2 ? (part -2) : part) << "_" << part;
1074 if (part == 1) osname <<"pv_logicalBSCWorld_2";
1075 if (part == 0) osname <<"pv_logicalEndWorld_1";
1076 if (part == 2) osname <<"pv_logicalEndWorld_0";
1077
1078 return GetNode( osname.str() );
1079 }
1080 else if (m_ROOTGeoInit == 1) { // from ROOT object
1081 if (m_NodePart[part] != 0) {
1082 return m_NodePart[part];
1083 }
1084 else {
1085 std::cout << "Node: " << "Part" << part << " not found" << std::endl;
1086 return 0;
1087 }
1088 }
1089
1090 return 0;
1091}
1092
1093TGeoNode*
1094EmcROOTGeo::GetPhi( int part, int phi ) // in EC, sector in fact
1095{
1096 if (m_ROOTGeoInit == 2) { // from GDML
1097 int endphilist[16]= {15,7,14,6,13,12,11,10,9,8,5,4,3,2,1,0};
1098 int endphipos[16] = {15,14,13,12,11,10,3,1,9,8,7,6,5,4,2,0}; //pos of phi in endworld
1099
1100 int realphi=0;
1101 if (phi==15||phi==7) realphi = 2;
1102 if (phi==14||phi==6) realphi = 1;
1103
1104 std::stringstream osname;
1105 //osname << "pv_" << "logical" << "Emc" << "Part" << (part == 2 ? (part -2) : part) << "Phi" << phi << "_" << phi;
1106 if (part == 1) osname << "pv_logicalBSCPhi" << "_" << 308-phi;
1107 else osname <<"pv_logicalEndPhi"<<realphi<<"_" <<endphipos[phi];
1108 return GetNode( osname.str() );
1109 }
1110 else if (m_ROOTGeoInit == 1) { // from ROOT object
1111 if (m_NodePhi[part][phi] != 0) {
1112 return m_NodePhi[part][phi];
1113 }
1114 else {
1115 std::cout << "Node: " << "Part" << part << "Phi" << phi << " not found" << std::endl;
1116 return 0;
1117 }
1118 }
1119
1120 return 0;
1121}
1122
1123TGeoNode*
1124EmcROOTGeo::GetTheta( int part, int phi, int theta ) // real phi, theta
1125{
1126 if (m_NodeTheta[part][phi][theta] != 0) {
1127 return m_NodeTheta[part][phi][theta];
1128 }
1129 else {
1130 std::cout << "Node: " << "Part" << part << "Phi" << phi << "Theta" << theta << " not found" << std::endl;
1131 return 0;
1132 }
1133}
1134
1135TGeoNode*
1136EmcROOTGeo::GetTheta2( int part, int phi, int theta ) // real phi, theta
1137{
1138 if (m_NodeTheta2[part][phi][theta] != 0) {
1139 return m_NodeTheta2[part][phi][theta];
1140 }
1141 else {
1142 return 0;
1143 }
1144}
1145
1146TGeoNode*
1147EmcROOTGeo::GetCrystal( int part, int phi, int theta ) // real phi, theta
1148{
1149 // in fact, br only 44 crystal nodes;
1150 return GetTheta(part, phi, theta)->GetDaughter(0);
1151}
1152
1153TGeoNode*
1154EmcROOTGeo::GetCrystal2( int part, int phi, int theta ) // real phi, theta
1155{
1156 // in fact, br only 44 crystal nodes;
1157 if (GetTheta2(part, phi, theta) == 0) return 0;
1158 else return GetTheta2(part, phi, theta)->GetDaughter(0);
1159}
1160
1161TGeoPhysicalNode*
1162EmcROOTGeo::GetPhysicalCrystal( int part, int phi, int theta ) // real phi, theta
1163{
1164 if (m_PhysicalCrystal[part][phi][theta] != 0) {
1165 return m_PhysicalCrystal[part][phi][theta];
1166 }
1167 else {
1168 std::cout << "PhysicalNode: " << "Part" << part << "Phi" << phi << "Theta" << theta << " not found" << std::endl;
1169 return 0;
1170 }
1171}
1172
1173TGeoPhysicalNode*
1174EmcROOTGeo::GetPhysicalCrystal2( int part, int phi, int theta ) // real phi, theta
1175{
1176 return m_PhysicalCrystal2[part][phi][theta];
1177}
1178
1179bool
1180EmcROOTGeo::HasTwoNodes( int part, int phi, int theta )
1181{
1182 if (part == 1) return false;
1183 else return true;
1184}
1185
1186
1187void
1188EmcROOTGeo::ComputeThetaPhi( int id, int sector, int nb, int &CryNumberTheta, int &CryNumberPhi)
1189{
1190 if ((sector>=0)&&(sector<3))
1191 sector+=16;
1192 if ((sector!=7)&&(sector!=15))
1193 {
1194 if ((nb>=0)&&(nb<4))
1195 {
1196 CryNumberTheta = 0;
1197 CryNumberPhi = (sector-3)*4+nb;
1198 }
1199 else if ((nb>=4)&&(nb<8))
1200 {
1201 CryNumberTheta = 1;
1202 CryNumberPhi = (sector-3)*4+nb-4;
1203 }
1204 else if ((nb>=8)&&(nb<13))
1205 {
1206 CryNumberTheta = 2;
1207 CryNumberPhi = (sector-3)*5+nb-8;
1208 }
1209 else if ((nb>=13)&&(nb<18))
1210 {
1211 CryNumberTheta = 3;
1212 CryNumberPhi = (sector-3)*5+nb-13;
1213 }
1214 else if ((nb>=18)&&(nb<24))
1215 {
1216 CryNumberTheta = 4;
1217 CryNumberPhi = (sector-3)*6+nb-18;
1218 }
1219 else if ((nb>=24)&&(nb<30))
1220 {
1221 CryNumberTheta = 5;
1222 CryNumberPhi = (sector-3)*6+nb-24;
1223 }
1224 }
1225 else// if((sector=7)||(sector==15))
1226 {
1227 if ((nb>=0)&&(nb<4))
1228 {
1229 CryNumberTheta = 0;
1230 CryNumberPhi = (sector-3)*4+3-nb;
1231 }
1232 else if ((nb>=4)&&(nb<8))
1233 {
1234 CryNumberTheta = 1;
1235 CryNumberPhi = (sector-3)*4+7-nb;
1236 }
1237 else if ((nb>=8)&&(nb<13))
1238 {
1239 CryNumberTheta = 2;
1240 CryNumberPhi = (sector-3)*5+12-nb;
1241 }
1242 else if ((nb>=13)&&(nb<18))
1243 {
1244 CryNumberTheta = 3;
1245 CryNumberPhi = (sector-3)*5+17-nb;
1246 }
1247 else if ((nb>=18)&&(nb<24))
1248 {
1249 CryNumberTheta = 4;
1250 CryNumberPhi = (sector-3)*6+23-nb;
1251 }
1252 else if ((nb>=24)&&(nb<30))
1253 {
1254 CryNumberTheta = 5;
1255 CryNumberPhi = (sector-3)*6+29-nb;
1256 }
1257 }
1258
1259 if (id==2)
1260 {
1261 switch (CryNumberTheta)
1262 {
1263 case 0:
1264 if (CryNumberPhi<32)
1265 CryNumberPhi = 31-CryNumberPhi;
1266 else
1267 CryNumberPhi = 95-CryNumberPhi;
1268 break;
1269 case 1:
1270 if (CryNumberPhi<32)
1271 CryNumberPhi = 31-CryNumberPhi;
1272 else
1273 CryNumberPhi = 95-CryNumberPhi;
1274 break;
1275 case 2:
1276 if (CryNumberPhi<40)
1277 CryNumberPhi = 39-CryNumberPhi;
1278 else
1279 CryNumberPhi = 119-CryNumberPhi;
1280 break;
1281 case 3:
1282 if (CryNumberPhi<40)
1283 CryNumberPhi = 39-CryNumberPhi;
1284 else
1285 CryNumberPhi = 119-CryNumberPhi;
1286 break;
1287 case 4:
1288 if (CryNumberPhi<48)
1289 CryNumberPhi = 47-CryNumberPhi;
1290 else
1291 CryNumberPhi = 143-CryNumberPhi;
1292 break;
1293 case 5:
1294 if (CryNumberPhi<48)
1295 CryNumberPhi = 47-CryNumberPhi;
1296 else
1297 CryNumberPhi = 143-CryNumberPhi;
1298 break;
1299 }
1300 }
1301}
1302
1303int
1305{
1306 int copyNb;
1307 switch (num){
1308 case 30:
1309 copyNb = 5;
1310 break;
1311 case 31:
1312 copyNb = 6;
1313 break;
1314 case 32:
1315 copyNb = 14;
1316 break;
1317 case 33:
1318 copyNb = 15;
1319 break;
1320 case 34:
1321 copyNb = 16;
1322 break;
1323 default:
1324 copyNb = num;
1325 break;
1326 }
1327 return copyNb;
1328}
1329
1331EmcROOTGeo::Get2DCrystal( Int_t part, Int_t phi, Int_t theta )
1332{
1333 if (m_Emc2DCrystal[part][phi][theta]) return m_Emc2DCrystal[part][phi][theta];
1334 else return 0;
1335}
1336
1337int
1338EmcROOTGeo::GetPart(TGeoPhysicalNode* phyNode)
1339{
1340 for (int part = 0; part < GetPartNb(); part++) {
1341 for (int theta = 0; theta < GetThetaNb(part); theta++) {
1342 for (int phi = 0; phi < GetPhiNb(part, theta); phi++) {
1343 if (phyNode == GetPhysicalCrystal(part, phi, theta)) {
1344 //cout << "EmcROOTGeo::GetPart()" << part << endl;
1345 return part;
1346 }
1347 if (phyNode == GetPhysicalCrystal2(part, phi, theta)) {
1348 //cout << "EmcROOTGeo::GetPart()" << part << endl;
1349 return part;
1350 }
1351 }
1352 }
1353 }
1354
1355 cout << "EmcROOTGeo::GetPart, this crystal physical node does not exist!" << endl;
1356 return -1;
1357}
1358
1359void
1360EmcROOTGeo::Draw(Option_t *option)
1361{
1362 TString opt = option;
1363 opt.ToUpper();
1364
1365 if (!m_2DGeoInit) cout << "EmcROOTGeo::Draw2D(), 2D Geometry not initialized!" << endl;
1366 BesView *view = dynamic_cast<BesView*>(gPad->GetView());
1367 if (!view) cout << "EmcROOTGeo::Draw(), BesView not found" << endl;
1368
1369 if (view->GetVisEmcGlobal()) { // EmcVisGlobal
1370 TString crystalOpt;
1371
1372 //if (opt.Contains("XY")) {
1373 // west part drawn first usually
1374 for (Int_t part = GetPartNb()-1; part >= 0; part--) {
1375 for (int theta = 0; theta < GetThetaNb(part); theta++) {
1376 for (int phi = 0; phi < GetPhiNb(part, theta); phi++) {
1377
1378 if (m_Emc2DCrystal[part][phi][theta]) {
1379 //cout << "part " << part << " layer " << layer << " crystal " << crystal << endl;
1380 m_Emc2DCrystal[part][phi][theta]->SetFired(false);
1381 if ( (part == 0 && view->GetVisEmcEast()) ||
1382 (part == 1 && view->GetVisEmcBarrel()) ||
1383 (part == 2 && view->GetVisEmcWest()) )
1384 m_Emc2DCrystal[part][phi][theta]->Draw(crystalOpt);
1385 }
1386 }
1387 }
1388 }
1389 }
1390}
1391
1392void
1393EmcROOTGeo::DrawHits(Option_t *option)
1394{
1395 // cout << "EmcROOTGeo::DrawHits" << endl;
1396 BesView *view = dynamic_cast<BesView*>(gPad->GetView());
1397 if (!view) cout << "EmcROOTGeo::DrawHits(), BesView not found" << endl;
1398
1399 //cout << "VisEmcHitsGlobal " << view->GetVisEmcHitsGlobal() << endl;
1400 //cout << "VisEmcHitsEast " << view->GetVisEmcHitsEast() << endl;
1401 //cout << "VisEmcHitsBarrel " << view->GetVisEmcHitsBarrel() << endl;
1402 //cout << "VisEmcHitsWest " << view->GetVisEmcHitsWest() << endl;
1403
1404 if (view->GetVisEmcHitsGlobal())
1405 {
1406 //Long Peixun's update: Use m_2DHitsArray which contains ready hits rather than rebuild hits
1407 for (int i = 0; i < m_2DHitsArray->GetEntries(); ++i)
1408 {
1409 Emc2DCrystal* aCrystal = (Emc2DCrystal*)m_2DHitsArray->At(i);
1410 if (aCrystal && aCrystal->GetCharge() > 5)
1411 {
1412 if ( (aCrystal->GetPart() == 0 && view->GetVisEmcHitsEast()) ||
1413 (aCrystal->GetPart() == 1 && view->GetVisEmcHitsBarrel()) ||
1414 (aCrystal->GetPart() == 2 && view->GetVisEmcHitsWest()) )
1415 {
1416 aCrystal->SetFired(true);
1417 aCrystal->Draw();
1418 }
1419 }
1420 }
1421
1422/* // reset time and charge to zero
1423 for (Int_t part = GetPartNb()-1; part >= 0; part--) {
1424 for (int theta = 0; theta < GetThetaNb(part); theta++) {
1425 for (int phi = 0; phi < GetPhiNb(part, theta); phi++) {
1426 if (m_Emc2DCrystal[part][phi][theta]) {
1427 m_Emc2DCrystal[part][phi][theta]->ResetTimeCharge();
1428 //m_Emc2DCrystal[part][phi][theta]->ClearInfo();
1429 }
1430 }
1431 }
1432 }
1433
1434 if (m_EmcDigiCol) {
1435 for (int i = 0; i < m_EmcDigiCol->GetEntries(); i++) {
1436 TEmcDigi *aEmcDigi = (TEmcDigi*)m_EmcDigiCol->At(i);
1437
1438 //cout << aEmcDigi->getIntId() << endl;
1439 Identifier aEmcID( aEmcDigi->getIntId() );
1440 int part = EmcID::barrel_ec( aEmcID );
1441 int theta = EmcID::theta_module( aEmcID );
1442 int phi = EmcID::phi_module( aEmcID );
1443
1444 Emc2DCrystal *aCrystal = 0;
1445 aCrystal = m_Emc2DCrystal[part][phi][theta];
1446
1447 //Double_t charge = Double_t(aEmcDigi->getChargeChannel()) / EMC_CHARGE_FACTOR;
1448 Double_t charge = RawDataUtil::EmcCharge(aEmcDigi->getMeasure(),
1449 aEmcDigi->getChargeChannel());
1450 aCrystal->SetCharge(charge);
1451 //cout << "charge " << aCrystal->GetCharge() << endl;
1452
1453 if (aCrystal&&charge > 5) {
1454 if ( (part == 0 && view->GetVisEmcHitsEast()) ||
1455 (part == 1 && view->GetVisEmcHitsBarrel()) ||
1456 (part == 2 && view->GetVisEmcHitsWest()) ) {
1457 aCrystal->SetFired(true);
1458 aCrystal->Draw();
1459 }
1460 }
1461 }
1462 } */
1463 }
1464}
1465
1466void EmcROOTGeo::Align(TGeoPhysicalNode *phyNode, TGeoMatrix *newmat, TGeoShape *newshape, Bool_t check)
1467{
1468 //phyNode->Align(newmat, newshape, check);
1469
1470 if (!newmat && !newshape) return;
1471 TGeoNode *node = phyNode->GetNode();
1472
1473 Int_t fLevel=phyNode->GetLevel();
1474 TGeoNode *nnode = 0;
1475 TGeoVolume *vm = phyNode->GetVolume(fLevel-2);
1476 // fLevel-2 is good for Emc geometry, use fLevel-1 if I want to use it in TofROOTGeo
1477 TGeoVolume *vd = 0;
1478
1479 TGeoNode *nodeArray[30];
1480 TString orgName = phyNode->GetName();
1481 Int_t i,id;
1482 if (!phyNode->IsAligned()) {
1483 for (i=0; i<=fLevel-2; i++) {
1484 nodeArray[i] = phyNode->GetNode(i);
1485 }
1486
1487 // fLevel-2 is good for Emc geometry,
1488 // in ROOT::TGeoPhysicalNode::Align,
1489 // it starts from 0, so some nodes were lost.
1490 for (i=fLevel-2; i<fLevel; i++) {
1491 // Get daughter node and its id inside vm
1492 node = phyNode->GetNode(i+1);
1493 id = vm->GetIndex(node);
1494
1495 if (id < 0) {
1496 //printf("cannot align node %s",phyNode->GetNode(i+1)->GetName());
1497 return;
1498 }
1499 // Clone daughter volume and node
1500 vd = node->GetVolume()->CloneVolume();
1501 nnode = node->MakeCopyNode();
1502 // Correct pointers to mother and volume
1503 nnode->SetName(node->GetName());
1504 nnode->SetVolume(vd);
1505 nnode->SetMotherVolume(vm);
1506 // Decouple old node from mother volume and connect new one
1507 vm->GetNodes()->RemoveAt(id);
1508 vm->GetNodes()->AddAt(nnode,id);
1509 nodeArray[i+1] = nnode;
1510 vm = vd;
1511 }
1512 } else {
1513 nnode = phyNode->GetNode();
1514 }
1515
1516 TString name;
1517 for (Int_t j = 0; j < phyNode->GetLevel()+1; j++) {
1518 name += "/";
1519 name += nodeArray[j]->GetName();
1520 }
1521 //phyNode->SetPath(name);
1522 phyNode->SetName(name);
1523 phyNode->Refresh();
1524
1525 // Now nnode is a cloned node of the one that need to be aligned
1526 TGeoNodeMatrix *aligned = (TGeoNodeMatrix*)nnode;
1527 vm = nnode->GetMotherVolume();
1528 vd = nnode->GetVolume();
1529 if (newmat) {
1530 // Register matrix and make it the active one
1531 if (!newmat->IsRegistered()) newmat->RegisterYourself();
1532 aligned->SetMatrix(newmat);
1533 // Update the global matrix for the aligned node
1534 TGeoHMatrix *global = phyNode->GetMatrix();
1535 TGeoHMatrix *up = phyNode->GetMatrix(fLevel-1);
1536 *global = up;
1537 global->Multiply(newmat);
1538 }
1539 // Change the shape for the aligned node
1540 if (newshape) vd->SetShape(newshape);
1541 // Now we have to re-voxelize the mother volume
1542 vm->SetVoxelFinder(0);
1543 vm->Voxelize("ALL");
1544 vm->FindOverlaps();
1545 // Eventually check for overlaps
1546 if (check) vm->CheckOverlaps();
1547 //phyNode->SetAligned(kTRUE);
1548}
1549
1550void EmcROOTGeo::RestorePhyNode(TGeoPhysicalNode *phyNode, TGeoNode *node)
1551{
1552 Align(phyNode, node->GetMatrix(), node->GetVolume()->GetShape());
1553}
TTree * data
Double_t time
virtual void CloseInfo()
virtual void Draw(Option_t *option="")
virtual void ClearInfo()
static unsigned int barrel_ec(const Identifier &id)
Values of different levels (failure returns 0)
static unsigned int theta_module(const Identifier &id)
static unsigned int phi_module(const Identifier &id)
TGeoVolume * GetVolumeCrystal(int part, int phi, int theta)
Get crystal volume;.
int ComputeEndCopyNb(int num)
Compute copyNb, copyNb 5,6,14,15,16 corresponding to two volume.
void SetVisEmcDetector()
Set Emc detector visibility;.
TGeoNode * GetCrystal(int part, int phi, int theta)
Get crystal one;.
TGeoVolume * GetVolumeTheta(int part, int phi, int theta)
Get theta volume;.
TGeoNode * GetTheta(int part, int phi, int theta)
Get theta node;.
void SetPhysicalDefaultVis()
Set default physical node attributes;.
TGeoVolume * GetVolumePart(int part)
Get part volume;.
TGeoNode * GetCrystal2(int part, int phi, int theta)
Get crystal2 one;.
void Align(TGeoPhysicalNode *phyNode, TGeoMatrix *newmat=0, TGeoShape *newshape=0, Bool_t check=kFALSE)
Align a physical node, change its position and shape.
void ComputeThetaPhi(int id, int sector, int nb, int &CryNumberTheta, int &CryNumberPhi)
Compute theta, phi from sector, nb.
Emc2DCrystal * Get2DCrystal(Int_t part, Int_t phi, Int_t theta)
Get Emc2DCrystal;.
TGeoPhysicalNode * GetPhysicalCrystal2(int part, int phi, int theta)
Get crystal physical node2; EC nb 5,6,14,15,16 in any sector has two physicalNode.
int GetPhiNb(int part)
Get number of phi on part;.
void InitFromROOT(TGeoVolume *vol)
Initialize ROOTGeo from TGeoVolume logicalEmc.
TGeoVolume * GetVolumePhi(int part, int phi)
Get phi volume;
void InitFromGDML(const char *gdmlFile, const char *setupName)
Initialize ROOTGeo from GDML.
void SetPhysicalNode()
Set the pointers to the physical nodes;.
void SetVolumeAppendInVis()
Set default visual attributes;.
void SetNode()
Set the pointers to theirs nodes;.
int GetThetaNb(int part)
Get number of theta on part;.
bool HasTwoNodes(int part, int phi, int theta)
Whether this id is combined of two nodes.
TGeoNode * GetPhi(int part, int phi)
Get phi node;.
void RestorePhyNode(TGeoPhysicalNode *phyNode, TGeoNode *node)
Restore the physical node to original shape.
TGeoPhysicalNode * GetPhysicalCrystal(int part, int phi, int theta)
Get crystal physical node;.
TGeoNode * GetTheta2(int part, int phi, int theta)
Get theta2 node;.
void SetDetector()
Set Detecor (what is detector depends on you)
void SetVolumeEmc(TGeoVolume *vol)
Set Emc volume, while initializing from ROOT;.
void SetVolumeDefaultVis()
Set default visual attributes;.
void SetHits()
Set all physicalNodes corresponding to digiCol;.
static double EmcCharge(int measure, 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.
int num[96]
Definition: ranlxd.c:373