Remove a few more fields that we dont use, and change the Lanes display
[htsworkflow.git] / htsworkflow / frontend / experiments / models.py
1 from django.db import models
2 from htsworkflow.frontend.samples.models import *
3 from django.core.exceptions import ObjectDoesNotExist
4
5 class FlowCell(models.Model):
6   
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
12   
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")
21
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)
30   
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)
39  
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")
48
49   #Machine Names
50   CLUSTER_MAC = (
51       ('M304','Cardinal'),
52       ('R349','R349'),
53       ('Tinkerbell','Tinkerbell'),
54       ('BitBit','BitBit'),
55     )
56   
57   SEQ_MAC = (
58       ('EAS149','Stanford'),
59       ('EAS46','EAS46'),
60       ('EAS45','Paris'),
61       ('Britney','Britney'),
62     )
63   
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')
66   
67   notes = models.TextField(blank=True)
68
69   def __unicode__(self):
70       return unicode(self.flowcell_id) 
71
72   def Create_LOG(self):
73     str = ''
74     str +='<a target=_balnk href="/experiments/'+self.flowcell_id+'" title="Create XLS like sheet for this Flowcell ..." ">Create LOG</a>'
75     try:
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>'
80     return str
81   Create_LOG.allow_tags = True 
82
83   def Lanes(self):
84     library_url = '/admin/samples/library/%s' 
85     html = ['<ol>']
86     for i in range(1,9):
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))
91     html.append('</ol>')
92     return "\n".join(html)
93   Lanes.allow_tags = True
94
95   class Meta:
96     ordering = ["-run_date"]
97   
98
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'),
113       (6, 'QC Finished'),
114       (7, 'DONE'),
115     )
116   run_status = models.IntegerField(choices=RUN_STATUS_CHOICES, default=0)
117   run_note = models.TextField(blank=True)
118
119
120   def main_status(self):
121     str = '<div'
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>'
127     else:
128       str += '>'+self.RUN_STATUS_CHOICES[self.run_status][1]
129
130     str += '</div>'
131     return str
132   main_status.allow_tags = True
133
134   main_status.allow_tags = True
135   
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()
144     str += '</div>'
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>'
148     str += '</div>'
149     str += '</div>'    
150     return str
151   Flowcell_Info.allow_tags = True