00001 namespace std { } using namespace std;
00002 #include <sys/stat.h>
00003 #include <sys/types.h>
00004 #include <fstream>
00005 #include "CLHEP/Units/GlobalSystemOfUnits.h"
00006 #include "DetectorDescription/RegressionTest/interface/DDHtmlFormatter.h"
00007
00008 #include "DetectorDescription/Core/interface/DDLogicalPart.h"
00009 #include "DetectorDescription/Core/interface/DDSpecifics.h"
00010 #include "DetectorDescription/Core/interface/DDPartSelection.h"
00011
00012
00013
00014 #include "DetectorDescription/Core/src/LogicalPart.h"
00015 #include "DetectorDescription/Core/src/Material.h"
00016 #include "DetectorDescription/Core/src/Specific.h"
00017 #include "DetectorDescription/Core/src/Solid.h"
00018
00019 #include "DetectorDescription/Base/interface/Singleton.icc"
00020
00021
00022 ostream & operator<<(ostream & o, const DDHtmlFormatter & f)
00023 {
00024 o << f.os_.str(); f.os_.str("");
00025 return o;
00026 }
00027
00028 DDHtmlFormatter DDHtmlFormatter::header(const string & title, const string & style)
00029 {
00030 pre();
00031 os_ << "<html>\n<head>\n<title>" << title << "</title>" << endl;
00032 os_ << "<link rel=\"stylesheet\" type=\"text/css\" href=\"" << style << "\">" << endl;
00033
00034 return *this;
00035 }
00036
00037 DDHtmlFormatter DDHtmlFormatter::link(const string & url, const string & txt, const string & target)
00038 {
00039 pre();
00040 os_ << lnk(url,txt,target) << endl;
00041 return *this;
00042 }
00043
00044 string DDHtmlFormatter::lnk(const string & url, const string & txt, const string & target)
00045 {
00046 string result;
00047 result = string("<a href=\"") + url;
00048 result += string("\" target=\"") + target;
00049 result += string("\">")+ txt + string("</a>");
00050 return result;
00051 }
00052
00053 DDHtmlFormatter DDHtmlFormatter::footer()
00054 {
00055 pre();
00056 os_ << "</body></html>" << endl;
00057 return *this;
00058 }
00059
00060
00061
00062
00063
00064
00065 void DDNsGenerator::doit()
00066 {
00067 DDHtmlFormatter f;
00068 os_ << f.header(title_,"../style.css");
00069 os_ << f.h2(title_) << f.p(text_);
00070 ns_type::const_iterator it = n_.begin();
00071 ns_type::const_iterator ed = n_.end();
00072 os_ << f.ul();
00073 for (; it != ed; ++it) {
00074 os_ << f.li(f.lnk(it->first + "/list.html" , it->first, target_));
00075 }
00076 os_ << f.ulEnd() << endl;
00077 os_ << f.footer() << endl;
00078 }
00079
00080
00081
00082 DDHtmlDetails::DDHtmlDetails(const string & cat, const string & txt) : cat_(cat), txt_(txt) { }
00083
00084 ns_type & DDHtmlLpDetails::names()
00085 {
00086 DDLogicalPart lp;
00087 findNameSpaces(lp, names_);
00088 return names_;
00089 }
00090
00091 ns_type & DDHtmlMaDetails::names()
00092 {
00093 DDMaterial lp;
00094 findNameSpaces(lp, names_);
00095 return names_;
00096 }
00097
00098 ns_type & DDHtmlSoDetails::names()
00099 {
00100 DDSolid lp;
00101 findNameSpaces(lp, names_);
00102 return names_;
00103 }
00104
00105 ns_type & DDHtmlSpDetails::names()
00106 {
00107 DDSpecifics lp;
00108 findNameSpaces(lp, names_);
00109 return names_;
00110 }
00111
00112 ns_type & DDHtmlRoDetails::names()
00113 {
00114 DDRotation lp;
00115 findNameSpaces(lp, names_);
00116 return names_;
00117 }
00118
00119
00120 bool DDHtmlSoDetails::details(ostream & os, const DDName & nm)
00121 {
00122 os << f_.header("Solid Details")
00123 << f_.h3(">> formatting under construction <<");
00124 os << DDSolid(nm); return true;
00125 }
00126
00127 bool DDHtmlSpDetails::details(ostream & os, const DDName & nm)
00128 {
00129 os << f_.header("SpecPars Details")
00130 << f_.h3(">> formatting under construction <<");
00131 os << DDSpecifics(nm); return true;
00132 }
00133
00134 bool DDHtmlRoDetails::details(ostream & os, const DDName & nm)
00135 {
00136 os << f_.header("Rotations Details");
00137
00138 DDRotation ddr(nm);
00139 if ( ddr.isDefined().second == false ) {
00140 os << "<b>ERROR!</b><br><p>The Rotation " << nm << " is not defined!</p>" << endl;
00141 return false;
00142 }
00143 DD3Vector x, y, z;
00144 ddr.matrix()->GetComponents(x, y, z);
00145 os << f_.h2("Rotation: " + nm.fullname());
00146 os << f_.h3("GEANT3 style:");
00147 os << "<table border=\"0\">" << endl
00148 << "<tr><td>thetaX =</td><td>" << x.Theta()/deg << " deg</td><tr>" << endl
00149 << "<tr><td>phiX =</td><td>" << x.Phi()/deg << " deg</td><tr>" << endl
00150 << "<tr><td>thetaY =</td><td>" << y.Theta()/deg << " deg</td><tr>" << endl
00151 << "<tr><td>phiY =</td><td>" << y.Phi()/deg << " deg</td><tr>" << endl
00152 << "<tr><td>thetaZ =</td><td>" << z.Theta()/deg << " deg</td><tr>" << endl
00153 << "<tr><td>phiZ =</td><td>" << z.Phi()/deg << " deg</td><tr>" << endl
00154 << "</table>";
00155
00156 os << f_.h3("Rotation axis & angle (theta,phi,angle)") << endl;
00157 os << DDRotation(nm); return true;
00158 }
00159
00160 bool DDHtmlMaDetails::details(ostream & os, const DDName & nm)
00161 {
00162 typedef DDI::Singleton<map<DDMaterial, set<DDLogicalPart> > > parts_t;
00163 static bool once = false;
00164 if (!once) {
00165 once=true;
00166 DDLogicalPart::iterator<DDLogicalPart> it, ed;
00167 ed.end();
00168
00169 for (; it != ed; ++it) {
00170 if (it->isDefined().second)
00171 parts_t::instance()[it->material()].insert(*it);
00172 }
00173 }
00174
00175 string s = nm.ns() + " : " + nm.name();
00176 DDMaterial ma(nm);
00177 os << f_.header(s);
00178 os << f_.h2("Material <b>" + s + "</b>");
00179 os << f_.br();
00180 if ( ma.isDefined().second == false ) {
00181 os << "<b>ERROR!<b><br><p>The Material is not defined in namespace " << nm.ns() << "! </p>" << endl;
00182 return false;
00183 }
00184
00185 os << "<p>density = " << ma.density()/g*cm3 << " g/cm3 </p>" << endl;
00186 int co = ma.noOfConstituents();
00187 if ( co ) {
00188 os << f_.p("Composites by fraction-mass:");
00189 os << f_.table()
00190 << f_.tr() << f_.td("<b>fm</b>") << f_.td("<b>Material</b>") << f_.td("<b>elementary?</b>") << f_.trEnd();
00191 for(int i=0; i<co; ++i) {
00192 pair<DDMaterial,double> fm = ma.constituent(i);
00193 string elem = "ERROR";
00194 DDMaterial m = fm.first;
00195 double frac = fm.second;
00196
00197 if (m.isDefined().second) {
00198 if (m.noOfConstituents())
00199 elem = "no";
00200 else
00201 elem = "yes";
00202 }
00203 os << f_.tr() << "<td>" << frac << "</td>"
00204 << f_.td(f_.lnk("../" + m.ddname().ns() + "/" + m.ddname().name() + ".html", m.ddname().fullname(), "_popup"))
00205 << f_.td(elem) << f_.trEnd();
00206 }
00207 os << f_.tableEnd();
00208 }
00209 else {
00210 os << f_.p("ElementaryMaterial:");
00211 os << "<p>z = " << ma.z() << "</p>" << endl;
00212 os << "<p>a = " << ma.a()/g*mole << "g/mole</p>" << endl;
00213 }
00214
00215
00216 const set<DDLogicalPart> & lps = parts_t::instance()[ma];
00217 set<DDLogicalPart>::const_iterator it(lps.begin()), ed(lps.end());
00218 if ( it != ed ) {
00219 os << f_.h3("Material used in following LogicalParts:") << endl;
00220 os << "<p>" << endl;
00221 }
00222 for (; it != ed; ++it ) {
00223 const DDName & n = it->ddname();
00224 os << f_.link("../../lp/" + n.ns() + "/" + n.name() + ".html", n.fullname(), "_popup" );
00225 }
00226 os << "</p>" << endl;
00227 return true;
00228 }
00229
00230 bool DDHtmlLpDetails::details(ostream & os, const DDName & nm)
00231 {
00232 static bool once = false;
00233 typedef DDI::Singleton< map<DDLogicalPart, set<DDSpecifics> > > lp_sp_t;
00234 if ( !once ) {
00235 once = true;
00236 DDSpecifics::iterator<DDSpecifics> it, ed;
00237 ed.end();
00238 for (; it != ed; ++it ) {
00239 if (it->isDefined().second) {
00240 const vector<DDPartSelection> & ps = it->selection();
00241 vector<DDPartSelection>::const_iterator pit(ps.begin()), ped(ps.end());
00242 for (; pit != ped; ++pit) {
00243 if (pit->size()) {
00244 lp_sp_t::instance()[pit->back().lp_].insert(*it);
00245 }
00246 }
00247 }
00248 }
00249 }
00250 string s = nm.ns() + " : " + nm.name();
00251 DDLogicalPart lp(nm);
00252 os << f_.header(s);
00253 os << f_.h2("LogicalPart <b>" + s + "</b>");
00254 os << f_.br();
00255 if ( lp.isDefined().second == false ) {
00256 os << "<b>ERROR!<b><br><p>The LogicalPart is not defined in namespace " << nm.ns() << "! </p>" << endl;
00257 return false;
00258 }
00259
00260 string so_url = "../../so/" + lp.solid().ddname().ns() + "/" + lp.solid().ddname().name() + ".html";
00261 string ma_url = "../../ma/" + lp.material().ddname().ns() + "/" + lp.material().ddname().name() + ".html";
00262 string so_nm = lp.solid().ddname().ns() + ":" + lp.solid().ddname().name();
00263 string ma_nm = lp.material().ddname().ns() + ":" + lp.material().ddname().name();
00264 os << f_.table()
00265 << f_.tr() << f_.td("Category") << f_.td( DDEnums::categoryName(lp.category()) ) << f_.trEnd()
00266 << f_.tr() << f_.td("Solid") << f_.td( f_.lnk(so_url, so_nm, "_popup" )) << f_.trEnd()
00267 << f_.tr() << f_.td("Material") << f_.td(f_.lnk(ma_url, ma_nm, "_popup")) << f_.trEnd();
00268 os << f_.tableEnd();
00269
00270 typedef map<DDLogicalPart, set<DDSpecifics> > lp_sp_type;
00271 const lp_sp_type & lp_sp = lp_sp_t::instance();
00272 lp_sp_type::const_iterator lpspit = lp_sp.find(lp);
00273 if (lpspit != lp_sp.end()) {
00274 os << f_.h3("assigned SpecPars (Specifics):");
00275 set<DDSpecifics>::const_iterator it(lpspit->second.begin()), ed(lpspit->second.end());
00276 os << "<p>" << endl;
00277 for (; it != ed; ++it) {
00278 os << f_.link("../../sp/" + it->ddname().ns() + "/" + it->ddname().name() + ".html", it->ddname().fullname(), "_popup")
00279 << " " << endl;
00280 }
00281 os << "</p>" << endl;
00282 }
00283
00284 os << f_.footer();
00285 return true;
00286 }
00287
00288
00289
00290 void dd_to_html(DDHtmlDetails & dtls)
00291 {
00292 cout << "---> dd_to_html() called with category=" << dtls.category() << endl;
00293 const string & category = dtls.category();
00294 const string & text = dtls.text();
00295 ns_type & names = dtls.names();
00296
00297 mkdir( category.c_str(), 0755 );
00298
00299
00300 string ns_fname = category + "/ns.html";
00301 ofstream ns_file(ns_fname.c_str());
00302 DDNsGenerator ns_gen(ns_file, text, "_list", names, "");
00303 ns_gen.doit();
00304 ns_file.close();
00305
00306
00307 ns_type::const_iterator it(names.begin()), ed(names.end());
00308 for( ; it != ed; ++it ) {
00309
00310 const string & ns = it->first;
00311
00312
00313 string dir = category + "/" + ns;
00314 mkdir( dir.c_str(), 0755 );
00315
00316
00317 string fname = category + "/" + ns + "/list.html";
00318 ofstream list_file(fname.c_str());
00319 DDHtmlFormatter f;
00320 list_file << f.header(text)
00321 << f.p("Instances in Namespace <b>" + ns + "</b><br>");
00322 list_file << f.ul();
00323
00324 set<string>::const_iterator nit(it->second.begin()), ned(it->second.end());
00325 for(; nit != ned; ++nit) {
00326
00327 const string & nm = *nit;
00328 string result_s = nm;
00329
00330
00331 string d_fname = category + "/" + ns + "/" + nm + ".html";
00332 ofstream detail_file(d_fname.c_str());
00333 DDName an(nm,ns);
00334 bool result = dtls.details(detail_file, an);
00335
00336 if (!result) result_s = ">> ERROR: " + nm + " <<";
00337 list_file << f.li(f.lnk(nm+".html", result_s, "_details"));
00338
00339 }
00340 list_file << f.ulEnd() << f.footer();
00341 }
00342 }
00343
00344
00345
00346
00347
00348 void DDFrameGenerator::doit()
00349 {
00350 DDHtmlFormatter f;
00351 os_ << f.header(t_);
00352 os_ << "<frameset cols=\"25%,*\">" << endl;
00353 os_ << " <frameset rows=\"50%,*\">" << endl;
00354 os_ << " <frame src=\"" << u1_ << "\" name=\"" << n1_ << "\">" << endl;
00355 os_ << " <frame src=\"" << u2_ << "\" name=\"" << n2_ << "\">" << endl;
00356 os_ << " </frameset>" << endl;
00357 os_ << " <frame src=\"" << u3_ << "\" name=\"" << n3_ << "\">" << endl;
00358 os_ << "</frameset>" << endl;
00359 os_ << f.footer() << endl;
00360 }
00361
00362 void dd_html_frameset(ostream & os)
00363 {
00364 DDHtmlFormatter f;
00365 os << f.header("DDD Reports");
00366 os << "<frameset rows=\"50%,50%\"> " << endl
00367 << " <frameset cols=\"50%,50%\">" << endl
00368 << " <frame name=\"_ns\" src=\"ns.html\">" << endl
00369 << " <frame name=\"_list\">" << endl
00370 << " </frameset>" << endl
00371 << " <frameset cols=\"50%,50%\">" << endl
00372 << " <frame name=\"_details\">" << endl
00373 << " <frame name=\"_popup\">" << endl
00374 << " </frameset>" << endl
00375 << "</frameset>" << endl
00376 << endl;
00377 os << f.footer();
00378
00379 }
00380
00381 void dd_html_menu_frameset(ostream & os)
00382 {
00383 DDHtmlFormatter f;
00384 os << f.header("DDD Web Representation");
00385 os << "<frameset cols=\"20%,80%\">" << endl
00386 << " <frame name=\"_menu\" src=\"menu.html\">" << endl
00387 << " <frame name=\"_selection\" >" << endl
00388 << "</frameset>" << endl;
00389
00390 os << f.footer();
00391 }
00392
00393
00394 void dd_html_menu(ostream & os)
00395 {
00396 DDHtmlFormatter f;
00397 os << f.header("DDD Web Main Menu","style.css");
00398 os << f.h1("Select a Category:")
00399 << f.p(f.lnk("lp/index.html", "LogicalParts", "_selection"))
00400 << f.p(f.lnk("ma/index.html", "Materials", "_selection"))
00401 << f.p(f.lnk("so/index.html", "Solids", "_selection"))
00402 << f.p(f.lnk("ro/index.html", "Rotations", "_selection"))
00403 << f.p(f.lnk("sp/index.html", "SpecPars", "_selection"))
00404 ;
00405
00406 os << f.footer();
00407 }
00408
00409
00410