Geant4  10.03.p01
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4ReflectedSolid Class Reference

#include <G4ReflectedSolid.hh>

Inheritance diagram for G4ReflectedSolid:
Collaboration diagram for G4ReflectedSolid:

Public Member Functions

 G4ReflectedSolid (const G4String &pName, G4VSolid *pSolid, const G4Transform3D &transform)
 
virtual ~G4ReflectedSolid ()
 
EInside Inside (const G4ThreeVector &p) const
 
void Extent (G4ThreeVector &pMin, G4ThreeVector &pMax) const
 
G4bool CalculateExtent (const EAxis pAxis, const G4VoxelLimits &pVoxelLimit, const G4AffineTransform &pTransform, G4double &pMin, G4double &pMax) const
 
G4ThreeVector SurfaceNormal (const G4ThreeVector &p) const
 
G4double DistanceToIn (const G4ThreeVector &p, const G4ThreeVector &v) const
 
G4double DistanceToIn (const G4ThreeVector &p) const
 
G4double DistanceToOut (const G4ThreeVector &p, const G4ThreeVector &v, const G4bool calcNorm=false, G4bool *validNorm=0, G4ThreeVector *n=0) const
 
G4double DistanceToOut (const G4ThreeVector &p) const
 
void ComputeDimensions (G4VPVParameterisation *p, const G4int n, const G4VPhysicalVolume *pRep)
 
G4ThreeVector GetPointOnSurface () const
 
G4VSolidClone () const
 
virtual G4GeometryType GetEntityType () const
 
virtual const G4ReflectedSolidGetReflectedSolidPtr () const
 
virtual G4ReflectedSolidGetReflectedSolidPtr ()
 
G4VSolidGetConstituentMovedSolid () const
 
G4Transform3D GetTransform3D () const
 
G4Transform3D GetDirectTransform3D () const
 
void SetDirectTransform3D (G4Transform3D &)
 
std::ostream & StreamInfo (std::ostream &os) const
 
 G4ReflectedSolid (const G4ReflectedSolid &rhs)
 
G4ReflectedSolidoperator= (const G4ReflectedSolid &rhs)
 
void DescribeYourselfTo (G4VGraphicsScene &scene) const
 
G4PolyhedronCreatePolyhedron () const
 
G4PolyhedronGetPolyhedron () const
 
- Public Member Functions inherited from G4VSolid
 G4VSolid (const G4String &name)
 
virtual ~G4VSolid ()
 
G4bool operator== (const G4VSolid &s) const
 
G4String GetName () const
 
void SetName (const G4String &name)
 
G4double GetTolerance () const
 
virtual G4double GetCubicVolume ()
 
virtual G4double GetSurfaceArea ()
 
void DumpInfo () const
 
virtual G4VisExtent GetExtent () const
 
virtual const G4VSolidGetConstituentSolid (G4int no) const
 
virtual G4VSolidGetConstituentSolid (G4int no)
 
virtual const G4DisplacedSolidGetDisplacedSolidPtr () const
 
virtual G4DisplacedSolidGetDisplacedSolidPtr ()
 
 G4VSolid (__void__ &)
 
 G4VSolid (const G4VSolid &rhs)
 
G4VSolidoperator= (const G4VSolid &rhs)
 
G4double EstimateCubicVolume (G4int nStat, G4double epsilon) const
 
G4double EstimateSurfaceArea (G4int nStat, G4double ell) const
 

Protected Attributes

G4VSolidfPtrSolid
 
G4Transform3DfDirectTransform3D
 
G4bool fRebuildPolyhedron
 
G4PolyhedronfpPolyhedron
 
- Protected Attributes inherited from G4VSolid
G4double kCarTolerance
 

Additional Inherited Members

- Protected Member Functions inherited from G4VSolid
void CalculateClippedPolygonExtent (G4ThreeVectorList &pPolygon, const G4VoxelLimits &pVoxelLimit, const EAxis pAxis, G4double &pMin, G4double &pMax) const
 
void ClipCrossSection (G4ThreeVectorList *pVertices, const G4int pSectionIndex, const G4VoxelLimits &pVoxelLimit, const EAxis pAxis, G4double &pMin, G4double &pMax) const
 
