<?xml version="1.0"?>
<xsl:stylesheet id="Unknown replicates: Concentration, %CV; Single sheet" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:exsl="http://exslt.org/math" extension-element-prefixes="exsl" version="1.0">
<xsl:output method="text"/>

<xsl:template match="/">
<xsl:text>Filename:</xsl:text><xsl:text>,</xsl:text>
<xsl:value-of select="MasterPlexPlateData/FileName"/>
<xsl:text>,&#x0A;</xsl:text>
<xsl:text>Acquisition Date:</xsl:text><xsl:text>,</xsl:text>
<xsl:value-of select="MasterPlexPlateData/RunDate"/><xsl:text>,</xsl:text><xsl:value-of select="MasterPlexPlateData/RunTime"/>
<xsl:text>,&#x0A;</xsl:text>
	<xsl:text>,,</xsl:text>
	<xsl:variable name="Plex"><xsl:value-of select = "count(//MasterPlexPlateData/BeadInfo)" /></xsl:variable>

	<xsl:for-each select="MasterPlexPlateData/BeadInfo">
		<xsl:variable name="AnalyteName"><xsl:value-of select="@beadname"/></xsl:variable>
		<xsl:copy-of select="$AnalyteName" /><xsl:text>,,</xsl:text>
	</xsl:for-each>

	<xsl:text>,&#x0A;</xsl:text>
	<xsl:text>,,</xsl:text>

	<xsl:for-each select="MasterPlexPlateData/BeadInfo">
		<xsl:text>Conc.,CV,</xsl:text>
	</xsl:for-each>
	<xsl:text>,&#x0A;</xsl:text>
	<xsl:for-each select="/MasterPlexPlateData/UnknowGroupList/UnknowGroup">
		<xsl:variable name="groupname"><xsl:value-of select="@name"/></xsl:variable>	
		<xsl:variable name="unknowngroupdata">
		<xsl:for-each select="GroupWell">
			<xsl:variable name="GroupWellID"><xsl:value-of select="@id"/></xsl:variable>
			<xsl:element name="GrpWell">
  				<xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute>
  				<xsl:attribute name="pos"><xsl:value-of select="position()"/></xsl:attribute>
				<xsl:attribute name="groupname"><xsl:value-of select="$groupname"/></xsl:attribute>
				<xsl:for-each select="../../../Well[@wellid=$GroupWellID]/Bead">
					<xsl:element name="GrpBead">	
						<xsl:attribute name="samplename"><xsl:value-of select="../@name"/></xsl:attribute>	
						<xsl:attribute name="addr"><xsl:value-of select="../@addr"/></xsl:attribute>
						<xsl:attribute name="id"><xsl:value-of select="@id + 1"/></xsl:attribute>
						<xsl:attribute name="conc"><xsl:value-of select="@conc"/></xsl:attribute>
						<xsl:attribute name="mfi"><xsl:value-of select="@mfi"/></xsl:attribute>
						<xsl:attribute name="mean_mfi"><xsl:value-of select="@sampleavg"/></xsl:attribute>
						<xsl:attribute name="cv"><xsl:value-of select="@samplecv"/></xsl:attribute>
						<xsl:attribute name="stdev"><xsl:value-of select="@resstddev"/></xsl:attribute>
						<xsl:attribute name="status"><xsl:value-of select="@status"/></xsl:attribute>
						<xsl:attribute name="constr"><xsl:value-of select="@constr"/></xsl:attribute>
						<xsl:choose>
  							<xsl:when test="@status = 1">
    								<xsl:attribute name="calc_mean_conc"><xsl:value-of select="@conc"/></xsl:attribute>
  							</xsl:when>
  							<xsl:otherwise>
   				 				<xsl:attribute name="calc_mean_conc"><xsl:value-of select="0"/></xsl:attribute>
  							</xsl:otherwise>
						</xsl:choose>
					</xsl:element>
				</xsl:for-each>
			</xsl:element>
		</xsl:for-each>
		</xsl:variable>
	
		
		<!-- Traverse through the unknowngroupdata variable -->
		<xsl:for-each select="msxsl:node-set($unknowngroupdata)/GrpWell">
			<!--<xsl:text>ID=</xsl:text><xsl:value-of select="current()"/><xsl:text>&#x0A;</xsl:text>-->
			<!--<xsl:text>ID       =</xsl:text><xsl:value-of select="current()/@id"/><xsl:text>&#x0A;</xsl:text>-->
			<!--<xsl:text>POS      =</xsl:text><xsl:value-of select="current()/@pos"/><xsl:text>&#x0A;</xsl:text>-->
			<xsl:variable name="grname"><xsl:value-of select="@groupname"/></xsl:variable>
			<xsl:variable name="num_beads"><xsl:value-of select="count(GrpBead)"/></xsl:variable>
				<xsl:for-each select="GrpBead">
					<xsl:variable name="plexid"><xsl:value-of select="@id"/></xsl:variable>		
					<xsl:variable name="num_valid_beads"><xsl:value-of select="count(//GrpWell/GrpBead[@status = '1'][@id = $plexid])"/></xsl:variable>	
					
					<xsl:if test="$plexid = 1">
						<!--<xsl:text>GroupName=</xsl:text><xsl:value-of select="$grname"/><xsl:text>,</xsl:text>-->
						<!--<xsl:text>SampleName=</xsl:text>--><xsl:value-of select="@samplename"/><xsl:text>,</xsl:text>
            <!--<xsl:text>Well     =</xsl:text>--><xsl:value-of select="@addr"/><xsl:text>,</xsl:text>
						
					</xsl:if>
					
					<!--<xsl:text>ID       =</xsl:text><xsl:value-of select="@id"/><xsl:text>&#x0A;</xsl:text>-->		
					<!--<xsl:text>MFI      =</xsl:text><xsl:value-of select="@mfi"/><xsl:text>&#x0A;</xsl:text>-->
				
					<xsl:choose>
  						<xsl:when test="@status = 1">
    							<xsl:call-template name="Scientific">
										<xsl:with-param name="Num" select="@conc" />
										</xsl:call-template><!--<xsl:value-of select="@conc"/>--><xsl:text>,</xsl:text>
  						</xsl:when>
  						<xsl:otherwise>
   				 			<xsl:call-template name="Scientific">
										<xsl:with-param name="Num" select="@constr" />
										</xsl:call-template><!--<xsl:value-of select="@constr"/>--><xsl:text>,</xsl:text>
  						</xsl:otherwise>
					</xsl:choose>
					
					<xsl:call-template name="Scientific">
										<xsl:with-param name="Num" select="@cv" />
										</xsl:call-template><!--<xsl:value-of select="$meanconc"/>--><xsl:text>,</xsl:text>

			<!--		<xsl:choose>
							<xsl:when test="$num_valid_beads > 0">

         						<xsl:call-template name="calc_variance">	
                   					<xsl:with-param name="nodes" select="//GrpWell/GrpBead[@id=$plexid]/@conc" />
								<xsl:with-param name="sum" select="0" />
								<xsl:with-param name="sum-sq" select="0" />
								<xsl:with-param name="count" select="0" />
								<xsl:with-param name="mcparam" select="sum(//GrpWell/GrpBead[@id=$plexid]/@conc) div $num_valid_beads" />
               					</xsl:call-template>
							</xsl:when>
							<xsl:otherwise>
								<xsl:text>NaN,</xsl:text>
							</xsl:otherwise>
					</xsl:choose> -->

					<!--<xsl:text>Mean_MFI =</xsl:text><xsl:value-of select="@mean_mfi"/><xsl:text>,</xsl:text>-->
					<!--<xsl:text>Stdev    =</xsl:text><xsl:value-of select="@stdev"/><xsl:text>,</xsl:text>-->
					<!--<xsl:text>CV       =</xsl:text><xsl:value-of select="@cv"/><xsl:text>,</xsl:text>	-->
					<!--<xsl:text>Tot_Conc =</xsl:text><xsl:value-of select="sum(//GrpWell/GrpBead[@id=$plexid]/@conc)"/><xsl:text>&#x0A;</xsl:text>-->
					<!--<xsl:text>Num_Beads=</xsl:text><xsl:value-of select="$num_beads"/><xsl:text>&#x0A;</xsl:text>-->
					<!--<xsl:text>Num_valid_beads=</xsl:text><xsl:value-of select="$num_valid_beads"/><xsl:text>&#x0A;</xsl:text>-->
					<!--<xsl:text>Status   =</xsl:text><xsl:value-of select="@status"/><xsl:text>&#x0A;</xsl:text>-->
					<!--<xsl:text>Calc_mean_conc =</xsl:text><xsl:value-of select="@calc_mean_conc"/><xsl:text>&#x0A;</xsl:text>-->				
				</xsl:for-each>
				<xsl:text>&#x0A;</xsl:text>
		</xsl:for-each>
		<xsl:text>&#x0A;</xsl:text>
	</xsl:for-each>
