(no commit message)
[htsworkflow.git] / htswfrontend / htswfrontend / exp_track / models.py
1 from django.db import models
2 from htswfrontend.fctracker.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, core=True)
8   run_date = models.DateTimeField(core=True)
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 __str__(self):
69     #return '%s (%s)' % (self.flowcell_id, self.run_date) 
70     return '%s' % (self.flowcell_id) 
71
72   def Create_LOG(self):
73     str = ''
74     str +='<a target=_balnk href="/exp_track/'+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/exp_track/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     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)
85   Lanes.allow_tags = True
86
87   class Meta:
88     ordering = ["-run_date"]
89   
90   class Admin:
91     save_on_top = True
92     date_hierarchy = "run_date"
93     save_on_top = True
94     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']
95     list_display = ('flowcell_id','seq_mac_id','run_date', 'Create_LOG','Lanes')
96     list_filter = ('seq_mac_id','cluster_mac_id')
97     fields = (
98         (None, {
99             'fields': ('run_date', ('flowcell_id','cluster_mac_id','seq_mac_id'), ('read_length'),)
100         }),
101         ('Lanes:', {
102             ##'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'),)
103            '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'),)
104         }),
105         (None, {
106             'fields' : ('notes',)
107         }),
108     )
109
110
111 ### -----------------------
112 class DataRun(models.Model):
113   ConfTemplate = "CONFIG PARAMS WILL BE GENERATED BY THE PIPELINE SCRIPT.\nYOU'LL BE ABLE TO EDIT AFTER IF NEEDED."
114   run_folder = models.CharField(max_length=50,unique=True, db_index=True)
115   fcid = models.ForeignKey(FlowCell,verbose_name="Flowcell Id")
116   config_params = models.TextField(default=ConfTemplate)
117   run_start_time = models.DateTimeField(core=True)
118   RUN_STATUS_CHOICES = (
119       (0, 'Sequencer running'), ##Solexa Data Pipeline Not Yet Started'),
120       (1, 'Data Pipeline Started'),
121       (2, 'Data Pipeline Interrupted'),
122       (3, 'Data Pipeline Finished'),
123       (4, 'CollectReads Started'),
124       (5, 'CollectReads Finished'),
125       (6, 'QC Finished'),
126       (7, 'DONE'),
127     )
128   run_status = models.IntegerField(choices=RUN_STATUS_CHOICES, default=0)
129   run_note = models.TextField(blank=True)
130
131
132   def main_status(self):
133     str = '<div'
134     if self.run_status >= 5:
135       str += ' style="color:green">'
136       str += '<b>'+self.RUN_STATUS_CHOICES[self.run_status][1]+'</b>'
137       str += '<br/><br/>' #<span style="color:red;font-size:80%;">New!</span>'
138       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>'
139     else:
140       str += '>'+self.RUN_STATUS_CHOICES[self.run_status][1]
141
142     str += '</div>'
143     return str
144   main_status.allow_tags = True
145
146   main_status.allow_tags = True
147   
148   def Flowcell_Info(self):
149     str = '<b>'+self.fcid.__str__()+'</b>'
150     str += '  (c: '+self.fcid.cluster_mac_id+',  s: '+self.fcid.seq_mac_id+')'
151     str += '<div style="margin-top:5px;">'    
152     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>'
153     str += '<div id="LanesOf'+self.fcid.__str__()+'" style="display:block;border:solid #cccccc 1px;width:350px">'
154     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+')'
155     str += LanesList ## self.fcid.Lanes()
156     str += '</div>'
157     str += '<div><a title="open Flowcell record" href="/admin/exp_track/flowcell/'+self.fcid.id.__str__()+'/" target=_self>Edit Flowcell record</a>'
158     #str += '<span style="color:red;font-size:80%;margin-left:15px;margin-right:3px">New!</span>'
159     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>'
160     str += '</div>'
161     str += '</div>'    
162     return str
163   Flowcell_Info.allow_tags = True
164
165   class Admin:
166     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']
167
168     list_display = ('run_folder','Flowcell_Info','run_start_time','main_status','run_note')
169     list_filter = ('run_status','run_start_time')