1 from django.db import models
2 from htswfrontend.fctracker.models import *
3 from django.core.exceptions import ObjectDoesNotExist
5 class FlowCell(models.Model):
7 flowcell_id = models.CharField(max_length=20, unique=True, db_index=True, core=True)
8 run_date = models.DateTimeField(core=True)
9 advanced_run = models.BooleanField(default=False)
10 read_length = models.IntegerField(default=32) #Stanford is currenlty 25
12 lane_1_library = models.ForeignKey(Library, related_name="lane_1_library")
13 lane_2_library = models.ForeignKey(Library, related_name="lane_2_library")
14 lane_3_library = models.ForeignKey(Library, related_name="lane_3_library")
15 lane_4_library = models.ForeignKey(Library, related_name="lane_4_library")
16 lane_5_library = models.ForeignKey(Library, related_name="lane_5_library")
17 lane_6_library = models.ForeignKey(Library, related_name="lane_6_library")
18 lane_7_library = models.ForeignKey(Library, related_name="lane_7_library")
19 lane_8_library = models.ForeignKey(Library, related_name="lane_8_library")
21 lane_1_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
22 lane_2_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
23 lane_3_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
24 lane_4_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
25 lane_5_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
26 lane_6_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
27 lane_7_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
28 lane_8_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
30 lane_1_cluster_estimate = models.IntegerField(blank=True, null=True)
31 lane_2_cluster_estimate = models.IntegerField(blank=True, null=True)
32 lane_3_cluster_estimate = models.IntegerField(blank=True, null=True)
33 lane_4_cluster_estimate = models.IntegerField(blank=True, null=True)
34 lane_5_cluster_estimate = models.IntegerField(blank=True, null=True)
35 lane_6_cluster_estimate = models.IntegerField(blank=True, null=True)
36 lane_7_cluster_estimate = models.IntegerField(blank=True, null=True)
37 lane_8_cluster_estimate = models.IntegerField(blank=True, null=True)
39 # lane_1_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_1_primer")
40 # lane_2_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_2_primer")
41 # lane_3_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_3_primer")
42 # lane_4_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_4_primer")
43 # lane_5_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_5_primer")
44 # lane_6_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_6_primer")
45 # lane_7_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_7_primer")
46 # lane_8_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_8_primer")
52 ('Tinkerbell','Tinkerbell'),
57 ('EAS149','Stanford'),
60 ('Britney','Britney'),
63 cluster_mac_id = models.CharField(max_length=50, choices=CLUSTER_MAC, default='BitBit')
64 seq_mac_id = models.CharField(max_length=50, choices=SEQ_MAC, verbose_name = 'Sequencer', default='Britney')
66 notes = models.TextField(blank=True)
69 #return '%s (%s)' % (self.flowcell_id, self.run_date)
70 return '%s' % (self.flowcell_id)
74 str +='<a target=_balnk href="/exp_track/'+self.flowcell_id+'" title="Create XLS like sheet for this Flowcell ..." ">Create LOG</a>'
76 t = DataRun.objects.get(fcid=self.id)
77 str +='<br/><a target=_self href="/admin/exp_track/datarun/?q='+self.flowcell_id+'" title="Check Data Runs ..." ">DataRun ..</a>'
78 except ObjectDoesNotExist:
79 str += '<br/><span style="color:red">not sequenced</span>'
81 Create_LOG.allow_tags = True
84 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)
85 Lanes.allow_tags = True
88 ordering = ["-run_date"]
92 date_hierarchy = "run_date"
94 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']
95 list_display = ('flowcell_id','seq_mac_id','run_date', 'Create_LOG','Lanes')
96 list_filter = ('seq_mac_id','cluster_mac_id')
99 'fields': ('run_date', ('flowcell_id','cluster_mac_id','seq_mac_id'), ('read_length'),)
102 ##'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'),)
103 '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'),)
106 'fields' : ('notes',)
111 ### -----------------------
112 class DataRun(models.Model):
113 ConfTemplate = "CONFIG PARAMS WILL BE GENERATED BY THE PIPELINE SCRIPT.\nYOU'LL BE ABLE TO EDIT AFTER IF NEEDED."
114 run_folder = models.CharField(max_length=50,unique=True, db_index=True)
115 fcid = models.ForeignKey(FlowCell,verbose_name="Flowcell Id")
116 config_params = models.TextField(default=ConfTemplate)
117 run_start_time = models.DateTimeField(core=True)
118 RUN_STATUS_CHOICES = (
119 (0, 'Sequencer running'), ##Solexa Data Pipeline Not Yet Started'),
120 (1, 'Data Pipeline Started'),
121 (2, 'Data Pipeline Interrupted'),
122 (3, 'Data Pipeline Finished'),
123 (4, 'CollectReads Started'),
124 (5, 'CollectReads Finished'),
128 run_status = models.IntegerField(choices=RUN_STATUS_CHOICES, default=0)
129 run_note = models.TextField(blank=True)
132 def main_status(self):
134 if self.run_status >= 5:
135 str += ' style="color:green">'
136 str += '<b>'+self.RUN_STATUS_CHOICES[self.run_status][1]+'</b>'
137 str += '<br/><br/>' #<span style="color:red;font-size:80%;">New!</span>'
138 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>'
140 str += '>'+self.RUN_STATUS_CHOICES[self.run_status][1]
144 main_status.allow_tags = True
146 main_status.allow_tags = True
148 def Flowcell_Info(self):
149 str = '<b>'+self.fcid.__str__()+'</b>'
150 str += ' (c: '+self.fcid.cluster_mac_id+', s: '+self.fcid.seq_mac_id+')'
151 str += '<div style="margin-top:5px;">'
152 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>'
153 str += '<div id="LanesOf'+self.fcid.__str__()+'" style="display:block;border:solid #cccccc 1px;width:350px">'
154 LanesList = '<div style="'+('background-color:#cccccc;' if 'Bad library' in self.fcid.lane_1_library.libtags() else '')+'">1: '+self.fcid.lane_1_library.__str__()+' ('+self.fcid.lane_1_library.library_species.use_genome_build+')</div> '
155 LanesList += '<div style="'+('background-color:#cccccc;' if 'Bad library' in self.fcid.lane_2_library.libtags() else '')+'">2: '+self.fcid.lane_2_library.__str__()+' ('+self.fcid.lane_2_library.library_species.use_genome_build+')</div>'
156 LanesList += '<div style="'+('background-color:#cccccc;' if 'Bad library' in self.fcid.lane_3_library.libtags() else '')+'">3: '+self.fcid.lane_3_library.__str__()+' ('+self.fcid.lane_3_library.library_species.use_genome_build+')</div>'
157 LanesList += '<div style="'+('background-color:#cccccc;' if 'Bad library' in self.fcid.lane_4_library.libtags() else '')+'">4: '+self.fcid.lane_4_library.__str__()+' ('+self.fcid.lane_4_library.library_species.use_genome_build+')</div>'
158 LanesList += '<div style="'+('background-color:#cccccc;' if 'Bad library' in self.fcid.lane_5_library.libtags() else '')+'">5: '+self.fcid.lane_5_library.__str__()+' ('+self.fcid.lane_5_library.library_species.use_genome_build+')</div>'
159 LanesList += '<div style="'+('background-color:#cccccc;' if 'Bad library' in self.fcid.lane_6_library.libtags() else '')+'">6: '+self.fcid.lane_6_library.__str__()+' ('+self.fcid.lane_6_library.library_species.use_genome_build+')</div>'
160 LanesList += '<div style="'+('background-color:#cccccc;' if 'Bad library' in self.fcid.lane_7_library.libtags() else '')+'">7: '+self.fcid.lane_7_library.__str__()+' ('+self.fcid.lane_7_library.library_species.use_genome_build+')</div>'
161 LanesList += '<div style="'+('background-color:#cccccc;' if 'Bad library' in self.fcid.lane_8_library.libtags() else '')+'">8: '+self.fcid.lane_8_library.__str__()+' ('+self.fcid.lane_8_library.library_species.use_genome_build+')</div>'
162 str += LanesList ## self.fcid.Lanes()
164 str += '<div><a title="open Flowcell record" href="/admin/exp_track/flowcell/'+self.fcid.id.__str__()+'/" target=_self>Edit Flowcell record</a>'
165 #str += '<span style="color:red;font-size:80%;margin-left:15px;margin-right:3px">New!</span>'
166 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>'
170 Flowcell_Info.allow_tags = True
173 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']
175 list_display = ('run_folder','Flowcell_Info','run_start_time','main_status','run_note')
176 list_filter = ('run_status','run_start_time')