CMS 3D CMS Logo

Public Member Functions | Protected Member Functions | Private Attributes

DDStreamer Class Reference

Streaming the DDD transient store from/into a std::istream/std::ostream */. More...

#include <DDStreamer.h>

List of all members.

Public Member Functions

 DDStreamer ()
 constructs a streamer object with yet undefined std::istream and std::ostream
 DDStreamer (std::istream &readFrom)
 creates a streamer object for reading
 DDStreamer (std::ostream &writeTo)
 creates a streamer object for writing
void read (std::istream &is)
 populate DDD transient objects from the given std::istream is
void read ()
 populate DDD transient objects from the std::istream refetrred to by member i_
void setInput (std::istream &i)
 set the istream for DDStreamer::read()
void setOutput (std::ostream &o)
 set the std::ostream for DDStreamer::write()
void write ()
 stream all DDD transient objects to the std::ostream referred to by member o_
void write (std::ostream &os)
 stream all DDD transient objects to the given std::ostream os
virtual ~DDStreamer ()
 does nothing; usefull only if another streamer derives from DDStreamer

Protected Member Functions

void materials_read ()
 read all instances of DDMaterial
void materials_write ()
 write all instances of DDMaterial
void names_read ()
 read all instances of DDName
void names_write ()
 write all instances of DDName
void parts_read ()
 read all instances of DDLogicalPart
void parts_write ()
 write all instances of DDLogicalPart
void pos_read ()
 read the graph structure for DDCompactView::graph()
void pos_write ()
 write the graph structure of DDCompactView::graph()
void rots_read ()
 read all instances of DDRotation
void rots_write ()
 write all instances of DDRotation
void solids_read ()
 read all instances of DDSolid
void solids_write ()
 write all instances of DDSolid
void specs_read ()
 read all instances of
void specs_write ()
 write all instances of DDSpecifics
void vars_read ()
 read the dictionlary of ClhepEvaluator
void vars_write ()
 write the dictionary of ClhepEvaluator

Private Attributes

const DDCompactViewcpv_
std::istream * i_
std::ostream * o_

Detailed Description

Streaming the DDD transient store from/into a std::istream/std::ostream */.

DDStreamer can be used to write the DDD transient object into a std::ostram and to retrieve them again via an std::istream.


The streamer can also be used together with DDLParser. Once possible usage scenario would be to load most of the geometrical DDD information via the streamer and parse some addional DDD XML documents containing SpecPar-information using DDLParser.


If DDStreamer is used together with DDLParser, the user has to ensure that reading in via DDStreamer::read() is done BEFORE invoking DDLParser to guarantee internal consistensies of the DDD objects.



  // writing:
  #include<fstream>
  std::ofstream file("pers.txt");
  DDStreamer streamer(file);
  streamer.write();
  
  
  // reading:
  #include<fstream>
  std::ifstream file("pers.txt");
  DDStreamer streamer(filer);
  streamer.read();

Definition at line 41 of file DDStreamer.h.


Constructor & Destructor Documentation

DDStreamer::DDStreamer ( )

constructs a streamer object with yet undefined std::istream and std::ostream

Definition at line 22 of file DDStreamer.cc.

 : cpv_(0), o_(0), i_(0)
 {
 }
DDStreamer::DDStreamer ( std::istream &  readFrom)

creates a streamer object for reading

Definition at line 38 of file DDStreamer.cc.

References i_.

 :  cpv_(0), o_(0), i_(0)
{
  if (is) {
    i_ = &is;
  }
  else {
    throw DDException("DDStreamer::DDStreamer(std::ostream&): not valid std::ostream");
  }
}
DDStreamer::DDStreamer ( std::ostream &  writeTo)

creates a streamer object for writing

Definition at line 27 of file DDStreamer.cc.

References o_.

 :  cpv_(0), o_(0), i_(0)
{
  if (os) {
    o_ = &os;
  }
  else {
    throw DDException("DDStreamer::DDStreamer(std::ostream&): not valid std::ostream");
  }
}
DDStreamer::~DDStreamer ( ) [virtual]

does nothing; usefull only if another streamer derives from DDStreamer

Definition at line 49 of file DDStreamer.cc.

{}

Member Function Documentation

void DDStreamer::materials_read ( ) [protected]

