ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
CexmcScenePrimitives.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file CexmcScenePrimitives.cc
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 /*
27  * =============================================================================
28  *
29  * Filename: CexmcScenePrimitives.cc
30  *
31  * Description: auxiliary scene primitives (radial lines etc.)
32  *
33  * Version: 1.0
34  * Created: 03.01.2011 11:45:33
35  * Revision: none
36  * Compiler: gcc
37  *
38  * Author: Alexey Radkov (),
39  * Company: PNPI
40  *
41  * =============================================================================
42  */
43 
44 #include <cmath>
45 #include <G4Polyline.hh>
46 #include <G4Circle.hh>
47 #include <G4Polyhedron.hh>
48 #include <G4ThreeVector.hh>
49 #include <G4VisAttributes.hh>
50 #include <G4VGraphicsScene.hh>
51 #include <G4AffineTransform.hh>
52 #include <G4Transform3D.hh>
53 #include <G4Point3D.hh>
54 #include <G4SystemOfUnits.hh>
55 #include "CexmcScenePrimitives.hh"
57 #include "CexmcSetup.hh"
58 #include "CexmcCommon.hh"
59 
60 
61 namespace
62 {
63  G4double CexmcRadialLineWidth( 2.0 );
64  G4double CexmcRadialLineCapScreenSize( 4.0 );
65  G4double CexmcMarkerScreenSize( 2.0 );
66  G4double CexmcICHlLineLineWidth( 1.0 );
67  G4Colour CexmcDefaultSPColour( 1.0, 1.0, 1.0 );
68 }
69 
70 
72  setup( setup_ ), markTargetCenter( false ), highlightInnerCrystals( false ),
73  messenger( NULL )
74 {
77  spColours[ CexmcTargetCenterMark_SP ] = CexmcDefaultSPColour;
78  spColours[ CexmcRadialLine_SP ] = CexmcDefaultSPColour;
79  spColours[ CexmcInnerCrystalsHl_SP ] = CexmcDefaultSPColour;
80 }
81 
82 
84 {
85  delete messenger;
86 }
87 
88 
90 {
91  if ( markTargetCenter )
92  MarkTargetCenter( scene );
94  HighlightInnerCrystals( scene );
95  for ( CexmcRadialLines::const_iterator k( radialLines.begin() );
96  k != radialLines.end(); ++k )
97  {
98  DrawRadialLine( scene, &*k );
99  }
100 }
101 
102 
104 {
105  G4Circle circle;
106  circle.SetScreenSize( CexmcMarkerScreenSize );
107  circle.SetFillStyle( G4Circle::filled );
109 
111  G4Transform3D transform3D( G4RotationMatrix(),
112  transform.NetTranslation() );
113 
114  scene.BeginPrimitives( transform3D );
115  scene.AddPrimitive( circle );
116  scene.EndPrimitives();
117 }
118 
119 
121  const CexmcRadialLine * rLine )
122 {
123  G4double theta( rLine->theta * deg );
124  G4double phi( rLine->phi * deg );
125  G4double length( rLine->length * cm );
126  G4Point3D radialLineEnd( - std::sin( theta ) * std::cos( phi ) * length,
127  std::sin( theta ) * std::sin( phi ) * length,
128  std::cos( theta ) * length );
129 
130  G4Polyline line;
131  line.push_back( G4ThreeVector() );
132  line.push_back( radialLineEnd );
133 
134  G4VisAttributes visAttributes( spColours[ CexmcRadialLine_SP ] );
135  visAttributes.SetLineWidth( CexmcRadialLineWidth );
136  line.SetVisAttributes( visAttributes );
137 
138  G4Circle circle;
139  circle.SetScreenSize( CexmcRadialLineCapScreenSize );
140  circle.SetFillStyle( G4Circle::filled );
141  circle.SetVisAttributes( spColours[ CexmcRadialLine_SP ] );
142 
144  G4Transform3D transform3D( G4RotationMatrix(),
145  transform.NetTranslation() );
146 
147  scene.BeginPrimitives( transform3D );
148  scene.AddPrimitive( circle );
149  scene.AddPrimitive( line );
150  scene.EndPrimitives();
151 }
152 
153 
155 {
156  const CexmcSetup::CalorimeterGeometryData & calorimeterGeometry(
158  G4double icWidth( calorimeterGeometry.crystalWidth *
159  ( calorimeterGeometry.nCrystalsInRow - 2 ) / 2 );
160  G4double icHeight( calorimeterGeometry.crystalHeight *
161  ( calorimeterGeometry.nCrystalsInColumn - 2 ) / 2 );
162  G4double icLength( calorimeterGeometry.crystalLength / 2 );
163  icWidth = icWidth < 0 ? 0 : icWidth;
164  icHeight = icHeight < 0 ? 0 : icHeight;
165 
166  G4PolyhedronBox innerCrystals( icWidth, icHeight, icLength );
168  visAttributes.SetLineWidth( CexmcICHlLineLineWidth );
169  innerCrystals.SetVisAttributes( visAttributes );
170 
171  const G4AffineTransform & transformLeft(
173  G4Transform3D transform3DLeft(
174  transformLeft.NetRotation().inverse(),
175  transformLeft.NetTranslation() );
176  const G4AffineTransform & transformRight(
178  G4Transform3D transform3DRight(
179  transformRight.NetRotation().inverse(),
180  transformRight.NetTranslation() );
181 
182  scene.BeginPrimitives( transform3DLeft );
183  scene.AddPrimitive( innerCrystals );
184  scene.EndPrimitives();
185  scene.BeginPrimitives( transform3DRight );
186  scene.AddPrimitive( innerCrystals );
187  scene.EndPrimitives();
188 }
189