source: trunk/source/persistency/ascii/src/G4tgrVolume.cc@ 1351

Last change on this file since 1351 was 1347, checked in by garnier, 15 years ago

geant4 tag 9.4

File size: 9.9 KB
Line 
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// $Id: G4tgrVolume.cc,v 1.13 2010/12/15 11:29:54 arce Exp $
28// GEANT4 tag $Name: geant4-09-04-ref-00 $
29//
30//
31// class G4tgrVolume
32
33// History:
34// - Created. P.Arce, CIEMAT (November 2007)
35// -------------------------------------------------------------------------
36
37#include "G4tgrVolume.hh"
38#include "G4tgrUtils.hh"
39#include "G4tgrSolid.hh"
40#include "G4tgrVolumeMgr.hh"
41#include "G4tgrPlace.hh"
42#include "G4tgrPlaceSimple.hh"
43#include "G4tgrPlaceDivRep.hh"
44#include "G4tgrPlaceParameterisation.hh"
45#include "G4tgrFileReader.hh"
46#include "G4tgrMessenger.hh"
47#include "G4UIcommand.hh"
48
49//-------------------------------------------------------------
50G4tgrVolume::G4tgrVolume()
51 : theName(""), theType(""),
52 theMaterialName(""), theSolid(0), theVisibility(false),
53 theRGBColour(0), theCheckOverlaps(false)
54{
55}
56
57
58//-------------------------------------------------------------
59G4tgrVolume::~G4tgrVolume()
60{
61 delete [] theRGBColour;
62}
63
64
65//-------------------------------------------------------------
66G4tgrVolume::G4tgrVolume( const std::vector<G4String>& wl)
67{
68 theType = "VOLSimple";
69
70 //---------- set name
71 theName = G4tgrUtils::GetString( wl[1] );
72
73 theVisibility = 1;
74 theRGBColour = new G4double[4];
75 for(size_t ii=0; ii<4; ii++) { theRGBColour[ii] = -1.; }
76 theCheckOverlaps = 0;
77
78 if( wl.size() != 4 )
79 {
80 //:VOLU tag to build a volume creating solid and material
81 //---------- set material name
82 theMaterialName = G4tgrUtils::GetString( wl[wl.size()-1] );
83
84 //---------- create only vector<double> of theSolidParams
85 theSolid = G4tgrVolumeMgr::GetInstance()->CreateSolid( wl, 1 );
86
87#ifdef G4VERBOSE
88 if( G4tgrMessenger::GetVerboseLevel() >= 1 )
89 {
90 G4cout << "Created from new solid: "
91 << *this << G4endl;
92 }
93#endif
94 }
95 else
96 {
97 //:VOLU tag to build a volume assigning material to solid
98 //---------- set material name
99 theMaterialName = G4tgrUtils::GetString( wl[3] );
100 theSolid = G4tgrVolumeMgr::GetInstance()->FindSolid( wl[2], true );
101
102#ifdef G4VERBOSE
103 if( G4tgrMessenger::GetVerboseLevel() >= 1 )
104 {
105 G4cout << "Created from existing solid: "
106 << *this << G4endl;
107 }
108#endif
109 }
110}
111
112
113//-------------------------------------------------------------------------
114G4tgrVolume::G4tgrVolume( const G4tgrVolume& vol )
115{
116 theName = vol.GetName();
117 theType = vol.GetType();
118 theMaterialName = vol.GetMaterialName();
119 theSolid = const_cast<G4tgrSolid*>(vol.GetSolid());
120 thePlacements = vol.GetPlacements();
121 theVisibility = vol.GetVisibility();
122 theRGBColour = vol.GetRGBColour();
123 theCheckOverlaps = vol.GetCheckOverlaps();
124}
125
126
127//-------------------------------------------------------------------------
128G4tgrVolume* G4tgrVolume::GetVolume( G4int ii ) const
129{
130 G4String ErrMessage = "Should only be called for composite solids... "
131 + G4UIcommand::ConvertToString(ii);
132 G4Exception("G4tgrVolume::GetVolume()", "InvalidCall",
133 FatalException, ErrMessage);
134 return 0;
135}
136
137
138//-------------------------------------------------------------
139G4tgrPlace* G4tgrVolume::AddPlace( const std::vector<G4String>& wl )
140{
141 //---------- Check for exact number of words read
142 G4tgrUtils::CheckWLsize( wl, 8, WLSIZE_EQ, " G4tgrVolume::AddPlace");
143 //---------- set G4tgrPlace
144 G4tgrPlaceSimple* pl = new G4tgrPlaceSimple( wl );
145 //---------- check that there is no previous placement in
146 // the same parent with the same copyNo
147 std::vector<G4tgrPlace*>::iterator ite;
148 for( ite = thePlacements.begin(); ite != thePlacements.end(); ite++)
149 {
150 if( ((*ite)->GetCopyNo() == pl->GetCopyNo())
151 && ((*ite)->GetParentName() == pl->GetParentName()) )
152 {
153 G4String ErrMessage = "Repeated placement. Volume "
154 + theName + " in " + pl->GetParentName();
155 G4Exception("G4tgrVolume::AddPlace()", "InvalidArgument",
156 FatalErrorInArgument, ErrMessage);
157 }
158 }
159
160 pl->SetVolume( this );
161 thePlacements.push_back( pl );
162
163#ifdef G4VERBOSE
164 if( G4tgrMessenger::GetVerboseLevel() >= 2 )
165 {
166 G4cout << " G4tgrVolume: New placement: " << thePlacements.size()
167 << " added for Volume " << theName
168 << " inside " << pl->GetParentName()
169 << " type " << pl->GetType() << G4endl;
170 }
171#endif
172 //---------- register parent - child
173 G4tgrVolumeMgr::GetInstance()->RegisterParentChild( pl->GetParentName(), pl );
174
175 return pl;
176}
177
178
179//-------------------------------------------------------------
180G4tgrPlaceDivRep*
181G4tgrVolume::AddPlaceReplica( const std::vector<G4String>& wl )
182{
183 //---------- Check for exact number of words read
184 G4tgrUtils::CheckWLsize( wl, 6, WLSIZE_GE, " G4tgrVolume::AddPlaceReplica");
185 G4tgrUtils::CheckWLsize( wl, 7, WLSIZE_LE, " G4tgrVolume::AddPlaceReplica");
186
187 if( (wl.size() == 7) && (G4tgrUtils::GetDouble(wl[6]) != 0.)
188 && (wl[3] != "PHI") )
189 {
190 G4Exception("G4tgrVolume::AddPlaceReplica",
191 "Offset set for replica not along PHI, it will not be used",
192 JustWarning,
193 G4String("Volume "+wl[1]+" in volume "+wl[2]).c_str());
194 }
195
196 //---------- set G4tgrPlace
197 G4tgrPlaceDivRep* pl = new G4tgrPlaceDivRep( wl );
198 pl->SetType("PlaceReplica");
199 pl->SetVolume( this );
200 thePlacements.push_back( pl );
201
202#ifdef G4VERBOSE
203 if( G4tgrMessenger::GetVerboseLevel() >= 2 )
204 {
205 G4cout << " G4tgrVolume: New placement replica: " << thePlacements.size()
206 << " added for Volume " << theName
207 << " inside " << pl->GetParentName() << G4endl;
208 }
209#endif
210 //---------- register parent - child
211 G4tgrVolumeMgr::GetInstance()->RegisterParentChild( pl->GetParentName(), pl );
212
213 return pl;
214}
215
216
217//-------------------------------------------------------------
218G4tgrPlaceParameterisation*
219G4tgrVolume::AddPlaceParam( const std::vector<G4String>& wl )
220{
221 //---------- set G4tgrPlaceParameterisation
222 G4tgrPlaceParameterisation* pl = new G4tgrPlaceParameterisation( wl );
223
224 pl->SetVolume( this );
225 thePlacements.push_back( pl );
226
227#ifdef G4VERBOSE
228 if( G4tgrMessenger::GetVerboseLevel() >= 2 )
229 {
230 G4cout << " G4tgrVolume: New placement Param: " << thePlacements.size()
231 << " added for Volume " << theName
232 << " inside " << pl->GetParentName() << G4endl;
233 }
234#endif
235 //---------- register parent - child
236 G4tgrVolumeMgr::GetInstance()->RegisterParentChild( pl->GetParentName(), pl );
237
238 return pl;
239}
240
241
242//-------------------------------------------------------------
243void G4tgrVolume::AddVisibility( const std::vector<G4String>& wl )
244{
245 //---------- Check for exact number of words read
246 G4tgrUtils::CheckWLsize( wl, 3, WLSIZE_EQ, " G4tgrVolume::AddVisibility");
247
248 //---------- Set visibility
249 theVisibility = G4tgrUtils::GetBool( wl[2] );
250}
251
252
253//-------------------------------------------------------------
254void G4tgrVolume::AddRGBColour( const std::vector<G4String>& wl )
255{
256 //---------- Check for exact number of words read
257 G4tgrUtils::CheckWLsize( wl, 5, WLSIZE_GE, " G4tgrVolume::AddRGBColour");
258
259 //---------- Set RGB colour
260 theRGBColour[0] = G4tgrUtils::GetDouble( wl[2] );
261 theRGBColour[1] = G4tgrUtils::GetDouble( wl[3] );
262 theRGBColour[2] = G4tgrUtils::GetDouble( wl[4] );
263 ///--------- Set transparency
264 if( wl.size() == 6 )
265 {
266 theRGBColour[3] = G4tgrUtils::GetDouble( wl[5] );
267 }
268}
269
270
271//-------------------------------------------------------------
272void G4tgrVolume::AddCheckOverlaps( const std::vector<G4String>& wl )
273{
274 //---------- Check for exact number of words read
275 G4tgrUtils::CheckWLsize( wl, 3, WLSIZE_GE, " G4tgrVolume::AddCheckOverlaps");
276
277 ///--------- Set check overlaps
278 theCheckOverlaps = G4tgrUtils::GetBool( wl[2] );
279
280}
281
282
283// -------------------------------------------------------------------------
284std::ostream& operator<<(std::ostream& os, const G4tgrVolume& obj)
285{
286 os << "G4tgrVolume= " << obj.theName << " Type= " << obj.theType
287 << " Material= " << obj.theMaterialName
288 << " Visibility " << obj.theVisibility
289 << " Colour " << (obj.theRGBColour)[0] << " "
290 << (obj.theRGBColour)[1] << " "
291 << (obj.theRGBColour)[2] << " "
292 << (obj.theRGBColour)[3] << " "
293 << " CheckOverlaps " << obj.theCheckOverlaps
294 << " N placements " << obj.thePlacements.size() << G4endl;
295
296 return os;
297}
Note: See TracBrowser for help on using the repository browser.