+import logging
+
+from django.core.exceptions import ObjectDoesNotExist
+from django.core import urlresolvers
from django.db import models
-from htswfrontend.fctracker.models import *
+
+from htsworkflow.frontend.samples.models import *
+from htsworkflow.frontend.settings import options
+
+class ClusterStation(models.Model):
+ name = models.CharField(max_length=50, unique=True)
+
+ def __unicode__(self):
+ return unicode(self.name)
+
+class Sequencer(models.Model):
+ name = models.CharField(max_length=50, unique=True)
+
+ def __unicode__(self):
+ return unicode(self.name)
+
+default_pM = 5
+try:
+ default_pM = int(options.get('frontend', 'default_pm'))
+except ValueError,e:
+ logging.error("invalid value for frontend.default_pm")
class FlowCell(models.Model):
- flowcell_id = models.CharField(max_length=20, unique=True, db_index=True, core=True)
- run_date = models.DateTimeField(core=True)
+ flowcell_id = models.CharField(max_length=20, unique=True, db_index=True)
+ run_date = models.DateTimeField()
advanced_run = models.BooleanField(default=False)
+ paired_end = models.BooleanField(default=False)
read_length = models.IntegerField(default=32) #Stanford is currenlty 25
-
- lane_1_library = models.ForeignKey(Library, related_name="lane_1_library")
- lane_2_library = models.ForeignKey(Library, related_name="lane_2_library")
- lane_3_library = models.ForeignKey(Library, related_name="lane_3_library")
- lane_4_library = models.ForeignKey(Library, related_name="lane_4_library")
- lane_5_library = models.ForeignKey(Library, related_name="lane_5_library")
- lane_6_library = models.ForeignKey(Library, related_name="lane_6_library")
- lane_7_library = models.ForeignKey(Library, related_name="lane_7_library")
- lane_8_library = models.ForeignKey(Library, related_name="lane_8_library")
-
- lane_1_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
- lane_2_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
- lane_3_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
- lane_4_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
- lane_5_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
- lane_6_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
- lane_7_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
- lane_8_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
-
- lane_1_cluster_estimate = models.IntegerField(blank=True, null=True)
- lane_2_cluster_estimate = models.IntegerField(blank=True, null=True)
- lane_3_cluster_estimate = models.IntegerField(blank=True, null=True)
- lane_4_cluster_estimate = models.IntegerField(blank=True, null=True)
- lane_5_cluster_estimate = models.IntegerField(blank=True, null=True)
- lane_6_cluster_estimate = models.IntegerField(blank=True, null=True)
- lane_7_cluster_estimate = models.IntegerField(blank=True, null=True)
- lane_8_cluster_estimate = models.IntegerField(blank=True, null=True)
-
- # lane_1_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_1_primer")
- # lane_2_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_2_primer")
- # lane_3_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_3_primer")
- # lane_4_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_4_primer")
- # lane_5_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_5_primer")
- # lane_6_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_6_primer")
- # lane_7_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_7_primer")
- # lane_8_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_8_primer")
-
- #Machine Names
- CLUSTER_MAC = (
- ('M304','Cardinal'),
- ('R349','R349'),
- ('Tinkerbell','Tinkerbell'),
- ('BitBit','BitBit'),
- )
-
- SEQ_MAC = (
- ('EAS149','Stanford'),
- ('EAS46','EAS46'),
- ('EAS45','Paris'),
- ('Britney','Britney'),
- )
-
- cluster_mac_id = models.CharField(max_length=50, choices=CLUSTER_MAC, default='BitBit')
- seq_mac_id = models.CharField(max_length=50, choices=SEQ_MAC, verbose_name = 'Sequencer', default='Britney')
+ control_lane = models.IntegerField(choices=[(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8)], null=True)
+
+ cluster_station = models.ForeignKey(ClusterStation, default=3)
+ sequencer = models.ForeignKey(Sequencer, default=1)
notes = models.TextField(blank=True)
- def __str__(self):
- #return '%s (%s)' % (self.flowcell_id, self.run_date)
- return '%s' % (self.flowcell_id)
+ def __unicode__(self):
+ return unicode(self.flowcell_id)
def Create_LOG(self):
- str = '' #<span style="color:red;font-size:80%;margin-right:3px">New!</span>'
- str +='<a target=_balnk href="/exp_track/'+self.flowcell_id+'" title="Create XLS like sheet for this Flowcell ..." ">Create LOG</a>'
+ str = ''
+ str +='<a target=_balnk href="/experiments/'+self.flowcell_id+'" title="Create XLS like sheet for this Flowcell ..." ">Create LOG</a>'
+ try:
+ t = DataRun.objects.get(fcid=self.id)
+ str +='<br/><a target=_self href="/admin/experiments/datarun/?q='+self.flowcell_id+'" title="Check Data Runs ..." ">DataRun ..</a>'
+ except ObjectDoesNotExist:
+ str += '<br/><span style="color:red">not sequenced</span>'
return str
Create_LOG.allow_tags = True
def Lanes(self):
- return '<div><span style="margin-right:10px">1)%s</span><span style="margin-right:10px">2)%s</span><span style="margin-right:10px">3)%s</span><span style="margin-right:10px">4)%s</span><span style="margin-right:10px">5)%s</span><span style="margin-right:10px">6)%s</span><span style="margin-right:10px">7)%s</span><span style="margin-right:10px">8)%s</span></div>' % (self.lane_1_library,self.lane_2_library,self.lane_3_library,self.lane_4_library,self.lane_5_library,self.lane_6_library,self.lane_7_library,self.lane_8_library)
+ library_url = '/admin/samples/library/%s'
+ html = ['<table>']
+ #for i in range(1,9):
+ for lane in self.lane_set.all():
+ cluster_estimate = lane.cluster_estimate
+ if cluster_estimate is not None:
+ cluster_estimate = "%s k" % ((int(cluster_estimate)/1000), )
+ else:
+ cluster_estimate = 'None'
+ library_id = lane.library_id
+ library = lane.library
+ element = '<tr><td>%d</td><td><a href="%s">%s</a></td><td>%s</td></tr>'
+ expanded_library_url = library_url %(library_id,)
+ html.append(element % (lane.lane_number, expanded_library_url, library, cluster_estimate))
+ html.append('</table>')
+ return "\n".join(html)
Lanes.allow_tags = True
-
+
class Meta:
ordering = ["-run_date"]
-
- class Admin:
- save_on_top = True
- date_hierarchy = "run_date"
- save_on_top = True
- search_fields = ['flowcell_id','seq_mac_id','cluster_mac_id','=lane_1_library__library_id','=lane_2_library__library_id','=lane_3_library__library_id','=lane_4_library__library_id','=lane_5_library__library_id','=lane_6_library__library_id','=lane_7_library__library_id','=lane_8_library__library_id']
- list_display = ('flowcell_id','seq_mac_id','run_date', 'Create_LOG','Lanes')
- list_filter = ('seq_mac_id','cluster_mac_id')
- fields = (
- (None, {
- 'fields': ('run_date', ('flowcell_id','cluster_mac_id','seq_mac_id'), ('read_length'),)
- }),
- ('Lanes:', {
- ##'fields' : (('lane_1_library', 'lane_1_pM', 'lane_1_cluster_estimate', 'lane_1_primer'), ('lane_2_library', 'lane_2_pM', 'lane_2_cluster_estimate', 'lane_2_primer'), ('lane_3_library', 'lane_3_pM', 'lane_3_cluster_estimate', 'lane_3_primer'), ('lane_4_library', 'lane_4_pM', 'lane_4_cluster_estimate', 'lane_4_primer'), ('lane_5_library', 'lane_5_pM', 'lane_5_cluster_estimate', 'lane_5_primer'), ('lane_6_library', 'lane_6_pM', 'lane_6_cluster_estimate', 'lane_6_primer'), ('lane_7_library', 'lane_7_pM', 'lane_7_cluster_estimate', 'lane_7_primer'), ('lane_8_library', 'lane_8_pM', 'lane_8_cluster_estimate', 'lane_8_primer'),)
- 'fields' : (('lane_1_library', 'lane_1_pM', 'lane_1_cluster_estimate'), ('lane_2_library', 'lane_2_pM', 'lane_2_cluster_estimate'), ('lane_3_library', 'lane_3_pM', 'lane_3_cluster_estimate'), ('lane_4_library', 'lane_4_pM', 'lane_4_cluster_estimate'), ('lane_5_library', 'lane_5_pM', 'lane_5_cluster_estimate'), ('lane_6_library', 'lane_6_pM', 'lane_6_cluster_estimate'), ('lane_7_library', 'lane_7_pM', 'lane_7_cluster_estimate'), ('lane_8_library', 'lane_8_pM', 'lane_8_cluster_estimate'),)
- }),
- (None, {
- 'fields' : ('notes',)
- }),
- )
+ def get_admin_url(self):
+ # that's the django way... except it didn't work
+ #return urlresolvers.reverse('admin_experiments_FlowCell_change', args=(self.id,))
+ return '/admin/experiments/flowcell/%s/' % (self.id,)
+ def flowcell_type(self):
+ """
+ Convert our boolean 'is paired' flag to a name
+ """
+ if self.paired_end:
+ return u"Paired"
+ else:
+ return u"Single"
+
### -----------------------
class DataRun(models.Model):
ConfTemplate = "CONFIG PARAMS WILL BE GENERATED BY THE PIPELINE SCRIPT.\nYOU'LL BE ABLE TO EDIT AFTER IF NEEDED."
run_folder = models.CharField(max_length=50,unique=True, db_index=True)
fcid = models.ForeignKey(FlowCell,verbose_name="Flowcell Id")
config_params = models.TextField(default=ConfTemplate)
- run_start_time = models.DateTimeField(core=True)
+ run_start_time = models.DateTimeField()
RUN_STATUS_CHOICES = (
(0, 'Sequencer running'), ##Solexa Data Pipeline Not Yet Started'),
(1, 'Data Pipeline Started'),
str += ' style="color:green">'
str += '<b>'+self.RUN_STATUS_CHOICES[self.run_status][1]+'</b>'
str += '<br/><br/>' #<span style="color:red;font-size:80%;">New!</span>'
- str +='<br/><a target=_balnk href="http://m304-apple-server.stanford.edu/'+self.fcid.flowcell_id+'_QC/'+self.fcid.flowcell_id+'_'+self.run_folder+'_QC_Summary.html" title="View QC Summaries of this run ..." ">View QC Page</a>'
+ str +='<br/><a target=_balnk href="'+settings.TASKS_PROJS_SERVER+'/Flowcells/'+self.fcid.flowcell_id+'/'+self.fcid.flowcell_id+'_QC_Summary.html" title="View QC Summaries of this run ..." ">View QC Page</a>'
else:
str += '>'+self.RUN_STATUS_CHOICES[self.run_status][1]
return str
Flowcell_Info.allow_tags = True
- class Admin:
- search_fields = ['run_folder','run_note','config_params','=fcid__lane_1_library__library_id','=fcid__lane_2_library__library_id','=fcid__lane_3_library__library_id','=fcid__lane_4_library__library_id','=fcid__lane_5_library__library_id','=fcid__lane_6_library__library_id','=fcid__lane_7_library__library_id','=fcid__lane_8_library__library_id']
- list_display = ('run_folder','Flowcell_Info','run_start_time','main_status','run_note')
- list_filter = ('run_status','run_start_time')
+class Lane(models.Model):
+ flowcell = models.ForeignKey(FlowCell)
+ lane_number = models.IntegerField(choices=[(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8)])
+ library = models.ForeignKey(Library)
+ pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=default_pM)
+ cluster_estimate = models.IntegerField(blank=True, null=True)
+ comment = models.TextField(null=True, blank=True)