CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
DDLCompositeMaterial.cc
Go to the documentation of this file.
1 /***************************************************************************
2  DDLCompositeMaterial.cc - description
3  -------------------
4  begin : Wed Oct 31 2001
5  email : case@ucdhep.ucdavis.edu
6  ***************************************************************************/
7 
8 /***************************************************************************
9  * *
10  * DDDParser sub-component of DDD *
11  * *
12  ***************************************************************************/
13 
16 
20 
22 
24  : DDLMaterial( myreg )
25 {}
26 
28 {}
29 
30 // to initialize the CompositeMaterial, clear all rMaterials in case some other
31 // rMaterial was used for some other element.
32 void
33 DDLCompositeMaterial::preProcessElement( const std::string& name, const std::string& nmspace, DDCompactView& cpv )
34 {
35  // fyi: no need to clear MaterialFraction because it is cleared at the end of each
36  // CompositeMaterial
37  myRegistry_->getElement( "rMaterial" )->clear();
38 }
39 
40 void
41 DDLCompositeMaterial::processElement( const std::string& name, const std::string& nmspace, DDCompactView& cpv )
42 {
43  DCOUT_V('P', "DDLCompositeMaterial::processElement started");
44 
47 
48  DDName ddn = getDDName( nmspace );
49  DDMaterial mat;
50 
51  mat = DDMaterial( ddn, ev.eval( nmspace, atts.find( "density" )->second ));
52 
53  // Get references to relevant DDL elements that are needed.
54  DDXMLElement* myMF = myRegistry_->getElement( "MaterialFraction" );
55  DDXMLElement* myrMaterial = myRegistry_->getElement( "rMaterial" );
56 
57  // Get the names from those elements and also the namespace for the reference element.
58  // The parent element CompositeMaterial MUST be in the same namespace as this fraction.
59  // additionally, because it is NOT a reference, we do not try to dis-entangle the namespace.
60  // That is, we do not use the getName() which searches the name for a colon, but instead use
61  // the "raw" name attribute.
62 
63  // TO DO: sfractions assumes that the values are "mixture by weight" (I think)
64  // we need to retrieve the fraction attributes and then check the method
65  // attribute of the CompositeMaterial to determine if the numbers go straight
66  // in to the DDCore or if the numbers need to be manipulated so that the
67  // sfractions are really mixtures by weight going into the DDCore. Otherwise,
68  // the DDCore has to know which are which and right now it does not.
69 
70  if( myMF->size() != myrMaterial->size())
71  {
72  std::string msg = "/nDDLCompositeMaterial::processElement found that the ";
73  msg += "number of MaterialFractions does not match the number ";
74  msg += "of rMaterial names for ";
75  msg += ddn.ns() + ":" + ddn.name() + ".";
76  throwError( msg );
77  }
78  for( size_t i = 0; i < myrMaterial->size(); ++i )
79  {
80  atts = myMF->getAttributeSet( i );
81  mat.addMaterial( myrMaterial->getDDName( nmspace, "name", i ),
82  ev.eval( nmspace, atts.find( "fraction" )->second ));
83  }
84  // clears and sets new reference to THIS material.
85  DDLMaterial::setReference( nmspace, cpv );
86  myMF->clear();
87  clear();
88  // print it.
89  DCOUT_V('P', "DDLCompositeMaterial::processElement completed " << mat);
90 }
int i
Definition: DBlmapReader.cc:9
DDLMaterial processes Box elements.
Definition: DDLMaterial.h:26
DDLElementRegistry * myRegistry_
Definition: DDXMLElement.h:186
DDMaterial is used to define and access material information.
Definition: DDMaterial.h:41
virtual const DDXMLAttribute & getAttributeSet(size_t aIndex=0) const
Get a &quot;row&quot; of attributes, i.e. one attribute set.
Definition: DDXMLElement.cc:79
void throwError(const std::string &keyMessage) const
format std::string for throw an error.
const std::string & ns() const
Returns the namespace.
Definition: DDName.cc:101
DDName is used to identify DDD entities uniquely.
Definition: DDName.h:18
type of data representation of DDCompactView
Definition: DDCompactView.h:77
void preProcessElement(const std::string &name, const std::string &nmspace, DDCompactView &cpv)
Called by loadAttributes AFTER attributes are loaded.
std::map< std::string, std::string > DDXMLAttribute
Definition: DDXMLElement.h:55
int addMaterial(const DDMaterial &m, double fm)
adds a material to the mixture proportional to its fraction-mass fm.
Definition: DDMaterial.cc:72
DDXMLElement * getElement(const std::string &name)
THE most important part. Getting the pointer to a given element type.
static value_type & instance()
~DDLCompositeMaterial()
Destructor.
DDLCompositeMaterial(DDLElementRegistry *myreg)
Constructor.
virtual size_t size(void) const
Number of elements accumulated.
virtual void setReference(const std::string &nmspace, DDCompactView &cpv)
Definition: DDLMaterial.cc:26
Interface of an Expression Evaluator.
#define DCOUT_V(M_v_Y, M_v_S)
Definition: DDdebug.h:54
virtual double eval(const std::string &ns, const std::string &expr)=0
evaluate an expression expr inside the local namespace
This is a base class for processing XML elements in the DDD.
Definition: DDXMLElement.h:58
The main class for processing parsed elements.
virtual void clear(void)
clear this element&#39;s contents.
Definition: DDXMLElement.cc:61
void processElement(const std::string &name, const std::string &nmspace, DDCompactView &cpv)
Processing the element.
virtual const DDName getDDName(const std::string &defaultNS, const std::string &attname=std::string("name"), size_t aIndex=0)
Definition: DDXMLElement.cc:86
const std::string & name() const
Returns the name.
Definition: DDName.cc:87