kroy3's picture
data1: Date RNA DNA conc.(ug) A260 A260/280 RNA Conc.(ng/µL) RNA Conc. (ug/µL)
67f63d6 verified
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>RNA Synthesis Optimization</title>
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script src="https://unpkg.com/feather-icons"></script>
<style>
.gradient-bg {
background: linear-gradient(135deg, #6b46c1 0%, #805ad5 100%);
}
.shadow-soft {
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
}
.card-hover:hover {
transform: translateY(-5px);
transition: all 0.3s ease;
}
</style>
</head>
<body class="bg-gray-50 font-sans">
<!-- Navigation -->
<nav class="gradient-bg text-white py-4 px-6 shadow-soft">
<div class="container mx-auto flex justify-between items-center">
<div class="flex items-center space-x-2">
<i data-feather="dna" class="w-8 h-8"></i>
<span class="text-xl font-bold">RNA Synthesis Dashboard</span>
</div>
<div class="hidden md:flex space-x-6">
<a href="#" class="hover:text-gray-200">Overview</a>
<a href="#" class="hover:text-gray-200">Data Analysis</a>
<a href="#" class="hover:text-gray-200">Conclusions</a>
<a href="#" class="hover:text-gray-200">Methodology</a>
</div>
<button class="md:hidden">
<i data-feather="menu" class="w-6 h-6"></i>
</button>
</div>
</nav>
<!-- Hero Section -->
<div class="gradient-bg text-white py-16 px-6">
<div class="container mx-auto text-center">
<h1 class="text-4xl md:text-5xl font-bold mb-4">RNA Synthesis Optimization Analysis</h1>
<p class="text-xl md:text-2xl mb-8 max-w-3xl mx-auto">Visualizing and interpreting RNA yield data to optimize synthesis protocols</p>
<button class="bg-white text-purple-700 font-semibold py-3 px-6 rounded-lg hover:bg-gray-100 transition duration-300">
Explore Data
</button>
</div>
</div>
<!-- Main Content -->
<div class="container mx-auto py-12 px-6">
<!-- Summary Cards -->
<div class="grid grid-cols-1 md:grid-cols-3 gap-8 mb-12">
<div class="bg-white rounded-xl p-6 shadow-soft card-hover">
<div class="flex items-center mb-4">
<div class="bg-purple-100 p-3 rounded-full mr-4">
<i data-feather="trending-up" class="text-purple-600 w-6 h-6"></i>
</div>
<h3 class="text-lg font-semibold">Highest Yield</h3>
</div>
<p class="text-3xl font-bold text-purple-600 mb-2">2.027 µg/µL</p>
<p class="text-gray-600">Achieved on 9/11/2025 with 1.5µg DNA</p>
</div>
<div class="bg-white rounded-xl p-6 shadow-soft card-hover">
<div class="flex items-center mb-4">
<div class="bg-blue-100 p-3 rounded-full mr-4">
<i data-feather="activity" class="text-blue-600 w-6 h-6"></i>
</div>
<h3 class="text-lg font-semibold">Average Yield</h3>
</div>
<p class="text-3xl font-bold text-blue-600 mb-2">0.492 µg/µL</p>
<p class="text-gray-600">Across all successful experiments</p>
</div>
<div class="bg-white rounded-xl p-6 shadow-soft card-hover">
<div class="flex items-center mb-4">
<div class="bg-green-100 p-3 rounded-full mr-4">
<i data-feather="check-circle" class="text-green-600 w-6 h-6"></i>
</div>
<h3 class="text-lg font-semibold">Optimal DNA Input</h3>
</div>
<p class="text-3xl font-bold text-green-600 mb-2">1.5µg</p>
<p class="text-gray-600">Consistently produced highest yields</p>
</div>
</div>
<!-- Charts Section -->
<div class="grid grid-cols-1 lg:grid-cols-2 gap-8 mb-12">
<div class="bg-white rounded-xl p-6 shadow-soft">
<h2 class="text-xl font-bold mb-4">RNA Yield Over Time</h2>
<div class="h-80">
<canvas id="yieldOverTimeChart"></canvas>
</div>
</div>
<div class="bg-white rounded-xl p-6 shadow-soft">
<h2 class="text-xl font-bold mb-4">DNA Input vs RNA Yield</h2>
<div class="h-80">
<canvas id="dnaVsRnaChart"></canvas>
</div>
</div>
</div>
<!-- Data Tables -->
<div class="bg-white rounded-xl p-6 shadow-soft mb-12">
<h2 class="text-xl font-bold mb-6">Experimental Data</h2>
<div class="overflow-x-auto">
<table class="min-w-full divide-y divide-gray-200">
<thead class="bg-gray-50">
<tr>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Date</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Sample</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">DNA (µg)</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">A260</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">A260/280</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">RNA (µg/µL)</th>
</tr>
</thead>
<tbody class="bg-white divide-y divide-gray-200">
<!-- Data rows will be inserted here by JavaScript -->
</tbody>
</table>
</div>
</div>
<!-- Conclusions Section -->
<div class="bg-white rounded-xl p-6 shadow-soft">
<h2 class="text-xl font-bold mb-6">Key Findings & Recommendations</h2>
<div class="space-y-4">
<div class="p-4 bg-purple-50 rounded-lg">
<h3 class="font-semibold text-purple-700 mb-2">1. Optimal DNA Input</h3>
<p class="text-gray-700">The data clearly shows that 1.5µg of DNA template consistently produces the highest RNA yields (average 0.971µg/µL) compared to lower inputs.</p>
</div>
<div class="p-4 bg-blue-50 rounded-lg">
<h3 class="font-semibold text-blue-700 mb-2">2. Time Course Analysis</h3>
<p class="text-gray-700">The 4-hour time point (7/25/2025) showed significantly lower yield (0.0408µg/µL) compared to standard incubations, suggesting longer reaction times are needed.</p>
</div>
<div class="p-4 bg-green-50 rounded-lg">
<h3 class="font-semibold text-green-700 mb-2">3. Extraction Method Impact</h3>
<p class="text-gray-700">Phenol:chlorform extraction showed variable results, with one sample (1.5µg input) producing excellent yield (1.5528µg/µL) while others were lower.</p>
</div>
<div class="p-4 bg-yellow-50 rounded-lg">
<h3 class="font-semibold text-yellow-700 mb-2">4. Protocol Recommendations</h3>
<ul class="list-disc pl-5 text-gray-700 space-y-1">
<li>Use 1.5µg DNA template for consistent high yields</li>
<li>Standardize reaction time to ≥16 hours</li>
<li>Evaluate alternative purification methods for consistency</li>
<li>Monitor A260/280 ratios for quality control (ideal range 1.8-2.1)</li>
</ul>
</div>
</div>
</div>
</div>
<!-- Footer -->
<footer class="bg-gray-800 text-white py-8 px-6">
<div class="container mx-auto">
<div class="flex flex-col md:flex-row justify-between items-center">
<div class="mb-6 md:mb-0">
<div class="flex items-center space-x-2">
<i data-feather="dna" class="w-6 h-6"></i>
<span class="text-lg font-bold">RNA Synthesis Dashboard</span>
</div>
<p class="mt-2 text-gray-400">Visualizing optimization data for better protocols</p>
</div>
<div class="flex space-x-6">
<a href="#" class="hover:text-purple-300">
<i data-feather="github" class="w-5 h-5"></i>
</a>
<a href="#" class="hover:text-purple-300">
<i data-feather="twitter" class="w-5 h-5"></i>
</a>
<a href="#" class="hover:text-purple-300">
<i data-feather="mail" class="w-5 h-5"></i>
</a>
</div>
</div>
<div class="border-t border-gray-700 mt-8 pt-8 text-center text-gray-400">
<p>© 2023 RNA Synthesis Optimization Dashboard. All rights reserved.</p>
</div>
</div>
</footer>
<script>
// Initialize feather icons
feather.replace();
// Data for charts
const data1 = [
{date: '7/23/2025', sample: 'ptc1a', dna: 2, a260: 2.598, ratio: 2.04, rna: 0.10392},
{date: '7/23/2025', sample: 'ptc1b', dna: 2, a260: 2.39, ratio: 1.94, rna: 0.0956},
{date: '7/25/2025', sample: 'ptc1a (4h)', dna: 5, a260: 1.02, ratio: 2.088, rna: 0.0408},
{date: '7/26/2025', sample: 'ptc1a', dna: 5, a260: 1.064, ratio: 2.11, rna: 0.04256},
{date: '7/26/2025', sample: 'ptc1b', dna: 5, a260: 19.85, ratio: 1.87, rna: 0.794},
{date: '9/15/2025', sample: 'ptc1b', dna: 2, a260: 3.11, ratio: 2.07, rna: 0.1244},
{date: '9/16/2025', sample: 'ptc1b', dna: 2, a260: 3.15, ratio: 2.041, rna: 0.126},
{date: '9/18/2025', sample: 'ptc1b', dna: 2, a260: 1.77, ratio: 1.32, rna: 0.0708},
{date: '9/19/2025', sample: 'ptc1a', dna: 2, a260: 1.59, ratio: 2.053, rna: 0.0636},
{date: '9/19/2025', sample: 'ptc1b', dna: 2, a260: 2.94, ratio: 2.093, rna: 0.1176},
{date: '9/22/2025', sample: 'ptc1a', dna: 2, a260: 16.5, ratio: 1.884, rna: 0.66},
{date: '9/22/2025', sample: 'ptc1b', dna: 2, a260: 32.5, ratio: 1.932, rna: 1.3}
];
const data2 = [
{date: '8/1/2025', sample: 'Standard', dna: 1.5, a260: 4.6, ratio: 1.95, rna: 0.184},
{date: '8/1/2025', sample: 'T7 pol', dna: 1.5, a260: 0.66, ratio: 1.882, rna: 0.0264},
{date: '8/4/2025', sample: 'Standard', dna: 1.5, a260: 10.45, ratio: 1.94, rna: 0.418},
{date: '8/5/2025', sample: 'Standard', dna: 1.5, a260: 24.28, ratio: 2.012, rna: 0.9712},
{date: '8/6/2025', sample: 'T7 pol', dna: 2.0, a260: 0.163, ratio: 2.32, rna: 0.00652},
{date: '8/8/2025', sample: 'Standard', dna: 1.5, a260: 12.06, ratio: 1.804, rna: 0.4824},
{date: '8/12/2025', sample: 'Standard', dna: 1.5, a260: 17.95, ratio: 2.048, rna: 0.718},
{date: '8/15/2025', sample: 'Standard', dna: 1.5, a260: 17.884, ratio: 1.803, rna: 0.71536},
{date: '8/21/2025', sample: 'Standard', dna: 1.5, a260: 16.93, ratio: 2.127, rna: 0.6772},
{date: '9/11/2025', sample: '0.5µg', dna: 0.5, a260: 42.47, ratio: 2.28, rna: 1.6988},
{date: '9/11/2025', sample: '1.0µg', dna: 1.0, a260: 43.1962, ratio: 2.315, rna: 1.727848},
{date: '9/11/2025', sample: '1.5µg', dna: 1.5, a260: 50.6832, ratio: 2.291, rna: 2.027328},
{date: '9/11/2025', sample: 'Phenol 0.5µg', dna: 0.5, a260: 21.495, ratio: 2.24, rna: 0.8598},
{date: '9/11/2025', sample: 'Phenol 1.0µg', dna: 1.0, a260: 4.46, ratio: 1.884, rna: 0.1784},
{date: '9/11/2025', sample: 'Phenol 1.5µg', dna: 1.5, a260: 38.82, ratio: 2.27, rna: 1.5528}
];
// Combine data for table
const allData = [...data1, ...data2].sort((a, b) => new Date(a.date) - new Date(b.date));
// Populate table
const tableBody = document.querySelector('tbody');
allData.forEach(item => {
const row = document.createElement('tr');
row.innerHTML = `
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">${item.date}</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">${item.sample}</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">${item.dna}</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">${item.a260}</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">${item.ratio}</td>
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium ${item.rna > 1 ? 'text-green-600' : item.rna > 0.5 ? 'text-blue-600' : 'text-gray-600'}">${item.rna}</td>
`;
tableBody.appendChild(row);
});
// Yield Over Time Chart
const timeCtx = document.getElementById('yieldOverTimeChart').getContext('2d');
new Chart(timeCtx, {
type: 'line',
data: {
labels: allData.map(item => `${item.date} (${item.sample})`),
datasets: [{
label: 'RNA Yield (µg/µL)',
data: allData.map(item => item.rna),
backgroundColor: 'rgba(99, 102, 241, 0.2)',
borderColor: 'rgba(99, 102, 241, 1)',
borderWidth: 2,
tension: 0.1,
pointRadius: 4,
pointBackgroundColor: 'rgba(99, 102, 241, 1)'
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
scales: {
y: {
beginAtZero: true,
title: {
display: true,
text: 'RNA Concentration (µg/µL)'
}
},
x: {
ticks: {
maxRotation: 45,
minRotation: 45
}
}
},
plugins: {
tooltip: {
callbacks: {
label: function(context) {
return `RNA: ${context.parsed.y.toFixed(4)} µg/µL`;
},
afterLabel: function(context) {
const item = allData[context.dataIndex];
return `DNA: ${item.dna}µg\nA260/280: ${item.ratio}`;
}
}
}
}
}
});
// DNA vs RNA Chart
const dnaRnaCtx = document.getElementById('dnaVsRnaChart').getContext('2d');
new Chart(dnaRnaCtx, {
type: 'scatter',
data: {
datasets: [
{
label: '0.5µg DNA',
data: allData.filter(item => item.dna === 0.5).map(item => ({
x: item.dna,
y: item.rna,
sample: item.sample,
date: item.date
})),
backgroundColor: 'rgba(239, 68, 68, 0.7)',
pointRadius: 8
},
{
label: '1.0µg DNA',
data: allData.filter(item => item.dna === 1.0).map(item => ({
x: item.dna,
y: item.rna,
sample: item.sample,
date: item.date
})),
backgroundColor: 'rgba(16, 185, 129, 0.7)',
pointRadius: 8
},
{
label: '1.5µg DNA',
data: allData.filter(item => item.dna === 1.5).map(item => ({
x: item.dna,
y: item.rna,
sample: item.sample,
date: item.date
})),
backgroundColor: 'rgba(99, 102, 241, 0.7)',
pointRadius: 8
},
{
label: '2.0µg DNA',
data: allData.filter(item => item.dna === 2.0).map(item => ({
x: item.dna,
y: item.rna,
sample: item.sample,
date: item.date
})),
backgroundColor: 'rgba(245, 158, 11, 0.7)',
pointRadius: 8
},
{
label: '5.0µg DNA',
data: allData.filter(item => item.dna === 5.0).map(item => ({
x: item.dna,
y: item.rna,
sample: item.sample,
date: item.date
})),
backgroundColor: 'rgba(139, 92, 246, 0.7)',
pointRadius: 8
}
]
},
options: {
responsive: true,
maintainAspectRatio: false,
scales: {
y: {
beginAtZero: true,
title: {
display: true,
text: 'RNA Yield (µg/µL)'
}
},
x: {
title: {
display: true,
text: 'DNA Input (µg)'
},
ticks: {
stepSize: 0.5
}
}
},
plugins: {
tooltip: {
callbacks: {
label: function(context) {
return `RNA: ${context.parsed.y.toFixed(4)} µg/µL`;
},
afterLabel: function(context) {
const item = allData.find(item =>
item.dna === context.parsed.x &&
item.rna === context.parsed.y &&
item.date === context.raw.date
);
return `Sample: ${item.sample}\nDate: ${item.date}\nA260/280: ${item.ratio}`;
}
}
}
}
}
});
</script>
</body>
</html>