read all instances of DDMaterial

Definition at line 285 of file DDStreamer.cc.

References a, DDMaterial::addMaterial(), DCOUT, dd_get_name(), i, i_, j, m, n, DDBase< N, C >::name(), and z.

Referenced by read().

{
  DCOUT('Y', "DDStreamer::materials_read()");
  std::istream & is = *i_;
  //DDMaterial::clear();
  size_t n=0;
  is >> n;
  size_t i=0;
  for (; i < n; ++i) { // Materials
    is.ignore(1000,'@');
    DDName dn = dd_get_name(is);
    double z(0), a(0), d(0);
    is >> z;
    is >> a;
    is >> d;
    int comp(0);
    is >> comp; // composites
    if (comp) { // composite material
      DDMaterial m(dn,d);
      DCOUT('y', "read-comp-material=" << m.name());
      int j=0;
      for(; j<comp; ++j) {
        DDName cname(dd_get_name(is));
        double fm(0);
        is >> fm;
        DDMaterial constituent(cname);
        DCOUT('y', "  read-composite=" << constituent.name());
        m.addMaterial(constituent,fm);
      }
    }
    else { // elementary material
      DDMaterial m(dn,z,a,d);
      DCOUT('y', "read-elem-material=" << m.name());
    }
  }
}
void DDStreamer::materials_write ( ) [protected]

write all instances of DDMaterial

Definition at line 256 of file DDStreamer.cc.

References DDMaterial::a(), DDBase< DDName, DDI::Material * >::begin(), DDMaterial::constituent(), DCOUT, dd_count(), DDMaterial::density(), DDBase< DDName, DDI::Material * >::end(), j, m, DDBase< N, C >::name(), nameout(), DDMaterial::noOfConstituents(), o_, and DDMaterial::z().

Referenced by write().

{
  DCOUT('Y', "DDStreamer::materials_write()");
  std::ostream & os = *o_;
  DDMaterial::iterator<DDMaterial> it(DDMaterial::begin()), ed(DDMaterial::end());
  size_t no = dd_count(DDMaterial());
  os << no << std::endl;
  for (; it != ed; ++it) {
    if (! it->isDefined().second) continue;
    const DDMaterial & m = *it;
    os << "--Material: " << m.name() << " @ " ;
    nameout(os,m.name()); 
    DCOUT('y', "write-material=" << m.name());
    os << ' ' << m.z() << ' ' << m.a() << ' ' << m.density() << ' ';
    
    int noc = m.noOfConstituents();
    os << noc;
    int j=0;
    for (; j<noc; ++j) {
      DCOUT('y', "  write-const-material=" << m.constituent(j).first.name());
      os << ' ';
      nameout(os,m.constituent(j).first.name());
      os << ' ' << m.constituent(j).second;
    }
    os << std::endl;
  }
}
void DDStreamer::names_read ( ) [protected]

read all instances of DDName

Definition at line 190 of file DDStreamer.cc.

References DCOUT, dd_get_delimit(), DDName::defineId(), i, i_, and asciidump::s.

Referenced by read().

{
  DCOUT('Y', "DDStreamer::names_read()");
  std::istream & is = *i_;
  DDName::IdToName & ids = DDI::Singleton<DDName::IdToName>::instance();
  DDName::Registry & reg = DDI::Singleton<DDName::Registry>::instance();
  
  size_t s;
  is >> s;
  ids.clear();
  //ids.resize(s);
  reg.clear();
  size_t i(0);
  //std::string nm; getline(is,nm);
  for (; i<s; ++i) {
    std::string nm(dd_get_delimit(is,'"'));
    std::string ns(dd_get_delimit(is,'"'));
    size_t id(0);
    is >> id;
    DDName::defineId(std::make_pair(nm,ns),id);
  }
}
void DDStreamer::names_write ( ) [protected]

write all instances of DDName

Definition at line 171 of file DDStreamer.cc.

References prof2calltree::count, DCOUT, and o_.

Referenced by write().