</xsl:template>


<xsl:template name="Scientific">
	<xsl:param name="Num"/>
	<xsl:if test="boolean(number(substring-after($Num,'E')))">
		<xsl:call-template name="Scientific_Helper">
			<xsl:with-param name="m" select="substring-before($Num,'E')"/>
			<xsl:with-param name="e" select="substring-after($Num,'E')"/>
		</xsl:call-template>
	</xsl:if>
	<xsl:if test="not(boolean(number(substring-after($Num,'E'))))">
		<xsl:value-of select='format-number($Num, "#.00")'/>
	</xsl:if>
</xsl:template>

<xsl:template name="Scientific_Helper">
	<xsl:param name="m"/>
	<xsl:param name="e"/>
	<xsl:choose>
		<xsl:when test="$e = 0 or not(boolean($e))">
			<xsl:value-of select='format-number($m, "#.00")'/>
		</xsl:when>
		<xsl:when test="$e &gt; 0">
			<xsl:call-template name="Scientific_Helper">
				<xsl:with-param name="m" select="$m * 10"/>
				<xsl:with-param name="e" select="$e - 1"/>
			</xsl:call-template>
		</xsl:when>
		<xsl:when test="$e &lt; 0">
			<xsl:call-template name="Scientific_Helper">
				<xsl:with-param name="m" select="$m div 10"/>
				<xsl:with-param name="e" select="$e + 1"/>
			</xsl:call-template>
		</xsl:when>
	</xsl:choose>