void ClipBetweenSections (G4ThreeVectorList *pVertices, const G4int pSectionIndex, const G4VoxelLimits &pVoxelLimit, const EAxis pAxis, G4double &pMin, G4double &pMax) const
 
void ClipPolygon (G4ThreeVectorList &pPolygon, const G4VoxelLimits &pVoxelLimit, const EAxis pAxis) const
 

Detailed Description

Definition at line 48 of file G4ReflectedSolid.hh.

Constructor & Destructor Documentation

G4ReflectedSolid::G4ReflectedSolid ( const G4String pName,
G4VSolid pSolid,
const G4Transform3D transform 
)

Definition at line 56 of file G4ReflectedSolid.cc.

59  : G4VSolid(pName), fRebuildPolyhedron(false), fpPolyhedron(0)
60 {
61  fPtrSolid = pSolid;
62  fDirectTransform3D = new G4Transform3D(transform);
63 }
G4Transform3D * fDirectTransform3D
HepGeom::Transform3D G4Transform3D
G4Polyhedron * fpPolyhedron
G4VSolid(const G4String &name)
Definition: G4VSolid.cc:61

Here is the caller graph for this function:

G4ReflectedSolid::~G4ReflectedSolid ( )
virtual

Definition at line 68 of file G4ReflectedSolid.cc.

69 {
71  delete fpPolyhedron; fpPolyhedron = 0;
72 }
G4Transform3D * fDirectTransform3D
G4Polyhedron * fpPolyhedron
G4ReflectedSolid::G4ReflectedSolid ( const G4ReflectedSolid rhs)

Definition at line 77 of file G4ReflectedSolid.cc.

78  : G4VSolid(rhs), fPtrSolid(rhs.fPtrSolid),
80 {
82 }
G4Transform3D * fDirectTransform3D
HepGeom::Transform3D G4Transform3D
G4Polyhedron * fpPolyhedron
G4VSolid(const G4String &name)
Definition: G4VSolid.cc:61

Member Function Documentation

G4bool G4ReflectedSolid::CalculateExtent ( const EAxis  pAxis,
const G4VoxelLimits pVoxelLimit,
const G4AffineTransform pTransform,
G4double pMin,
G4double pMax 
) const
virtual

Implements G4VSolid.

Definition at line 217 of file G4ReflectedSolid.cc.

222 {
223  // Separation of transformations. Calculation of the extent is done
224  // in a reflection of the global space. In such way, the voxel is
225  // reflected, but the solid is transformed just by G4AffineTransform.
226  // It allows to use CalculateExtent() of the solid.
227 
228  // Reflect voxel limits in Z
229  //
230  G4VoxelLimits limits;
231  limits.AddLimit(kXAxis, pVoxelLimits.GetMinXExtent(),
232  pVoxelLimits.GetMaxXExtent());
233  limits.AddLimit(kYAxis, pVoxelLimits.GetMinYExtent(),
234  pVoxelLimits.GetMaxYExtent());
235  limits.AddLimit(kZAxis,-pVoxelLimits.GetMaxZExtent(),
236  -pVoxelLimits.GetMinZExtent());
237 
238  // Set affine transformation
239  //
240  G4Transform3D transform3D = G4ReflectZ3D()*pTransform*(*fDirectTransform3D);
241  G4AffineTransform transform(transform3D.getRotation().inverse(),
242  transform3D.getTranslation());
243 
244  // Find extent
245  //
246  if (!fPtrSolid->CalculateExtent(pAxis, limits, transform, pMin, pMax))
247  {
248  return false;
249  }
250  if (pAxis == kZAxis)
251  {
252  G4double tmp= -pMin; pMin= -pMax; pMax= tmp;
253  }
254 
255  return true;
256 }
virtual G4bool CalculateExtent(const EAxis pAxis, const G4VoxelLimits &pVoxelLimit, const G4AffineTransform &pTransform, G4double &pMin, G4double &pMax) const =0
HepRotation inverse() const
void AddLimit(const EAxis pAxis, const G4double pMin, const G4double pMax)
CLHEP::HepRotation getRotation() const
HepGeom::ReflectZ3D G4ReflectZ3D
double G4double
Definition: G4Types.hh:76
CLHEP::Hep3Vector getTranslation() const

