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 library_url = '/admin/samples/library/%s'
87 library_id = getattr(self, 'lane_%d_library_id' % i)
88 library = getattr(self, 'lane_%d_library' % i)
89 element = '<li><a href="%s">%s</a></li>'
90 html.append(element % (library_url % library_id, library))
92 return "\n".join(html)
93 Lanes.allow_tags = True
96 ordering = ["-run_date"]
99 ### -----------------------
100 class DataRun(models.Model):
101 ConfTemplate = "CONFIG PARAMS WILL BE GENERATED BY THE PIPELINE SCRIPT.\nYOU'LL BE ABLE TO EDIT AFTER IF NEEDED."
102 run_folder = models.CharField(max_length=50,unique=True, db_index=True)
103 fcid = models.ForeignKey(FlowCell,verbose_name="Flowcell Id")
104 config_params = models.TextField(default=ConfTemplate)
105 run_start_time = models.DateTimeField()
106 RUN_STATUS_CHOICES = (
107 (0, 'Sequencer running'), ##Solexa Data Pipeline Not Yet Started'),
108 (1, 'Data Pipeline Started'),
109 (2, 'Data Pipeline Interrupted'),
110 (3, 'Data Pipeline Finished'),
111 (4, 'CollectReads Started'),
112 (5, 'CollectReads Finished'),
116 run_status = models.IntegerField(choices=RUN_STATUS_CHOICES, default=0)
117 run_note = models.TextField(blank=True)
120 def main_status(self):
122 if self.run_status >= 5:
123 str += ' style="color:green">'
124 str += '<b>'+self.RUN_STATUS_CHOICES[self.run_status][1]+'</b>'
125 str += '<br/><br/>' #<span style="color:red;font-size:80%;">New!</span>'
126 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>'
128 str += '>'+self.RUN_STATUS_CHOICES[self.run_status][1]
132 main_status.allow_tags = True
134 main_status.allow_tags = True
136 def Flowcell_Info(self):
137 str = '<b>'+self.fcid.__str__()+'</b>'
138 str += ' (c: '+self.fcid.cluster_mac_id+', s: '+self.fcid.seq_mac_id+')'
139 str += '<div style="margin-top:5px;">'
140 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>'
141 str += '<div id="LanesOf'+self.fcid.__str__()+'" style="display:block;border:solid #cccccc 1px;width:350px">'
142 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+')'
143 str += LanesList ## self.fcid.Lanes()
145 str += '<div><a title="open Flowcell record" href="/admin/exp_track/flowcell/'+self.fcid.id.__str__()+'/" target=_self>Edit Flowcell record</a>'
146 #str += '<span style="color:red;font-size:80%;margin-left:15px;margin-right:3px">New!</span>'
147 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>'
151 Flowcell_Info.allow_tags = True