This is a partial merge of the stanford branch with the caltech branch of
[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(core=True)
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 __str__(self):
68     #return '%s (%s)' % (self.flowcell_id, self.run_date) 
69     return '%s' % (self.flowcell_id) 
70
71   def Create_LOG(self):
72     str = '' #<span style="color:red;font-size:80%;margin-right:3px">New!</span>'
73     str +='<a target=_balnk href="/exp_track/'+self.flowcell_id+'" title="Create XLS like sheet for this Flowcell ..." ">Create LOG</a>'
74     return str
75   Create_LOG.allow_tags = True 
76
77   def Lanes(self):
78     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)
79   Lanes.allow_tags = True
80  
81   class Meta:
82     ordering = ["-run_date"]
83   
84   class Admin:
85     save_on_top = True
86     date_hierarchy = "run_date"
87     save_on_top = True
88     search_fields = ['flowcell_id','seq_mac_id','cluster_mac_id','=lane_1_library__library_id','=lane_2_library__library_id','=lane_3_library__library_id','=lane_4_library__library_id','=lane_5_library__library_id','=lane_6_library__library_id','=lane_7_library__library_id','=lane_8_library__library_id']
89     list_display = ('flowcell_id','seq_mac_id','run_date', 'Create_LOG','Lanes')
90     list_filter = ('seq_mac_id','cluster_mac_id')
91     fields = (
92         (None, {
93             'fields': ('run_date', ('flowcell_id','cluster_mac_id','seq_mac_id'), ('read_length'),)
94         }),
95         ('Lanes:', {
96             ##'fields' : (('lane_1_library', 'lane_1_pM', 'lane_1_cluster_estimate', 'lane_1_primer'), ('lane_2_library', 'lane_2_pM', 'lane_2_cluster_estimate', 'lane_2_primer'), ('lane_3_library', 'lane_3_pM', 'lane_3_cluster_estimate', 'lane_3_primer'), ('lane_4_library', 'lane_4_pM', 'lane_4_cluster_estimate', 'lane_4_primer'), ('lane_5_library', 'lane_5_pM', 'lane_5_cluster_estimate', 'lane_5_primer'), ('lane_6_library', 'lane_6_pM', 'lane_6_cluster_estimate', 'lane_6_primer'), ('lane_7_library', 'lane_7_pM', 'lane_7_cluster_estimate', 'lane_7_primer'), ('lane_8_library', 'lane_8_pM', 'lane_8_cluster_estimate', 'lane_8_primer'),)
97            'fields' : (('lane_1_library', 'lane_1_pM', 'lane_1_cluster_estimate'), ('lane_2_library', 'lane_2_pM', 'lane_2_cluster_estimate'), ('lane_3_library', 'lane_3_pM', 'lane_3_cluster_estimate'), ('lane_4_library', 'lane_4_pM', 'lane_4_cluster_estimate'), ('lane_5_library', 'lane_5_pM', 'lane_5_cluster_estimate'), ('lane_6_library', 'lane_6_pM', 'lane_6_cluster_estimate'), ('lane_7_library', 'lane_7_pM', 'lane_7_cluster_estimate'), ('lane_8_library', 'lane_8_pM', 'lane_8_cluster_estimate'),)
98         }),
99         (None, {
100             'fields' : ('notes',)
101         }),
102     )
103
104
105 ### -----------------------
106 class DataRun(models.Model):
107   ConfTemplate = "CONFIG PARAMS WILL BE GENERATED BY THE PIPELINE SCRIPT.\nYOU'LL BE ABLE TO EDIT AFTER IF NEEDED."
108   run_folder = models.CharField(max_length=50,unique=True, db_index=True)
109   fcid = models.ForeignKey(FlowCell,verbose_name="Flowcell Id")
110   config_params = models.TextField(default=ConfTemplate)
111   run_start_time = models.DateTimeField(core=True)
112   RUN_STATUS_CHOICES = (
113       (0, 'Sequencer running'), ##Solexa Data Pipeline Not Yet Started'),
114       (1, 'Data Pipeline Started'),
115       (2, 'Data Pipeline Interrupted'),
116       (3, 'Data Pipeline Finished'),
117       (4, 'CollectReads Started'),
118       (5, 'CollectReads Finished'),
119       (6, 'QC Finished'),
120       (7, 'DONE'),
121     )
122   run_status = models.IntegerField(choices=RUN_STATUS_CHOICES, default=0)
123   run_note = models.TextField(blank=True)
124
125
126   def main_status(self):
127     str = '<div'
128     if self.run_status >= 5:
129       str += ' style="color:green">'
130       str += '<b>'+self.RUN_STATUS_CHOICES[self.run_status][1]+'</b>'
131       str += '<br/><br/>' #<span style="color:red;font-size:80%;">New!</span>'
132       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>'
133     else:
134       str += '>'+self.RUN_STATUS_CHOICES[self.run_status][1]
135
136     str += '</div>'
137     return str
138   main_status.allow_tags = True
139
140   main_status.allow_tags = True
141   
142   def Flowcell_Info(self):
143     str = '<b>'+self.fcid.__str__()+'</b>'
144     str += '  (c: '+self.fcid.cluster_mac_id+',  s: '+self.fcid.seq_mac_id+')'
145     str += '<div style="margin-top:5px;">'    
146     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>'
147     str += '<div id="LanesOf'+self.fcid.__str__()+'" style="display:block;border:solid #cccccc 1px;width:350px">'
148     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+')'
149     str += LanesList ## self.fcid.Lanes()
150     str += '</div>'
151     str += '<div><a title="open Flowcell record" href="/admin/exp_track/flowcell/'+self.fcid.id.__str__()+'/" target=_self>Edit Flowcell record</a>'
152     #str += '<span style="color:red;font-size:80%;margin-left:15px;margin-right:3px">New!</span>'
153     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>'
154     str += '</div>'
155     str += '</div>'    
156     return str
157   Flowcell_Info.allow_tags = True
158
159   class Admin:
160     search_fields = ['run_folder','run_note','config_params','=fcid__lane_1_library__library_id','=fcid__lane_2_library__library_id','=fcid__lane_3_library__library_id','=fcid__lane_4_library__library_id','=fcid__lane_5_library__library_id','=fcid__lane_6_library__library_id','=fcid__lane_7_library__library_id','=fcid__lane_8_library__library_id']
161
162     list_display = ('run_folder','Flowcell_Info','run_start_time','main_status','run_note')
163     list_filter = ('run_status','run_start_time')