Here is the call graph for this function:

G4VSolid * G4ReflectedSolid::Clone ( ) const
virtual

Reimplemented from G4VSolid.

Definition at line 371 of file G4ReflectedSolid.cc.

372 {
373  return new G4ReflectedSolid(*this);
374 }
G4ReflectedSolid(const G4String &pName, G4VSolid *pSolid, const G4Transform3D &transform)

Here is the call graph for this function:

void G4ReflectedSolid::ComputeDimensions ( G4VPVParameterisation p,
const G4int  n,
const G4VPhysicalVolume pRep 
)
virtual

Reimplemented from G4VSolid.

Definition at line 346 of file G4ReflectedSolid.cc.

349 {
350  DumpInfo();
351  G4Exception("G4ReflectedSolid::ComputeDimensions()",
352  "GeomMgt0001", FatalException,
353  "Method not applicable in this context!");
354 }
void DumpInfo() const
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41

Here is the call graph for this function:

G4Polyhedron * G4ReflectedSolid::CreatePolyhedron ( ) const
virtual

Reimplemented from G4VSolid.

Definition at line 418 of file G4ReflectedSolid.cc.

419 {
420  G4Polyhedron* polyhedron = fPtrSolid->CreatePolyhedron();
421  if (polyhedron)
422  {
423  polyhedron->Transform(*fDirectTransform3D);
424  return polyhedron;
425  }
426  else
427  {
428  std::ostringstream message;
429  message << "Solid - " << GetName()
430  << " - original solid has no" << G4endl
431  << "corresponding polyhedron. Returning NULL!";
432  G4Exception("G4ReflectedSolid::CreatePolyhedron()",
433  "GeomMgt1001", JustWarning, message);
434  return 0;
435  }
436 }
G4String GetName() const
HepPolyhedron & Transform(const G4Transform3D &t)
G4Transform3D * fDirectTransform3D
virtual G4Polyhedron * CreatePolyhedron() const
Definition: G4VSolid.cc:660
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
#define G4endl
Definition: G4ios.hh:61

Here is the call graph for this function:

Here is the caller graph for this function:

void G4ReflectedSolid::DescribeYourselfTo ( G4VGraphicsScene scene) const
virtual

Implements G4VSolid.

Definition at line 408 of file G4ReflectedSolid.cc.

409 {
410  scene.AddSolid (*this);
411 }
virtual void AddSolid(const G4Box &)=0

Here is the call graph for this function:

G4double G4ReflectedSolid::DistanceToIn ( const G4ThreeVector p,
const G4ThreeVector v 
) const
virtual

Implements G4VSolid.

Definition at line 285 of file G4ReflectedSolid.cc.

287 {
288  G4ThreeVector newPoint = (*fDirectTransform3D)*G4Point3D(p);
289  G4ThreeVector newDirection = (*fDirectTransform3D)*G4Vector3D(v);
290  return fPtrSolid->DistanceToIn(newPoint,newDirection);
291 }
HepGeom::Point3D< G4double > G4Point3D
Definition: G4Point3D.hh:35
HepGeom::Vector3D< G4double > G4Vector3D
Definition: G4Vector3D.hh:35
virtual G4double DistanceToIn(const G4ThreeVector &p, const G4ThreeVector &v) const =0

Here is the call graph for this function:

G4double G4ReflectedSolid::DistanceToIn ( const G4ThreeVector p) const
virtual

Implements G4VSolid.

Definition at line 299 of file G4ReflectedSolid.cc.

300 {
301  G4ThreeVector newPoint = (*fDirectTransform3D)*G4Point3D(p);
302  return fPtrSolid->DistanceToIn(newPoint);
303 }
HepGeom::Point3D< G4double > G4Point3D
Definition: G4Point3D.hh:35
virtual G4double DistanceToIn(const G4ThreeVector &p, const G4ThreeVector &v) const =0

Here is the call graph for this function:

G4double G4ReflectedSolid::DistanceToOut ( const G4ThreeVector p,
const G4ThreeVector v,
const G4bool  calcNorm = false,
G4bool validNorm = 0,
G4ThreeVector n = 0 
) const
virtual

Implements G4VSolid.

