Phoenix hint [Software]

posted by Helmut Homepage – Vienna, Austria, 2015-10-31 19:41 (3532 d 04:22 ago) – Posting: # 15593
Views: 11,033

Dear all,

last Monday Simon Davis posted a trick at the Certara-Forum:

[…] viewing an analysis is to […] right-click on the root workflow and choose dependencies, this will generate an XML dump of the whole project that can be rendered in any web browser etc.

Almost perfect – if you want to make the life of monitors, auditors, and inspectors easier. There is a little bug in the XML-engine of PHX. The XML starts with…

<?xml version="1.0" encoding="ISO-8859-1"?> <?xml-stylesheet type="text/xsl" href="Workflow.xslt"?>
<?xml version="1.0" encoding="utf-8"?>

… which is not well-formed XLM (double declaration of the encoding). Will give a blank page in IE and in more standard-conform browsers an error similar to this one:

Address: file:///C:/foo/bar/Workflow.xml
Row No. 2, Column 1:<?xml version="1.0" encoding="utf-8"?>
^

Easy: Overwrite <?xml version="1.0" encoding="ISO-8859-1"?> with <?xml version="1.0" encoding="utf-8"?>, delete the second line, and safe in UTF-8 (otherwise special characters might not be displayed properly).

The stylesheet Workflow.xslt sucks up too much space, IMHO. This is mine:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <html>
      <style type="text/css">
        body {
          font: normal 1em Tahoma, Verdana, Arial, sans-serif;
        }
        table {
          width: 100%;
          font: normal 0.83em Tahoma, Verdana, Arial, sans-serif;
          border: 1px solid #000;
          border-collapse: collapse;
        }
        caption {
          font-size: 1em;
        }
        tfoot td {
          text-align: left;
        }
        tbody {
          border: 1px solid #000;
          border-collapse: collapse;
        }
        th, td {
          padding: 0.1em 0.75em;
          height: 1em;
          border: 1px solid #000;
          border-collapse: collapse;
        }
      </style>
      <body>
        <xsl:apply-templates select="Workflow" />
      </body>
    </html>
  </xsl:template>
  <xsl:template match="Workflow">
    <tr>
      <xsl:if test="@Level &gt; 1">
        <td></td>
      </xsl:if>
      <td>
        <br/>
        <table border="1" rules="groups">
          <thead>
            <tr>
              <xsl:if test="@Level &gt; 1">
                <th></th>
              </xsl:if>
              <th>
                <h3>
                  <xsl:value-of select="@Name"/>
                </h3>
              </th>
            </tr>
          </thead>
          <xsl:apply-templates select="Executable" />
          <xsl:apply-templates select="Workflow" />
        </table>
      </td>
    </tr>
  </xsl:template>
  <xsl:template match="Executable">
    <xsl:if test="position() = 1">
      <thead>
        <tr>
          <th>Object Type</th>
          <th>Object Name</th>
          <th>Object Status</th>
        </tr>
      </thead>
    </xsl:if>
    <tbody>
      <tr>
        <td><xsl:value-of select="@Type"/></td>
        <td><xsl:value-of select="@Name"/></td>
        <td><xsl:value-of select="@Status"/></td>
      </tr>
      <xsl:apply-templates select="Datasource" />
      <xsl:apply-templates select="Result" />
    </tbody>
  </xsl:template>
  <xsl:template match="Datasource">
    <tr>
    <tr>
      <td><a name="{@Guid}" id="{@Guid}">Datasource</a></td>
      <td><xsl:value-of select="@Name"/></td>
      <xsl:choose>
        <xsl:when test="@Generated='False'">
          <td>Not Generated</td>
        </xsl:when>
        <xsl:otherwise>
          <td><a href="{@FileName}">Source</a></td>
        </xsl:otherwise>
      </xsl:choose>
    </tr>
  </tr>
  <xsl:if test="Mappings">
    <tr>
      <td></td>
      <td colspan="2"><xsl:apply-templates select="Mappings" /></td>
    </tr>
  </xsl:if>
  </xsl:template>
  <xsl:template match="Result">
    <tr>
      <td><a name="{@Guid}" id="{@Guid}">Result</a></td>
      <td><xsl:value-of select="@Name"/></td>
      <xsl:choose>
        <xsl:when test="@Generated='False'">
          <td>Not Generated</td>
        </xsl:when>
        <xsl:otherwise>
          <td><a href="{@FileName}">Generated</a></td>
        </xsl:otherwise>
      </xsl:choose>
    </tr>
  </xsl:template>
  <xsl:template match="Mappings">
    <table>
      <tr><th colspan="2">Mappings</th></tr>
      <tr>
        <th>Variable</th>
        <th>Column</th>
      </tr>
      <xsl:apply-templates select="Map" />
    </table>
  </xsl:template>
  <xsl:template match="Map">
    <tr>
      <td><xsl:value-of select="@Variable"/></td>
      <td><xsl:value-of select="@Column"/></td>
    </tr>
  </xsl:template>
