Team:Harvard/Team

From 2011.igem.org

(Difference between revisions)
(Revert to unbroken state take 2)
(replacing the coda slider js directly into the source code)
Line 18: Line 18:
<script type="text/javascript" src="http://www.hcs.harvard.edu/kbarclay/javascripts/jquery-1.3.2.min.js"></script>  
<script type="text/javascript" src="http://www.hcs.harvard.edu/kbarclay/javascripts/jquery-1.3.2.min.js"></script>  
<script type="text/javascript" src="http://www.hcs.harvard.edu/kbarclay/javascripts/jquery.easing.1.3.js"></script>  
<script type="text/javascript" src="http://www.hcs.harvard.edu/kbarclay/javascripts/jquery.easing.1.3.js"></script>  
-
<script type="text/javascript" src="http://people.fas.harvard.edu/~jwchew/iGEM/teamslider/jquery.coda-slider-2.0.js"></script>  
+
 
 +
<!-- http://people.fas.harvard.edu/~jwchew/iGEM/teamslider/jquery.coda-slider-2.0.js -->
 +
/*
 +
jQuery Coda-Slider v2.0 - http://www.ndoherty.biz/coda-slider
 +
Copyright (c) 2009 Niall Doherty
 +
This plugin available for use in all personal or commercial projects under both MIT and GPL licenses.
 +
*/
 +
 
 +
$(function(){
 +
// Remove the coda-slider-no-js class from the body
 +
$("body").removeClass("coda-slider-no-js");
 +
// Preloader
 +
$(".coda-slider").children('.panel').hide().end().prepend('<p class="loading">Loading...<br /><img src="images/ajax-loader.gif" alt="loading..." /></p>');
 +
});
 +
 
 +
var sliderCount = 1;
 +
 
 +