{
  DCOUT('Y', "DDStreamer::names_write()");
  std::ostream & os = *o_;
  DDName::IdToName & ids = DDI::Singleton<DDName::IdToName>::instance();
  
  DDName::IdToName::const_iterator it(ids.begin()), ed(ids.end());
  os << ids.size() << std::endl;
  size_t count(0);
  for (; it != ed; ++it) {
    os << '"' << (*it)->first.first << '"' << ' ' 
       << '"' << (*it)->first.second << '"' << ' ' 
       << count << std::endl;
    ++count;
  }
  
}
void DDStreamer::parts_read ( ) [protected]

read all instances of DDLogicalPart

Definition at line 514 of file DDStreamer.cc.

References DCOUT, dd_get_name(), i, i_, and n.

Referenced by read().

{
  DCOUT('Y', "DDStreamer::parts_read()");
  std::istream & is = *i_;
  //DDLogicalPart::clear();
  size_t n=0;
  is >> n;
  size_t i=0;
  for (; i < n; ++i) { // LogicalParts
    is.ignore(1000,'@');
    DDName dn = dd_get_name(is);
    size_t cat(0);
    is >> cat;
    DDEnums::Category categ = DDEnums::Category(cat);
    DDName mat = dd_get_name(is);
    DDName sol = dd_get_name(is);
    DDLogicalPart lp(dn,mat,sol,categ);
    DCOUT('y', "read-lp=" << lp);
  }
}
void DDStreamer::parts_write ( ) [protected]

write all instances of DDLogicalPart

Definition at line 493 of file DDStreamer.cc.

References DDBase< DDName, DDI::LogicalPart * >::begin(), DDLogicalPart::category(), DCOUT, dd_count(), DDBase< DDName, DDI::LogicalPart * >::end(), DDLogicalPart::material(), DDBase< N, C >::name(), nameout(), o_, and DDLogicalPart::solid().

Referenced by write().

{
  DCOUT('Y', "DDStreamer::parts_write()");
  std::ostream & os = *o_;
  DDLogicalPart::iterator<DDLogicalPart> it(DDLogicalPart::begin()), ed(DDLogicalPart::end());
  size_t no = dd_count(DDLogicalPart());
  os << no << std::endl;
  for (; it != ed; ++it) {
    if (! it->isDefined().second) continue;  
    const DDLogicalPart & lp = *it;
    os << "--Part: " << lp.name() << " @ ";
    nameout(os,lp.name()); 
    os << ' ' << lp.category() << ' ';
    nameout(os,lp.material().name());
    os << ' ';
    nameout(os,lp.solid().name());
    os << std::endl;
  }
}
void DDStreamer::pos_read ( ) [protected]

read the graph structure for DDCompactView::graph()

Definition at line 676 of file DDStreamer.cc.

References CommonMethods::cp(), DCOUT, dd_get_name(), dd_rot_bin_in(), DDanonymousRot(), Capri::details::from(), g, DDCompactView::graph(), i, i_, DDI::Singleton< I >::instance(), argparse::message, n, DDBase< N, C >::name(), DDCompactView::position(), dbtoconf::root, graph< N, E >::size(), matplotRender::t, x, detailsBasic3DVector::y, and z.

Referenced by read().

