1 from django.db import models
2 from htsworkflow.frontend.samples.models import *
3 from htsworkflow.frontend.settings import options
4 from django.core.exceptions import ObjectDoesNotExist
7 class ClusterStation(models.Model):
8 name = models.CharField(max_length=50, unique=True)
10 def __unicode__(self):
11 return unicode(self.name)
13 class Sequencer(models.Model):
14 name = models.CharField(max_length=50, unique=True)
16 def __unicode__(self):
17 return unicode(self.name)
21 default_pM = int(options.get('frontend', 'default_pm'))
23 logging.error("invalid value for frontend.default_pm")
28 class FlowCell(models.Model):
30 flowcell_id = models.CharField(max_length=20, unique=True, db_index=True)
31 run_date = models.DateTimeField()
32 advanced_run = models.BooleanField(default=False)
33 paired_end = models.BooleanField(default=False)
34 read_length = models.IntegerField(default=32) #Stanford is currenlty 25
36 lane_1_library = models.ForeignKey(Library, related_name="lane_1_library")
37 lane_2_library = models.ForeignKey(Library, related_name="lane_2_library")
38 lane_3_library = models.ForeignKey(Library, related_name="lane_3_library")
39 lane_4_library = models.ForeignKey(Library, related_name="lane_4_library")
40 lane_5_library = models.ForeignKey(Library, related_name="lane_5_library")
41 lane_6_library = models.ForeignKey(Library, related_name="lane_6_library")
42 lane_7_library = models.ForeignKey(Library, related_name="lane_7_library")
43 lane_8_library = models.ForeignKey(Library, related_name="lane_8_library")
45 lane_1_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=default_pM)
46 lane_2_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=default_pM)
47 lane_3_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=default_pM)
48 lane_4_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=default_pM)
49 lane_5_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=default_pM)
50 lane_6_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=default_pM)
51 lane_7_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=default_pM)
52 lane_8_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=default_pM)
54 lane_1_cluster_estimate = models.IntegerField(blank=True, null=True)
55 lane_2_cluster_estimate = models.IntegerField(blank=True, null=True)
56 lane_3_cluster_estimate = models.IntegerField(blank=True, null=True)
57 lane_4_cluster_estimate = models.IntegerField(blank=True, null=True)
58 lane_5_cluster_estimate = models.IntegerField(blank=True, null=True)
59 lane_6_cluster_estimate = models.IntegerField(blank=True, null=True)
60 lane_7_cluster_estimate = models.IntegerField(blank=True, null=True)
61 lane_8_cluster_estimate = models.IntegerField(blank=True, null=True)
63 # lane_1_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_1_primer")
64 # lane_2_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_2_primer")
65 # lane_3_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_3_primer")
66 # lane_4_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_4_primer")
67 # lane_5_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_5_primer")
68 # lane_6_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_6_primer")
69 # lane_7_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_7_primer")
70 # lane_8_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_8_primer")
72 cluster_station = models.ForeignKey(ClusterStation, default=3)
73 sequencer = models.ForeignKey(Sequencer, default=1)
75 notes = models.TextField(blank=True)
77 def __unicode__(self):
78 return unicode(self.flowcell_id)
82 str +='<a target=_balnk href="/experiments/'+self.flowcell_id+'" title="Create XLS like sheet for this Flowcell ..." ">Create LOG</a>'
84 t = DataRun.objects.get(fcid=self.id)
85 str +='<br/><a target=_self href="/admin/experiments/datarun/?q='+self.flowcell_id+'" title="Check Data Runs ..." ">DataRun ..</a>'
86 except ObjectDoesNotExist:
87 str += '<br/><span style="color:red">not sequenced</span>'
89 Create_LOG.allow_tags = True
92 library_url = '/admin/samples/library/%s'
95 cluster_estimate = getattr(self, 'lane_%d_cluster_estimate' % (i,))
96 if cluster_estimate is not None:
97 cluster_estimate = "%s k" % ((int(cluster_estimate)/1000), )
99 cluster_estimate = 'None'
100 library_id = getattr(self, 'lane_%d_library_id' % (i,))
101 library = getattr(self, 'lane_%d_library' % i)
102 element = '<tr><td>%d</td><td><a href="%s">%s</a></td><td>%s</td></tr>'
103 expanded_library_url = library_url %(library_id,)
104 html.append(element % (i, expanded_library_url, library, cluster_estimate))
105 html.append('</table>')
106 return "\n".join(html)
107 Lanes.allow_tags = True
110 ordering = ["-run_date"]
112 ### -----------------------
113 class DataRun(models.Model):
114 ConfTemplate = "CONFIG PARAMS WILL BE GENERATED BY THE PIPELINE SCRIPT.\nYOU'LL BE ABLE TO EDIT AFTER IF NEEDED."
115 run_folder = models.CharField(max_length=50,unique=True, db_index=True)
116 fcid = models.ForeignKey(FlowCell,verbose_name="Flowcell Id")
117 config_params = models.TextField(default=ConfTemplate)
118 run_start_time = models.DateTimeField()
119 RUN_STATUS_CHOICES = (
120 (0, 'Sequencer running'), ##Solexa Data Pipeline Not Yet Started'),
121 (1, 'Data Pipeline Started'),
122 (2, 'Data Pipeline Interrupted'),
123 (3, 'Data Pipeline Finished'),
124 (4, 'CollectReads Started'),
125 (5, 'CollectReads Finished'),
129 run_status = models.IntegerField(choices=RUN_STATUS_CHOICES, default=0)
130 run_note = models.TextField(blank=True)
133 def main_status(self):
135 if self.run_status >= 5:
136 str += ' style="color:green">'
137 str += '<b>'+self.RUN_STATUS_CHOICES[self.run_status][1]+'</b>'
138 str += '<br/><br/>' #<span style="color:red;font-size:80%;">New!</span>'
139 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>'
141 str += '>'+self.RUN_STATUS_CHOICES[self.run_status][1]
145 main_status.allow_tags = True
147 main_status.allow_tags = True
149 def Flowcell_Info(self):
150 str = '<b>'+self.fcid.__str__()+'</b>'
151 str += ' (c: '+self.fcid.cluster_mac_id+', s: '+self.fcid.seq_mac_id+')'
152 str += '<div style="margin-top:5px;">'
153 str +='<a title="View Lane List here ..." onClick="el = document.getElementById(\'LanesOf'+self.fcid.__str__()+'\');if(el) (el.style.display==\'none\'?el.style.display=\'block\':el.style.display=\'none\')" style="cursor:pointer;color: #5b80b2;">View/hide lanes</a>'
154 str += '<div id="LanesOf'+self.fcid.__str__()+'" style="display:block;border:solid #cccccc 1px;width:350px">'
155 LanesList = '1: '+self.fcid.lane_1_library.__str__()+' ('+self.fcid.lane_1_library.library_species.use_genome_build+')<br/>2: '+self.fcid.lane_2_library.__str__()+' ('+self.fcid.lane_2_library.library_species.use_genome_build+')<br/>3: '+self.fcid.lane_3_library.__str__()+' ('+self.fcid.lane_3_library.library_species.use_genome_build+')<br/>4: '+self.fcid.lane_4_library.__str__()+' ('+self.fcid.lane_4_library.library_species.use_genome_build+')<br/>5: '+self.fcid.lane_5_library.__str__()+' ('+self.fcid.lane_5_library.library_species.use_genome_build+')<br/>6: '+self.fcid.lane_6_library.__str__()+' ('+self.fcid.lane_6_library.library_species.use_genome_build+')<br/>7: '+self.fcid.lane_7_library.__str__()+' ('+self.fcid.lane_7_library.library_species.use_genome_build+')<br/>8: '+self.fcid.lane_8_library.__str__()+' ('+self.fcid.lane_8_library.library_species.use_genome_build+')'
156 str += LanesList ## self.fcid.Lanes()
158 str += '<div><a title="open Flowcell record" href="/admin/exp_track/flowcell/'+self.fcid.id.__str__()+'/" target=_self>Edit Flowcell record</a>'
159 #str += '<span style="color:red;font-size:80%;margin-left:15px;margin-right:3px">New!</span>'
160 str +='<a style="margin-left:15px;" target=_balnk href="/exp_track/'+self.fcid.flowcell_id+'" title="View XLS like sheet for this Flowcell LOG ..." ">GA LOG Page</a>'
164 Flowcell_Info.allow_tags = True
167 class Lane(models.Model):
168 flowcell = models.ForeignKey(FlowCell)
169 lane_number = models.IntegerField(choices=[(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8)])
170 library = models.ForeignKey(Library)
171 pm = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=default_pM)
172 cluster_estimate = models.IntegerField(blank=True, null=True)
173 comment = models.TextField(null=True, blank=True)