Definition at line 310 of file G4ReflectedSolid.cc.

315 {
316  G4ThreeVector solNorm;
317 
318  G4ThreeVector newPoint = (*fDirectTransform3D)*G4Point3D(p);
319  G4ThreeVector newDirection = (*fDirectTransform3D)*G4Vector3D(v);
320 
321  G4double dist = fPtrSolid->DistanceToOut(newPoint, newDirection,
322  calcNorm, validNorm, &solNorm);
323  if(calcNorm)
324  {
325  *n = (*fDirectTransform3D)*G4Vector3D(solNorm);
326  }
327  return dist;
328 }
HepGeom::Point3D< G4double > G4Point3D
Definition: G4Point3D.hh:35
HepGeom::Vector3D< G4double > G4Vector3D
Definition: G4Vector3D.hh:35
double G4double
Definition: G4Types.hh:76
virtual G4double DistanceToOut(const G4ThreeVector &p, const G4ThreeVector &v, const G4bool calcNorm=false, G4bool *validNorm=0, G4ThreeVector *n=0) const =0

Here is the call graph for this function:

G4double G4ReflectedSolid::DistanceToOut ( const G4ThreeVector p) const
virtual

Implements G4VSolid.

Definition at line 335 of file G4ReflectedSolid.cc.

336 {
337  G4ThreeVector newPoint = (*fDirectTransform3D)*G4Point3D(p);
338  return fPtrSolid->DistanceToOut(newPoint);
339 }
HepGeom::Point3D< G4double > G4Point3D
Definition: G4Point3D.hh:35
virtual G4double DistanceToOut(const G4ThreeVector &p, const G4ThreeVector &v, const G4bool calcNorm=false, G4bool *validNorm=0, G4ThreeVector *n=0) const =0

Here is the call graph for this function:

void G4ReflectedSolid::Extent ( G4ThreeVector pMin,
G4ThreeVector pMax 
) const
virtual

Reimplemented from G4VSolid.

Definition at line 155 of file G4ReflectedSolid.cc.

156 {
157  fPtrSolid->Extent(pMin,pMax);
158  G4double xmin = pMin.x(), ymin = pMin.y(), zmin = pMin.z();
159  G4double xmax = pMax.x(), ymax = pMax.y(), zmax = pMax.z();
163 
164  if (std::abs(xx) == 1 && std::abs(yy) == 1 && std::abs(zz) == 1)
165  {
166  // Special case of reflection in axis and pure translation
167  //
168  if (xx == -1) { G4double tmp = -xmin; xmin = -xmax; xmax = tmp; }
169  if (yy == -1) { G4double tmp = -ymin; ymin = -ymax; ymax = tmp; }
170  if (zz == -1) { G4double tmp = -zmin; zmin = -zmax; zmax = tmp; }
171  xmin += fDirectTransform3D->dx();
172  xmax += fDirectTransform3D->dx();
173  ymin += fDirectTransform3D->dy();
174  ymax += fDirectTransform3D->dy();
175  zmin += fDirectTransform3D->dz();
176  zmax += fDirectTransform3D->dz();
177  }
178  else
179  {
180  // Use additional reflection in Z to set up affine transformation
181  //
182  G4Transform3D transform3D = G4ReflectZ3D()*(*fDirectTransform3D);
183  G4AffineTransform transform(transform3D.getRotation().inverse(),
184  transform3D.getTranslation());
185 
186  // Find bounding box
187  //
188  G4VoxelLimits unLimit;
189  fPtrSolid->CalculateExtent(kXAxis,unLimit,transform,xmin,xmax);
190  fPtrSolid->CalculateExtent(kYAxis,unLimit,transform,ymin,ymax);
191  fPtrSolid->CalculateExtent(kZAxis,unLimit,transform,zmin,zmax);
192  }
193 
194  pMin.set(xmin,ymin,-zmax);
195  pMax.set(xmax,ymax,-zmin);
196 
197  // Check correctness of the bounding box
198  //
199  if (pMin.x() >= pMax.x() || pMin.y() >= pMax.y() || pMin.z() >= pMax.z())
200  {
201  std::ostringstream message;
202  message << "Bad bounding box (min >= max) for solid: "
203  << GetName() << " !"
204  << "\npMin = " << pMin
205  << "\npMax = " << pMax;
206  G4Exception("G4ReflectedSolid::Extent()", "GeomMgt0001",
207  JustWarning, message);
208  DumpInfo();
209  }
210 }
void set(double x, double y, double z)
G4String GetName() const
double yy() const
Definition: Transform3D.h:264
virtual G4bool CalculateExtent(const EAxis pAxis, const G4VoxelLimits &pVoxelLimit, const G4AffineTransform &pTransform, G4double &pMin, G4double &pMax) const =0
double x() const
double dx() const
Definition: Transform3D.h:279
double zz() const
Definition: Transform3D.h:276
G4Transform3D * fDirectTransform3D
double z() const
HepRotation inverse() const
void DumpInfo() const
CLHEP::HepRotation getRotation() const
double dy() const
Definition: Transform3D.h:282
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
HepGeom::ReflectZ3D G4ReflectZ3D
double dz() const
Definition: Transform3D.h:285
double y() const
double xx() const
Definition: Transform3D.h:252
double G4double
Definition: G4Types.hh:76
CLHEP::Hep3Vector getTranslation() const
virtual void Extent(G4ThreeVector &pMin, G4ThreeVector &pMax) const
Definition: G4VSolid.cc:626