{
  DCOUT('Y', "DDStreamer::pos_read()");
  std::istream & is = *i_;
  is.ignore(1000,'@');
  DDName rtname = dd_get_name(is);
  DDLogicalPart root(rtname);
  DCOUT('y', "root is: " << root.name());
  DDRootDef::instance().set(root);
  size_t n=0;
  is >> n;
  size_t i=0;
  DDCompactView cpv;
  DDCompactView::graph_type & g = const_cast<DDCompactView::graph_type&>(cpv.graph());
  //  DDPositioner pos_(&cpv);
  //LogDebug << "===== GRAPH SIZE = " << g.size() << " ======" << std::endl << std::endl;
  if (g.size()) {
    edm::LogWarning("DDStreamer") << std::endl;
    edm::LogWarning("DDStreamer") << "DDStreamer::pos_read(): The CompactView already contains some position information." << std::endl
         << "                        It may cause an inconsistent geometry representation!" << std::endl << std::endl;
    throw DDException("DDStreamer::pos_read() failed; CompactView has already been populated by another data source");   
  }
  for (; i < n; ++i) { // Positions
    is.ignore(1000,'@');
    DDName from(dd_get_name(is));
    DDName to(dd_get_name(is));
    std::string cp;
    is >> cp;
    char cr = is.get();
    if (cr != ' ') throw DDException("DDStreamer::pos_read(): inconsistent sequence! no blank delimiter found!");
    //double x,y,z;
    B x,y,z;
    is >> x;
    is >> y;
    is >> z;
    DDTranslation t(x.val_,y.val_,z.val_);
    is.ignore();
    char rottype = is.get();
    DDRotationMatrix * matrix(0);
    //DDName rotname;
    DDRotation rot;
    switch(rottype) {
      case 'a': // anonymous rotation
        is.ignore();
        matrix = new DDRotationMatrix;
        dd_rot_bin_in(is,*matrix);
        rot = DDanonymousRot(matrix);
        break;
      case 'u': // unit rotation
        break;
      case 'r': // regular (named) rotation
        rot = DDRotation(dd_get_name(is));
        break;
      default:
        std::string message = "DDStreamer::pos_read(): could not determine type of rotation\n";
        throw(DDException(message));
      }                                
    //DDName rot(dd_get_name(is));
    cpv.position(DDLogicalPart(to),DDLogicalPart(from),cp,t,rot); 
    DCOUT('y', " pos-read: f=" << from << " to=" << to << " t=" << t << " r=" << rot);
  }
}
void DDStreamer::pos_write ( ) [protected]

write the graph structure of DDCompactView::graph()

Definition at line 610 of file DDStreamer.cc.

References graph< N, E >::begin_iter(), prof2calltree::count, DCOUT, dd_rot_bin_out(), graph< N, E >::end_iter(), g, DDCompactView::graph(), DDI::Singleton< I >::instance(), DDBase< N, C >::name(), nameout(), and o_.

Referenced by write().

{
  DCOUT('Y', "DDStreamer::pos_write()");
  DDCompactView cpv;
  const DDCompactView::graph_type & g = cpv.graph();
  DDCompactView::graph_type::const_iterator it = g.begin_iter();
  DDCompactView::graph_type::const_iterator ed = g.end_iter();
  std::ostream & os = *o_;
  // first the root
  DDLogicalPart rt = DDRootDef::instance().root();
  os << "--Root: @ ";
  nameout(os,rt.name());
  os << std::endl;
  //os << g.edge_size() << std::endl;
  DDCompactView::graph_type::const_iterator iit = g.begin_iter();
  DDCompactView::graph_type::const_iterator eed = g.end_iter();
  size_t count(0);
  for(; iit != eed; ++iit) {
    ++count;
  }
  os << count << std::endl;
  count=0;
  DDName unit_rot_name;
  DDRotationMatrix unit_rot;
  for(; it != ed; ++it) {
     os << "--Pos[" << count << "]: @ "; ++count;
     //const DDLogicalPart & fr = it->from(); 
     nameout(os, it->from().name());
     os << ' ';
     nameout(os, it->to().name());
     os << ' ' << it->edge()->copyno_;
     const DDTranslation & tr = it->edge()->translation();
     //os << ' ' << B(tr.x()) << ' ' << B(tr.y()) << ' ' << B(tr.z());
     os << ' ' << B(tr.x()) << B(tr.y()) << B(tr.z());
     const DDRotation & ro = it->edge()->rot_;
     os << ' ';
     /* if it's an anonymous rotation stemming from an AlgoPosPart
        then it's id must be the one of a unit rotation AND
        it must be defined at this point AND it must not be the
        unit rotation.
        A character identifier is issues to mark the type of the rotation:
        a ... anonymous rotation, followed by the binary numbers of the matrix
        u ... unit-rotation matrix, no values following
        r ... regular defined rotation-matrix (named rotation matrix) followed by name-id
     */
     if (ro.name() == unit_rot_name) {
       if(ro.isDefined().second) {
         if(*(ro.rotation()) != unit_rot) {
           os << "a ";
           dd_rot_bin_out(os,*(ro.rotation()));
         }  
         else {
           os << "u ";
         }
       }
     }
     else {
       os << "r ";
       nameout(os, ro.name());
     }  
     os << std::endl;
  }

}
void DDStreamer::read ( std::istream &  is)

populate DDD transient objects from the given std::istream is

Definition at line 154 of file DDStreamer.cc.

