<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>BioTeam</title>
	<atom:link href="http://bioteam.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://bioteam.net</link>
	<description>Enabling Science</description>
	<lastBuildDate>Thu, 16 Feb 2012 15:57:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>MiniLIMS for Ion Torrent PGM Sequencer Launched</title>
		<link>http://bioteam.net/2012/02/minilims-for-ion-torrent-pgm-sequencer-launched/</link>
		<comments>http://bioteam.net/2012/02/minilims-for-ion-torrent-pgm-sequencer-launched/#comments</comments>
		<pubDate>Wed, 15 Feb 2012 17:00:16 +0000</pubDate>
		<dc:creator>bioteam</dc:creator>
				<category><![CDATA[Employee Posts]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Press Release]]></category>
		<category><![CDATA[ion]]></category>
		<category><![CDATA[ion torrent]]></category>
		<category><![CDATA[MiniLIMS]]></category>
		<category><![CDATA[next-gen sequencing]]></category>
		<category><![CDATA[PGM]]></category>
		<category><![CDATA[post-wide]]></category>

		<guid isPermaLink="false">http://bioteam.net/?p=1722</guid>
		<description><![CDATA[BioTeam Inc. announces the availability of BioTeam MiniLIMS for Ion Torrent Personal Genome Machine (PGM).]]></description>
			<content:encoded><![CDATA[<hr />
<p style="text-align: center;">PRESS RELEASE</p>
<hr />
<h2><strong>BioTeam Launches MiniLIMS<sup>TM</sup> for Ion Torrent PGM Sequencer</strong></h2>
<p><strong>Marco Island, FL, February 15, 2012 </strong>– BioTeam Inc. announces the availability of BioTeam MiniLIMS for Ion Torrent Personal Genome Machine (PGM). MiniLIMS is a powerful Web-based Laboratory Information Management System (LIMS) built for scientists who want a cost-effective solution that is fast, simple and flexible.  MiniLIMS will be available for direct purchase through Life Technologies WebStore after March 15, 2012.</p>
<p>MiniLIMS is the first independent software solution to connect directly to the Ion Torrent Server. Tight integration permits automated data transfer, speeds data processing, and eliminates many sources of error. MiniLIMS captures NGS workflow processes including sample receipt, sample prep, planned experiments, and results viewing. This agreement expands the Life Technologies-BioTeam collaboration. BioTeam provides extended service and support for the Ion Torrent Server and Suite Software.</p>
<p>“The BioTeam has demonstrated market-leading knowledge of the Torrent Suite Software, that drives primary analysis of semiconductor sequencing, through their extensive work on both the Ion Torrent Grand Challenges and Torrent Server support services.  Their practical working knowledge of the underpinnings of the Ion Torrent software makes them a strong choice to consider when choosing a LIMS partner, “said Mike Lelivelt, Director of Bioinformatics and Software Products, Ion Torrent</p>
<p>“Effective data management is an ongoing challenge for NGS users with many still using spreadsheets. MiniLIMS helps PGM users quickly gain improved control of their NGS data and derive more value from their NGS-based activities,” said Stan Gloss, Managing Director, BioTeam.</p>
<p>Among MiniLIMS’ core capabilities are:</p>
<ul>
<li><strong>Simplified Data Entry</strong>. Customize data entry and display – without programming – to exactly match your samples, reagents, workflows, and instruments. Data stored in spreadsheets can be quickly and easily uploaded.</li>
</ul>
<ul>
<li><strong>Automatic Loading of PGM Data</strong>. Data is imported from the PGM into MiniLIMS automatically, hyperlinking all the sample, run, and preparation details. Upload your own files, putting all the data you need in one place.<strong> </strong></li>
</ul>
<ul>
<li><strong>Powerful Report Generation</strong>. Create custom reports to see the state of your experiments at any time; there are pages that show the history of all data in the system.</li>
</ul>
<p>The new MiniLIMS Ion Torrent plugin extends MiniLIMS to work with PGM data. Round trip data management allows scientists to plan experiments from MiniLIMS and see results from the PGM load automatically. MiniLIMS can alert users when data appears or pages change. Routine experiments can be configured using templates so a new run can be setup with a few keystrokes. Results can be delivered to users using the same project and sample overview pages that support Bioanalyzer, Nanodrop, or other lab processes. A graphical overview provides a snapshot of recent runs and analyses.</p>
<p>To see the most recent screenshots of MiniLIMS for PGM visit:</p>
<p><a href="http://biote.am/73">http://biote.am/73</a></p>
<p><strong>About BioTeam</strong></p>
<p><em>BioTeam is a high performance consultancy, serving the needs of the life sciences community since 2002. Our expertise includes cluster computing, large scale data storage, cloud computing, and semantic LIMS development. For more information, please visit <a href="../">http://bioteam.net</a></em></p>
<p>&nbsp;</p>
<hr />
]]></content:encoded>
			<wfw:commentRss>http://bioteam.net/2012/02/minilims-for-ion-torrent-pgm-sequencer-launched/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Metrum moves to the cloud</title>
		<link>http://bioteam.net/2012/02/metrum-moves-to-the-cloud/</link>
		<comments>http://bioteam.net/2012/02/metrum-moves-to-the-cloud/#comments</comments>
		<pubDate>Wed, 15 Feb 2012 14:02:45 +0000</pubDate>
		<dc:creator>chrisdag</dc:creator>
				<category><![CDATA[Employee Posts]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[amazon aws]]></category>
		<category><![CDATA[amazon cloud]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[case study]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[ec2]]></category>
		<category><![CDATA[featured]]></category>
		<category><![CDATA[metrum]]></category>
		<category><![CDATA[post-wide]]></category>
		<category><![CDATA[s3]]></category>

		<guid isPermaLink="false">http://bioteam.net/?p=1724</guid>
		<description><![CDATA[Over the past few years, many life science organizations have dabbled in cloud computing and explored infrastructure-as-a-service, with varying degrees of enthusiasm and commitment. But one Connecticut company has decided to go for broke—transferring its entire IT infrastructure onto the Amazon cloud. ]]></description>
			<content:encoded><![CDATA[<div>
<div>
<hr />
<h1>Two Guys and a Credit Card: Metrum’s Amazon Cloud Makeover</h1>
</div>
</div>
<p><span><span style="font-family: Verdana;"><strong><em>A case study in transferring a life sciences IT infrastructure fully into the cloud</em> </strong></span></span></p>
<hr />
<blockquote>
<div>&#8220;<em><span style="font-family: Verdana; font-size: x-small;">Over the past few years, many life science organizations have dabbled in cloud computing and explored infrastructure-as-a-service, with varying degrees of enthusiasm and commitment. But one Connecticut company has decided to go for broke—transferring its entire IT infrastructure onto the Amazon cloud.  </span></em> &#8220;</div>
</blockquote>
<div>BioTeam is excited to see one of our longest-running and coolest clients featured in a Bio-IT World Case Study. We&#8217;ve been working with the nice folks at <a href="http://metrumrg.com/">Metrum Research Group</a> for many years now. They&#8217;ve been a pleasure to work with and are always involved in very interesting and challenging work.</div>
<div>You can read the full story here:</div>
<div>
<ul>
<li>Short Link: <a href="http://biote.am/74">http://biote.am/74</a></li>
<li>Direct Link: <a href="http://www.bio-itworld.com/2012/02/14/two-guys-credit-card-metrum-amazon-cloud-makeover.html">http://www.bio-itworld.com/2012/02/14/two-guys-credit-card-metrum-amazon-cloud-makeover.html </a></li>
</ul>
<p>And don&#8217;t forget to attend <a href="http://www.bio-itworldexpo.com/">BioIT World Boston</a> in April to see Jeff and Adam talk about the system in person.</p>
</div>
<div>The back story is covered in the linked article. A few of the Metrum principals attended one of our <a href="http://bioteam.net/amazon-cloud-training/">AWS Training sessions</a> and came away with enough knowledge to map their own needs onto the AWS product lineup. A few meetings, a brainstorming session or two and a new collaboration was created.</div>
<p>&nbsp;</p>
<div>I won&#8217;t steal Jeff &amp; Adam&#8217;s thunder by talking technical about the AWS architecture and methods used. You&#8217;ll have to wait until April @ the conference for that.</div>
]]></content:encoded>
			<wfw:commentRss>http://bioteam.net/2012/02/metrum-moves-to-the-cloud/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MiniLIMS Ion Torrent plugin sneak peek</title>
		<link>http://bioteam.net/2012/02/minilims-ion-torrent-plugin-sneak-peek/</link>
		<comments>http://bioteam.net/2012/02/minilims-ion-torrent-plugin-sneak-peek/#comments</comments>
		<pubDate>Mon, 06 Feb 2012 22:28:01 +0000</pubDate>
		<dc:creator>aaron</dc:creator>
				<category><![CDATA[Employee Posts]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ion torrent]]></category>
		<category><![CDATA[MiniLIMS]]></category>
		<category><![CDATA[next-gen]]></category>
		<category><![CDATA[next-gen sequencing]]></category>

		<guid isPermaLink="false">http://bioteam.net/?p=1714</guid>
		<description><![CDATA[The great conflagration of genomic luminaries known as AGBT is once again upon us. Getting it in just under the wire, we&#8217;ll be releasing the Ion Torrent plugin for the MiniLIMS platform at this meeting. MiniLIMS Product Page MiniLIMS User Guide System requirements Request a quote If you&#8217;ve been following my previous posts about the [...]]]></description>
			<content:encoded><![CDATA[<p>The great conflagration of genomic luminaries known as <a href="http://agbt.org">AGBT</a> is once again upon us.  Getting it in just under the wire, we&#8217;ll be releasing the Ion Torrent plugin for the <a href="/minilims">MiniLIMS platform</a> at this meeting.</p>
<div style="float: right">
<ul>
<li><a href="/minilims/" title="MiniLIMS Product Page">MiniLIMS Product Page</a></li>
<li><a href="http://minilims.bioteam.net/docs/1-0/user-guide/" title="MiniLIMS User Guide">MiniLIMS User Guide</a></li>
<li><a href="http://minilims.bioteam.net/docs/1-0/overview-and-requirements/" title="Requirements">System requirements</a></li>
<li><a href="mailto:stan@bioteam.net">Request a quote</a></li>
</ul>
</div>
<p>If you&#8217;ve been following my previous posts about the PHP API (<a href="/2011/11/ion-torrent-server-api-id-like-to-introduce-you-to-the-minilims-api/">starting here</a>) you know a little bit about how MiniLIMS is exchanging data with the Torrent Server via the nicely designed RESTful JSON interface.  What I&#8217;d like to show you here is how that data exchange is materializing in the MiniLIMS plugin.</p>
<p>First, I want to show you really quickly how you install the Ion Torrent plugin (assuming you have MiniLIMS installed at /var/www/minilims):</p>
<pre>
$ cd /var/www/minilims/plugins
$ sudo cp ~/Downloads/IonTorrent.tar.gz .
$ tar xzvf IonTorrent.tar.gz
</pre>
<p>That&#8217;s it.  Using the runtime integration capabilities of PHP, the Ion Torrent plugin will be loaded the next time you access a MiniLIMS page.</p>
<p>Our 1.0 plugin release isn&#8217;t particularly glitzy, but it takes advantage of the Torrent Server API to provide some of the key things that our early users have been interested in: planned experiment posting; run and report retrieval; instrument status; and file and quality results delivery.</p>
<p>Planned experiments are a nice facility provided by the Torrent Server that allows you to define a PGM run outside of the tiny console on the instrument itself.  By setting them up in MiniLIMS and posting to the Torrent Server, you can maintain data integrity by selecting predefined Sample and Project records.</p>
<div id="attachment_1716" class="wp-caption aligncenter" style="width: 610px"><a href="http://bioteam.net/wp-content/uploads/2012/02/PGM-Planned-Experiment.png"><img src="http://bioteam.net/wp-content/uploads/2012/02/PGM-Planned-Experiment.png" alt="" title="PGM Planned Experiment" width="600" class="size-full wp-image-1716" /></a><p class="wp-caption-text">A PGM Planned Experiment in MiniLIMS</p></div>
<p>Once saved, the Planned Experiment can be posted to the Torrent Server and, therefore, selected from the console.</p>
<p>As most lab scientists will attest to, the same basic experiment is run repeatedly with just a different sample and/or project.  PGM Planned Experiments can be saved as PGM Experiment Templates that can be reused for common experiment types.  When creating a new planned experiment, just chose a template from the available list and your form will be populated with it&#8217;s values.</p>
<p>Like the Illumina and Roche 454 MiniLIMS plugins, the Ion Torrent offering features a run loader.  The Ion Torrent run loader retrieves Experiments (runs), Results (reports), Quality Metrics and Lib Metrics from the Torrent Server.  As described in the previous postings, the data types closely follow the API arrangement.  Data can either be retrieved via the regular cron job or by using the &#8220;Refresh data&#8221; button on the Torrent Server page.</p>
<div id="attachment_1717" class="wp-caption aligncenter" style="width: 610px"><a href="http://bioteam.net/wp-content/uploads/2012/02/PGM-Result.png"><img src="http://bioteam.net/wp-content/uploads/2012/02/PGM-Result.png" alt="" title="PGM Result" width="600" class="size-full wp-image-1717" /></a><p class="wp-caption-text">Torrent Server analysis result with link back to the Torrent Browser</p></div>
<p>MiniLIMS also provides lab personnel with a quick overview of the state of the instrument run and analysis based on the data from the most recent run.  FTP status of the run and status of the currently running report (if there is one) is shown along with a list of the most recent runs and results.</p>
<div id="attachment_1719" class="wp-caption aligncenter" style="width: 610px"><a href="http://bioteam.net/wp-content/uploads/2012/02/Instrument-overview1.png"><img src="http://bioteam.net/wp-content/uploads/2012/02/Instrument-overview1.png" alt="" title="Instrument overview" width="600" class="size-full wp-image-1719" /></a><p class="wp-caption-text">Instrument overview showing status and recent results</p></div>
<p>End user results delivery is also made simpler by MiniLIMS.  MiniLIMS projects, typically used to group user Samples, now include a summary of the results associated with your project.  The summary has just about everything a discerning scientist would need: links to FASTQ and SFF files (zipped versions), drill-down links to full PGM Experiment and PGM Result pages, the full analysis reports on the Torrent Server and q17 and q20 read numbers.</p>
<div id="attachment_1720" class="wp-caption aligncenter" style="width: 610px"><a href="http://bioteam.net/wp-content/uploads/2012/02/Project-with-results.png"><img src="http://bioteam.net/wp-content/uploads/2012/02/Project-with-results.png" alt="" title="Project with results" width="600" class="size-full wp-image-1720" /></a><p class="wp-caption-text">MiniLIMS Project with PGM results table.  More file links and q17/q20 results are available off page.</p></div>
<p>Remember when looking at these examples of the PGM plugin pages that MiniLIMS is end-user configurable. Though the data types used to supply a table result like the one above are fixed, specific columns can be added or removed, filters and sorting can be applied and new properties can be added to the Project definition to match your lab workflow.</p>
<p>Those are pretty much the key elements of the 1.0 plugin.  We expect to have a couple more releases this year as MiniLIMS grows and we incorporate feedback from customers.  If you&#8217;re going to AGBT, come find us.</p>
]]></content:encoded>
			<wfw:commentRss>http://bioteam.net/2012/02/minilims-ion-torrent-plugin-sneak-peek/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2012 Cloud Training Dates</title>
		<link>http://bioteam.net/2012/01/2012-cloud-training-dates/</link>
		<comments>http://bioteam.net/2012/01/2012-cloud-training-dates/#comments</comments>
		<pubDate>Thu, 26 Jan 2012 22:47:41 +0000</pubDate>
		<dc:creator>chrisdag</dc:creator>
				<category><![CDATA[Training]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[chef]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[cloud training]]></category>
		<category><![CDATA[devops]]></category>
		<category><![CDATA[opscode]]></category>
		<category><![CDATA[opscode chef]]></category>
		<category><![CDATA[orchestration]]></category>
		<category><![CDATA[post-wide]]></category>

		<guid isPermaLink="false">http://bioteam.net/?p=1710</guid>
		<description><![CDATA[Scheduled 2012 dates, times and locations for upcoming cloud and Opscode Chef training classes. ]]></description>
			<content:encoded><![CDATA[<h1>2012 Cloud Training Dates</h1>
<p>In 2012 BioTeam will be offering two different classes &#8211; our popular &#8220;<a href="http://bioteam.net/amazon-cloud-training/">Fundamentals: Amazon Web Services for Science &amp; Engineering</a>&#8221; class along with a new 1-day course on practical systems and cloud orchestration that we are calling &#8220;<a href="http://bioteam.net/amazon-cloud-training/cloud-orchestration-training/">Cloud Orchestration with Opscode Chef</a> &#8221;</p>
<p>Classes, dates and locations are as follows:</p>
<ul>
<li><del>(CANCELLED) Friday March 9, 2012: <strong> Cloud Orchestration</strong> (in conjunction with <a href="http://www.xgencongress.com/">XGen Conference &amp; Expo</a> in San Diego, CA USA)</del></li>
<li>Sunday &amp; Monday April 22-23, 2012 – <strong>AWS for Science &amp; Engineering</strong> (in conjunction with <a href="http://www.bio-itworldexpo.com/">BioITWorld</a> in Boston, MA USA)</li>
<li>April 27, 2012, Friday – <strong>Cloud Orchestration</strong> (in conjunction with <a href="http://www.bio-itworldexpo.com/">BioITWorld</a> in Boston, MA USA)</li>
<li>May 18-19, 2012, Friday &amp; Saturday – <strong>AWS for Science &amp; Engineering</strong> (in conjunction with <a href="http://www.biomarkerworldcongress.com/">Biomarker World Congress</a>, Philadelphia, PA USA)</li>
<li>May 20, 2012, Sunday – <strong>Cloud Orchestration</strong> (in conjunction with <a href="http://www.biomarkerworldcongress.com/">Biomarker World Congress</a>, Philadelphia, PA USA)</li>
<li>June 14-15, 2012 – Thursday – Friday <strong>AWS for Science &amp; Engineering</strong> in San Francisco, CA</li>
<li>September 8-9, 2012 Saturday &amp; Sunday <strong>AWS for Science &amp; Engineering</strong> (in conjunction with <a href="http://www.triconference.com/cloud-computing">MMTC Cloud Conference</a> , San Francisco CA)</li>
<li>September 14, 2012 – Friday – <strong>Cloud Orchestration</strong> (in conjunction with <a href="http://www.triconference.com/cloud-computing">MMTC Cloud Conference</a> , San Francisco CA)</li>
</ul>
<h2>Registration &amp; More Information</h2>
<h3><a href="http://www.healthtech.com/cloud">http://www.healthtech.com/cloud</a></h3>
<p>Our friends at <a href="http://www.healthtech.com/">Cambridge Healthtech Institute</a> do all the hard work with training locations, logistics, advertising, enrollment and management. CHI should be considered the authoritative source for all training information and course details. For general questions not related to a specific scheduled class, feel free to contact <a href="mailto:%22chris@bioteam.net%22">chris@bioteam.net</a>.</p>
<p>CHI&#8217;s primary page for the Amazon training class is <a href="http://www.healthtech.com/cloud">http://www.healthtech.com/cloud</a> and we&#8217;ll update this page if there is a separate course and enrollment page set up for the Chef Orchestration training.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://bioteam.net/2012/01/2012-cloud-training-dates/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adding a coating of civilization to PHP stdclass with the PGMObject base class</title>
		<link>http://bioteam.net/2012/01/adding-a-coating-of-civilization-to-php-stdclass-with-the-pgmobject-base-class/</link>
		<comments>http://bioteam.net/2012/01/adding-a-coating-of-civilization-to-php-stdclass-with-the-pgmobject-base-class/#comments</comments>
		<pubDate>Wed, 25 Jan 2012 16:53:21 +0000</pubDate>
		<dc:creator>aaron</dc:creator>
				<category><![CDATA[Employee Posts]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ion torrent]]></category>
		<category><![CDATA[MiniLIMS]]></category>
		<category><![CDATA[next-gen]]></category>
		<category><![CDATA[ngs]]></category>

		<guid isPermaLink="false">http://bioteam.net/?p=1665</guid>
		<description><![CDATA[Previous posts in this series: Ion Torrent Server API, I’d like to introduce you to the MiniLIMS API The MiniLIMS 4 column table and it’s PHP manifestation, the TypeInstance A quick round of applause for the Ion Torrent Server API Bioinformatics has been notorious for the tension between public, supported access to data and algorithms [...]]]></description>
			<content:encoded><![CDATA[<p>Previous posts in this series: </p>
<ul>
<li><a href="http://bioteam.net/wp-admin/post.php?action=edit&#038;post=1645">Ion Torrent Server API, I’d like to introduce you to the MiniLIMS API</a></li>
<li><a href="/2011/11/the-minilims-4-column-table-and-its-php-manifestation-the-typeinstance/">The MiniLIMS 4 column table and it’s PHP manifestation, the TypeInstance </a></li>
<li><a href="/2011/12/a-quick-round-of-applause-for-the-ion-torrent-server-api/">A quick round of applause for the Ion Torrent Server API</a></li>
</ul>
<p>Bioinformatics has been notorious for the tension between public, supported access to data and algorithms and the often critical need to get under the hood.  The ABI trace file and the Illumina output file system are good examples of data sources in which detailed internal access was necessary, but effective APIs did not exist and controlled, supported access was insufficient.</p>
<p>My approach to the data object portion of the API described below is to try to do some of both.  I think I&#8217;ve found an accommodation of both structured access to the Torrent Server data objects and availability of the rawest form of data.  If you know what you&#8217;re doing and are willing to take responsibility, take the raw data and go nuts.  Otherwise, stick to the more managed parts of the API.  </p>
<p>The Torrent Server RESTful API returns a JSON document that can be easily converted to a stdclass object via <code>json_decode</code>.  If you&#8217;re not familiar with the stdclass, don&#8217;t feel bad; the only real documentation <a href="http://www.webmaster-source.com/2009/08/20/php-stdclass-storing-data-object-instead-array/">comes from third parties</a>.  It&#8217;s easy to understand, though; it&#8217;s what you get when you turn an associative array into an object.  We&#8217;ll use this as the basis for the PHP API.  </p>
<p>Here is an example of the JSON document returned by the <a href="/2011/12/a-quick-round-of-applause-for-the-ion-torrent-server-api/"> previously described Torrent Server API</a>, specifically for an instrument (&#8220;Rig&#8221; in Ion Torrent parlance):<br />
<div id="attachment_1666" class="wp-caption aligncenter" style="width: 610px"><a href="http://bioteam.net/wp-content/uploads/2011/12/Instrument-JSON.png"><img src="http://bioteam.net/wp-content/uploads/2011/12/Instrument-JSON.png" alt="" title="Instrument JSON" width="600" class="size-full wp-image-1666" /></a><p class="wp-caption-text">JSON returned for an Instrument query</p></div><br />
(Like some of the shots from other posts, this is a JSON document dressed up by a Chrome plugin.)  This data structure is typical for API query results. If this document were run through PHPs <code>json_decode</code>, you&#8217;d get a stdclass that would allow you to do the following:</p>
<pre>
    $rigresult = json_decode($jsondoc);
        ...
    $rigresult->meta->limit == 20;
        ...
    $defaultrig = $rigresult->objects[0];
    $defaultrig->name == "default";
</pre>
<p>Easy, eh?  We could probably just take these stdclass objects and convert them to MiniLIMS TypeInstances and we&#8217;d be done before lunch.  </p>
<p>Yeah, you&#8217;re right.  It&#8217;s a little too easy.</p>
<p>As I mentioned above, we&#8217;re going to try to provide some control and structure over the objects pulled from the server.  This will not only help the general consumer of this PHP API, but it will also help the MiniLIMS system more clearly handle changes to the Torrent Server.  Since you can&#8217;t add or change the methods of the stdclass, I&#8217;m going to use a wrapper object and call it PGMObject.  From the PGMObject, more specific subclasses will be derived according to the Torrent Server types.</p>
<p>Before I describe the PGMObject, though, I&#8217;d like to use a subclass as an example of what I&#8217;d want to do.  I&#8217;ll stick with the instrument data type since it&#8217;s relatively small.</p>
<div id="attachment_1668" class="wp-caption aligncenter" style="width: 610px"><a href="http://bioteam.net/wp-content/uploads/2011/12/PGMInstrument.png"><img src="http://bioteam.net/wp-content/uploads/2011/12/PGMInstrument.png" alt="" title="PGM Instrument PHP class" width="600" class="size-full wp-image-1668" /></a><p class="wp-caption-text">PGM Instrument PHP class</p></div>
<p>There are 4 things I&#8217;m trying to accomplish here:</p>
<ol>
<li>PGMInstrument extends PGMObject, the class that will handle all of the common functions</li>
<li>The <code>properties</code> array that is populated in the constructor lists the valid property names for this object so that we can check them.</li>
<li>The <code>required</code> array allows me to check for required fields in the validation method (coming up shortly)</li>
<li>The <code>defaults</code> array allows me to set defaults for a particular field.</li>
</ol>
<p>This really is the essence of the distinction between one PGM object and another- a list of properties and the characteristics of those properties.  How those properties and their characteristics are used can be defined in the base class for the most part by iterating through these arrays.</p>
<p>Below is a screenshot of the PGMObject interface (a collapsed object view from an Eclipse editor window).<br />
<div id="attachment_1701" class="wp-caption aligncenter" style="width: 610px"><a href="http://bioteam.net/wp-content/uploads/2012/01/PGMObject-interface.png"><img src="http://bioteam.net/wp-content/uploads/2012/01/PGMObject-interface.png" alt="" title="PGMObject interface" width="600" class="size-full wp-image-1701" /></a><p class="wp-caption-text">PGMObject interface (collapsed object view in Eclipse)</p></div></p>
<p>First, I want to point out the constructor and the <code>getJson/setJson</code> methods.  If you use the TorrentServer object (we&#8217;ll see that one soon) to retrieve a PGMObject from your Torrent Server instance, you can just grab the JSON document and do with it as you will.  More often than not the object representations will be very handy, but, if you need low level access, it&#8217;s yours.</p>
<p>This JSON document represents a single one of the objects returned by the Torrent Server.  A URL query typically returns an array of matching objects along with a <code>{meta}</code> document that can be used to support paging. The document maintained by these objects is a single data object with no associated meta.</p>
<p>If you don&#8217;t want to work with the raw JSON, you have two choices for interacting with the data values; either <code>getPropertyValue/setPropertyValue</code> or getters and setters for the individual properties.</p>
<p>The <code>getPropertyValue/setPropertyValue</code> method works just like the MiniLIMS methods of the same name; a property name and value are passed for <code>setPropertyValue</code> and just a property name for <code>getPropertyValue</code>.  These are really handy for treating PGMObject subclasses generically and, particularly, for iterating through the full property list.  If you wanted to write an HTML table you could do this:</p>
<pre>
$id  = "5";                           //An experiment id from the Torrent Server
$exp = $tserver->getExperiment($id);  //$tserver is a TorrentServer object

$html   = "&lt;table&gt;&lt;tr&gt;&lt;th&gt;Property&lt;/th&gt;&lt;th&gt;Value&lt;/th&gt;&lt;/tr&gt;\n";
foreach($exp->getProperties() as $prop){
  $html .= "&lt;tr&gt;";
  $html .= "&lt;td&gt;" . $prop . "</td&gt;";
  $html .= "&lt;td&gt;" . $exp->getPropertyValue($property) . "&lt;/td&gt;";
  $html .= "&lt;/tr&gt;\n";
}
$html  .= "&lt;/table&gt;\n";
</pre>
<p>Property-specific getters and setters are nice to have for data objects like these.  Popularized by Java, get/set methods for accessing object members allows for controlled access, but can be incredibly tedious to write for the most common case of simply getting or setting the attribute.  The <code>__call</code> function is a special PHP object method that is called when an undefined function is called on an object.  By having this function look for getters and setters that match the set of valid properties for the PGMObject, we can write one chunk of code to handle all of the routine get/set calls.  Of course, if you want to do any special handling in a getter or setter (e.g. make something a computed value), you can define that function for your PGMObject subclass; if the method is explicitly defined, the <code>__call</code> function won&#8217;t get called.   </p>
<p>Here is a chunk of <code>__call</code> where the parameter <code>$name</code> is the name of the function being called and <code>$arguments</code> is the array of argument names and values:</p>
<pre>
  public function __call($name,$arguments){
    if (!isset($this->properties)){
      throw new Exception("PGMObject cannot function without a properties list");
    }
    $matches = array();
    if (preg_match('/^get(.*)/',$name,$matches)){
      $prop = lcfirst($matches[1]);
      if (in_array($prop,$this->properties)){
        if (!isset($this->object)){
          if (isset($this->json)){
            $this->parseJson();
          }
          else {
            return "";
          }
        }
        return $this->object->$prop;
      }
    }
...
}
</pre>
<p>that allows you to do this:</p>
<pre>
$id  = "5";                           //An experiment id from the Torrent Server
$exp = $tserver->getExperiment($id);  //$tserver is a TorrentServer object

$chiptype   = $exp->getChipType();
</pre>
<p>without explicitly defining the <code>getChipType()</code> method.</p>
<p>The final &#8220;value-add&#8221; that we place on top of the PGMObject is the <code>isValid()</code> method.  This is primarily to support objects that are being pushed to the Torrent Server (like a PlannedExperiment object).  In the base class, this function goes through the <code>$required</code> array and makes sure that all of the properties listed have a value.  If they do not, the method returns a null value and stores a message in the <code>$validationErrors</code> array.</p>
<p>This snippet shows how to use it:</p>
<pre>
$pexp = new PlannedExperiment();
$pexp->setId("5");
$pexp->setSample("Fish blood");
$pexp->setPlanPGM("default");
if (!$pexp->isValid()){
  print "Planned experiment is not valid for the following reason(s):&lt;p/&gt;\n";
  print implode("&lt;p/&gt;",$pexp->getValidationErrors());
}
else {
  $tserver->putPlannedExperiment($pexp);
}
</pre>
<p>Long-winded though this was, I hope the essential point is clear.  I&#8217;ve tried to accommodate both raw(ish) access to the Torrent Server data objects and an object-oriented structure that can support controlled access, while at the same time minimizing the amount of routine coding.</p>
<p>In the next post, we&#8217;ll examine the TorrentServer class, whose purpose is to provide access to a Torrent Server, much like a traditional database object broker.</p>
]]></content:encoded>
			<wfw:commentRss>http://bioteam.net/2012/01/adding-a-coating-of-civilization-to-php-stdclass-with-the-pgmobject-base-class/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Inside the Box &#8211; Jan 2012</title>
		<link>http://bioteam.net/2012/01/inside-the-box-jan-2012/</link>
		<comments>http://bioteam.net/2012/01/inside-the-box-jan-2012/#comments</comments>
		<pubDate>Mon, 23 Jan 2012 19:58:43 +0000</pubDate>
		<dc:creator>aaron</dc:creator>
				<category><![CDATA[Employee Posts]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Publications]]></category>
		<category><![CDATA[featured]]></category>

		<guid isPermaLink="false">http://bioteam.net/?p=1695</guid>
		<description><![CDATA[The Unstable Equilibrium of the Bioinformatics Org Chart]]></description>
			<content:encoded><![CDATA[<p>BioTeam continues it&#8217;s &#8220;Inside the Box&#8221; column for BioITWorld magazine, this month we have Aaron Kitzmiller on &#8220;<em><strong>The Unstable Equilibrium of the Bioinformatics Org Char</strong></em>t&#8221;</p>
<p>Excerpt:<em><strong></strong></em></p>
<blockquote><p><em><strong><span style="font-family: Verdana; font-size: x-small;">In most organizations, the human resources of bioinformatics are a regular source of tension. Unless you’re particularly lucky, you can be plagued by politics, illogical decision making, disappointment, and low productivity. While you can have these problems in a properly-balanced organization, there are certain org charts in which they are endemic.  </span></strong></em></p></blockquote>
<p>The full article can be read at it&#8217;s online home:</p>
<blockquote><p><a title="The Unstable Equilibrium of the Bioinformatics Org Chart" href="http://www.bio-itworld.com/issues/2012/jan/unstable-equilibrium-bioinformatics-org-chart.html">http://www.bio-itworld.com/issues/2012/jan/unstable-equilibrium-bioinformatics-org-chart.html </a></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://bioteam.net/2012/01/inside-the-box-jan-2012/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Building Open Grid Scheduler on CentOS/RHEL 6.2</title>
		<link>http://bioteam.net/2012/01/building-open-grid-scheduler-on-centos-rhel-6-2/</link>
		<comments>http://bioteam.net/2012/01/building-open-grid-scheduler-on-centos-rhel-6-2/#comments</comments>
		<pubDate>Thu, 12 Jan 2012 15:48:23 +0000</pubDate>
		<dc:creator>chrisdag</dc:creator>
				<category><![CDATA[Employee Posts]]></category>
		<category><![CDATA[Tech Notes]]></category>
		<category><![CDATA[post-wide]]></category>

		<guid isPermaLink="false">http://bioteam.net/?p=1690</guid>
		<description><![CDATA[How to build Grid Engine 2011.11 from source on 64bit CentOS/RHEL 6.x based systems. ]]></description>
			<content:encoded><![CDATA[<h3>Contents</h3>
<p><div class="toc"><div class="toc_list"><ul><li class="toc_item"><a href="#toc-background-disclaimer">Background & Disclaimer</a></li><li class="toc_item"><a href="#toc-skipped-build-items">Skipped Build Items</a></li><li class="toc_item"><a href="#toc-differences-between-6-2-and-prior-versions-of-centos-and-rhel">Differences between 6.2 and prior versions of CentOS and RHEL</a></li><li class="toc_item"><a href="#toc-build-environment">Build Environment</a></li><li class="toc_item"><a href="#toc-required-linux-os-packages">Required Linux OS Packages</a></li><li class="toc_item"><a href="#toc-download-open-grid-scheduler-2011-11">Download Open Grid Scheduler 2011.11</a></li><li class="toc_item"><a href="#toc-download-install-external-dependencies">Download & Install External Dependencies</a></li><li class="toc_item"><a href="#toc-izpack-1-4-4">IzPack 1.4.4</a></li><li class="toc_item"><a href="#toc-patch-grid-engine-2011-11-source-to-support-openssl-1-0-0">Patch Grid Engine 2011.11 Source to support OpenSSL-1.0.0</a></li><li class="toc_item"><a href="#toc-customize-the-aimk-site-file">Customize the aimk.site file</a></li><li class="toc_item"><a href="#toc-customize-the-build-properties-file">Customize the build.properties file</a></li><li class="toc_item"><a href="#toc-"></a></li><li class="toc_item"><a href="#toc-customize-the-clientsgui-installernbprojectproject-properties-file">Customize the ./clients/gui-installer/nbproject/project.properties file</a></li><li class="toc_item"><a href="#toc-hack-up-the-aimk-build-file">Hack up the aimk build file</a></li><li class="toc_item"><a href="#toc-build-grid-engine-from-source">Build Grid Engine from Source</a></li><li class="toc_item"><a href="#toc-"></a></li><li class="toc_item"><a href="#toc-hack-up-the-scriptsdistinst-binary-staging-script">Hack up the scripts/distinst binary staging script</a></li><li class="toc_item"><a href="#toc-edit-the-scriptsdistinst-site-configuration-file">Edit the scripts/distinst.site configuration file</a></li><li class="toc_item"><a href="#toc-stage-the-distribution-binaries-by-running-the-scriptsdistinst-script">Stage the distribution binaries by running the scripts/distinst script</a></li><li class="toc_item"><a href="#toc-build-grid-engine-binary-distribution-archives">Build Grid Engine binary distribution archives</a></li><li class="toc_item"><a href="#toc-check-tmpsge6_dist-for-the-new-archives">Check /tmp/sge6_dist/ for the new archives</a></li></ul></div></div> </p>
<h2>Background &amp; Disclaimer</h2>
<p>This blog page attempts to clean up and organize the scattered notes I maintain on how to build Grid Engine on various platforms. This post in particular is talking about <a href="http://gridscheduler.sourceforge.net/">Open Grid Schedule</a>r version 2011.11 as built on CentOS 6.2 (a binary clone of RedHat Enterprise Linux RHEL 6.2).</p>
<p>First round of notes will cover building on x86-64 but I&#8217;ll also try to document the same process for building 32bit executables as well.</p>
<p>Another reason for this document is that many of the online instructions for building Grid Engine take the &#8220;easy&#8221; way out by skipping the compilation of various features, services and subsystems. In particular I don&#8217;t like refusing to compile with Java just because it&#8217;s easier and I actually like having the java-based GUI installer present on my systems.</p>
<h2>Skipped Build Items<a name="toc-skipped-build-items" style="text-decoration: none;">&nbsp;&nbsp;</a></h2>
<p>The primary goal is to build as much of Grid Engine as possible. At this stage, the only things we are skipping are:<br />
•    ARCo<br />
•    sgeinspect binary<br />
•    Hadoop/Herd integration</p>
<p>Every other feature, service and 3rd party executable should be covered.</p>
<h2>Differences between 6.2 and prior versions of CentOS and RHEL<a name="toc-differences-between-6-2-and-prior-versions-of-centos-and-rhel" style="text-decoration: none;">&nbsp;&nbsp;</a></h2>
<p>The primary difference is that our 6.2 OS includes an updated version of OpenSSL that breaks Grid Engine compilation. This document covers the patch necessary to complete the build on RHEL 6.2 and CentOS 6.2.</p>
<h2>Build Environment<a name="toc-build-environment" style="text-decoration: none;">&nbsp;&nbsp;</a></h2>
<p>Unless stated otherwise, assume that the build environment is a bare-bones CentOS 6.2 machine where I&#8217;ll be building SGE as user &#8220;root&#8221; and installing many of the external dependencies into /opt/</p>
<h2>Required Linux OS Packages<a name="toc-required-linux-os-packages" style="text-decoration: none;">&nbsp;&nbsp;</a></h2>
<p>I started with a stripped down bare-bones CentOS 6.2 VM and had to install the following distro packages. I can&#8217;t claim 100% that these are all the RPMs you will need but it&#8217;s probably fairly comprehensive:</p>
<pre>$ sudo yum -y install "openmotif openmotif-devel openmotif22 openssl-devel openssl-static make gcc \
autoconf pam-devel libXpm  libXpm-devel ncurses ncurses-devel unzip texinfo"</pre>
<h2>Download Open Grid Scheduler 2011.11<a name="toc-download-open-grid-scheduler-2011-11" style="text-decoration: none;">&nbsp;&nbsp;</a></h2>
<p>From the website:<em> The 2011.11 release includes new features (e.g. Berkeley DB spooling improvement: removed dependency on NFSv4, <a href="http://gridscheduler.sourceforge.net/projects/hwloc/GridEnginehwloc.html">hwloc support</a>, GPU integration, ARM Linux port, gmake upgrade, Linux 3.0 support, etc), together with other enhancements and bug fixes.</em></p>
<p><em>See the <a href="http://gridscheduler.sourceforge.net/Releases/ReleaseNotesGE2011.11.pdf">release notes</a> for more info!</em></p>
<pre># mkdir /opt/opengridscheduler-src
# cd /opt/opengridscheduler-src
# wget http://sourceforge.net/projects/gridscheduler/files/GE2011.11/GE2011.11.tar.gz/download?use_mirror=superb-sea2
# zcat GE2011.11.tar.gz | tar xvf -</pre>
<h2>Download &amp; Install External Dependencies</h2>
<p>There are a ton of them. Have patience.</p>
<h4>Java, $JAVA_HOME and $PATH alterations</h4>
<p>Visit <a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">http://www.oracle.com/technetwork/java/javase/downloads/index.html</a> and grab a Java JDK. I used JDK 7u2 for x86-64 and selected the .tar.gz version for download.</p>
<pre># cd /opt/
# gunzip jdk-7u2-linux-x64.tar.gz
# tar xvf jdk-7u2-linux-x64.tar
# ln -s jdk1.7.0_02/ java</pre>
<p>By making a symbolic link between /opt/jdk1.7.0_02 and /opt/java we can more easily set $JAVA_HOME to something convenient like &#8220;$JAVA_HOME=/opt/java&#8221;.</p>
<p>We need to set some environment variables and PATH settings next. I chose to do this by making an <strong>/etc/profile.d/sge-build.sh</strong> entry with the following contents. How you set your path and environment variables depends on your personal preference and what shell you use. Note that the sge-build.sh file also includes info about Java ANT  and JUNIT .jar files that will be installed later on.</p>
<blockquote>
<pre>## Java
export JAVA_HOME=/opt/java
export ANT_HOME=/opt/ant
export CLASSPATH=/opt/junit/junit3.8.1/junit.jar:/opt/ant/lib/ant.jar
export JUNIT_JAR=/opt/junit/junit3.8.1/junit.jar

 ## Path Tweaking
export PATH=$PATH:$JAVA_HOME/bin:$ANT_HOME/bin</pre>
</blockquote>
<h4>ANT</h4>
<p>Visit <a href="http://ant.apache.org/index.html">http://ant.apache.org/index.html</a> and grab Apache Ant. The version used in this document is 1.8.2.</p>
<pre># cd /opt/
# gunzip apache-ant-1.8.2-bin.tar.gz
# tar xvf apache-ant-1.8.2-bin.tar
# ln -s apache-ant-1.8.2 ant</pre>
<h4>JUNIT</h4>
<p>This is another dependency of the various Java bits within Grid Engine, in this case I&#8217;m using junit-3.8.1:</p>
<pre># cd /opt/
# mkdir junit
# cd /opt/junit/
# wget http://downloads.sourceforge.net/project/junit/junit/3.8.1/junit3.8.1.zip?use_mirror=superb-sea2
# unzip junit3.8.1.zip</pre>
<p>We will need to reference the location of junit.jar in CLASSPATH and a few other locations, those are documented elsewhere on this page.</p>
<h4>JavaCC</h4>
<p>This is another dependency of the various Java bits within Grid Engine, this time from <a href="http://javacc.java.net/">http://javacc.java.net/</a>:</p>
<pre># cd /opt/
# mkdir other-sge-deps
# mkdir other-sge-deps/java
# cd /opt/other-sge-deps/java/
# wget http://java.net/projects/javacc/downloads/download/javacc-5.0.tar.gz
# gunzip javacc-5.0.tar.gz
# tar xvf javacc-5.0.tar</pre>
<p>The configuration parameters that point to javacc are documented elsewhere on this page, the primary setting is within the build.properties file in the source directory.</p>
<h2>IzPack 1.4.4<a name="toc-izpack-1-4-4" style="text-decoration: none;">&nbsp;&nbsp;</a></h2>
<p>We need <a href="http://izpack.org/">IZpack</a> which is apparently a nice cross-platform Java tool for bundling application installers. I think,  but am not 100% sure, that this dependency is required to build the graphical SGE GUI installer.</p>
<p>There is one small problem though. My working build environment seems to explicitly use an ancient version of IzPack that is not even available for download any more on the <a href="http://izpack.org/downloads/">http://izpack.org/downloads/</a> website. Given that my build environment works with version 1.4.4 and I seem to also have much more modern versions laying around in &#8220;_disabled/&#8221; folders I&#8217;m guessing that SGE has a dependency on this specific (and old) version.</p>
<p>For convenience  I&#8217;ve uploaded version 1.4.4 here for others to use if needed:  <a href="http://bioteam.net/wp-content/uploads/misc/Izpack-1.4.4.tar.gz">http://bioteam.net/wp-content/uploads/misc/Izpack-1.4.4.tar.gz</a></p>
<pre># cd /opt/
# wget  <a href="http://bioteam.net/wp-content/uploads/misc/Izpack-1.4.4.tar.gz">http://bioteam.net/wp-content/uploads/misc/Izpack-1.4.4.tar.gz</a>
# gunzip Izpack-1.4.4.tar.gz
# tar xvf Izpack-1.4.4.tar</pre>
<p>The specific places where we mention the Izpack location in the SGE build &amp; config files is highlighted elsewhere on this page.</p>
<h4>BerkeleyDB version 4.4.20</h4>
<p>It&#8217;s actually important to use this (old) version of BerkeleyDB. It&#8217;s the last version that supports RPC spooling to a remote BDB database and the SGE build process assumes that this functionality is present. In addition, there have been some indications on the mailing list that internal use of BDB for berkeley-db based spooling also assumes behavior and technical features associated with the older versions of the code.</p>
<p>Visit <a href="http://www.oracle.com/technetwork/database/berkeleydb/downloads/index.html">http://www.oracle.com/technetwork/database/berkeleydb/downloads/index.html</a> and follow the link to &#8220;Previous Releases&#8221; where you can find the 4.4.20 version.</p>
<p>You will see below that we are building with &#8220;&#8211;enable-rpc&#8221; and installing into /opt/berkeley-db/ which is where the BDB bin/ and lib/ directories will end up.</p>
<pre># mkdir /opt/berkeley-db
# mv db-4.4.20.tar.gz berkeley-db/
# cd berkeley-db/
# gunzip -c db-4.4.20.tar.gz | tar xvf -
# cd db-4.4.20
# cd build_unix
# ../dist/configure --prefix=/opt/berkeley-db/ --enable-rpc
# make
# make install</pre>
<h2>Patch Grid Engine 2011.11 Source to support OpenSSL-1.0.0<a name="toc-patch-grid-engine-2011-11-source-to-support-openssl-1-0-0" style="text-decoration: none;">&nbsp;&nbsp;</a></h2>
<p>If you see this error, you are hitting an issue with openssl-1.0 on your system:</p>
<p><a href="http://bioteam.net/wp-content/uploads/2012/01/ssl-error.png"><img class="size-medium wp-image-1692 alignnone" title="ssl-error" src="http://bioteam.net/wp-content/uploads/2012/01/ssl-error-300x138.png" alt="" width="300" height="138" /></a></p>
<p>You can see the bug report and patch at this URL: <a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=622849"> http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=622849</a> and you can download the actual patch via this URL:  <a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?msg=10;filename=622849-openssl.patch;att=1;bug=622849">http://bugs.debian.org/cgi-bin/bugreport.cgi?msg=10;filename=622849-openssl.patch;att=1;bug=622849</a></p>
<p>Place the patch file one level above the GE2011.11 source/ folder:</p>
<pre>[root@grunt GE2011.11]# ls -l
total 1140
-rw-r--r--.  1 root root    6763 Jan 12 14:38 <strong>622849-openssl.patch</strong>
-rw-rw-r--.  1 dag  dag     5403 Nov 14 14:01 Changelog
-rw-rw-r--.  1 dag  dag  1121679 Nov 14 14:01 Changelog.SGE
drwxrwxr-x.  7 dag  dag     4096 Nov 14 14:02 doc
drwxrwxr-x.  2 dag  dag    20480 Nov 14 14:02 review
drwxrwxr-x. 12 dag  dag     4096 Jan 12 14:30 source</pre>
<p>Now patch the actual <strong>./source/libs/comm/cl_ssl_framework.c</strong> file &#8230;</p>
<pre>[root@grunt GE2011.11]#  patch -p1 &lt; 622849-openssl.patch
patching file source/libs/comm/cl_ssl_framework.c
[root@grunt GE2011.11]#</pre>
<p>&nbsp;</p>
<h2>Customize the aimk.site file<a name="toc-customize-the-aimk-site-file" style="text-decoration: none;">&nbsp;&nbsp;</a></h2>
<p>The local file <strong>aimk.site</strong> file contains site-specific information about where your external dependencies are installed.</p>
<p>My current aimk.site has the following customizations (note that the info below is not the entire file, just the lines that I have added or changed..</p>
<p><strong>Berkely-DB settings in aimk.site:</strong></p>
<blockquote>
<pre># BERKELEYDB_HOME the directory where the include and lib directory of
# Berkeley DB is installed
#
set BERKELEYDB_HOME = /opt/berkeley-db/
set BDB_INCLUDE_SUBDIR =
set BDB_LIB_SUBDIR =
set BDB_LIB_SUFFIX =</pre>
</blockquote>
<p><strong>OpenSSL settings in aimk.site:</strong></p>
<blockquote>
<pre>## dag (set values for openssl libs and include files)
set OPENSSL_SOVERSION = 1.0.0-10
set OPENSSL_HOME = /usr
set OPENSSL_LIB_DIR = /usr/lib64
set OPENSSL_EXTRA_LIBS = "-lkrb5 -lz "<strong></strong></pre>
</blockquote>
<p><strong>JUNIT settings in aimk.site:</strong></p>
<blockquote>
<pre>set JUNIT_JAR = '/opt/junit/junit3.8.1/junit.jar'</pre>
</blockquote>
<h2>Customize the build.properties file<a name="toc-customize-the-build-properties-file" style="text-decoration: none;">&nbsp;&nbsp;</a></h2>
<p>This file is where we set parameters related to the building of the java componants</p>
<p><strong>JUNIT</strong> edits:</p>
<blockquote>
<pre># junit jar file classpath
libs.junit.classpath=/opt/junit/junit3.8.1/junit.jar</pre>
</blockquote>
<p><strong>JavaCC</strong> edits:</p>
<blockquote>
<pre>javacc.home=/opt/other-sge-deps/java/javacc-5.0</pre>
</blockquote>
<h2></h2>
<h2>Customize the ./clients/gui-installer/nbproject/project.properties file<a name="toc-customize-the-clientsgui-installernbprojectproject-properties-file" style="text-decoration: none;">&nbsp;&nbsp;</a></h2>
<p>Yeah there is probably a better or cleaner way to do this but I found I had to edit the clients/gui-installer/nbproject/project.properties file in order to fix some issues with finding a certain iZpack/ant.jar file and the Java SWING layout stuff. Here are my changes</p>
<p><strong>SWING</strong> edits in project.properties:</p>
<blockquote>
<pre>#Swing layout
#libs.swing-layout.classpath=${izpack.home}/../swing-layout-1.0.3.jar
libs.swing-layout.classpath=${izpack.home}/swing-layout-1.0.3.jar</pre>
</blockquote>
<p><strong>ANT</strong> edits in project.properties:</p>
<blockquote>
<pre>#Ant
#libs.ant.classpath=${izpack.home}/../ant.jar
libs.ant.classpath=/opt/Izpack-1.4.4/ant.jar</pre>
</blockquote>
<h2>Hack up the aimk build file<a name="toc-hack-up-the-aimk-build-file" style="text-decoration: none;">&nbsp;&nbsp;</a></h2>
<p><strong>Note</strong>: We are really not supposed to be doing this but it&#8217;s rare that I&#8217;m able to get through an SGE build without making minor alterations to the actual &#8220;aimk&#8221; compile script. This is where we can also get into personal preferences about how to build software so your own experience may be different,</p>
<p>Here are my edits&#8230;</p>
<p>I&#8217;m pretty sure this edit is meant to get around the fact that our libcrypto OpenSSL files are in &#8220;/usr/lib64&#8243; instead of &#8220;/usr/lib&#8221; and the KFLAGS additions are meant to proactively avoid a new and different compile error that I forgot to document in my notes &#8230;</p>
<p><strong>Near line #370 in ./aimk:</strong></p>
<blockquote>
<pre>#set SECLIBS_STATIC    = "$OPENSSL_HOME/lib/libssl.a $OPENSSL_HOME/lib/libcrypto.a"                                                     
#set KLFLAGS           = "-L$OPENSSL_HOME/lib"                                                                                          
set SECLIBS_STATIC    = "$OPENSSL_HOME/lib64/libssl.a $OPENSSL_HOME/lib64/libcrypto.a"
set KLFLAGS           = "-L$OPENSSL_HOME/lib64 -lkrb5 -lz"</pre>
</blockquote>
<p>This next edit I believe is required to let the &#8216;qtcsh&#8217; binary build properly, it complains unless we add &#8220;-ltermcap&#8221; &#8230;</p>
<p><strong>Near line #3043 in ./aimk:</strong></p>
<blockquote>
<pre># Dag hack for qtcsh on CentOS 6.2 ...                                                                                                                      
# set SGE_LIBS = "-lsge -lpthread"                                                                                                                        
set SGE_LIBS = "-lsge -lpthread -ltermcap"</pre>
</blockquote>
<h2>Build Grid Engine from Source<a name="toc-build-grid-engine-from-source" style="text-decoration: none;">&nbsp;&nbsp;</a></h2>
<p>Whew! Now that all the pre-requisites, patching and hacking is done Grid Engine should ideally build smoothly from scratch at this point.</p>
<p>Refer to the README.build and README.aimk text files if needed. The commands that follow are taken straight from the build docs.</p>
<h4> Prepwork</h4>
<blockquote><p># ./aimk -only-depend<br />
# scripts/zerodepend<br />
# ./aimk depend</p></blockquote>
<h4> Build binaries &amp; manpages</h4>
<blockquote><p># ./aimk<br />
# ./aimk -man</p></blockquote>
<h2></h2>
<h2>Hack up the scripts/distinst binary staging script<a name="toc-hack-up-the-scriptsdistinst-binary-staging-script" style="text-decoration: none;">&nbsp;&nbsp;</a></h2>
<p>The &#8220;distinst&#8221; script is used to stage the newly built binaries into a location where the &#8220;mk_dist&#8221; script can finally start building .tar.gz archives for distribution. We need to make a few edits to it first &#8230;</p>
<h4>Edit Line #718 of scripts/distinst &amp; set insthadoop=false to prevent failure due to missing &#8220;herd.jar&#8221;:</h4>
<blockquote>
<pre>insthadoop=false</pre>
</blockquote>
<h4>Edit near line #1551 to fix location of the libcrypto.so.1.0.0 file (it&#8217;s looking in lib/ instead of lib64/ )</h4>
<p><em>Note the two separate edits where we make changes from &#8220;lib&#8221; to &#8220;lib64/&#8221; below &#8230;</em></p>
<blockquote>
<pre>  elif [ -f $OPENSSLBASE/<strong>lib64</strong>/$libname ]; then
    #libname=$OPENSSLBASE/lib/$libname                                                                                                        
    libname=$OPENSSLBASE/<strong>lib64</strong>/$libname
  fi</pre>
</blockquote>
<h2>Edit the scripts/distinst.site configuration file<a name="toc-edit-the-scriptsdistinst-site-configuration-file" style="text-decoration: none;">&nbsp;&nbsp;</a></h2>
<p>We need to configure some values here to fix some OpenSSL and Berkeley-DB values.</p>
<blockquote>
<pre># Base directory where the openssl binary and libraries reside
OPENSSLSOVERSION=1.0.0
OPENSSLBASE=/usr/

# Base directory where BDB resides
BERKELEYDBBASE=/opt/berkeley-db/</pre>
</blockquote>
<h2>Stage the distribution binaries by running the scripts/distinst script<a name="toc-stage-the-distribution-binaries-by-running-the-scriptsdistinst-script" style="text-decoration: none;">&nbsp;&nbsp;</a></h2>
<p>I decided my staging location was going to be &#8220;/opt/opengridscheduler-src/distinst-base/&#8221; so first we do:</p>
<pre># mkdir /opt/opengridscheduler-src/distinst-base/</pre>
<p>And now we can actually run the distribution staging script!</p>
<pre># ./scripts/distinst -v -allall -bin -libs -basedir /opt/opengridscheduler-src/distinst-base/ -vdir GE2011.11</pre>
<p>&nbsp;</p>
<h2>Build Grid Engine binary distribution archives<a name="toc-build-grid-engine-binary-distribution-archives" style="text-decoration: none;">&nbsp;&nbsp;</a></h2>
<p>Now we can actually build distributable Grid Engine archives. The documentation recommends a symbolic link be placed inside your distinst &#8220;basedir&#8221; that points back to the &#8220;mk_dist&#8221; script:</p>
<pre># ln -s /opt/opengridscheduler-src/GE2011.11/source/scripts/mk_dist /opt/opengridscheduler-src/distinst-base/mk_dist</pre>
<pre># cd /opt/opengridscheduler-src/distinst-base</pre>
<pre>And now we can actually run the command:</pre>
<pre># ./mk_dist -vdir GE2011.11 -version GE2011.11 -common -doc -bin linux-x64</pre>
<h2>Check /tmp/sge6_dist/ for the new archives<a name="toc-check-tmpsge6_dist-for-the-new-archives" style="text-decoration: none;">&nbsp;&nbsp;</a></h2>
<p>Never had time to track down, change or care about this but by default it seems that &#8220;mk_dist&#8221; is placing our new binaries into /tmp/sge6_dist/ &#8230;</p>
<p>If things actually worked you should see something like this:</p>
<blockquote>
<pre>[root@grunt distinst-base]# ls -l /tmp/sge6_dist/
total 30384
-rw-r--r--. 1 root root 28162103 Jan 12 17:31 ge-GE2011.11-bin-linux-x64.tar.gz
-rw-r--r--. 1 root root  2946660 Jan 12 17:31 ge-GE2011.11-common.tar.gz
[root@grunt distinst-base]#
[root@grunt distinst-base]#</pre>
</blockquote>
<p>&#8230; and these are the standard &#8220;courtesy binary&#8221; archives that many of us are long familiar with.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://bioteam.net/2012/01/building-open-grid-scheduler-on-centos-rhel-6-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Smart Storage</title>
		<link>http://bioteam.net/2012/01/minilims-as-droboapp/</link>
		<comments>http://bioteam.net/2012/01/minilims-as-droboapp/#comments</comments>
		<pubDate>Fri, 06 Jan 2012 14:01:34 +0000</pubDate>
		<dc:creator>chrisdag</dc:creator>
				<category><![CDATA[Employee Posts]]></category>
		<category><![CDATA[Tech Notes]]></category>
		<category><![CDATA[drobo]]></category>
		<category><![CDATA[lims]]></category>
		<category><![CDATA[MiniLIMS]]></category>
		<category><![CDATA[ngs]]></category>
		<category><![CDATA[post-wide]]></category>

		<guid isPermaLink="false">http://bioteam.net/?p=1673</guid>
		<description><![CDATA[BioTeam highlights scientific LIMS software running inside a storage array appliance. ]]></description>
			<content:encoded><![CDATA[<h2>Running scientific data management software directly on a storage appliance</h2>
<p>The first picture shows a couple of <a href="http://www.drobo.com/">Drobo</a> storage arrays. The second image is a screen capture showing BioTeam running it&#8217;s own <a href="http://bioteam.net/minilims/">MiniLIMS product</a> as an <em><strong>embedded application hosted directly inside</strong></em> the Drobo storage array. Cool huh?</p>
<p>The idea that an inexpensive and super easy-to-use storage appliance can easily be made to natively host scientific data management software is pretty fascinating. There are a ton of high-end storage solutions for large-scale genome platforms but you don&#8217;t hear a lot buzz about small, simple and clever things targeted at single researchers or single instruments.</p>
<h3><a href="http://bioteam.net/wp-content/uploads/2012/01/drobo-with-logo-540x250-feat1.jpg"><img class="aligncenter size-full wp-image-1686" title="drobo-with-logo-540x250-feat" src="http://bioteam.net/wp-content/uploads/2012/01/drobo-with-logo-540x250-feat1.jpg" alt="" width="540" height="250" /></a></h3>
<p><a href="http://bioteam.net/wp-content/uploads/2012/01/partial-screencap2.png"><img class="aligncenter size-full wp-image-1689" title="partial-screencap2" src="http://bioteam.net/wp-content/uploads/2012/01/partial-screencap2.png" alt="" width="588" height="632" /></a></p>
<h2>Disclaimer</h2>
<p>This blog post is intended simply to highlight something cool that we were able to do while hacking and experimenting on our own time. The freedom to fool around with stuff like this is one of the reasons I love coming to work every day.</p>
<p>Just to be clear:</p>
<ul>
<li>This is not a product</li>
<li>This is not officially sanctioned or supported by anyone</li>
<li>It&#8217;s a neat proof of concept, nothing more.</li>
</ul>
<h2></h2>
<h2>Meh. Whats the big deal?</h2>
<p>Storage systems have been adding internal horsepower rapidly for years now. This internal power is necessary to run additional services and features such as encryption, replication and data-deduplication etc. that the market has been demanding.</p>
<p>That&#8217;s old news. It&#8217;s also nothing new to learn that storage vendors have often been obtaining this performance by leveraging the commoditization wave seen with standard  server technologies and chipsets. Sure they still differentiate themselves &amp; juice their core storage engines with proprietary engineering, silicon and hardware but more and more of them are running core functions on standard tech that IT pros are well familiar with.</p>
<p>As the price/performance of mass-market server technology increases it becomes easier and easier to put &#8220;more power&#8221; into infrastructure items like network switches and storage arrays.</p>
<p>In addition to the increasing use of mass-market hardware inside these devices, more and more of them are running internal operating systems that are either 100% Linux or very &#8220;unix-like&#8221; inside.  Anyone who has been root on an <a href="http://www.isilon.com">Isilon</a> cluster or <a href="http://www.panasas.com">Panasas</a> storage brick will have seen this first-hand.</p>
<p>Once you have hardware CPU cycles to spare and an internal OS that can pretty easily run common development tools, libraries and applications the next logical question becomes &#8220;what other software can I run directly inside this environment?&#8221;.</p>
<p>This, also, is not anything new. My first experience with this a few years back was seeing how Isilon embedded software from <a href="http://www.asperasoft.com/">Aspera </a>into their arrays so that their broadcast media clients could more easily sling HD video streams around the world.</p>
<p>&nbsp;</p>
<h2>Ok, so why the blog post?</h2>
<h4>Because <em>Appliance</em>!</h4>
<p>Getting MiniLIMs to run as an application inside a Drobo storage array is cool and worthy of a minor blog writeup for the following reasons:</p>
<ul>
<ul>
<li>Several vendors have &#8220;application aware&#8221; infrastructure &amp; datacenter products but these are often targeted at big enterprises and for support/profit reasons they are often locked down to hosting only a certain set of software products. It&#8217;s hard to wedge your &#8220;own stuff&#8221; into these platforms</li>
</ul>
</ul>
<ul>
<li>DIY &amp; rackmount Linux storage servers can easily handle this use case (for instance our <a href="http://bioteam.net/2011/08/backblaze-storage-pod/">120TB Backblaze Pod</a>) and there are tons of other options out there for people who want to build real servers that can both run applications and internally provide a ton of storage capacity. Companies like <a href="http://www.siliconmechanics.com/">Silicon Mechanics</a> have all sorts of suitable offerings. <strong>The problem</strong>? Most of these systems completely fail the &#8220;<em>easy-to-use appliance</em>&#8221; test.  They are great systems but they need to be purchased, integrated and supported by IT professionals if they are going to succeed in a research or scientific environment.</li>
</ul>
<ul>
<li>The notable thing in our mind is that we were able to place our scientific software inside a storage device that was designed from Day 1 to act as a simple appliance. No IT expert required. The Drobo units are notable for being dead easy to setup, manage and use. In addition, Drobo goes out of their way to encourage 3rd party developers to create &#8220;DroboApps&#8221; that run on their architecture.</li>
</ul>
<p>It&#8217;s not inconceivable similar &#8220;smart storage&#8221; devices  could replace traditional PC-based laboratory instrument control workstations.</p>
<p>As storage units get smarter and more capable the need for a dedicated Windows PC attached to an instrument or <a href="http://www.iontorrent.com/">Genome Sequencer </a>becomes less important.</p>
<p>We particularly like the idea of a small storage appliance that is capable of natively hosting scientific and data management software &#8211; there are a lot of instrument-attached use cases that come to mind.  Something like this seems attractive for single-instrument genomics environments or labs where dedicated research IT staff may not be easily available.</p>
<p>I&#8217;ll end this post with a few more Drobo pictures just to really highlight their &#8220;small appliance&#8221; nature &#8230;</p>
<p>&nbsp;</p>
<p><a href="http://bioteam.net/wp-content/uploads/2012/01/drobo-3.jpg"><img class="aligncenter size-medium wp-image-1675" title="drobo-3" src="http://bioteam.net/wp-content/uploads/2012/01/drobo-3-300x145.jpg" alt="" width="300" height="145" /></a></p>
<p><a href="http://bioteam.net/wp-content/uploads/2012/01/drobo-4.jpg"><img class="aligncenter size-medium wp-image-1674" title="drobo-4" src="http://bioteam.net/wp-content/uploads/2012/01/drobo-4-300x224.jpg" alt="" width="300" height="224" /></a></p>
<p><a href="http://bioteam.net/wp-content/uploads/2012/01/drobo-5.jpg"><img class="aligncenter size-medium wp-image-1687" title="drobo-5" src="http://bioteam.net/wp-content/uploads/2012/01/drobo-5-300x224.jpg" alt="" width="300" height="224" /></a></p>
<h5>More Info:</h5>
<ul>
<li><a href="http://bioteam.net/minilims/">BioTeam MiniLIMS information</a></li>
<li><a href="http://www.drobo.com/products/professionals/drobo-fs/apps.php">Drobo &#8220;DroboApps&#8221; information</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://bioteam.net/2012/01/minilims-as-droboapp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CentOS 6.1, local VMs and Opscode Chef</title>
		<link>http://bioteam.net/2011/12/centos-6-1-local-vms-and-opscode-chef/</link>
		<comments>http://bioteam.net/2011/12/centos-6-1-local-vms-and-opscode-chef/#comments</comments>
		<pubDate>Thu, 29 Dec 2011 18:58:20 +0000</pubDate>
		<dc:creator>chrisdag</dc:creator>
				<category><![CDATA[Employee Posts]]></category>
		<category><![CDATA[Screencasts]]></category>
		<category><![CDATA[Tech Notes]]></category>
		<category><![CDATA[bootstrapping]]></category>
		<category><![CDATA[centos]]></category>
		<category><![CDATA[centos-6]]></category>
		<category><![CDATA[chef]]></category>
		<category><![CDATA[infrastructure automation]]></category>
		<category><![CDATA[opscode]]></category>
		<category><![CDATA[post-wide]]></category>
		<category><![CDATA[server orchestration]]></category>
		<category><![CDATA[xenserver]]></category>

		<guid isPermaLink="false">http://bioteam.net/?p=1669</guid>
		<description><![CDATA[This blog post is just a quick one-off article to highlight how well Chef plays with non-cloud systems including local virtual machines that BioTeam is running via Citrix XenServer.]]></description>
			<content:encoded><![CDATA[<h3>Automating Internal Infrastructure Orchestration with Chef</h3>
<h2><a href="http://bioteam.net/wp-content/uploads/2011/12/staff.bioteam.net_.png"><img class="aligncenter size-medium wp-image-1670" title="staff.bioteam.net" src="http://bioteam.net/wp-content/uploads/2011/12/staff.bioteam.net_-300x160.png" alt="" width="300" height="160" /></a></h2>
<p>BioTeam maintains it&#8217;s internal company IT infrastructure across a distributed mix of servers hosted both &#8220;in the cloud&#8221; as well as within our own offices and colocation cages. We&#8217;ve long been using <a href="http://opscode.com">Opscode Chef </a>to &#8220;orchestrate&#8221; our cloud systems and recently have found it invaluable for automatic configuration management of our own local servers and VMs.</p>
<p>This blog post is just a quick one-off article to highlight how well Chef plays with non-cloud systems including local virtual machines that BioTeam is running via Citrix XenServer. It was so easy to spin up a new VM (&#8220;staff.bioteam.net&#8221;) and then use a single Chef one-liner command to bootstrap the server to configure user accounts, install new software (denyhosts) and adjust the configuration of the /etc/sudoers file that I wanted to screencast and share the process.</p>
<h3>First things first &#8230;</h3>
<p>Thanks to Steve Danna for publishing a CentOS-6 bootstrapping template script. In the screencast below where you see me typing the &#8220;knife bootstrap &#8230;&#8221; command I&#8217;m directly invoking the bootstrapping script for CentOS 6 systems <a href="https://github.com/stevendanna/knife-hacks/blob/master/bootstraps/centos6-gems.erb">that Steve put on github</a>.</p>
<h3>Screencast Ahead</h3>
<p>In the video recorded below we start with a CentOS 6.1 Linux system. The VM was created from a pre-existing barebones XenServer template and really just contains a minimal operating system and network stack with almost no installed software.</p>
<p>Normally in &#8220;Xen&#8221; land, I&#8217;d fire up the new VM from a template and then do manual sysadmin &#8220;stuff&#8221; to the server to make it do what it needed to do.</p>
<p>For this particular server (&#8220;staff.bioteam.net&#8221;) we really just needed a few things to start with:</p>
<ul>
<li>Create BioTeam staff user accounts</li>
<li>Upload and install individual BioTeam staff SSH keys so they can login securely</li>
<li>Add the appropriate BioTeam user accounts to the /etc/sudoers file so they can elevate access when needed</li>
<li>Install, configure and start the &#8216;denyhosts&#8217; service to block SSH password guessing attacks</li>
</ul>
<p>And wouldn&#8217;t you know &#8230; BioTeam <strong>ALREADY</strong> has Chef recipes to do all those things because we need them on just about every cloud server we create.</p>
<p>The screencast below simply shows how I can do all the tasks listed above via my personal Mac OS X laptop with a single call to the Opscode Chef CLI tool named &#8216;knife&#8217;. The exact command used was:</p>
<pre style="padding-left: 30px;"> $ knife bootstrap -d centos6-gems --ssh-user root \
 --run-list "recipe[users::sysadmins], recipe[sudo], recipe[denyhosts]" \
 staff.bioteam.net</pre>
<p>It&#8217;s literally that easy.</p>
<p>The video below is not edited for time in any way. It really does take less than 4 minutes to take a &#8216;barebones&#8217; CentOS system, install all the software dependencies, build and configure chef, download the cookbooks and runlist and then &#8220;process them&#8221;. The end result is 100% automated provisioning of a new server while I check Facebook in another browser window.</p>
<p>And for people new to Opscode Chef this is a great example of how powerful and flexible these &#8220;infrastructure orchestration&#8221; systems have become. The Chef client running on the new server is doing far more than just simple installs of software from remote repositories. Of course it&#8217;s doing that but it&#8217;s also installing personal individual SSH keys, editing the contents of the /etc/sudoers file and installing, configuring and starting a new network security service (denyhosts). Try doing that amount of &#8220;custom&#8221; server config work using a &#8220;golden image&#8221; or Kickstart type method!</p>
<p>&nbsp;</p>
<p><strong>Note</strong>: The text-heavy screencast may best be viewed directly on youtube.com, particularly in the &#8220;big&#8221; 720p HD version &#8230;</p>
<p>&nbsp;</p>
<p><iframe src="http://www.youtube.com/embed/648NI-uVhY0?rel=0&amp;hd=1" frameborder="0" width="853" height="480"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://bioteam.net/2011/12/centos-6-1-local-vms-and-opscode-chef/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A quick round of applause for the Ion Torrent Server API</title>
		<link>http://bioteam.net/2011/12/a-quick-round-of-applause-for-the-ion-torrent-server-api/</link>
		<comments>http://bioteam.net/2011/12/a-quick-round-of-applause-for-the-ion-torrent-server-api/#comments</comments>
		<pubDate>Fri, 02 Dec 2011 17:11:30 +0000</pubDate>
		<dc:creator>aaron</dc:creator>
				<category><![CDATA[Employee Posts]]></category>
		<category><![CDATA[ion torrent]]></category>
		<category><![CDATA[MiniLIMS]]></category>
		<category><![CDATA[ngs]]></category>

		<guid isPermaLink="false">http://bioteam.net/?p=1653</guid>
		<description><![CDATA[Previous posts in this series: Ion Torrent Server API, I’d like to introduce you to the MiniLIMS API The MiniLIMS 4 column table and it’s PHP manifestation, the TypeInstance I&#8217;d like to suggest a quick round of applause for the RESTful Ion Torrent Server API. I feel funny doing so; it&#8217;s like applauding a common [...]]]></description>
			<content:encoded><![CDATA[<p>Previous posts in this series: </p>
<ul>
<li><a href="http://bioteam.net/wp-admin/post.php?action=edit&#038;post=1645">Ion Torrent Server API, I’d like to introduce you to the MiniLIMS API</a></li>
<li><a href="/2011/11/the-minilims-4-column-table-and-its-php-manifestation-the-typeinstance/">The MiniLIMS 4 column table and it’s PHP manifestation, the TypeInstance </a></li>
</ul>
<p>I&#8217;d like to suggest a quick round of applause for the RESTful Ion Torrent Server API.  I feel funny doing so; it&#8217;s like applauding a common sense activity like using a cross walk and not running across the street.  API calls via URLs that return JSON text objects really should be the default these days.  Sure, maybe you&#8217;re in some glacially-paced industry that just made the move from CORBA to SOAP and are thrilled with the readability of bloated XML documents.  But for everyone else, GET/POST operations that communicate via lightweight JSON  encoded text is just so sensible.  Every modern language, and even command line tools like <em>curl</em>, can use a RESTful API; most can encode/decode JSON in a single line.  It&#8217;s particularly useful for things like real-time instrument monitoring where an AJAX call can get you the current status without reloading a page.</p>
<p>The icing on this cake is the meta-data.  The Torrent Server API delivers an object overview at the root and type details under a &#8220;schema&#8221; path for each data type in the same RESTful form.  It&#8217;s not going to be directly useful for the MiniLIMS PGM classes, as I&#8217;ll described below, but it&#8217;s very handy for those of us that abhor reading documentation.</p>
<p>The URLs of the Torrent Server API reflect the hierarchy you&#8217;d expect for accessing data from the instrument.  Here&#8217;s the URL to access a particular <em>experiment</em>, the Torrent name for an instrument run:<br />
<code></p>
<p>http://&lt;torrent-server&gt;/rundb/api/v1/experiment/3/?format=json</p>
<p></code></p>
<p>The root of the URL is pretty self explanatory: <code>/rundb/api/v1</code> is the entry point into the API.  Though it is certainly nice of them to include the version, if you&#8217;re going to do that, a &#8220;latest&#8221; URL that redirects to the latest version can also be helpful.</p>
<p>The next part, <code>experiment</code>, is the object type.  If you only go this far in the path, you&#8217;ll get a full listing of all <code>experiment</code>s.  If you include the final path component (<code>3</code> in this example) you&#8217;ll be accessing a single object using the internally generated id. </p>
<p>The request parameters come in to play in a number of situations.  Though only the one format is supported, and it should be the default regardless, they insist that you include the <code>format=json</code> parameter.  Beyond this, request parameters can be used to filter results, find by name, sort the returned documents, and support paging of results.  For example, if you don&#8217;t know the internally generated id of the experiment, you can ask for it by name:</p>
<p><code>http://&lt;torrent-server&gt;/rundb/api/v1/experiment/?format=json&#038;expName=R_2011_09_01_15_58_12_user_B15-410-r124922-bst9_lib909_run2-ms</code></p>
<p>You might have noticed the lack of any login credentials in the URL.  Torrent Servers do require logins, but it&#8217;s http basic authentication.  As a result, most URL-handling code can deal with it, including the <em>curl</em> binary.  I&#8217;ll show you the PHP code later.</p>
<p>This is the JSON document returned by the above URL (marked up a bit by a Chrome plugin):</p>
<div id="attachment_1657" class="wp-caption aligncenter" style="width: 510px"><a href="http://bioteam.net/wp-content/uploads/2011/12/Torrent-JSON1.png"><img src="http://bioteam.net/wp-content/uploads/2011/12/Torrent-JSON1.png" alt="" title="Torrent JSON" width="500" class="size-full wp-image-1657" /></a><p class="wp-caption-text">Torrent JSON for experiment/3</p></div>
<p>Pretty straightforward, eh?  Things are well formed and id and &#8216;resource_uri&#8217; are included.  One small annoyance is that most fields are camel case, but there are a few underbar word separators.  API should clear that up, though. </p>
<p><em>As an aside, the data that I&#8217;m showing comes from an Amazon EC2 instance setup by Adam Kraut here at The BioTeam.  Besides being a guru at all things Cloud, including Master <a href="www.opscode.com/chef">Chef</a> credentials, he&#8217;s been spinning up these instances for the <a href="/2011/08/accuracy-grand-challenge/">Ion Torrent Grand Challenge competitors</a>.  They&#8217;ve been really handy for development.</em></p>
<p>The schema urls provide great typing guidance for each of the elements for a particular document.  Here&#8217;s a partial schema for the <code>experiment</code> type.</p>
<div id="attachment_1656" class="wp-caption aligncenter" style="width: 510px"><a href="http://bioteam.net/wp-content/uploads/2011/12/Torrent-JSON-schema.png"><img src="http://bioteam.net/wp-content/uploads/2011/12/Torrent-JSON-schema.png" alt="" title="Torrent JSON schema" width="500" class="size-full wp-image-1656" /></a><p class="wp-caption-text">Schema for experiments</p></div>
<p>A great thing to have available- if you&#8217;re in to strongly typed systems.  Except for the &#8220;nullable&#8221; field, most of this is kinda pointless in our situation.  PHP isn&#8217;t strongly typed and, even if it were, MiniLIMS itself treats everything as name-value pairs.  Any value checking has to be done in decoupled validation code.  The schema also provides a list of filtering and ordering fields (not shown in the screenshot above).  This also is unlikely to help us much because we&#8217;re going to slurp the data wholesale into MiniLIMS and will take care of searching and sorting with our own mechanisms.</p>
<p>Among the request parameters that can be used are <code>limit</code> and <code>offset</code>.  The combination of these two can support a &#8220;paging&#8221; functionality.  If, for example, we weren&#8217;t storing the experiment records in MiniLIMS itself, we might want a paged display of, say 20 at a time. For page 1, we&#8217;d use <code>limit=20&#038;offset=0</code>; for page 2, we&#8217;d use <code>limit=20&#038;offset=20</code>.  Again, we&#8217;re going to be pulling the data into MiniLIMS to get tighter integration for our end users, so we&#8217;ll be able to pass on this as well.</p>
<p>The <bold>results:</bold> field in the experiment shown above is a URI, clearly pointing to a document of another type. This foreign-key-like pointer is important for tying the data together, but is going to add a minor wrinkle to the API development.</p>
<p>I swear, code is coming soon.  Now that we have some of the background, in the next post, I&#8217;ll walk through the design of data objects in our API. </p>
<p>Next post in this series:</p>
<ul>
<li><a href="/2012/01/adding-a-coating-of-civilization-to-php-stdclass-with-the-pgmobject-base-class/">Adding a coating of civilization to PHP stdclass with the PGMObject base class</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://bioteam.net/2011/12/a-quick-round-of-applause-for-the-ion-torrent-server-api/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

