1 from django.db import models
2 from htsworkflow.frontend.samples.models import *
3 from django.core.exceptions import ObjectDoesNotExist
5 class ClusterStation(models.Model):
6 name = models.CharField(max_length=50, unique=True)
9 return unicode(self.name)
11 class Sequencer(models.Model):
12 name = models.CharField(max_length=50, unique=True)
14 def __unicode__(self):
15 return unicode(self.name)
17 class FlowCell(models.Model):
19 flowcell_id = models.CharField(max_length=20, unique=True, db_index=True)
20 run_date = models.DateTimeField()
21 advanced_run = models.BooleanField(default=False)
22 paired_end = models.BooleanField(default=False)
23 read_length = models.IntegerField(default=32) #Stanford is currenlty 25
25 lane_1_library = models.ForeignKey(Library, related_name="lane_1_library")
26 lane_2_library = models.ForeignKey(Library, related_name="lane_2_library")
27 lane_3_library = models.ForeignKey(Library, related_name="lane_3_library")
28 lane_4_library = models.ForeignKey(Library, related_name="lane_4_library")
29 lane_5_library = models.ForeignKey(Library, related_name="lane_5_library")
30 lane_6_library = models.ForeignKey(Library, related_name="lane_6_library")
31 lane_7_library = models.ForeignKey(Library, related_name="lane_7_library")
32 lane_8_library = models.ForeignKey(Library, related_name="lane_8_library")
34 lane_1_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
35 lane_2_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
36 lane_3_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
37 lane_4_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
38 lane_5_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
39 lane_6_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
40 lane_7_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
41 lane_8_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
43 lane_1_cluster_estimate = models.IntegerField(blank=True, null=True)
44 lane_2_cluster_estimate = models.IntegerField(blank=True, null=True)
45 lane_3_cluster_estimate = models.IntegerField(blank=True, null=True)
46 lane_4_cluster_estimate = models.IntegerField(blank=True, null=True)
47 lane_5_cluster_estimate = models.IntegerField(blank=True, null=True)
48 lane_6_cluster_estimate = models.IntegerField(blank=True, null=True)
49 lane_7_cluster_estimate = models.IntegerField(blank=True, null=True)
50 lane_8_cluster_estimate = models.IntegerField(blank=True, null=True)
52 # lane_1_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_1_primer")
53 # lane_2_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_2_primer")
54 # lane_3_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_3_primer")
55 # lane_4_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_4_primer")
56 # lane_5_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_5_primer")
57 # lane_6_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_6_primer")
58 # lane_7_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_7_primer")
59 # lane_8_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_8_primer")
61 #cluster_mac_id = models.CharField(max_length=50, choices=CLUSTER_MAC, default='BitBit')
62 #seq_mac_id = models.CharField(max_length=50, choices=SEQ_MAC, verbose_name = 'Sequencer', default='Britney')
63 cluster_station = models.ForeignKey(ClusterStation)
64 sequencer = models.ForeignKey(Sequencer)
66 notes = models.TextField(blank=True)
68 def __unicode__(self):
69 return unicode(self.flowcell_id)
73 str +='<a target=_balnk href="/experiments/'+self.flowcell_id+'" title="Create XLS like sheet for this Flowcell ..." ">Create LOG</a>'
75 t = DataRun.objects.get(fcid=self.id)
76 str +='<br/><a target=_self href="/admin/experiments/datarun/?q='+self.flowcell_id+'" title="Check Data Runs ..." ">DataRun ..</a>'
77 except ObjectDoesNotExist:
78 str += '<br/><span style="color:red">not sequenced</span>'
80 Create_LOG.allow_tags = True
83 library_url = '/admin/samples/library/%s'
86 library_id = getattr(self, 'lane_%d_library_id' % i)
87 library = getattr(self, 'lane_%d_library' % i)
88 element = '<li><a href="%s">%s</a></li>'
89 html.append(element % (library_url % library_id, library))
91 return "\n".join(html)
92 Lanes.allow_tags = True
95 ordering = ["-run_date"]
97 ### -----------------------
98 class DataRun(models.Model):
99 ConfTemplate = "CONFIG PARAMS WILL BE GENERATED BY THE PIPELINE SCRIPT.\nYOU'LL BE ABLE TO EDIT AFTER IF NEEDED."
100 run_folder = models.CharField(max_length=50,unique=True, db_index=True)
101 fcid = models.ForeignKey(FlowCell,verbose_name="Flowcell Id")
102 config_params = models.TextField(default=ConfTemplate)
103 run_start_time = models.DateTimeField()
104 RUN_STATUS_CHOICES = (
105 (0, 'Sequencer running'), ##Solexa Data Pipeline Not Yet Started'),
106 (1, 'Data Pipeline Started'),
107 (2, 'Data Pipeline Interrupted'),
108 (3, 'Data Pipeline Finished'),
109 (4, 'CollectReads Started'),
110 (5, 'CollectReads Finished'),
114 run_status = models.IntegerField(choices=RUN_STATUS_CHOICES, default=0)
115 run_note = models.TextField(blank=True)
118 def main_status(self):
120 if self.run_status >= 5:
121 str += ' style="color:green">'
122 str += '<b>'+self.RUN_STATUS_CHOICES[self.run_status][1]+'</b>'
123 str += '<br/><br/>' #<span style="color:red;font-size:80%;">New!</span>'
124 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>'
126 str += '>'+self.RUN_STATUS_CHOICES[self.run_status][1]
130 main_status.allow_tags = True
132 main_status.allow_tags = True
134 def Flowcell_Info(self):
135 str = '<b>'+self.fcid.__str__()+'</b>'
136 str += ' (c: '+self.fcid.cluster_mac_id+', s: '+self.fcid.seq_mac_id+')'
137 str += '<div style="margin-top:5px;">'
138 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>'
139 str += '<div id="LanesOf'+self.fcid.__str__()+'" style="display:block;border:solid #cccccc 1px;width:350px">'
140 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+')'
141 str += LanesList ## self.fcid.Lanes()
143 str += '<div><a title="open Flowcell record" href="/admin/exp_track/flowcell/'+self.fcid.id.__str__()+'/" target=_self>Edit Flowcell record</a>'
144 #str += '<span style="color:red;font-size:80%;margin-left:15px;margin-right:3px">New!</span>'
145 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>'
149 Flowcell_Info.allow_tags = True