References i_, materials_read(), names_read(), parts_read(), pos_read(), rots_read(), solids_read(), specs_read(), and vars_read().

void DDStreamer::read ( )

populate DDD transient objects from the std::istream refetrred to by member i_

Definition at line 121 of file DDStreamer.cc.

References i_.

{
   if (i_ && *i_) {
    read(*i_);
   }
   else {
     throw DDException("DDStreamer::read(): bad std::istream");
   }
}
void DDStreamer::rots_read ( ) [protected]

read all instances of DDRotation

Definition at line 587 of file DDStreamer.cc.

References trackerHits::c, DCOUT, dd_get_name(), dd_rot_bin_in(), i, i_, n, DDBase< N, C >::name(), and submit::rm.

Referenced by read().

{
  DCOUT('Y', "DDStreamer::rots_read()");
  std::istream & is = *i_;
  //DDRotation::clear();
  size_t n=0;
  is >> n;
  size_t i=0;
  for (; i < n; ++i) { // Rotations
    is.ignore(1000,'@');
    DDName dn = dd_get_name(is);
    char c = is.get();
    if (c != ' ') { 
      throw DDException("DDStreamer::rots_read(): inconsitency! no blank separator found!");
    }
 
    DDRotationMatrix * rm = new DDRotationMatrix();
    dd_rot_bin_in(is,*rm);
    DDRotation ddr = DDRotation(dn,rm);
    DCOUT('y',"read-rots=" << ddr.name());
  }
}
void DDStreamer::rots_write ( ) [protected]

write all instances of DDRotation

Definition at line 558 of file DDStreamer.cc.

References DDBase< DDName, DDRotationMatrix * >::begin(), DCOUT, dd_count(), dd_rot_out(), DDBase< DDName, DDRotationMatrix * >::end(), o_, and csvReporter::r.

Referenced by write().

{ 
  DCOUT('Y', "DDStreamer::rots_write()");
  std::ostream & os = *o_;
  DDRotation::iterator<DDRotation> it(DDRotation::begin()), ed(DDRotation::end());
  size_t no = dd_count(DDRotation());
  os << no << std::endl;
  //DDName ano;
  for (; it != ed; ++it) {
    if (! it->isDefined().second) continue;  
    const DDRotation & r = *it;
    //if (r.name().id() == ano.id()) {
    //  continue;
    //}
    dd_rot_out(os,r);   
  } 
}
void DDStreamer::setInput ( std::istream &  i) [inline]

set the istream for DDStreamer::read()

Definition at line 69 of file DDStreamer.h.

References i, and i_.

{ i_ = &i; }
void DDStreamer::setOutput ( std::ostream &  o) [inline]

set the std::ostream for DDStreamer::write()

Definition at line 72 of file DDStreamer.h.

References connectstrParser::o, and o_.

{ o_ = &o; }
void DDStreamer::solids_read ( ) [protected]

read all instances of DDSolid

Definition at line 406 of file DDStreamer.cc.

References a, b, trackerHits::c, DCOUT, dd_get_boolean_params(), dd_get_name(), ddbox, ddcons, ddintersection, ddpolycone_rrz, ddpolycone_rz, ddpolyhedra_rrz, ddpolyhedra_rz, ddpseudotrap, ddreflected, ddshapeless, ddsubtraction, ddtrap, ddtubs, ddunion, i, i_, reco::helper::VirtualJetProducerHelper::intersection(), n, L1TEmulatorMonitor_cff::p, csvReporter::r, DDSolidFactory::reflection(), DDSolidFactory::subtraction(), matplotRender::t, and DDSolidFactory::unionSolid().

Referenced by read().