$.fn.codaSlider = function(settings) {
 +
 
 +
settings = $.extend({
 +
autoHeight: true,
 +
autoHeightEaseDuration: 1000,
 +
autoHeightEaseFunction: "easeInOutExpo",
 +
autoSlide: false,
 +
autoSlideInterval: 7000,
 +
autoSlideStopWhenClicked: true,
 +
crossLinking: true,
 +
dynamicArrows: true,
 +
dynamicArrowLeftText: "&#171",
 +
dynamicArrowRightText: "&#187;",
 +
dynamicTabs: true,
 +
dynamicTabsAlign: "center",
 +
dynamicTabsPosition: "top",
 +
externalTriggerSelector: "a.xtrig",
 +
firstPanelToLoad: 1,
 +
panelTitleSelector: "h2.title",
 +
slideEaseDuration: 1000,
 +
slideEaseFunction: "easeInOutExpo"
 +
}, settings);
 +
 +
return this.each(function(){
 +
 +
// Uncomment the line below to test your preloader
 +
// alert("Testing preloader");
 +
 +
var slider = $(this);
 +
 +
// If we need arrows
 +
if (settings.dynamicArrows) {
 +
slider.parent().addClass("arrows");
 +
slider.before('<div class="coda-nav-left" id="coda-nav-left-' + sliderCount + '"><a href="#">' + settings.dynamicArrowLeftText + '</a></div>');
 +
slider.after('<div class="coda-nav-right" id="coda-nav-right-' + sliderCount + '"><a href="#">' + settings.dynamicArrowRightText + '</a></div>');
 +
};
 +
 +
var panelWidth = slider.find(".panel").width();
 +
var panelCount = slider.find(".panel").size();
 +
var panelContainerWidth = panelWidth*panelCount;
 +
var navClicks = 0; // Used if autoSlideStopWhenClicked = true
 +
 +
// Surround the collection of panel divs with a container div (wide enough for all panels to be lined up end-to-end)
 +
$('.panel', slider).wrapAll('<div class="panel-container"></div>');
 +
// Specify the width of the container div (wide enough for all panels to be lined up end-to-end)
 +
$(".panel-container", slider).css({ width: panelContainerWidth });
 +
 +
// Specify the current panel.
 +
// If the loaded URL has a hash (cross-linking), we're going to use that hash to give the slider a specific starting position...
 +
if (settings.crossLinking && location.hash && parseInt(location.hash.slice(1)) <= panelCount) {
 +
var currentPanel = parseInt(location.hash.slice(1));
 +
var offset = - (panelWidth*(currentPanel - 1));
 +
$('.panel-container', slider).css({ marginLeft: offset });
 +
// If that's not the case, check to see if we're supposed to load a panel other than Panel 1 initially...
 +
} else if (settings.firstPanelToLoad != 1 && settings.firstPanelToLoad <= panelCount) {
 +
var currentPanel = settings.firstPanelToLoad;
 +
var offset = - (panelWidth*(currentPanel - 1));
 +
$('.panel-container', slider).css({ marginLeft: offset });
 +
// Otherwise, we'll just set the current panel to 1...
 +
} else {
 +
var currentPanel = 1;
 +
};
 +
 +
// Left arrow click
 +
$("#coda-nav-left-" + sliderCount + " a").click(function(){
 +
navClicks++;
 +
if (currentPanel == 1) {
 +
offset = - (panelWidth*(panelCount - 1));
 +
alterPanelHeight(panelCount - 1);
 +
currentPanel = panelCount;
 +
slider.siblings('.coda-nav').find('a.current').removeClass('current').parents('ul').find('li:last a').addClass('current');
 +
} else {
 +
currentPanel -= 1;
 +
alterPanelHeight(currentPanel - 1);
 +
offset = - (panelWidth*(currentPanel - 1));
 +
slider.siblings('.coda-nav').find('a.current').removeClass('current').parent().prev().find('a').addClass('current');
 +
};
 +
$('.panel-container', slider).animate({ marginLeft: offset }, settings.slideEaseDuration, settings.slideEaseFunction);
 +
if (settings.crossLinking) { location.hash = currentPanel }; // Change the URL hash (cross-linking)
 +
return false;
 +
});
 +
 +
// Right arrow click
 +
$('#coda-nav-right-' + sliderCount + ' a').click(function(){
 +
navClicks++;
 +
if (currentPanel == panelCount) {
 +
offset = 0;
 +
currentPanel = 1;
 +
alterPanelHeight(0);
 +
slider.siblings('.coda-nav').find('a.current').removeClass('current').parents('ul').find('a:eq(0)').addClass('current');
 +
} else {
 +
offset = - (panelWidth*currentPanel);
 +
alterPanelHeight(currentPanel);
 +
currentPanel += 1;
 +
slider.siblings('.coda-nav').find('a.current').removeClass('current').parent().next().find('a').addClass('current');
 +
};
 +
$('.panel-container', slider).animate({ marginLeft: offset }, settings.slideEaseDuration, settings.slideEaseFunction);
 +
if (settings.crossLinking) { location.hash = currentPanel }; // Change the URL hash (cross-linking)
 +
return false;
 +
});
 +
 +
// If we need a dynamic menu
 +
if (settings.dynamicTabs) {
 +
var dynamicTabs = '<div class="coda-nav" id="coda-nav-' + sliderCount + '"><ul></ul></div>';
 +
switch (settings.dynamicTabsPosition) {
 +
case "bottom":
 +
slider.parent().append(dynamicTabs);
 +
break;
 +
default:
 +
slider.parent().prepend(dynamicTabs);
 +
break;
 +
};
 +
ul = $('#coda-nav-' + sliderCount + ' ul');
 +
// Create the nav items
 +
$('.panel', slider).each(function(n) {
 +
ul.append('<li class="tab' + (n+1) + '"><a href="#' + (n+1) + '">' + $(this).find(settings.panelTitleSelector).text() + '</a></li>');
 +
});
 +
navContainerWidth = slider.width() + slider.siblings('.coda-nav-left').width() + slider.siblings('.coda-nav-right').width();
 +
ul.parent().css({ width: navContainerWidth });
 +
switch (settings.dynamicTabsAlign) {
 +
case "center":
 +
ul.css({ width: ($("li", ul).width() + 2) * panelCount });
 +
break;
 +
case "right":
 +
ul.css({ float: 'right' });
 +
break;
 +
};
 +
};
 +
 +
// If we need a tabbed nav
 +
$('#coda-nav-' + sliderCount + ' a').each(function(z) {
 +
// What happens when a nav link is clicked
 +
$(this).bind("click", function() {
 +
navClicks++;
 +
$(this).addClass('current').parents('ul').find('a').not($(this)).removeClass('current');
 +
offset = - (panelWidth*z);
 +
alterPanelHeight(z);
 +
currentPanel = z + 1;
 +
$('.panel-container', slider).animate({ marginLeft: offset }, settings.slideEaseDuration, settings.slideEaseFunction);
 +
if (!settings.crossLinking) { return false }; // Don't change the URL hash unless cross-linking is specified
 +
});
 +
});
 +
 +
// External triggers (anywhere on the page)
 +
$(settings.externalTriggerSelector).each(function() {
 +
// Make sure this only affects the targeted slider
 +
if (sliderCount == parseInt($(this).attr("rel").slice(12))) {
 +
$(this).bind("click", function() {
 +
navClicks++;
 +
targetPanel = parseInt($(this).attr("href").slice(1));
 +
offset = - (panelWidth*(targetPanel - 1));
 +
alterPanelHeight(targetPanel - 1);
 +
currentPanel = targetPanel;
 +
// Switch the current tab:
 +
slider.siblings('.coda-nav').find('a').removeClass('current').parents('ul').find('li:eq(' + (targetPanel - 1) + ') a').addClass('current');
 +
// Slide
 +
$('.panel-container', slider).animate({ marginLeft: offset }, settings.slideEaseDuration, settings.slideEaseFunction);
 +
if (!settings.crossLinking) { return false }; // Don't change the URL hash unless cross-linking is specified
 +
});
 +
};
 +
});
 +
 +
// Specify which tab is initially set to "current". Depends on if the loaded URL had a hash or not (cross-linking).
 +
if (settings.crossLinking && location.hash && parseInt(location.hash.slice(1)) <= panelCount) {
 +
$("#coda-nav-" + sliderCount + " a:eq(" + (location.hash.slice(1) - 1) + ")").addClass("current");
 +
// If there's no cross-linking, check to see if we're supposed to load a panel other than Panel 1 initially...
 +
} else if (settings.firstPanelToLoad != 1 && settings.firstPanelToLoad <= panelCount) {
 +
$("#coda-nav-" + sliderCount + " a:eq(" + (settings.firstPanelToLoad - 1) + ")").addClass("current");
 +
// Otherwise we must be loading Panel 1, so make the first tab the current one.
 +
} else {
 +
$("#coda-nav-" + sliderCount + " a:eq(0)").addClass("current");
 +
};
 +
 +
// Set the height of the first panel (kludge to 441 px)
 +
if (settings.autoHeight) {
 +
panelHeight = 441;
 +
slider.css({ height: panelHeight });
 +
};
 +
 +
// Trigger autoSlide
 +
if (settings.autoSlide) {
 +
slider.ready(function() {
 +
setTimeout(autoSlide,settings.autoSlideInterval);
 +
});
 +
};
 +
 +
function alterPanelHeight(x) {
 +
if (settings.autoHeight) {
 +
panelHeight = $('.panel:eq(' + x + ')', slider).height()
 +
slider.animate({ height: panelHeight }, settings.autoHeightEaseDuration, settings.autoHeightEaseFunction);
 +
};
 +
};
 +
 +
function autoSlide() {
 +
if (navClicks == 0 || !settings.autoSlideStopWhenClicked) {
 +
if (currentPanel == panelCount) {
 +
var offset = 0;
 +
currentPanel = 1;
 +
} else {
 +
var offset = - (panelWidth*currentPanel);
 +
currentPanel += 1;
 +
};
 +
alterPanelHeight(currentPanel - 1);
 +
// Switch the current tab:
 +
slider.siblings('.coda-nav').find('a').removeClass('current').parents('ul').find('li:eq(' + (currentPanel - 1) + ') a').addClass('current');
 +
// Slide:
 +
$('.panel-container', slider).animate({ marginLeft: offset }, settings.slideEaseDuration, settings.slideEaseFunction);
 +
setTimeout(autoSlide,settings.autoSlideInterval);
 +
};
 +
};
 +
 +
// Kill the preloader
 +
$('.panel', slider).show().end().find("p.loading").remove();
 +
slider.removeClass("preload");
 +
 +
sliderCount++;
 +
 +
});
 +
};
 +