</xsl:template>

<xsl:template name="calc_variance">
  <xsl:param name="nodes" />
  <xsl:param name="sum" />
  <xsl:param name="sum-sq" />
  <xsl:param name="count" />
  <xsl:param name="mcparam" />

  <xsl:choose>
    <xsl:when test="not($nodes)">
      <xsl:variable name="variancenum"><xsl:value-of select="($sum-sq - ($sum * $sum) div $count) div ($count - 1)"/></xsl:variable> 
	<!--<xsl:text>Variance=</xsl:text><xsl:value-of select="$variancenum" /><xsl:text>,</xsl:text>-->

	<xsl:call-template name="sqrt">	
		<xsl:with-param name="num" select="$variancenum"/>
		<xsl:with-param name="meanconcparam2" select="$mcparam"/>
	</xsl:call-template>

    </xsl:when>
    <xsl:otherwise>
      <xsl:variable name="value" select="$nodes[1]"/>
      <xsl:call-template name="calc_variance">
        <xsl:with-param name="nodes" select="$nodes[position( ) != 1]"/>
        <xsl:with-param name="sum" select="$sum + $value"/>
        <xsl:with-param name="sum-sq" select="$sum-sq + ($value * $value)"/>
        <xsl:with-param name="count" select="$count + 1"/>
	  <xsl:with-param name="mcparam" select="$mcparam"/>

      </xsl:call-template>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template name="sqrt">
	<xsl:param name="meanconcparam2" />
	<xsl:param name="num" />  <!-- The number you want to find the square root of -->
	<xsl:param name="try" select="1" />  <!-- The current 'try'.  This is used internally. -->
	<xsl:param name="iter" select="1" /> <!-- The current iteration, checked against maxiter to limit loop count -->
	<xsl:param name="maxiter" select="1000"/>  <!-- Set this up to insure against infinite loops -->

	<!-- This template was written by Nate Austin using Sir Isaac Newton's method of finding roots -->
	<xsl:choose>
	<xsl:when test="$try * $try = $num or $iter &gt; $maxiter">

	</xsl:when>
	<xsl:otherwise>
      <xsl:call-template name="sqrt">
      <xsl:with-param name="num" select="$num"/>
      <xsl:with-param name="try" select="$try - (($try * $try - $num) div (2 * $try))"/>
	<xsl:with-param name="iter" select="$iter + 1"/>
	<xsl:with-param name="maxiter" select="$maxiter"/>
	<xsl:with-param name="meanconcparam2" select="$meanconcparam2"/>
	</xsl:call-template>
	</xsl:otherwise>
	</xsl:choose>
</xsl:template>

</xsl:stylesheet>
