Merged much of the stanford htsworkflow frontend into trunk.
[htsworkflow.git] / htsworkflow / frontend / experiments / models.py
1 from django.db import models
2 from htsworkflow.frontend.samples.models import *
3
4 class FlowCell(models.Model):
5   
6   flowcell_id = models.CharField(max_length=20, unique=True, db_index=True)
7   run_date = models.DateTimeField()
8   advanced_run = models.BooleanField(default=False)
9   read_length = models.IntegerField(default=32) #Stanford is currenlty 25
10   
11   lane_1_library = models.ForeignKey(Library, related_name="lane_1_library")
12   lane_2_library = models.ForeignKey(Library, related_name="lane_2_library")
13   lane_3_library = models.ForeignKey(Library, related_name="lane_3_library")
14   lane_4_library = models.ForeignKey(Library, related_name="lane_4_library")
15   lane_5_library = models.ForeignKey(Library, related_name="lane_5_library")
16   lane_6_library = models.ForeignKey(Library, related_name="lane_6_library")
17   lane_7_library = models.ForeignKey(Library, related_name="lane_7_library")
18   lane_8_library = models.ForeignKey(Library, related_name="lane_8_library")
19
20   lane_1_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
21   lane_2_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
22   lane_3_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
23   lane_4_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
24   lane_5_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
25   lane_6_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
26   lane_7_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
27   lane_8_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
28   
29   lane_1_cluster_estimate = models.IntegerField(blank=True, null=True)
30   lane_2_cluster_estimate = models.IntegerField(blank=True, null=True)
31   lane_3_cluster_estimate = models.IntegerField(blank=True, null=True)
32   lane_4_cluster_estimate = models.IntegerField(blank=True, null=True)
33   lane_5_cluster_estimate = models.IntegerField(blank=True, null=True)
34   lane_6_cluster_estimate = models.IntegerField(blank=True, null=True)
35   lane_7_cluster_estimate = models.IntegerField(blank=True, null=True)
36   lane_8_cluster_estimate = models.IntegerField(blank=True, null=True)
37  
38   # lane_1_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_1_primer")
39   # lane_2_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_2_primer")
40   # lane_3_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_3_primer")
41   # lane_4_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_4_primer")
42   # lane_5_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_5_primer")
43   # lane_6_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_6_primer")
44   # lane_7_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_7_primer")
45   # lane_8_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_8_primer")
46
47   #Machine Names
48   CLUSTER_MAC = (
49       ('M304','Cardinal'),
50       ('R349','R349'),
51       ('Tinkerbell','Tinkerbell'),
52       ('BitBit','BitBit'),
53     )
54   
55   SEQ_MAC = (
56       ('EAS149','Stanford'),
57       ('EAS46','EAS46'),
58       ('EAS45','Paris'),
59       ('Britney','Britney'),
60     )
61   
62   cluster_mac_id = models.CharField(max_length=50, choices=CLUSTER_MAC, default='BitBit')
63   seq_mac_id = models.CharField(max_length=50, choices=SEQ_MAC, verbose_name = 'Sequencer', default='Britney')
64   
65   notes = models.TextField(blank=True)
66
67   def __unicode__(self):
68       return unicode(self.flowcell_id) 
69
70   def Create_LOG(self):
71     str = '' #<span style="color:red;font-size:80%;margin-right:3px">New!</span>'
72     str +='<a target=_balnk href="/experiments/'+self.flowcell_id+'" title="Create XLS like sheet for this Flowcell ..." ">Create LOG</a>'
73     return str
74   Create_LOG.allow_tags = True 
75
76   def Lanes(self):
77     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)
78   Lanes.allow_tags = True
79  
80
81
82 ### -----------------------
83 class DataRun(models.Model):
84   ConfTemplate = "CONFIG PARAMS WILL BE GENERATED BY THE PIPELINE SCRIPT.\nYOU'LL BE ABLE TO EDIT AFTER IF NEEDED."
85   run_folder = models.CharField(max_length=50,unique=True, db_index=True)
86   fcid = models.ForeignKey(FlowCell,verbose_name="Flowcell Id")
87   config_params = models.TextField(default=ConfTemplate)
88   run_start_time = models.DateTimeField()
89   RUN_STATUS_CHOICES = (
90       (0, 'Sequencer running'), ##Solexa Data Pipeline Not Yet Started'),
91       (1, 'Data Pipeline Started'),
92       (2, 'Data Pipeline Interrupted'),
93       (3, 'Data Pipeline Finished'),
94       (4, 'CollectReads Started'),
95       (5, 'CollectReads Finished'),
96       (6, 'QC Finished'),
97       (7, 'DONE'),
98     )
99   run_status = models.IntegerField(choices=RUN_STATUS_CHOICES, default=0)
100   run_note = models.TextField(blank=True)
101
102
103   def main_status(self):
104     str = '<div'
105     if self.run_status >= 5:
106       str += ' style="color:green">'
107       str += '<b>'+self.RUN_STATUS_CHOICES[self.run_status][1]+'</b>'
108       str += '<br/><br/>' #<span style="color:red;font-size:80%;">New!</span>'
109       str +='<br/><a target=_balnk href="http://m304-apple-server.stanford.edu/'+self.fcid.flowcell_id+'_QC/'+self.fcid.flowcell_id+'_'+self.run_folder+'_QC_Summary.html" title="View QC Summaries of this run ..." ">View QC Page</a>'
110     else:
111       str += '>'+self.RUN_STATUS_CHOICES[self.run_status][1]
112
113     str += '</div>'
114     return str
115   main_status.allow_tags = True
116
117   main_status.allow_tags = True
118   
119   def Flowcell_Info(self):
120     str = '<b>'+self.fcid.__str__()+'</b>'
121     str += '  (c: '+self.fcid.cluster_mac_id+',  s: '+self.fcid.seq_mac_id+')'
122     str += '<div style="margin-top:5px;">'    
123     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>'
124     str += '<div id="LanesOf'+self.fcid.__str__()+'" style="display:block;border:solid #cccccc 1px;width:350px">'
125     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+')'
126     str += LanesList ## self.fcid.Lanes()
127     str += '</div>'
128     str += '<div><a title="open Flowcell record" href="/admin/exp_track/flowcell/'+self.fcid.id.__str__()+'/" target=_self>Edit Flowcell record</a>'
129     #str += '<span style="color:red;font-size:80%;margin-left:15px;margin-right:3px">New!</span>'
130     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>'
131     str += '</div>'
132     str += '</div>'    
133     return str
134   Flowcell_Info.allow_tags = True
135