{
  DCOUT('Y', "DDStreamer::solids_read()");
  std::istream & is = *i_;
  //DDSolid::clear();
  size_t n=0;
  is >> n;
  size_t i=0;
  for (; i < n; ++i) { // Solids
    is.ignore(1000,'@');
    DDName dn = dd_get_name(is);

    size_t sp(0);
    is >> sp;
    DDSolidShape shape = DDSolidShape(sp);
    
    // boolean solids
    if ( (shape==ddunion) | (shape==ddsubtraction) || (shape==ddintersection) ) {
      DDRotation r;
      DDTranslation t;
      DDSolid a;
      DDSolid b;
      dd_get_boolean_params(is,r,t,a,b);
      switch (shape) {
      case ddunion:
        DDSolidFactory::unionSolid(dn,a,b,t,r);
        break;
      case ddintersection:
        DDSolidFactory::intersection(dn,a,b,t,r);
        break;
      case ddsubtraction:
        DDSolidFactory::subtraction(dn,a,b,t,r);
        break;  
      default:
        throw DDException("DDStreamer::solids_read(): messed up in boolean solid reading!");    
      }
    }
    
    // reflection solids
    else if (shape==ddreflected) {
      DDName ref_nm = dd_get_name(is);
      DDSolidFactory::reflection(dn,ref_nm);
    }
    else if ( (shape==ddbox ) ||
              (shape==ddtrap) ||
              (shape==ddcons) ||
              (shape==ddtubs) ||    
              (shape==ddpolycone_rz) ||
              (shape==ddpolycone_rrz) ||
              (shape==ddpolyhedra_rz) ||                          
              (shape==ddpolyhedra_rrz) ||
              (shape==ddpseudotrap) ||
              (shape==ddshapeless) )
    {
      // read in the solid's parameters
      size_t npars(0);
      is >> npars;
      
      std::vector<double> p(npars);
      if(npars) {
        //edm::LogError("DDStreamer") << npars << flush << std::endl;
        char c;
        c = is.get();
        if (c != ' ') {
           edm::LogError("DDStreamer") << "delimiter: " << c << std::endl;
          throw DDException("DDStreamer::solids_read(): wrong separator in atomic for atomic solids parameters");
        }
        is.read((char*)&(*(p.begin())),npars*sizeof(double));   
        /*
        size_t i(0);
        for(; i< npars; ++i) {
          double d(0);
          is >> d;
          p.push_back(d);
        }
        */
      } 
      DDSolid so = DDSolid(dn,shape,p);
      DCOUT('y', "read-solid=" << so);     
    }
    else {
      edm::LogError("DDStreamer") << "wrong solid enum: " << shape << std::endl;
      throw DDException("Error in DDStreamer::solids_read(), wrong shape-enum!");
    }
  }
}
void DDStreamer::solids_write ( ) [protected]

write all instances of DDSolid

Definition at line 346 of file DDStreamer.cc.

References DDBase< DDName, DDI::Solid * >::begin(), DCOUT, dd_count(), dd_stream_booleans(), dd_stream_reflected(), ddintersection, ddreflected, ddsubtraction, ddunion, DDBase< DDName, DDI::Solid * >::end(), mergeVDriftHistosByStation::name, DDBase< N, C >::name(), nameout(), o_, L1TEmulatorMonitor_cff::p, DDSolid::parameters(), asciidump::s, and DDSolid::shape().

Referenced by write().

{
  DCOUT('Y', "DDStreamer::solids_write()");
  std::ostream & os = *o_;
  DDSolid::iterator<DDSolid> it(DDSolid::begin()), ed(DDSolid::end());
  size_t no = dd_count(DDSolid());
  os << no << std::endl;
  for (; it != ed; ++it) {
    if (! it->isDefined().second) continue;  
    const DDSolid & s = *it;
    DCOUT('y', "write-solid=" << s << " enum=" << s.shape());
    os << "--Solid: " << s.name() << ' ' << DDSolidShapesName::name(s.shape()) << " @ ";
    nameout(os,s.name()); 
    os << ' ' << s.shape() << ' ';
    switch (s.shape()) {
    case ddunion: case ddsubtraction: case ddintersection:
      dd_stream_booleans(os, s, s.shape());
      break;
    case ddreflected:
      dd_stream_reflected(os, s);
      break;
    default:
      size_t ps = s.parameters().size();
      os << ps;
      const std::vector<double> & p = s.parameters();
      os << ' ';
      os.write((char*)(&(*p.begin())),ps*sizeof(double));
      /*
      std::vector<double>::const_iterator it(p.begin()), ed(p.end());
      for (; it != ed; ++it) {
        os << ' ' << *it;
      }
      */
    }
    os << std::endl;
  }
}
void DDStreamer::specs_read ( ) [protected]

read all instances of

Definition at line 824 of file DDStreamer.cc.