Here is the call graph for this function:

G4VSolid * G4ReflectedSolid::GetConstituentMovedSolid ( ) const

Definition at line 126 of file G4ReflectedSolid.cc.

127 {
128  return fPtrSolid;
129 }

Here is the caller graph for this function:

G4Transform3D G4ReflectedSolid::GetDirectTransform3D ( ) const

Definition at line 139 of file G4ReflectedSolid.cc.

140 {
141  G4Transform3D aTransform= *fDirectTransform3D;
142  return aTransform;
143 }
G4Transform3D * fDirectTransform3D
G4GeometryType G4ReflectedSolid::GetEntityType ( ) const
virtual

Implements G4VSolid.

Definition at line 111 of file G4ReflectedSolid.cc.

112 {
113  return G4String("G4ReflectedSolid");
114 }

Here is the caller graph for this function:

G4ThreeVector G4ReflectedSolid::GetPointOnSurface ( ) const
virtual

Reimplemented from G4VSolid.

Definition at line 361 of file G4ReflectedSolid.cc.

362 {
364  return (*fDirectTransform3D)*G4Point3D(p);
365 }
const char * p
Definition: xmltok.h:285
HepGeom::Point3D< G4double > G4Point3D
Definition: G4Point3D.hh:35
G4Transform3D * fDirectTransform3D
virtual G4ThreeVector GetPointOnSurface() const
Definition: G4VSolid.cc:153

Here is the call graph for this function:

G4Polyhedron * G4ReflectedSolid::GetPolyhedron ( ) const
virtual

Reimplemented from G4VSolid.

Definition at line 443 of file G4ReflectedSolid.cc.

