print killing wsgi; minor fix.
[htsworkflow.git] / htsworkflow / frontend / experiments / models.py
1 from django.db import models
2 from htsworkflow.frontend.samples.models import *
3 from htsworkflow.frontend.settings import options
4 from django.core.exceptions import ObjectDoesNotExist
5 import logging
6
7 class ClusterStation(models.Model):
8   name = models.CharField(max_length=50, unique=True)
9
10   def __unicode__(self):
11     return unicode(self.name)
12
13 class Sequencer(models.Model):
14   name = models.CharField(max_length=50, unique=True)
15
16   def __unicode__(self):
17     return unicode(self.name)
18
19 default_pM = 5
20 try:
21   default_pM = int(options.get('frontend', 'default_pm'))
22 except ValueError,e:
23   logging.error("invalid value for frontend.default_pm")
24
25
26   
27
28 class FlowCell(models.Model):
29   
30   flowcell_id = models.CharField(max_length=20, unique=True, db_index=True)
31   run_date = models.DateTimeField()
32   advanced_run = models.BooleanField(default=False)
33   paired_end = models.BooleanField(default=False)
34   read_length = models.IntegerField(default=32) #Stanford is currenlty 25
35   
36   lane_1_library = models.ForeignKey(Library, related_name="lane_1_library")
37   lane_2_library = models.ForeignKey(Library, related_name="lane_2_library")
38   lane_3_library = models.ForeignKey(Library, related_name="lane_3_library")
39   lane_4_library = models.ForeignKey(Library, related_name="lane_4_library")
40   lane_5_library = models.ForeignKey(Library, related_name="lane_5_library")
41   lane_6_library = models.ForeignKey(Library, related_name="lane_6_library")
42   lane_7_library = models.ForeignKey(Library, related_name="lane_7_library")
43   lane_8_library = models.ForeignKey(Library, related_name="lane_8_library")
44
45   lane_1_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=default_pM)
46   lane_2_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=default_pM)
47   lane_3_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=default_pM)
48   lane_4_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=default_pM)
49   lane_5_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=default_pM)
50   lane_6_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=default_pM)
51   lane_7_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=default_pM)
52   lane_8_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=default_pM)
53   
54   lane_1_cluster_estimate = models.IntegerField(blank=True, null=True)
55   lane_2_cluster_estimate = models.IntegerField(blank=True, null=True)
56   lane_3_cluster_estimate = models.IntegerField(blank=True, null=True)
57   lane_4_cluster_estimate = models.IntegerField(blank=True, null=True)
58   lane_5_cluster_estimate = models.IntegerField(blank=True, null=True)
59   lane_6_cluster_estimate = models.IntegerField(blank=True, null=True)
60   lane_7_cluster_estimate = models.IntegerField(blank=True, null=True)
61   lane_8_cluster_estimate = models.IntegerField(blank=True, null=True)
62  
63   # lane_1_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_1_primer")
64   # lane_2_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_2_primer")
65   # lane_3_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_3_primer")
66   # lane_4_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_4_primer")
67   # lane_5_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_5_primer")
68   # lane_6_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_6_primer")
69   # lane_7_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_7_primer")
70   # lane_8_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_8_primer")
71
72   cluster_station = models.ForeignKey(ClusterStation, default=3)
73   sequencer = models.ForeignKey(Sequencer, default=1)
74   
75   notes = models.TextField(blank=True)
76
77   def __unicode__(self):
78       return unicode(self.flowcell_id) 
79
80   def Create_LOG(self):
81     str = ''
82     str +='<a target=_balnk href="/experiments/'+self.flowcell_id+'" title="Create XLS like sheet for this Flowcell ..." ">Create LOG</a>'
83     try:
84       t = DataRun.objects.get(fcid=self.id)
85       str +='<br/><a target=_self href="/admin/experiments/datarun/?q='+self.flowcell_id+'" title="Check Data Runs ..." ">DataRun ..</a>'
86     except ObjectDoesNotExist:
87       str += '<br/><span style="color:red">not sequenced</span>'
88     return str
89   Create_LOG.allow_tags = True 
90
91   def Lanes(self):
92     library_url = '/admin/samples/library/%s' 
93     html = ['<table>']
94     for i in range(1,9):
95         cluster_estimate = getattr(self, 'lane_%d_cluster_estimate' % (i,))
96         if cluster_estimate is not None:
97             cluster_estimate = "%s k" % ((int(cluster_estimate)/1000), )
98         else:
99             cluster_estimate = 'None'
100         library_id = getattr(self, 'lane_%d_library_id' % (i,))
101         library = getattr(self, 'lane_%d_library' % i)
102         element = '<tr><td>%d</td><td><a href="%s">%s</a></td><td>%s</td></tr>'
103         expanded_library_url = library_url %(library_id,)
104         html.append(element % (i, expanded_library_url, library, cluster_estimate))
105     html.append('</table>')
106     return "\n".join(html)
107   Lanes.allow_tags = True
108
109   class Meta:
110     ordering = ["-run_date"]
111   
112 ### -----------------------
113 class DataRun(models.Model):
114   ConfTemplate = "CONFIG PARAMS WILL BE GENERATED BY THE PIPELINE SCRIPT.\nYOU'LL BE ABLE TO EDIT AFTER IF NEEDED."
115   run_folder = models.CharField(max_length=50,unique=True, db_index=True)
116   fcid = models.ForeignKey(FlowCell,verbose_name="Flowcell Id")
117   config_params = models.TextField(default=ConfTemplate)
118   run_start_time = models.DateTimeField()
119   RUN_STATUS_CHOICES = (
120       (0, 'Sequencer running'), ##Solexa Data Pipeline Not Yet Started'),
121       (1, 'Data Pipeline Started'),
122       (2, 'Data Pipeline Interrupted'),
123       (3, 'Data Pipeline Finished'),
124       (4, 'CollectReads Started'),
125       (5, 'CollectReads Finished'),
126       (6, 'QC Finished'),
127       (7, 'DONE'),
128     )
129   run_status = models.IntegerField(choices=RUN_STATUS_CHOICES, default=0)
130   run_note = models.TextField(blank=True)
131
132
133   def main_status(self):
134     str = '<div'
135     if self.run_status >= 5:
136       str += ' style="color:green">'
137       str += '<b>'+self.RUN_STATUS_CHOICES[self.run_status][1]+'</b>'
138       str += '<br/><br/>' #<span style="color:red;font-size:80%;">New!</span>'
139       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     else:
141       str += '>'+self.RUN_STATUS_CHOICES[self.run_status][1]
142
143     str += '</div>'
144     return str
145   main_status.allow_tags = True
146
147   main_status.allow_tags = True
148   
149   def Flowcell_Info(self):
150     str = '<b>'+self.fcid.__str__()+'</b>'
151     str += '  (c: '+self.fcid.cluster_mac_id+',  s: '+self.fcid.seq_mac_id+')'
152     str += '<div style="margin-top:5px;">'    
153     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>'
154     str += '<div id="LanesOf'+self.fcid.__str__()+'" style="display:block;border:solid #cccccc 1px;width:350px">'
155     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+')'
156     str += LanesList ## self.fcid.Lanes()
157     str += '</div>'
158     str += '<div><a title="open Flowcell record" href="/admin/exp_track/flowcell/'+self.fcid.id.__str__()+'/" target=_self>Edit Flowcell record</a>'
159     #str += '<span style="color:red;font-size:80%;margin-left:15px;margin-right:3px">New!</span>'
160     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>'
161     str += '</div>'
162     str += '</div>'    
163     return str
164   Flowcell_Info.allow_tags = True
165
166
167 class Lane(models.Model):
168   flowcell = models.ForeignKey(FlowCell)
169   lane_number = models.IntegerField(choices=[(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8)])
170   library = models.ForeignKey(Library)
171   pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=default_pM)
172   cluster_estimate = models.IntegerField(blank=True, null=True)
173   comment = models.TextField(null=True, blank=True)