References DCOUT, dd_get_delimit(), dd_get_name(), i, i_, n, mergeVDriftHistosByStation::name, query::result, asciidump::s, DDValue::setEvalState(), and python::multivaluedict::sort().

Referenced by read().

{
  DCOUT('Y', "DDStreamer::specs_read()");
  std::istream & is = *i_;
  //DDSpecifics::clear();
  size_t n=0;
  is >> n;
  size_t i=0;
  for (; i < n; ++i) { // Specifics
    is.ignore(1000,'@');
    DDName sn(dd_get_name(is));
    size_t nps(0);
    is >> nps;
    size_t ii=0;
    std::vector<std::string> ps;
    is.ignore(100,'\n');
    for (; ii < nps; ++ii) {
      std::string s;
      getline(is,s);
      DCOUT('y', "specs-ps=" << s);
      ps.push_back(s);
    }
    is >> nps;
    ii=0;
    DDsvalues_type sv;
    for(; ii<nps; ++ii) {
      std::string name = dd_get_delimit(is,'"');
      bool evl(false);
      is >> evl;
      size_t no(0);
      is >> no;
      std::vector<DDValuePair> valv;
      DDValue result;
      if (evl) {
        size_t iii=0;
        for(; iii<no; ++iii) {
          std::string strv = dd_get_delimit(is,'"');
          double dblv(0);
          is >> dblv;
          DDValuePair valp(strv,dblv);
          valv.push_back(valp);
        }
        result = DDValue(name,valv);
        result.setEvalState(true);
      }
      else {
        size_t iii=0;
        for(; iii<no; ++iii) {
          std::string strv = dd_get_delimit(is,'"');    
          DDValuePair valp(strv,0);
          valv.push_back(valp);
        }
        result = DDValue(name,valv);
        result.setEvalState(false);
      }
      sv.push_back(DDsvalues_Content_type(result,result));
    }
    std::sort(sv.begin(),sv.end());
    DDSpecifics sp(sn,ps,sv,false);
    DCOUT('y', " specs-read: " << sp);
  }  
}
void DDStreamer::specs_write ( ) [protected]

write all instances of DDSpecifics

Definition at line 774 of file DDStreamer.cc.

References DDBase< DDName, DDI::Specific * >::begin(), DCOUT, dd_count(), DDBase< DDName, DDI::Specific * >::end(), i, DDValue::isEvaluated(), DDValue::name(), DDBase< N, C >::name(), nameout(), o_, asciidump::s, DDSpecifics::selection(), DDValue::size(), DDSpecifics::specifics(), DDValue::strings(), and v.

Referenced by write().

{
  DCOUT('Y', "DDStreamer::specs_write()");
  std::ostream & os = *o_;
  DDSpecifics::iterator<DDSpecifics> it(DDSpecifics::begin()), ed(DDSpecifics::end());
  size_t no = dd_count(DDSpecifics());
  os << no << std::endl;
  for (; it != ed; ++it) {
    if (! it->isDefined().second) continue;  
    const DDSpecifics & sp = *it;
    os << "--Spec: @ ";
    nameout(os,sp.name());
    os << ' ' << sp.selection().size() << std::endl;
    std::vector<DDPartSelection>::const_iterator sit(sp.selection().begin()), sed(sp.selection().end());
    for (; sit != sed; ++sit) {
      os << *sit << std::endl;
    }
    os << sp.specifics().size() << std::endl;
    DDsvalues_type::const_iterator vit(sp.specifics().begin()), ved(sp.specifics().end());
    for (; vit != ved; ++vit) {
      const DDValue & v = vit->second;
      os << ' ' << '"' << v.name() << '"' << ' ';
      if (v.isEvaluated()) {
        os << 1 << ' ';
      }
      else {
        os << 0 << ' ';
      }
      os << v.size() << ' ';
      if (v.isEvaluated()) {
        size_t s=v.size();
        size_t i=0;
        for (; i<s; ++i) {
          os << '"' << v[i].first << '"' << ' ' << v[i].second << ' ';
        }
      }
      else {
        size_t s=v.size();
        size_t i=0;
        const std::vector<std::string> & vs = v.strings();
        for (; i<s; ++i) {
          os << '"' << vs[i] << '"' << ' ';
        }
      }
      os << std::endl;
      
    }
  }  
}
void DDStreamer::vars_read ( ) [protected]