</script>
 +
 
 +
<!-- Initialize js -->
<script type="text/javascript">  
<script type="text/javascript">  
$().ready(function() {
$().ready(function() {

Revision as of 05:33, 28 October 2011

bar

The 2011 Harvard iGEM Team

/* jQuery Coda-Slider v2.0 - http://www.ndoherty.biz/coda-slider Copyright (c) 2009 Niall Doherty This plugin available for use in all personal or commercial projects under both MIT and GPL licenses. */ $(function(){ // Remove the coda-slider-no-js class from the body $("body").removeClass("coda-slider-no-js"); // Preloader $(".coda-slider").children('.panel').hide().end().prepend('

Loading...
loading...

'); }); var sliderCount = 1; $.fn.codaSlider = function(settings) { settings = $.extend({ autoHeight: true, autoHeightEaseDuration: 1000, autoHeightEaseFunction: "easeInOutExpo", autoSlide: false, autoSlideInterval: 7000, autoSlideStopWhenClicked: true, crossLinking: true, dynamicArrows: true, dynamicArrowLeftText: "&#171", dynamicArrowRightText: "»", dynamicTabs: true, dynamicTabsAlign: "center", dynamicTabsPosition: "top", externalTriggerSelector: "a.xtrig", firstPanelToLoad: 1, panelTitleSelector: "h2.title", slideEaseDuration: 1000, slideEaseFunction: "easeInOutExpo" }, settings); return this.each(function(){ // Uncomment the line below to test your preloader // alert("Testing preloader"); var slider = $(this); // If we need arrows if (settings.dynamicArrows) { slider.parent().addClass("arrows"); slider.before(''); slider.after(''); }; var panelWidth = slider.find(".panel").width(); var panelCount = slider.find(".panel").size(); var panelContainerWidth = panelWidth*panelCount; var navClicks = 0; // Used if autoSlideStopWhenClicked = true // Surround the collection of panel divs with a container div (wide enough for all panels to be lined up end-to-end) $('.panel', slider).wrapAll('
'); // Specify the width of the container div (wide enough for all panels to be lined up end-to-end) $(".panel-container", slider).css({ width: panelContainerWidth }); // Specify the current panel. // If the loaded URL has a hash (cross-linking), we're going to use that hash to give the slider a specific starting position... if (settings.crossLinking && location.hash && parseInt(location.hash.slice(1)) <= panelCount) { var currentPanel = parseInt(location.hash.slice(1)); var offset = - (panelWidth*(currentPanel - 1)); $('.panel-container', slider).css({ marginLeft: offset }); // If that's not the case, check to see if we're supposed to load a panel other than Panel 1 initially... } else if (settings.firstPanelToLoad != 1 && settings.firstPanelToLoad <= panelCount) { var currentPanel = settings.firstPanelToLoad; var offset = - (panelWidth*(currentPanel - 1)); $('.panel-container', slider).css({ marginLeft: offset }); // Otherwise, we'll just set the current panel to 1... } else { var currentPanel = 1; }; // Left arrow click $("#coda-nav-left-" + sliderCount + " a").click(function(){ navClicks++; if (currentPanel == 1) { offset = - (panelWidth*(panelCount - 1)); alterPanelHeight(panelCount - 1); currentPanel = panelCount; slider.siblings('.coda-nav').find('a.current').removeClass('current').parents('ul').find('li:last a').addClass('current'); } else { currentPanel -= 1; alterPanelHeight(currentPanel - 1); offset = - (panelWidth*(currentPanel - 1)); slider.siblings('.coda-nav').find('a.current').removeClass('current').parent().prev().find('a').addClass('current'); }; $('.panel-container', slider).animate({ marginLeft: offset }, settings.slideEaseDuration, settings.slideEaseFunction); if (settings.crossLinking) { location.hash = currentPanel }; // Change the URL hash (cross-linking) return false; }); // Right arrow click $('#coda-nav-right-' + sliderCount + ' a').click(function(){ navClicks++; if (currentPanel == panelCount) { offset = 0; currentPanel = 1; alterPanelHeight(0); slider.siblings('.coda-nav').find('a.current').removeClass('current').parents('ul').find('a:eq(0)').addClass('current'); } else { offset = - (panelWidth*currentPanel); alterPanelHeight(currentPanel); currentPanel += 1; slider.siblings('.coda-nav').find('a.current').removeClass('current').parent().next().find('a').addClass('current'); }; $('.panel-container', slider).animate({ marginLeft: offset }, settings.slideEaseDuration, settings.slideEaseFunction); if (settings.crossLinking) { location.hash = currentPanel }; // Change the URL hash (cross-linking) return false; }); // If we need a dynamic menu if (settings.dynamicTabs) { var dynamicTabs = '
    '; switch (settings.dynamicTabsPosition) { case "bottom": slider.parent().append(dynamicTabs); break; default: slider.parent().prepend(dynamicTabs); break; }; ul = $('#coda-nav-' + sliderCount + ' ul'); // Create the nav items $('.panel', slider).each(function(n) { ul.append('
  • ' + $(this).find(settings.panelTitleSelector).text() + '
  • '); }); navContainerWidth = slider.width() + slider.siblings('.coda-nav-left').width() + slider.siblings('.coda-nav-right').width(); ul.parent().css({ width: navContainerWidth }); switch (settings.dynamicTabsAlign) { case "center": ul.css({ width: ($("li", ul).width() + 2) * panelCount }); break; case "right": ul.css({ float: 'right' }); break; }; }; // If we need a tabbed nav $('#coda-nav-' + sliderCount + ' a').each(function(z) { // What happens when a nav link is clicked $(this).bind("click", function() { navClicks++; $(this).addClass('current').parents('ul').find('a').not($(this)).removeClass('current'); offset = - (panelWidth*z); alterPanelHeight(z); currentPanel = z + 1; $('.panel-container', slider).animate({ marginLeft: offset }, settings.slideEaseDuration, settings.slideEaseFunction); if (!settings.crossLinking) { return false }; // Don't change the URL hash unless cross-linking is specified }); }); // External triggers (anywhere on the page) $(settings.externalTriggerSelector).each(function() { // Make sure this only affects the targeted slider if (sliderCount == parseInt($(this).attr("rel").slice(12))) { $(this).bind("click", function() { navClicks++; targetPanel = parseInt($(this).attr("href").slice(1)); offset = - (panelWidth*(targetPanel - 1)); alterPanelHeight(targetPanel - 1); currentPanel = targetPanel; // Switch the current tab: slider.siblings('.coda-nav').find('a').removeClass('current').parents('ul').find('li:eq(' + (targetPanel - 1) + ') a').addClass('current'); // Slide $('.panel-container', slider).animate({ marginLeft: offset }, settings.slideEaseDuration, settings.slideEaseFunction); if (!settings.crossLinking) { return false }; // Don't change the URL hash unless cross-linking is specified }); }; }); // Specify which tab is initially set to "current". Depends on if the loaded URL had a hash or not (cross-linking). if (settings.crossLinking && location.hash && parseInt(location.hash.slice(1)) <= panelCount) { $("#coda-nav-" + sliderCount + " a:eq(" + (location.hash.slice(1) - 1) + ")").addClass("current"); // If there's no cross-linking, check to see if we're supposed to load a panel other than Panel 1 initially... } else if (settings.firstPanelToLoad != 1 && settings.firstPanelToLoad <= panelCount) { $("#coda-nav-" + sliderCount + " a:eq(" + (settings.firstPanelToLoad - 1) + ")").addClass("current"); // Otherwise we must be loading Panel 1, so make the first tab the current one. } else { $("#coda-nav-" + sliderCount + " a:eq(0)").addClass("current"); }; // Set the height of the first panel (kludge to 441 px) if (settings.autoHeight) { panelHeight = 441; slider.css({ height: panelHeight }); }; // Trigger autoSlide if (settings.autoSlide) { slider.ready(function() { setTimeout(autoSlide,settings.autoSlideInterval); }); }; function alterPanelHeight(x) { if (settings.autoHeight) { panelHeight = $('.panel:eq(' + x + ')', slider).height() slider.animate({ height: panelHeight }, settings.autoHeightEaseDuration, settings.autoHeightEaseFunction); }; }; function autoSlide() { if (navClicks == 0 || !settings.autoSlideStopWhenClicked) { if (currentPanel == panelCount) { var offset = 0; currentPanel = 1; } else { var offset = - (panelWidth*currentPanel); currentPanel += 1; }; alterPanelHeight(currentPanel - 1); // Switch the current tab: slider.siblings('.coda-nav').find('a').removeClass('current').parents('ul').find('li:eq(' + (currentPanel - 1) + ') a').addClass('current'); // Slide: $('.panel-container', slider).animate({ marginLeft: offset }, settings.slideEaseDuration, settings.slideEaseFunction); setTimeout(autoSlide,settings.autoSlideInterval); }; }; // Kill the preloader $('.panel', slider).show().end().find("p.loading").remove(); slider.removeClass("preload"); sliderCount++; }); };

    Team

    Kristin

    Kristin Barclay



    Concentration: Electrical Engineering, Physics

    Year: 2014

    Team Affiliation: Bioinformatics, Web Design

    Other Hobbies: Stargazing, ASOIAF, Battlestar Galactica

    Favourite YouTube Video: The Humans Are Dead

    Way to Pass Time While Waiting for PCR: Strike a heroic pose while staring dreamily into the distance.

    Justin

    Justin Chew



    Concentration: Neurobiology

    Year: 2011

    Team Affiliation: Bioinformatics, ZF

    Other Hobbies: Building things, launching things with catapults, lighting things on fire, going for walks and bike rides in the mountains.

    Favourite YouTube Video: Dubstep Guns

    Way to Pass Time While Waiting for PCR: Work on a time machine to skip ahead to when it's done/have fun with dry ice/sleep.

    Sarah

    Sarah Choudhury



    Concentration: Biomedical Engineering

    Year: 2012

    Team Affiliation: Wet Lab, TolC

    Other Hobbies: listening to instrumental music (Yanni, Ravid(hang)), reading fiction(Wilde, Dostoevsky, Maugham)

    Favourite YouTube Video: 2D Photography Rube Goldberg

    Way to Pass Time While Waiting for PCR: Design new cars on boxcar2d.com, catch up on xkcd, cyanide and happiness, and PhD comics.

    Will

    Will Clerx



    Concentration: Molecular & Cellular/Organismic & Evolutionary Biology

    Year: 2014

    Team Affiliation: Wet Lab, Bioinformatics, Web Design

    Other Hobbies: Cross country, track, musics, playing with zinc fingers

    Favourite YouTube Video: Harry Potter and the Deathly Hallows Trailer Parody

    Way to Pass Time While Waiting for PCR: Do another PCR. Or, write an iGEM song.

    Naomi

    Naomi Genuth



    Concentration: Molecular & Cellular/Organismic & Evolutionary Biology

    Year: 2014

    Team Affiliation: Wet Lab, Wolfe

    Other Hobbies: Reading, running, hiking, piano

    Favourite YouTube Video: Monty Python - Philosophers' World Cup

    Way to Pass Time While Waiting for PCR: Set up another reaction. Or two. Or three.

    Brandon

    Brandon Gerberich



    Concentration: Chemistry

    Year: 2014

    Team Affiliation: Bioinformatics, Wolfe

    Other Hobbies: Trumpet, Board Games, Wind Surfing

    Favourite YouTube Video: Imagining the Tenth Dimension

    Way to Pass Time While Waiting for PCR: 1) Just use the 6th dimension for instant PCR results, or 2) Remain in the 3rd dimension and build ice snowmen.

    Mark

    Mark Kopelman



    Concentration: Human Evolutionary Biology

    Year: 2012

    Team Affiliation: Wet Lab, ToIC, Web Design

    Other Hobbies: Winning

    Favourite YouTube Video: Friday

    Way to Pass Time While Waiting for PCR: ...Run another PCR, duh.

    Matt

    Matt Lunati



    Concentration: Neurobiology

    Year: 2012

    Team Affiliation: Wet Lab, ToIC

    Other Hobbies: Sports, the internet

    Favourite YouTube Video: How to Make 3d Glasses

    Way to Pass Time While Waiting for PCR: Listen to music on YouTube

    Nida

    Nida Naushad



    Concentration: Neurobiology

    Year: 2014

    Team Affiliation: Bioinformatics, ZF

    Other Hobbies: Photography, knitting

    Favourite YouTube Video: How To Turn a Sphere Inside Out

    Way to Pass Time While Waiting for PCR: Contemplate the possibility of sentient bacteria in all possible worlds.

    Advisers and Mentors

    HARVMentors.jpg


    Pictured (left to right):

    Srivatsan Raman, PhD

    Postdoctoral researcher, Church Lab, Harvard University

    Daniel Goodman

    PhD candidate in Bioinformatics and Integrative Genomics, Harvard/MIT

    Joyce Yang

    PhD candidate, Church Lab, Harvard University

    Jameson Rogers

    PhD candidate, Harvard School of Engineering and Applied Sciences

    Noah Taylor

    PhD candidate in Biological and Biomedical Sciences, Harvard University


    Not pictured:

    Jun Li

    PhD candidate, Harvard Medical School Department of Genetics

    Alain Viel, PhD

    Senior Lecturer, Department of Molecular and Cellular Biology, Harvard University

    Jagesh Shah, PhD

    Assistant Professor, Department of Systems Biology, Harvard Medical School

    Andrew Cumming

    Research Assistant, Department of Molecular and Cellular Biology, Harvard University

    George Church, PhD

    Professor of Genetics, Harvard Medical School, Director of the Center for Computational Genetics
    Retrieved from "http://2011.igem.org/Team:Harvard/Team"