1 from django.db import models
2 from htsworkflow.frontend.samples.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)
8 run_date = models.DateTimeField()
9 advanced_run = models.BooleanField(default=False)
10 paired_end = models.BooleanField(default=False)
11 read_length = models.IntegerField(default=32) #Stanford is currenlty 25
13 lane_1_library = models.ForeignKey(Library, related_name="lane_1_library")
14 lane_2_library = models.ForeignKey(Library, related_name="lane_2_library")
15 lane_3_library = models.ForeignKey(Library, related_name="lane_3_library")
16 lane_4_library = models.ForeignKey(Library, related_name="lane_4_library")
17 lane_5_library = models.ForeignKey(Library, related_name="lane_5_library")
18 lane_6_library = models.ForeignKey(Library, related_name="lane_6_library")
19 lane_7_library = models.ForeignKey(Library, related_name="lane_7_library")
20 lane_8_library = models.ForeignKey(Library, related_name="lane_8_library")
22 lane_1_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
23 lane_2_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
24 lane_3_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
25 lane_4_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
26 lane_5_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
27 lane_6_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
28 lane_7_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
29 lane_8_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
31 lane_1_cluster_estimate = models.IntegerField(blank=True, null=True)
32 lane_2_cluster_estimate = models.IntegerField(blank=True, null=True)
33 lane_3_cluster_estimate = models.IntegerField(blank=True, null=True)
34 lane_4_cluster_estimate = models.IntegerField(blank=True, null=True)
35 lane_5_cluster_estimate = models.IntegerField(blank=True, null=True)
36 lane_6_cluster_estimate = models.IntegerField(blank=True, null=True)
37 lane_7_cluster_estimate = models.IntegerField(blank=True, null=True)
38 lane_8_cluster_estimate = models.IntegerField(blank=True, null=True)
40 # lane_1_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_1_primer")
41 # lane_2_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_2_primer")
42 # lane_3_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_3_primer")
43 # lane_4_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_4_primer")
44 # lane_5_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_5_primer")
45 # lane_6_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_6_primer")
46 # lane_7_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_7_primer")
47 # lane_8_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_8_primer")
53 ('Tinkerbell','Tinkerbell'),
58 ('EAS149','Stanford'),
61 ('Britney','Britney'),
64 cluster_mac_id = models.CharField(max_length=50, choices=CLUSTER_MAC, default='BitBit')
65 seq_mac_id = models.CharField(max_length=50, choices=SEQ_MAC, verbose_name = 'Sequencer', default='Britney')
67 notes = models.TextField(blank=True)
69 def __unicode__(self):
70 return unicode(self.flowcell_id)
74 str +='<a target=_balnk href="/experiments/'+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/experiments/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"]
91 ### -----------------------
92 class DataRun(models.Model):
93 ConfTemplate = "CONFIG PARAMS WILL BE GENERATED BY THE PIPELINE SCRIPT.\nYOU'LL BE ABLE TO EDIT AFTER IF NEEDED."
94 run_folder = models.CharField(max_length=50,unique=True, db_index=True)
95 fcid = models.ForeignKey(FlowCell,verbose_name="Flowcell Id")
96 config_params = models.TextField(default=ConfTemplate)
97 run_start_time = models.DateTimeField()
98 RUN_STATUS_CHOICES = (
99 (0, 'Sequencer running'), ##Solexa Data Pipeline Not Yet Started'),
100 (1, 'Data Pipeline Started'),
101 (2, 'Data Pipeline Interrupted'),
102 (3, 'Data Pipeline Finished'),
103 (4, 'CollectReads Started'),
104 (5, 'CollectReads Finished'),
108 run_status = models.IntegerField(choices=RUN_STATUS_CHOICES, default=0)
109 run_note = models.TextField(blank=True)
112 def main_status(self):
114 if self.run_status >= 5:
115 str += ' style="color:green">'
116 str += '<b>'+self.RUN_STATUS_CHOICES[self.run_status][1]+'</b>'
117 str += '<br/><br/>' #<span style="color:red;font-size:80%;">New!</span>'
118 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>'
120 str += '>'+self.RUN_STATUS_CHOICES[self.run_status][1]
124 main_status.allow_tags = True
126 main_status.allow_tags = True
128 def Flowcell_Info(self):
129 str = '<b>'+self.fcid.__str__()+'</b>'
130 str += ' (c: '+self.fcid.cluster_mac_id+', s: '+self.fcid.seq_mac_id+')'
131 str += '<div style="margin-top:5px;">'
132 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>'
133 str += '<div id="LanesOf'+self.fcid.__str__()+'" style="display:block;border:solid #cccccc 1px;width:350px">'
134 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+')'
135 str += LanesList ## self.fcid.Lanes()
137 str += '<div><a title="open Flowcell record" href="/admin/exp_track/flowcell/'+self.fcid.id.__str__()+'/" target=_self>Edit Flowcell record</a>'
138 #str += '<span style="color:red;font-size:80%;margin-left:15px;margin-right:3px">New!</span>'
139 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>'
143 Flowcell_Info.allow_tags = True