read the dictionlary of ClhepEvaluator

Definition at line 912 of file DDStreamer.cc.

References DDConstant::createConstantsFromEvaluator(), DCOUT, dd_get_delimit(), i, i_, DDI::Singleton< I >::instance(), n, mergeVDriftHistosByStation::name, ClhepEvaluator::set(), and relativeConstraints::value.

Referenced by read().

{
  DCOUT('Y', "DDStreamer::vars_read()");
  std::istream & is = *i_;
  ExprEvalInterface & ev = ExprEvalSingleton::instance();
  ClhepEvaluator * eval = dynamic_cast<ClhepEvaluator*>(&ev);
  if (eval){
    size_t n(0);
    is >> n;
    size_t i(0);
  
    for(; i<n; ++i) {
      std::string name(dd_get_delimit(is,'"'));
      std::string value(dd_get_delimit(is,'"'));
      eval->set(name,value);
    }
  }
  else {
    throw DDException("DDStreamer::vars_write(): expression-evaluator is not a ClhepEvaluator-implementation!");  
  }
  DDConstant::createConstantsFromEvaluator();
}
void DDStreamer::vars_write ( ) [protected]

write the dictionary of ClhepEvaluator

Definition at line 888 of file DDStreamer.cc.

References i, DDI::Singleton< I >::instance(), o_, asciidump::s, ClhepEvaluator::values(), and ClhepEvaluator::variables().

Referenced by write().

{
  std::ostream & os = *o_;
  ExprEvalInterface & ev = ExprEvalSingleton::instance();
  ClhepEvaluator * eval = dynamic_cast<ClhepEvaluator*>(&ev);
  if (eval){
    const std::vector<std::string> & vars = eval->variables();
    const std::vector<std::string> & vals = eval->values();
    if (vars.size() != vals.size()) {
      throw DDException("DDStreamer::vars_write(): different size of variable names & values!") ;
    }
    size_t i(0), s(vars.size());
    os << s << std::endl;
    for (; i<s; ++i) {
      os << '"' << vars[i] << '"' << ' ' 
         << '"' << vals[i] << '"' << std::endl; 
    }  
  }
  else {
    throw DDException("DDStreamer::vars_write(): expression-evaluator is not a ClhepEvaluator-implementation!");
  }
}
void DDStreamer::write ( void  )

stream all DDD transient objects to the std::ostream referred to by member o_

Definition at line 111 of file DDStreamer.cc.

References o_.

{
   if (o_ && *o_) {
     write(*o_);
   }
   else {
     throw DDException("DDStreamer::write(): bad std::ostream");
   }
}
void DDStreamer::write ( std::ostream &  os)

stream all DDD transient objects to the given std::ostream os

Definition at line 131 of file DDStreamer.cc.

References materials_write(), names_write(), o_, parts_write(), pos_write(), rots_write(), solids_write(), specs_write(), and vars_write().

{
  o_=&os;
  std::streamsize prec(os.precision());
  os << std::setprecision(26) << std::scientific;
  names_write();
  vars_write();  
  
  materials_write();
  solids_write();
  parts_write();
  
  pos_write();
  specs_write();
  
  rots_write();    
  //os << DDI::Singleton<DDName::IdToName>::instance().size() << std::endl;
  //names_write();
  os << resetiosflags((std::ios_base::fmtflags)0);
  os << std::setprecision(prec);
}

Member Data Documentation

const DDCompactView* DDStreamer::cpv_ [private]

not used

Definition at line 124 of file DDStreamer.h.

std::istream* DDStreamer::i_ [private]

istream target for reading DDD objects

Definition at line 126 of file DDStreamer.h.

Referenced by DDStreamer(), materials_read(), names_read(), parts_read(), pos_read(), read(), rots_read(), setInput(), solids_read(), specs_read(), and vars_read().

std::ostream* DDStreamer::o_ [private]

std::ostream target for writing DDD objects

Definition at line 125 of file DDStreamer.h.

Referenced by DDStreamer(), materials_write(), names_write(), parts_write(), pos_write(), rots_write(), setOutput(), solids_write(), specs_write(), vars_write(), and write().