444 {
445  if (!fpPolyhedron ||
449  {
451  fRebuildPolyhedron = false;
452  }
453  return fpPolyhedron;
454 }
static G4int GetNumberOfRotationSteps()
G4Polyhedron * fpPolyhedron
G4int GetNumberOfRotationStepsAtTimeOfCreation() const
G4Polyhedron * CreatePolyhedron() const

Here is the call graph for this function:

const G4ReflectedSolid * G4ReflectedSolid::GetReflectedSolidPtr ( ) const
virtual

Definition at line 116 of file G4ReflectedSolid.cc.

117 {
118  return this;
119 }
G4ReflectedSolid * G4ReflectedSolid::GetReflectedSolidPtr ( )
virtual

Definition at line 121 of file G4ReflectedSolid.cc.

122 {
123  return this;
124 }
G4Transform3D G4ReflectedSolid::GetTransform3D ( ) const

Definition at line 134 of file G4ReflectedSolid.cc.

135 {
136  return fDirectTransform3D->inverse();
137 }
Transform3D inverse() const
Definition: Transform3D.cc:142
G4Transform3D * fDirectTransform3D

Here is the call graph for this function:

EInside G4ReflectedSolid::Inside ( const G4ThreeVector p) const
virtual

Implements G4VSolid.

Definition at line 262 of file G4ReflectedSolid.cc.

263 {
264  G4ThreeVector newPoint = (*fDirectTransform3D)*G4Point3D(p);
265  return fPtrSolid->Inside(newPoint);
266 }
HepGeom::Point3D< G4double > G4Point3D
Definition: G4Point3D.hh:35
virtual EInside Inside(const G4ThreeVector &p) const =0

Here is the call graph for this function:

G4ReflectedSolid & G4ReflectedSolid::operator= ( const G4ReflectedSolid rhs)

Definition at line 87 of file G4ReflectedSolid.cc.

88 {
89  // Check assignment to self
90  //
91  if (this == &rhs) { return *this; }
92 
93  // Copy base class data
94  //
96 
97  // Copy data
98  //
99  fPtrSolid= rhs.fPtrSolid;
100  delete fDirectTransform3D;
102  fRebuildPolyhedron = false;
103  delete fpPolyhedron; fpPolyhedron= 0;
104 
105  return *this;
106 }
G4Transform3D * fDirectTransform3D
HepGeom::Transform3D G4Transform3D
G4Polyhedron * fpPolyhedron
G4VSolid & operator=(const G4VSolid &rhs)
Definition: G4VSolid.cc:111

Here is the call graph for this function:

void G4ReflectedSolid::SetDirectTransform3D ( G4Transform3D transform)

Definition at line 145 of file G4ReflectedSolid.cc.

146 {
147  fDirectTransform3D = &transform;
148  fRebuildPolyhedron = true;
149 }
G4Transform3D * fDirectTransform3D
std::ostream & G4ReflectedSolid::StreamInfo ( std::ostream &  os) const
virtual

Implements G4VSolid.

Definition at line 381 of file G4ReflectedSolid.cc.

382 {
383  os << "-----------------------------------------------------------\n"
384  << " *** Dump for Reflected solid - " << GetName() << " ***\n"
385  << " ===================================================\n"
386  << " Solid type: " << GetEntityType() << "\n"
387  << " Parameters of constituent solid: \n"
388  << "===========================================================\n";
389  fPtrSolid->StreamInfo(os);
390  os << "===========================================================\n"
391  << " Transformations: \n"
392  << " Direct transformation - translation : \n"
393  << " " << fDirectTransform3D->getTranslation() << "\n"
394  << " - rotation : \n"
395  << " ";
397  os << "\n"
398  << "===========================================================\n";
399 
400  return os;
401 }
G4String GetName() const
std::ostream & print(std::ostream &os) const
Definition: RotationIO.cc:21
G4Transform3D * fDirectTransform3D
virtual std::ostream & StreamInfo(std::ostream &os) const =0
CLHEP::HepRotation getRotation() const
virtual G4GeometryType GetEntityType() const
CLHEP::Hep3Vector getTranslation() const

Here is the call graph for this function:

G4ThreeVector G4ReflectedSolid::SurfaceNormal ( const G4ThreeVector p) const
virtual

Implements G4VSolid.

Definition at line 273 of file G4ReflectedSolid.cc.

274 {
275  G4ThreeVector newPoint = (*fDirectTransform3D)*G4Point3D(p);
277  return (*fDirectTransform3D)*normal;
278 }
HepGeom::Point3D< G4double > G4Point3D
Definition: G4Point3D.hh:35
G4Transform3D * fDirectTransform3D
static double normal(HepRandomEngine *eptr)
Definition: RandPoisson.cc:77
virtual G4ThreeVector SurfaceNormal(const G4ThreeVector &p) const =0

Here is the call graph for this function:

Member Data Documentation

G4Transform3D* G4ReflectedSolid::fDirectTransform3D
protected

Definition at line 128 of file G4ReflectedSolid.hh.

G4Polyhedron* G4ReflectedSolid::fpPolyhedron
mutableprotected

Definition at line 131 of file G4ReflectedSolid.hh.

G4VSolid* G4ReflectedSolid::fPtrSolid
protected

Definition at line 127 of file G4ReflectedSolid.hh.

G4bool G4ReflectedSolid::fRebuildPolyhedron
mutableprotected

Definition at line 130 of file G4ReflectedSolid.hh.


The documentation for this class was generated from the following files: