Print library.library_id instead of the flowcell.library_id.
[htsworkflow.git] / htsworkflow / frontend / eland_config / views.py
1 from django.http import HttpResponse
2 from django.shortcuts import render_to_response
3 from django.core.exceptions import ObjectDoesNotExist
4
5 from htsworkflow.frontend.eland_config import forms
6 from htsworkflow.frontend import settings
7 from htsworkflow.frontend.experiments import models
8
9 import os
10 import glob
11 # Create your views here.
12
13
14 def _validate_input(data):
15   #if data.find('..') == -1 or data.find('/') == -1 or data.find('\\') == -1:
16   return data.replace('..', '').replace('/', '_').replace('\\', '_')
17
18 #def contact(request):
19 #    if request.method == 'POST':
20 #        form = ContactForm(request.POST)
21 #        if form.is_valid():
22 #            # Do form processing here...
23 #            return HttpResponseRedirect('/url/on_success/')
24 #    else:
25 #        form = ContactForm()
26 #    return
27
28
29
30 #def _saveConfigFile(form):
31 #  """
32 #  Given a valid form, save eland config to file based on flowcell number.
33 #  """
34 #  assert form.is_valid()
35 #  
36 #  clean_data = form.cleaned_data
37 #  flowcell = clean_data['flow_cell_number'].replace('/','_').replace('..', '__')
38 #  
39 #  file_path = os.path.join(settings.UPLOADTO_CONFIG_FILE, flowcell)
40 #  
41 #  f = open(file_path, 'w')
42 #  cfg = generateElandConfig(form)
43 #  f.write(cfg)
44 #  f.close()
45 #  
46 #
47 #def _saveToDb(form):
48 #  """
49 #  Save info to the database.
50 #  """
51 #  clean_data = form.cleaned_data
52 #  
53 #  fc_id = clean_data['flow_cell_number']
54 #  
55 #  try:
56 #    fc = models.FlowCell.objects.get(flowcell_id=fc_id)
57 #  except models.FlowCell.DoesNotExist:
58 #    fc = models.FlowCell()
59 #    
60 #  fc.flowcell_id = fc_id
61 #  fc.run_date = clean_data['run_date']
62 #  
63 #  #LANE 1
64 #  fc.lane1_sample = clean_data['lane1_description']
65 #  species_name = clean_data['lane1_species']
66 #  try:
67 #    specie = models.Specie.objects.get(scientific_name=species_name)
68 #  except models.Specie.DoesNotExist:
69 #    specie = models.Specie(scientific_name=species_name)
70 #    specie.save()
71 #  fc.lane1_species = specie
72 #  
73 #  #LANE 2
74 #  fc.lane2_sample = clean_data['lane2_description']
75 #  species_name = clean_data['lane2_species']
76 #  try:
77 #    specie = models.Specie.objects.get(scientific_name=species_name)
78 #  except models.Specie.DoesNotExist:
79 #    specie = models.Specie(scientific_name=species_name)
80 #    specie.save()
81 #  fc.lane2_species = specie
82 #  
83 #  #LANE 3
84 #  fc.lane3_sample = clean_data['lane3_description']
85 #  species_name = clean_data['lane3_species']
86 #  try:
87 #    specie = models.Specie.objects.get(scientific_name=species_name)
88 #  except models.Specie.DoesNotExist:
89 #    specie = models.Specie(scientific_name=species_name)
90 #    specie.save()
91 #  fc.lane3_species = specie
92 #  
93 #  #LANE 4
94 #  fc.lane4_sample = clean_data['lane4_description']
95 #  species_name = clean_data['lane4_species']
96 #  try:
97 #    specie = models.Specie.objects.get(scientific_name=species_name)
98 #  except models.Specie.DoesNotExist:
99 #    specie = models.Specie(scientific_name=species_name)
100 #    specie.save()
101 #  fc.lane4_species = specie
102 #  
103 #  #LANE 5
104 #  fc.lane5_sample = clean_data['lane5_description']
105 #  species_name = clean_data['lane5_species']
106 #  try:
107 #    specie = models.Specie.objects.get(scientific_name=species_name)
108 #  except models.Specie.DoesNotExist:
109 #    specie = models.Specie(scientific_name=species_name)
110 #    specie.save()
111 #  fc.lane5_species = specie
112 #  
113 #  #LANE 6
114 #  fc.lane6_sample = clean_data['lane6_description']
115 #  species_name = clean_data['lane6_species']
116 #  try:
117 #    specie = models.Specie.objects.get(scientific_name=species_name)
118 #  except models.Specie.DoesNotExist:
119 #    specie = models.Specie(scientific_name=species_name)
120 #    specie.save()
121 #  fc.lane6_species = specie
122 #  
123 #  #LANE 7
124 #  fc.lane7_sample = clean_data['lane7_description']
125 #  species_name = clean_data['lane7_species']
126 #  try:
127 #    specie = models.Specie.objects.get(scientific_name=species_name)
128 #  except models.Specie.DoesNotExist:
129 #    specie = models.Specie(scientific_name=species_name)
130 #    specie.save()
131 #  fc.lane7_species = specie
132 #  
133 #  #LANE 8
134 #  fc.lane8_sample = clean_data['lane8_description']
135 #  species_name = clean_data['lane8_species']
136 #  try:
137 #    specie = models.Specie.objects.get(scientific_name=species_name)
138 #  except models.Specie.DoesNotExist:
139 #    specie = models.Specie(scientific_name=species_name)
140 #    specie.save()
141 #  fc.lane8_species = specie
142 #  
143 #  fc.notes = clean_data['notes']
144 #  
145 #  fc.save()
146 #  
147 #  return fc
148 #  
149 #
150 #def generateElandConfig(form):
151 #  data = []
152 #  
153 #  form = form.cleaned_data
154 #  
155 #  BASE_DIR = '/data-store01/compbio/genomes'
156 #  
157 #  data.append("# FLOWCELL: %s" % (form['flow_cell_number']))
158 #  data.append("#")
159 #  
160 #  notes = form['notes'].replace('\r\n', '\n').replace('\r', '\n')
161 #  notes = notes.replace('\n', '\n#  ')
162 #  data.append("# NOTES:")
163 #  data.append("#  %s\n#" % (notes))
164 #  
165 #  #Convert all newline conventions to unix style
166 #  l1d = form['lane1_description'].replace('\r\n', '\n').replace('\r', '\n')
167 #  l2d = form['lane2_description'].replace('\r\n', '\n').replace('\r', '\n')
168 #  l3d = form['lane3_description'].replace('\r\n', '\n').replace('\r', '\n')
169 #  l4d = form['lane4_description'].replace('\r\n', '\n').replace('\r', '\n')
170 #  l5d = form['lane5_description'].replace('\r\n', '\n').replace('\r', '\n')
171 #  l6d = form['lane6_description'].replace('\r\n', '\n').replace('\r', '\n')
172 #  l7d = form['lane7_description'].replace('\r\n', '\n').replace('\r', '\n')
173 #  l8d = form['lane8_description'].replace('\r\n', '\n').replace('\r', '\n')
174 #  
175 #  # Turn new lines into indented commented newlines
176 #  l1d = l1d.replace('\n', '\n#  ')
177 #  l2d = l2d.replace('\n', '\n#  ')
178 #  l3d = l3d.replace('\n', '\n#  ')
179 #  l4d = l4d.replace('\n', '\n#  ')
180 #  l5d = l5d.replace('\n', '\n#  ')
181 #  l6d = l6d.replace('\n', '\n#  ')
182 #  l7d = l7d.replace('\n', '\n#  ')
183 #  l8d = l8d.replace('\n', '\n#  ')
184 #  
185 #  data.append("# Lane1: %s" % (l1d))
186 #  data.append("# Lane2: %s" % (l2d))
187 #  data.append("# Lane3: %s" % (l3d))
188 #  data.append("# Lane4: %s" % (l4d))
189 #  data.append("# Lane5: %s" % (l5d))
190 #  data.append("# Lane6: %s" % (l6d))
191 #  data.append("# Lane7: %s" % (l7d))
192 #  data.append("# Lane8: %s" % (l8d))
193 #  
194 #  #data.append("GENOME_DIR %s" % (BASE_DIR))
195 #  #data.append("CONTAM_DIR %s" % (BASE_DIR))
196 #  read_length = form['read_length']
197 #  data.append("READ_LENGTH %d" % (read_length))
198 #  #data.append("ELAND_REPEAT")
199 #  data.append("ELAND_MULTIPLE_INSTANCES 8")
200 #  
201 #  #Construct genome dictionary to figure out what lanes to put
202 #  # in the config file.
203 #  genome_dict = {}
204 #  l1s = form['lane1_species']
205 #  genome_dict.setdefault(l1s, []).append('1')
206 #  l2s = form['lane2_species']
207 #  genome_dict.setdefault(l2s, []).append('2')
208 #  l3s = form['lane3_species']
209 #  genome_dict.setdefault(l3s, []).append('3')
210 #  l4s = form['lane4_species']
211 #  genome_dict.setdefault(l4s, []).append('4')
212 #  l5s = form['lane5_species']
213 #  genome_dict.setdefault(l5s, []).append('5')
214 #  l6s = form['lane6_species']
215 #  genome_dict.setdefault(l6s, []).append('6')
216 #  l7s = form['lane7_species']
217 #  genome_dict.setdefault(l7s, []).append('7')
218 #  l8s = form['lane8_species']
219 #  genome_dict.setdefault(l8s, []).append('8')
220 #  
221 #  genome_list = genome_dict.keys()
222 #  genome_list.sort()
223 #  
224 #  #Loop through and create entries for each species.
225 #  for genome in genome_list:
226 #    lanes = ''.join(genome_dict[genome])
227 #    data.append('%s:ANALYSIS eland' % (lanes))
228 #    data.append('%s:READ_LENGTH %s' % (lanes, read_length))
229 #    data.append('%s:ELAND_GENOME %s' % (lanes, os.path.join(BASE_DIR, genome)))
230 #    data.append('%s:USE_BASES %s' % (lanes, 'Y'*int(read_length)))
231 #    
232 #  data.append('SEQUENCE_FORMAT --scarf')
233 #  
234 #  return '\n'.join(data)
235
236
237 def getElandConfig(flowcell, regenerate=False):
238
239   if hasattr(settings, 'UPLOADTO_CONFIG_FILE'):
240     dest = settings.UPLOADTO_CONFIG_FILE
241   else:
242     dest = '/tmp'
243   file_path = os.path.join(dest, flowcell)
244   
245   #If we are regenerating the config file, skip
246   # reading of existing file. If the file doesn't
247   # exist, try to generate it form the DB.
248   if not regenerate and os.path.isfile(file_path):
249     f = open(file_path, 'r')
250     data = f.read()
251     f.close()
252     return data
253   
254   try:
255     fcObj = models.FlowCell.objects.get(flowcell_id__iexact=flowcell)
256   except ObjectDoesNotExist:
257     return None
258   
259   data = []
260   
261   #form = form.cleaned_data
262   
263   BASE_DIR = '/data-store01/compbio/genomes'
264   
265   data.append("# FLOWCELL: %s" % (fcObj.flowcell_id))
266   data.append("#")
267   
268   notes = fcObj.notes.replace('\r\n', '\n').replace('\r', '\n')
269   notes = notes.replace('\n', '\n#  ')
270   data.append("# NOTES:")
271   data.append("#  %s\n#" % (notes))
272   
273   #Convert all newline conventions to unix style
274   for lane in fcObj.lane_set.all():
275     data.append("# Lane%d: %s | %s" % \
276       (lane.lane_number, unicode(lane.library.library_id),  lane.library.library_name.replace('%', '%%')))
277   
278   #data.append("GENOME_DIR %s" % (BASE_DIR))
279   #data.append("CONTAM_DIR %s" % (BASE_DIR))
280   read_length = fcObj.read_length
281   #data.append("ELAND_REPEAT")
282   data.append("ELAND_MULTIPLE_INSTANCES 8")
283   
284   #Construct genome dictionary to figure out what lanes to put
285   # in the config file.
286   genome_dict = {}
287   
288   #l1s = form['lane1_species']
289   for lane in fcObj.lane_set.all():
290     species = lane.library.library_species.scientific_name
291     genome_dict.setdefault(species, []).append(unicode(lane.lane_number))
292   
293   genome_list = genome_dict.keys()
294   genome_list.sort()
295   
296   #Loop through and create entries for each species.
297   for genome in genome_list:
298     lanes = ''.join(genome_dict[genome])
299     if fcObj.paired_end:
300         data.append('%s:ANALYSIS eland_pair' % (lanes))
301     else:
302         data.append('%s:ANALYSIS eland_extended' % (lanes))
303     data.append('%s:READ_LENGTH %s' % (lanes, read_length))
304     data.append('%s:ELAND_GENOME %s' % (lanes, '%%(%s)s' % (genome)))
305     data.append('%s:USE_BASES %s' % (lanes, 'Y'*int(read_length)))
306     
307   data.append('SEQUENCE_FORMAT --fastq')
308   data.append('') # want a trailing newline
309   
310   data = '\n'.join(data)
311   
312   f = open(file_path, 'w')
313   f.write(data)
314   f.close()
315   
316   return data
317
318
319
320 def config(request, flowcell=None):
321   """
322   Returns eland config file for a given flowcell number,
323   or returns a list of available flowcell numbers.
324   """
325   
326   # Provide INDEX of available Flowcell config files.
327   if flowcell is None:
328     #Find all FC* config files and report an index html file
329     #fc_list = [ os.path.split(file_path)[1] for file_path in glob.glob(os.path.join(settings.UPLOADTO_CONFIG_FILE, 'FC*')) ]
330     fc_list = [ fc.flowcell_id for fc in models.FlowCell.objects.all() ]
331     
332     #Convert FC* list to html links
333     fc_html = [ '<a href="/eland_config/%s/">%s</a>' % (fc_name, fc_name) for fc_name in fc_list ]
334       
335     return HttpResponse('<br />'.join(fc_html))
336   
337   #FIXME: Should validate flowcell input before using.
338   flowcell = _validate_input(flowcell)
339   cfg = getElandConfig(flowcell, regenerate=True)
340   
341   if not cfg:
342     return HttpResponse("Hmm, config file for %s does not seem to exist." % (flowcell))
343   
344   
345   return HttpResponse(cfg, mimetype="text/plain")
346
347
348
349
350 #def index(request):
351 #  """
352 #  Return a form for filling out information about the flowcell
353 #  """
354 #  if request.method == 'POST':
355 #    form = forms.ConfigForm(request.POST, error_class=forms.DivErrorList)
356 #    if form.is_valid():
357 #      #cfg = generateElandConfig(form)
358 #      _saveConfigFile(form)
359 #      _saveToDb(form)
360 #      return HttpResponse("Eland Config Saved!", mimetype="text/plain")
361 #    else:
362 #      return render_to_response('config_form.html', {'form': form })
363 #  
364 #  else:   
365 #    fm = forms.ConfigForm(error_class=forms.DivErrorList)
366 #    return render_to_response('config_form.html', {'form': fm })