</xsl:stylesheet>


Screenshot:
[image]

All links point to the respective data (Source) or results (Generated). Data are in csv-format (comma delimited, decimal separator period). Plots are rendered to jpeg. Guess what *.txt means. These files are particularly interesting because they document the mapping of variables, the PHX version and build, and date/time of execution. Note that this is the timestamp of the object, not when you exported it to XML. Example for a nonparametric crossover-setup:

Date: Oct 28, 2015 15:40:37 Local
/********************************* Begin Mappings *********************************/
Main : BENonparCross.Data.SennTable4_9
   Sort :
   Subject : subj
   Sequence : seq
   Response : var
   Treatment : trt
/********************************* End Mappings   *********************************/

Phoenix Build 6.4.0.768
Treatment Data Layout = Stacked


The result (always in full precision) is given in a csv-file as:

Variables,Median,Confidence_Level,Exact,CI_Lower,CI_Upper
Treatment_Diff_( T - R ),1.25,0.8,0.8,-5,8.5
Treatment_Diff_( T - R ),1.25,0.9,0.9,-6,12.5
Treatment_Diff_( T - R ),1.25,0.95,0.95,-10,16
T,112.5,0.8,0.85400390625,100,125
T,112.5,0.9,0.85400390625,100,125
T,112.5,0.95,0.96142578125,90,130
R,110,0.8,0.85400390625,100,118
R,110,0.9,0.85400390625,100,118
R,110,0.95,0.96142578125,98,125

Ugly. However, my browser suggests to open it in Excel – which takes care of the columns. For Senn’s example I was interested in the 95% CI. I set up a filter and renamed the results.

Date: Oct 28, 2015 15:40:37 Local
Phoenix Build 6.4.0.768
Step 1 Filter
--- Mappings ---
Worksheet : BENonparCross.Workflow.SennTable4_9.Crossover.Confidence Intervals
Exclude : Exact
--- Settings ---
Include where [Variables] = 'Treatment_Diff_( T - R )' (Tolerance = 0) Entire Row
Include where [Confidence_Level] = '0.95' (Tolerance = 0) Entire Row

Step 2 Properties
--- Mappings ---
Sort :
--- Settings ---
Median => PE
CI_Lower => CL_lo
CI_Upper => CL_hi

The result in another csv (formatted here):

Variables                  PE Confidence_Level CL_lo  CL_hi
Treatment_Diff_( T - R ) 1.25             0.95  -10      16


I think that the XML-file gives reviewers an opportunity to dive into what has been done – without needing a (trial)license of Phoenix or even on a different operating system. Furthermore, the output is tiny: My 1.32 MiB project-file boiled down to just 68 KiB. ;-)

Dif-tor heh smusma 🖖🏼 Довге життя Україна! [image]
Helmut Schütz
[image]

The quality of responses received is directly proportional to the quality of the question asked. 🚮
Science Quotes

Complete thread:

UA Flag
Activity
 Admin contact
23,425 posts in 4,928 threads, 1,684 registered users;
42 visitors (0 registered, 42 guests [including 10 identified bots]).
Forum time: 01:04 CEST (Europe/Vienna)

No problem can stand the assault of sustained thinking.    Voltaire

The Bioequivalence and Bioavailability Forum is hosted by
BEBAC Ing. Helmut Schütz
HTML5