Merge in Rami's changes from last friday.
[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   read_length = models.IntegerField(default=32) #Stanford is currenlty 25
11   
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")
20
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)
29   
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)
38  
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")
47
48   #Machine Names
49   CLUSTER_MAC = (
50       ('M304','Cardinal'),
51       ('R349','R349'),
52       ('Tinkerbell','Tinkerbell'),
53       ('BitBit','BitBit'),
54     )
55   
56   SEQ_MAC = (
57       ('EAS149','Stanford'),
58       ('EAS46','EAS46'),
59       ('EAS45','Paris'),
60       ('Britney','Britney'),
61     )
62   
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')
65   
66   notes = models.TextField(blank=True)
67
68   def __unicode__(self):
69       return unicode(self.flowcell_id) 
70
71   def Create_LOG(self):
72     str = ''
73     str +='<a target=_balnk href="/experiments/'+self.flowcell_id+'" title="Create XLS like sheet for this Flowcell ..." ">Create LOG</a>'
74     try:
75       t = DataRun.objects.get(fcid=self.id)
76       str +='<br/><a target=_self href="/admin/experiments/datarun/?q='+self.flowcell_id+'" title="Check Data Runs ..." ">DataRun ..</a>'
77     except ObjectDoesNotExist:
78       str += '<br/><span style="color:red">not sequenced</span>'
79     return str
80   Create_LOG.allow_tags = True 
81
82   def Lanes(self):
83     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)
84   Lanes.allow_tags = True
85
86   class Meta:
87     ordering = ["-run_date"]
88   
89
90 ### -----------------------
91 class DataRun(models.Model):
92   ConfTemplate = "CONFIG PARAMS WILL BE GENERATED BY THE PIPELINE SCRIPT.\nYOU'LL BE ABLE TO EDIT AFTER IF NEEDED."
93   run_folder = models.CharField(max_length=50,unique=True, db_index=True)
94   fcid = models.ForeignKey(FlowCell,verbose_name="Flowcell Id")
95   config_params = models.TextField(default=ConfTemplate)
96   run_start_time = models.DateTimeField()
97   RUN_STATUS_CHOICES = (
98       (0, 'Sequencer running'), ##Solexa Data Pipeline Not Yet Started'),
99       (1, 'Data Pipeline Started'),
100       (2, 'Data Pipeline Interrupted'),
101       (3, 'Data Pipeline Finished'),
102       (4, 'CollectReads Started'),
103       (5, 'CollectReads Finished'),
104       (6, 'QC Finished'),
105       (7, 'DONE'),
106     )
107   run_status = models.IntegerField(choices=RUN_STATUS_CHOICES, default=0)
108   run_note = models.TextField(blank=True)
109
110
111   def main_status(self):
112     str = '<div'
113     if self.run_status >= 5:
114       str += ' style="color:green">'
115       str += '<b>'+self.RUN_STATUS_CHOICES[self.run_status][1]+'</b>'
116       str += '<br/><br/>' #<span style="color:red;font-size:80%;">New!</span>'
117       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>'
118     else:
119       str += '>'+self.RUN_STATUS_CHOICES[self.run_status][1]
120
121     str += '</div>'
122     return str
123   main_status.allow_tags = True
124
125   main_status.allow_tags = True
126   
127   def Flowcell_Info(self):
128     str = '<b>'+self.fcid.__str__()+'</b>'
129     str += '  (c: '+self.fcid.cluster_mac_id+',  s: '+self.fcid.seq_mac_id+')'
130     str += '<div style="margin-top:5px;">'    
131     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>'
132     str += '<div id="LanesOf'+self.fcid.__str__()+'" style="display:block;border:solid #cccccc 1px;width:350px">'
133     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+')'
134     str += LanesList ## self.fcid.Lanes()
135     str += '</div>'
136     str += '<div><a title="open Flowcell record" href="/admin/exp_track/flowcell/'+self.fcid.id.__str__()+'/" target=_self>Edit Flowcell record</a>'
137     #str += '<span style="color:red;font-size:80%;margin-left:15px;margin-right:3px">New!</span>'
138     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>'
139     str += '</div>'
140     str += '</div>'    
141     return str
142   Flowcell_Info.allow_tags = True