def _on_mouse_click(self, evt): if self.current_node is None: return for tag in self.current_node.get_tags(): if (tag.startswith('DataAcquis|TLM') or tag.startswith('DataAcquis|HCS')): for well in self.current_node.get_well_ids(): image_tag = '%s|Images|%s|%s|%s'%(exp.get_tag_stump(tag, 2), exp.get_tag_instance(tag), exp.get_tag_timepoint(tag), well) urls = meta.get_field(image_tag, []) for url in urls: im = Image.open(url) im.show() elif tag.startswith('DataAcquis|FCS'): for well in self.current_node.get_well_ids(): image_tag = '%s|Images|%s|%s|%s'%(exp.get_tag_stump(tag, 2), exp.get_tag_instance(tag), exp.get_tag_timepoint(tag), well) urls = meta.get_field(image_tag, []) for url in urls: os.startfile(url) ## message = '' ## for well in sorted(self.current_node.get_well_ids()): ## message += ', '.join(well) ## message += '\n' ## msg = wx.MessageDialog(self, message, caption='Info', style=wx.OK | wx.ICON_INFORMATION | wx.STAY_ON_TOP, pos=(200,200)) ## msg.ShowModal() ## msg.Destroy() try: bench = wx.GetApp().get_bench() except: return # --- Update the Bench view --- bench.set_timepoint(self.current_node.get_timepoint()) bench.taglistctrl.set_selected_protocols( [exp.get_tag_protocol(tag) for tag in self.current_node.get_tags()]) bench.group_checklist.SetCheckedStrings( [exp.PlateDesign.get_plate_group(well[0]) for well in self.current_node.get_well_ids()]) bench.update_plate_groups() bench.update_well_selections()
def get_ancestral_tags(self, node): #ancestral_tags = [] #for pnode in timeline.reverse_iter_tree(node): #if pnode: #if 'CellTransfer|Seed' in node.tags: #for tag in node.tags: ##if (tag.startswith('CellTransfer|Seed') and ##meta.get_field('CellTransfer|Seed|HarvestInstance|'+exp.get_tag_instance(tag)) is not None): #h_instance = meta.get_field('CellTransfer|Seed|HarvestInstance|'+exp.get_tag_instance(tag)) #for tpnode in self.nodes_by_timepoint[node.get_timepoint()-1]: #if tpnode: #for tptag in tpnode.tags: #if exp.get_tag_protocol(tptag) == 'CellTransfer|Harvest|'+h_instance: #for npnode in timeline.reverse_iter_tree(tpnode): #if npnode: #for nptag in npnode.tags: #ancestral_tags.append(exp.get_tag_stump(nptag, 2)) #else: #for ptag in pnode.tags: #ancestral_tags.append(exp.get_tag_stump(ptag, 2)) #return ancestral_tags return [exp.get_tag_stump(ptag, 2) for pnode in timeline.reverse_iter_tree(node) if pnode for ptag in pnode.tags]
def get_children_tags(self, node): """returns the children node tags""" return [exp.get_tag_stump(ctag, 2) for cnodes in timeline.get_progeny(node) if cnodes for ctag in cnodes.tags]
def OnSavingData(self, event): #TO DO: make this method coherent with other instances of this method ctrl = event.GetEventObject() tag = [t for t, c in self.settings_controls.items() if c == ctrl][0] if tag.startswith('Admin'): # if this is an Admin myDate = '' if isinstance(ctrl, wx.DatePickerCtrl): date = ctrl.GetValue() self.myDate = '%02d/%02d/%4d' % (date.Day, date.Month + 1, date.Year) if isinstance(ctrl, wx.ListBox) and ctrl.GetStringSelection() == 'Other': other = wx.GetTextFromUser('Insert Other', 'Other') ctrl.Append(other) ctrl.SetStringSelection(other) self.curr_protocol['ADMIN'] = [ self.settings_controls['Admin|0'].GetValue(), self.myDate, self.settings_controls['Admin|2'].GetValue(), self.settings_controls['Admin|3'].GetValue(), self.settings_controls['Admin|4'].GetStringSelection() ] else: # if this is a step step = tag.split('|')[0] # get the sibling controls like description, duration, temp controls for this step info = [] for tg in [t for t, c in self.settings_controls.items()]: if exp.get_tag_stump(tag, 1) == exp.get_tag_stump( tg, 1) and tg.startswith('Step'): c_num = int(tg.split('|')[1]) if isinstance(self.settings_controls[tg], wx.Choice): info.insert( c_num, self.settings_controls[tg].GetStringSelection()) elif isinstance(self.settings_controls[tg], wx.ListBox): info.insert( c_num, self.settings_controls[tg].GetStringSelection()) else: user_input = self.settings_controls[tg].GetValue() user_input.rstrip('\n') user_input.rstrip('\t') info.insert(c_num, user_input) self.curr_protocol[step] = info
def OnSavingData(self, event): #TO DO: make this method coherent with other instances of this method ctrl = event.GetEventObject() tag = [t for t, c in self.settings_controls.items() if c==ctrl][0] if tag.startswith('Admin'): # if this is an Admin myDate = '' if isinstance(ctrl, wx.DatePickerCtrl): date = ctrl.GetValue() self.myDate = '%02d/%02d/%4d'%(date.Day, date.Month+1, date.Year) if isinstance(ctrl, wx.ListBox) and ctrl.GetStringSelection() == 'Other': other = wx.GetTextFromUser('Insert Other', 'Other') ctrl.Append(other) ctrl.SetStringSelection(other) self.curr_protocol['ADMIN'] = [self.settings_controls['Admin|0'].GetValue(), self.myDate, self.settings_controls['Admin|2'].GetValue(), self.settings_controls['Admin|3'].GetValue(), self.settings_controls['Admin|4'].GetStringSelection()] else: # if this is a step step = tag.split('|')[0] # get the sibling controls like description, duration, temp controls for this step info = [] for tg in [t for t, c in self.settings_controls.items()]: if exp.get_tag_stump(tag, 1) == exp.get_tag_stump(tg, 1) and tg.startswith('Step'): c_num = int(tg.split('|')[1]) if isinstance(self.settings_controls[tg], wx.Choice): info.insert(c_num, self.settings_controls[tg].GetStringSelection()) elif isinstance(self.settings_controls[tg], wx.ListBox): info.insert(c_num, self.settings_controls[tg].GetStringSelection()) else: user_input = self.settings_controls[tg].GetValue() user_input.rstrip('\n') user_input.rstrip('\t') info.insert(c_num, user_input) self.curr_protocol[step] = info
def _recalculate_min_size(self): if self.timepoints is not None and len(self.timepoints) > 0: timeline = exp.ExperimentSettings.getInstance().get_timeline() max_event_types_per_timepoint = \ max([len(set([exp.get_tag_stump(evt.get_welltag()) for evt in evts])) for t, evts in self.events_by_timepoint.items()]) min_h = (max_event_types_per_timepoint+1) * self.ICON_SIZE + self.PAD * 2 + self.FONT_SIZE[1] + self.TIC_SIZE * 2 + 1 if self.time_x: self.SetMinSize((self.PAD * 2 + self.MIN_X_GAP * self.timepoints[-1], min_h)) else: self.SetMinSize((len(self.timepoints) * self.MIN_X_GAP + self.PAD * 2, min_h))
def __init__(self, parent, protocol, token, col_details, mandatory_tags, **kwargs): wx.Panel.__init__(self, parent, **kwargs) self.protocol = protocol self.token = token self.col_details = col_details self.col_headers = self.col_details.keys() self.mandatory_tags = mandatory_tags self.tag_stump = exp.get_tag_stump(self.protocol, 2) self.instance = exp.get_tag_attribute(self.protocol) self.settings_controls = {} self.showRows()
def __init__(self, parent, protocol, **kwargs): wx.ScrolledWindow.__init__(self, parent, **kwargs) self.SetScrollbars(20, 20, self.Size[0] + 20, self.Size[1] + 20, 0, 0) self.tag_stump = exp.get_tag_stump(protocol, 2) self.instance = exp.get_tag_attribute(protocol) # Attach a flexi sizer for the text controler and labels self.fgs = wx.FlexGridSizer(rows=15000, cols=6, hgap=5, vgap=5) #Create the first step as empty if not meta.get_field(self.tag_stump + '|Step1|%s' % self.instance): meta.set_field(self.tag_stump + '|Step1|%s' % self.instance, ['', '', '']) self.showSteps()
def __init__(self, parent, protocol, **kwargs): wx.ScrolledWindow.__init__(self, parent, **kwargs) self.SetScrollbars(20, 20, self.Size[0]+20, self.Size[1]+20, 0, 0) self.tag_stump = exp.get_tag_stump(protocol, 2) self.instance = exp.get_tag_attribute(protocol) # Attach a flexi sizer for the text controler and labels self.fgs = wx.FlexGridSizer(rows=15000, cols=6, hgap=5, vgap=5) #Create the first step as empty if not meta.get_field(self.tag_stump+'|Step1|%s'%self.instance): meta.set_field(self.tag_stump+'|Step1|%s'%self.instance, ['','','']) self.showSteps()
def _on_paint(self, evt=None): '''Handler for paint events. ''' if not self.timepoints: evt.Skip() return PAD = self.PAD + self.ICON_SIZE / 2.0 ICON_SIZE = self.ICON_SIZE MIN_X_GAP = self.MIN_X_GAP TIC_SIZE = self.TIC_SIZE FONT_SIZE = self.FONT_SIZE MAX_TIMEPOINT = self.timepoints[-1] self.hover_timepoint = None dc = wx.PaintDC(self) dc.Clear() dc.BeginDrawing() w_win, h_win = (float(self.Size[0]), float(self.Size[1])) if self.time_x: if MAX_TIMEPOINT == 0: px_per_time = 1 else: px_per_time = max((w_win - PAD * 2.0) / MAX_TIMEPOINT, MIN_X_GAP) if len(self.timepoints) == 1: x_gap = 1 else: x_gap = max(MIN_X_GAP, (w_win - PAD * 2) / (len(self.timepoints) - 1)) # y pos of line y = h_win - PAD - FONT_SIZE[1] - TIC_SIZE - 1 # draw the timeline if self.time_x: dc.DrawLine(PAD, y, px_per_time * MAX_TIMEPOINT + PAD, y) else: dc.DrawLine(PAD, y, x_gap * (len(self.timepoints) - 1) + PAD, y) font = dc.Font font.SetPixelSize(FONT_SIZE) dc.SetFont(font) # draw event icons for i, timepoint in enumerate(self.timepoints): # x position of timepoint on the line if self.time_x: x = timepoint * px_per_time + PAD else: x = i * x_gap + PAD if (self.cursor_pos is not None and x - ICON_SIZE/2 < self.cursor_pos < x + ICON_SIZE/2): dc.SetPen(wx.Pen(wx.BLACK, 3)) self.hover_timepoint = timepoint else: dc.SetPen(wx.Pen(wx.BLACK, 1)) # Draw tic marks dc.DrawLine(x, y - TIC_SIZE, x, y + TIC_SIZE) #dc.DrawRectangle(x, y, ICON_SIZE, ICON_SIZE) prefixes = set([exp.get_tag_stump(ev.get_welltag(), 2) for ev in self.events_by_timepoint[timepoint]]) for i, stump in enumerate(prefixes): if stump.startswith('CellTransfer|Seed'): bmp = icons.seed.Scale(ICON_SIZE, ICON_SIZE, quality=wx.IMAGE_QUALITY_HIGH).ConvertToBitmap() elif stump.startswith('CellTransfer|Harvest'): bmp = icons.harvest.Scale(ICON_SIZE, ICON_SIZE, quality=wx.IMAGE_QUALITY_HIGH).ConvertToBitmap() elif stump.startswith('Perturbation|Chem'): bmp = icons.treat.Scale(ICON_SIZE, ICON_SIZE, quality=wx.IMAGE_QUALITY_HIGH).ConvertToBitmap() elif stump.startswith('Perturbation|Bio'): bmp = icons.dna.Scale(ICON_SIZE, ICON_SIZE, quality=wx.IMAGE_QUALITY_HIGH).ConvertToBitmap() elif stump.startswith('Labeling|Stain'): bmp = icons.stain.Scale(ICON_SIZE, ICON_SIZE, quality=wx.IMAGE_QUALITY_HIGH).ConvertToBitmap() elif stump.startswith('Labeling|Antibody'): bmp = icons.antibody.Scale(ICON_SIZE, ICON_SIZE, quality=wx.IMAGE_QUALITY_HIGH).ConvertToBitmap() elif stump.startswith('Labeling|Primer'): bmp = icons.primer.Scale(ICON_SIZE, ICON_SIZE, quality=wx.IMAGE_QUALITY_HIGH).ConvertToBitmap() elif stump.startswith('AddProcess|Spin'): bmp = icons.spin.Scale(ICON_SIZE, ICON_SIZE, quality=wx.IMAGE_QUALITY_HIGH).ConvertToBitmap() elif stump.startswith('AddProcess|Wash'): bmp = icons.wash.Scale(ICON_SIZE, ICON_SIZE, quality=wx.IMAGE_QUALITY_HIGH).ConvertToBitmap() elif stump.startswith('AddProcess|Dry'): bmp = icons.dry.Scale(ICON_SIZE, ICON_SIZE, quality=wx.IMAGE_QUALITY_HIGH).ConvertToBitmap() elif stump.startswith('AddProcess|Medium'): bmp = icons.medium.Scale(ICON_SIZE, ICON_SIZE, quality=wx.IMAGE_QUALITY_HIGH).ConvertToBitmap() elif stump.startswith('AddProcess|Incubator'): bmp = icons.incubator.Scale(ICON_SIZE, ICON_SIZE, quality=wx.IMAGE_QUALITY_HIGH).ConvertToBitmap() elif stump.startswith('DataAcquis|HCS'): bmp = icons.staticimage.Scale(ICON_SIZE, ICON_SIZE, quality=wx.IMAGE_QUALITY_HIGH).ConvertToBitmap() elif stump.startswith('DataAcquis|FCS'): bmp = icons.fcs.Scale(ICON_SIZE, ICON_SIZE, quality=wx.IMAGE_QUALITY_HIGH).ConvertToBitmap() elif stump.startswith('DataAcquis|TLM'): bmp = icons.tlm.Scale(ICON_SIZE, ICON_SIZE, quality=wx.IMAGE_QUALITY_HIGH).ConvertToBitmap() dc.DrawBitmap(bmp, x - ICON_SIZE / 2.0, y - ((i+1)*ICON_SIZE) - TIC_SIZE - 1) # draw the timepoint beneath the line time_string = exp.format_time_string(timepoint) wtext = FONT_SIZE[0] * len(time_string) dc.DrawText(time_string, x - wtext/2.0, y + TIC_SIZE + 1) dc.EndDrawing()
def formatProtocolInfo(self): ''' this method format the information of the annoted protocols ready for printing''' meta = exp.ExperimentSettings.getInstance() self.printfile = file('screenshot.htm', 'w') timepoints = meta.get_timeline().get_unique_timepoints() timeline = meta.get_timeline() self.events_by_timepoint = timeline.get_events_by_timepoint() #---- Overview Secion ---# protocol_info = self.decode_event_description('Overview|Project|1') #this 1 is psedo to make it coherent with other instance based tabs self.printfile.write('<html><head><title>Experiment Protocol</title></head>' '<br/><body><h1>'+protocol_info[0]+'</h1>' '<h3>1. Experiment Overview</h3>' ) for element in protocol_info[1]: self.printfile.write('<dfn>'+element[0]+': </dfn><code>'+element[1]+'</code><br />') #---- Stock Culture ----# stockcultures = meta.get_field_instances('StockCulture|Sample') self.printfile.write('<h3>2. Stock Culture</h3>') if stockcultures: for instance in stockcultures: protocol_info = self.decode_event_description('StockCulture|Sample|%s'%instance) self.printfile.write('<i>'+protocol_info[0]+' </i><br />') for element in protocol_info[1]: self.printfile.write('<dfn>'+element[0]+': </dfn><code>'+element[1]+'</code><br />') #self.printfile.write('<code>'+protocol_info[2]+' </code><br />') self.printfile.write('<br />') self.printfile.write('<dfn>'+protocol_info[2][0]+'</dfn><br />' else: self.printfile.write('<code>No stock culture was used for this experiment</code>') #---- Instrument Secion ---# self.printfile.write('<h3>3. Instrument Settings</h3>') microscopes = meta.get_field_instances('Instrument|Microscope') flowcytometers = meta.get_field_instances('Instrument|Flowcytometer') if microscopes: for instance in microscopes: protocol_info = self.decode_event_description('Instrument|Microscope|%s'%instance) self.printfile.write('<i>Channel Name: '+protocol_info[0]+' (microscope instance %s)'%instance+'</i><br />') for component in protocol_info[1]: if component[0] == 'Component': self.printfile.write('<strong>'+component[1]+'</strong><br />') else: self.printfile.write('<code><b>'+component[0]+': </b>'+component[1]+'</code><br />') self.printfile.write('<p></p>') if flowcytometers: for instance in flowcytometers: protocol_info = self.decode_event_description('Instrument|Flowcytometer|%s'%instance) self.printfile.write('<i>'+protocol_info[0]+' </i><br />') for element in protocol_info[1]: # channels self.printfile.write('<ul><li><code><b>'+element[0]+': </b>') # channel name for i, component in enumerate(element[1]): # config of each component of this channel if i == len(element[1])-1: self.printfile.write(meta.decode_ch_component(component[0])) else: self.printfile.write(meta.decode_ch_component(component[0])+' >> ') self.printfile.write('</code></li></ul>') self.printfile.write('<p></p>') #---- Material and Method Secion ---# self.printfile.write('<h3>4. Materials and Methods</h3>') for i, timepoint in enumerate(timepoints): for protocol in set([exp.get_tag_protocol(ev.get_welltag()) for ev in self.events_by_timepoint[timepoint]]): instance = exp.get_tag_attribute(protocol) # protocol info includes the description of the attributes for each of the protocol e.g. Perturbation|Chem|1 is passed protocol_info = self.decode_event_description(protocol) # spatial info includes plate well inforamtion for this event well tag e.g. Perturbation|Bio|Wells|1|793 ####spatial_info = self.decode_event_location(ev.get_welltag()) ##THIS THING DOES NOT WORK WHEN SAME EVENT AT SAME TIME POINT HAPPENS welltag = exp.get_tag_stump(protocol, 2)+'|Wells|%s|%s'%(instance, str(timepoint)) spatial_info = self.decode_event_location(welltag) # -- write the description and location of the event --# if (exp.get_tag_event(protocol) == 'Seed') and (meta.get_field('CellTransfer|Seed|StockInstance|%s'%instance) is not None): self.printfile.write('Step '+str(i+1)+': <em><b>Seeding</b></em> at '+exp.format_time_string(timepoint)+' hrs<br />') self.printfile.write('<code>'+protocol_info[0]+'</code><br />') self.printlocation(spatial_info) # if harvest precede seeding #if meta.get_field('CellTransfer|Seed|HarvestInstance|%s'%instance) is not None: ## origin(harvesting instance), destination(seeding instance), timepoint #self.printCellTransfer(meta.get_field('CellTransfer|Seed|HarvestInstance|%s'%instance), #instance, timepoint) if exp.get_tag_event(protocol) == 'Harvest': self.printfile.write('Step '+str(i+1)+': <em><b>Harvest-Seed (Cell Transfer)</b></em> at '+exp.format_time_string(timepoint)+' hrs<br />') self.printCellTransfer(instance, timepoint) if exp.get_tag_event(protocol) == 'Chem': #TO DO self.printfile.write('Step '+str(i+1)+': <em><b>Chemical Perturbation</b></em> at '+exp.format_time_string(timepoint)+' hrs<br />') self.printfile.write('<code>'+protocol_info[0]+'</code><br />') self.printlocation(spatial_info) if exp.get_tag_event(protocol) == 'Bio': self.printfile.write('Step '+str(i+1)+': <em><b>Biological Perturbation</b></em> at '+exp.format_time_string(timepoint)+' hrs<br />') self.printfile.write('<code>'+protocol_info[0]+'</code><br />') for element in protocol_info[1]: self.printfile.write('<code><i>'+element[0]+': </i>'+element[1]+'</code><br />') self.printlocation(spatial_info) if exp.get_tag_event(protocol) == 'Dye': self.printfile.write('Step '+str(i+1)+': <em><b>Staining with chemical dye</b></em> at '+exp.format_time_string(timepoint)+' hrs<br />') self.printfile.write('<i>'+protocol_info[0]+'</i><br />') # header part for element in protocol_info[1]: # step description description = element[0] duration = element[1] temp = element[2] if len(duration) > 0: # duration is mentioned duration = ' for %s minutes'%element[1] if len(temp) > 0: # duration is mentioned temp = ' at %s C.'%element[2] self.printfile.write('<ul><li><code>'+description+duration+temp+'</code></li></ul>') self.printlocation(spatial_info) if exp.get_tag_event(protocol) == 'Immuno': self.printfile.write('Step '+str(i+1)+': <em><b>Staining with immunofluorescence</b></em> at '+exp.format_time_string(timepoint)+' hrs<br />') self.printfile.write('<i>'+protocol_info[0]+'</i><br />') # header part for element in protocol_info[2]: #footer part goes here self.printfile.write('<code>'+element+'</code><br />') #footer part for element in protocol_info[1]: # step description description = element[0] duration = element[1] temp = element[2] if len(duration) > 0: # duration is mentioned duration = ' for %s minutes'%element[1] if len(temp) > 0: # duration is mentioned temp = ' at %s C.'%element[2] self.printfile.write('<ul><li><code>'+description+duration+temp+'</code></li></ul>') self.printlocation(spatial_info) if exp.get_tag_event(protocol) == 'Genetic': self.printfile.write('Step '+str(i+1)+': <em><b>Staining with genetic materials</b></em> at '+exp.format_time_string(timepoint)+' hrs<br />') self.printfile.write('<i>'+protocol_info[0]+'</i><br />') # header part for element in protocol_info[2]: #footer part goes here self.printfile.write('<code><i>'+element[0]+': </i>'+element[1]+'</code><br />')#footer part for element in protocol_info[1]: # step description description = element[0] duration = element[1] temp = element[2] if len(duration) > 0: # duration is mentioned duration = ' for %s minutes'%element[1] if len(temp) > 0: # duration is mentioned temp = ' at %s C.'%element[2] self.printfile.write('<ul><li><code>'+description+duration+temp+'</code></li></ul>') self.printlocation(spatial_info) if exp.get_tag_event(protocol) == 'Spin': self.printfile.write('Step '+str(i+1)+': <em><b>Spinning</b></em> at '+exp.format_time_string(timepoint)+' hrs<br />') self.printfile.write('<i>'+protocol_info[0]+'</i><br />') # header part for element in protocol_info[1]: # step description description = element[0] if len(element[1]) > 0: # duration is mentioned duration = ' for %s minutes'%element[1] else: duration = '' self.printfile.write('<ul><li><code>'+description+duration+'</code></li></ul>') self.printlocation(spatial_info) if exp.get_tag_event(protocol) == 'Wash': self.printfile.write('Step '+str(i+1)+': <em><b>Washing</b></em> at '+exp.format_time_string(timepoint)+' hrs<br />') self.printfile.write('<i>'+protocol_info[0]+'</i><br />') # header part for element in protocol_info[1]: # step description description = element[0] if len(element[1]) > 0: # duration is mentioned duration = ' for %s minutes'%element[1] else: duration = '' self.printfile.write('<ul><li><code>'+description+duration+'</code></li></ul>') self.printlocation(spatial_info) if exp.get_tag_event(protocol) == 'Dry': self.printfile.write('Step '+str(i+1)+': <em><b>Drying</b></em> at '+exp.format_time_string(timepoint)+' hrs<br />') self.printfile.write('<i>'+protocol_info[0]+'</i><br />') # header part for element in protocol_info[1]: # step description description = element[0] if len(element[1]) > 0: # duration is mentioned duration = ' for %s minutes'%element[1] else: duration = '' self.printfile.write('<ul><li><code>'+description+duration+'</code></li></ul>') self.printlocation(spatial_info) if exp.get_tag_event(protocol) == 'Medium': self.printfile.write('Step '+str(i+1)+': <em><b>Addition of medium</b></em> at '+exp.format_time_string(timepoint)+' hrs<br />') self.printfile.write('<i>'+protocol_info[0]+'</i><br />') # header part for element in protocol_info[2]: #footer part goes here self.printfile.write('<code>'+element+'</code><br />') #footer part for element in protocol_info[1]: # step description description = element[0] if len(element[1]) > 0: # duration is mentioned duration = ' for %s minutes'%element[1] else: duration = '' self.printfile.write('<ul><li><code>'+description+duration+'</code></li></ul>') self.printlocation(spatial_info) if exp.get_tag_event(protocol) == 'Incubator': self.printfile.write('Step '+str(i+1)+': <em><b>Incubation</b></em> at '+exp.format_time_string(timepoint)+' hrs<br />') self.printfile.write('<i>'+protocol_info[0]+'</i><br />') # header part for element in protocol_info[2]: #footer part goes here self.printfile.write('<code><i>'+element[0]+': </i>'+element[1]+'</code><br />') #footer part for element in protocol_info[1]: # step description description = element[0] if len(element[1]) > 0: # duration is mentioned duration = ' for %s minutes'%element[1] else: duration = '' self.printfile.write('<ul><li><code>'+description+duration+'</code></li></ul>') self.printlocation(spatial_info) if exp.get_tag_event(protocol) == 'TLM': self.printfile.write('Step '+str(i+1)+': <em><b>Timelapse image acquisition</b></em> at '+exp.format_time_string(timepoint)+' hrs<br />') self.printfile.write('<code>'+protocol_info[0]+'</code><br />') # header part wrtie wich setting instance being used for element in protocol_info[1]: self.printfile.write('<code><i>'+element[0]+': </i>'+element[1]+'</code><br />') self.printlocation(spatial_info) # write the image urls self.printfile.write('<table border="0">') for plate, wells in spatial_info.iteritems(): for well in wells: pw = plate, well self.printfile.write('<code><b>Well '+well+'</b></code><br />') for url in meta.get_field('DataAcquis|TLM|Images|%s|%s|%s'%(instance,timepoint, pw), []): self.printfile.write('<small>'+url+'</small><br />') #self.printfile.write('<tr><code><td>'+well+':</td><td>'+('<br />'.join(meta.get_field('DataAcquis|FCS|Images|%s|%s|%s'%(instance,timepoint, pw), [])))+'</td></code></tr>') self.printfile.write('</table><br />') if exp.get_tag_event(protocol) == 'HCS': self.printfile.write('Step '+str(i+1)+': <em><b>Static image acquisition</b></em> at '+exp.format_time_string(timepoint)+' hrs<br />') self.printfile.write('<code>'+protocol_info[0]+'</code><br />') # header part wrtie wich setting instance being used for element in protocol_info[1]: self.printfile.write('<code><i>'+element[0]+': </i>'+element[1]+'</code><br />') self.printlocation(spatial_info) # write the image urls self.printfile.write('<table border="0">') for plate, wells in spatial_info.iteritems(): for well in wells: pw = plate, well self.printfile.write('<code><b>Well '+well+'</b></code><br />') for url in meta.get_field('DataAcquis|HCS|Images|%s|%s|%s'%(instance,timepoint, pw), []): self.printfile.write('<small>'+url+'</small><br />') #self.printfile.write('<tr><code><td>'+well+':</td><td>'+('<br />'.join(meta.get_field('DataAcquis|FCS|Images|%s|%s|%s'%(instance,timepoint, pw), [])))+'</td></code></tr>') self.printfile.write('</table><br />') if exp.get_tag_event(protocol) == 'FCS': self.printfile.write('Step '+str(i+1)+': <em><b> FCS file acquisition</b></em> at '+exp.format_time_string(timepoint)+' hrs<br />') self.printfile.write('<code>'+protocol_info[0]+'</code><br />') # header part wrtie wich setting instance being used for element in protocol_info[1]: self.printfile.write('<code><i>'+element[0]+': </i>'+element[1]+'</code><br />') self.printlocation(spatial_info) # write the image urls self.printfile.write('<table border="0">') for plate, wells in spatial_info.iteritems(): for well in wells: pw = plate, well self.printfile.write('<code><b>'+plate+'['+well+']'+'</b></code><br />') for url in meta.get_field('DataAcquis|FCS|Images|%s|%s|%s'%(instance,timepoint, pw), []): self.printfile.write('<small>'+url+'</small><br />') #self.printfile.write('<tr><code><td>'+well+':</td><td>'+('<br />'.join(meta.get_field('DataAcquis|FCS|Images|%s|%s|%s'%(instance,timepoint, pw), [])))+'</td></code></tr>') self.printfile.write('</table><br />') if exp.get_tag_event(protocol) == 'CriticalPoint': # to implement if there are events at the same timepoint write those event first then the critical point self.printfile.write('<font size="2" color="red">Critical point: '+meta.get_field('Notes|CriticalPoint|Description|%s'%instance)+'</font></em><br />') if exp.get_tag_event(protocol) == 'Hint': self.printfile.write('<font size="2" color="blue">Hint: '+meta.get_field('Notes|Hint|Description|%s'%instance)+'</font></em><br />') if exp.get_tag_event(protocol) == 'Rest': self.printfile.write('<font size="2" color="green">Rest: '+meta.get_field('Notes|Rest|Description|%s'%instance)+'</font></em><br />') if exp.get_tag_event(protocol) == 'URL': self.printfile.write('<code>To find out more information please visit '+meta.get_field('Notes|URL|Description|%s'%instance)+'</code><br />') if exp.get_tag_event(protocol) == 'Video': self.printfile.write('<code>For more information please watch the media file: '+meta.get_field('Notes|Video|Description|%s'%instance)+'</code><br />') self.printfile.write('<br />') #---- Protocol Map ---# self.printfile.write('<br />'.join(['<h3>5. Methodology Map</h3>', '<br/><br/>', '<center><img src=myImage.png width=500 height=600></center>', '</body></html>'])) self.printfile.close() #---------------------------------------------------------------------- def sendToPrinter(self): """""" self.printer.GetPrintData().SetPaperId(wx.PAPER_LETTER) self.printer.PrintFile(self.html.GetOpenedPage()) def decode_event_description(self, protocol): meta = ExperimentSettings.getInstance() instance = exp.get_tag_attribute(protocol) header = '' footer = [] info = [] if exp.get_tag_type(protocol) == 'Overview': header += meta.get_field('Overview|Project|Title', default='Not specified') info.append(('Aims', meta.get_field('Overview|Project|Aims', default='Not specified'))) info.append(('Funding Code', meta.get_field('Overview|Project|Fund', default='Not specified'))) info.append(('Keywords', meta.get_field('Overview|Project|Keywords', default='Not specified'))) info.append(('Experiment Number', meta.get_field('Overview|Project|ExptNum', default='Not specified'))) info.append(('Experiment date', meta.get_field('Overview|Project|ExptDate', default='Not specified'))) info.append(('Relevant publications', meta.get_field('Overview|Project|Publications', default='Not specified'))) info.append(('Experimenter', meta.get_field('Overview|Project|Experimenter', default='Not specified'))) info.append(('Institution', meta.get_field('Overview|Project|Institution', default='Not specified'))) info.append(('Department', meta.get_field('Overview|Project|Department', default='Not specified'))) info.append(('Address', meta.get_field('Overview|Project|Address', default='Not specified'))) info.append(('Experiment Status', meta.get_field('Overview|Project|Status', default='Not specified'))) return (header, info) if exp.get_tag_type(protocol) == 'StockCulture': header += '%s cell line (Authority %s, Ref: %s) was used. This will be referred as Stock Instance %s' %(meta.get_field('StockCulture|Sample|CellLine|%s'%instance, default='Not specified'), meta.get_field('StockCulture|Sample|Authority|%s'%instance, default='Not specified'), str(instance), meta.get_field('StockCulture|Sample|CatalogueNo|%s'%instance, default='Not specified'), str(instance)) info.append(('Depositors', meta.get_field('StockCulture|Sample|Depositors|%s'%instance, default='Not specified'))) info.append(('Biosafety Level', meta.get_field('StockCulture|Sample|Biosafety|%s'%instance, default='Not specified'))) info.append(('Shipment', meta.get_field('StockCulture|Sample|Shipment|%s'%instance, default='Not specified'))) info.append(('Permit', meta.get_field('StockCulture|Sample|Permit|%s'%instance, default='Not specified'))) info.append(('Growth Property', meta.get_field('StockCulture|Sample|GrowthProperty|%s'%instance, default='Not specified'))) info.append(('Organism', meta.get_field('StockCulture|Sample|Organism|%s'%instance, default='Not specified'))) info.append(('Morphology', meta.get_field('StockCulture|Sample|Morphology|%s'%instance, default='Not specified'))) info.append(('Organ', meta.get_field('StockCulture|Sample|Organ|%s'%instance, default='Not specified'))) info.append(('Disease', meta.get_field('StockCulture|Sample|Disease|%s'%instance, default='Not specified'))) info.append(('Products', meta.get_field('StockCulture|Sample|Products|%s'%instance, default='Not specified'))) info.append(('Applications', meta.get_field('StockCulture|Sample|Applications|%s'%instance, default='Not specified'))) info.append(('Receptors', meta.get_field('StockCulture|Sample|Receptors|%s'%instance, default='Not specified'))) info.append(('Antigen', meta.get_field('StockCulture|Sample|Antigen|%s'%instance, default='Not specified'))) info.append(('DNA', meta.get_field('StockCulture|Sample|DNA|%s'%instance, default='Not specified'))) info.append(('Cytogenetic', meta.get_field('StockCulture|Sample|Cytogenetic|%s'%instance, default='Not specified'))) info.append(('Isoenzymes', meta.get_field('StockCulture|Sample|Isoenzymes|%s'%instance, default='Not specified'))) info.append(('Age of Organism (days)', meta.get_field('StockCulture|Sample|Age|%s'%instance, default='Not specified'))) info.append(('Gender', meta.get_field('StockCulture|Sample|Gender|%s'%instance, default='Not specified'))) info.append(('Ethnicity', meta.get_field('StockCulture|Sample|Ethnicity|%s'%instance, default='Not specified'))) info.append(('Comments', meta.get_field('StockCulture|Sample|Comments|%s'%instance, default='Not specified'))) info.append(('Publications', meta.get_field('StockCulture|Sample|Publications|%s'%instance, default='Not specified'))) info.append(('Related Products', meta.get_field('StockCulture|Sample|RelProduct|%s'%instance, default='Not specified'))) info.append(('Original Passage Number', meta.get_field('StockCulture|Sample|OrgPassageNo|%s'%instance, default='Not specified'))) info.append(('Preservation', meta.get_field('StockCulture|Sample|Preservation|%s'%instance, default='Not specified'))) info.append(('GrowthMedium', meta.get_field('StockCulture|Sample|GrowthMedium|%s'%instance, default='Not specified'))) passages = [attr for attr in meta.get_attribute_list_by_instance('StockCulture|Sample', instance) if attr.startswith('Passage')] if passages: footer += '%s passages were carried out according to the specifications' %str(len(passages)) return (header, info, footer) if exp.get_tag_event(protocol) == 'Microscope': header += '%s settings' %meta.get_field('Instrument|Microscope|ChannelName|%s'%instance, default = 'Not specified') if meta.get_field('Instrument|Microscope|Stand|%s'%instance) is not None: info.append(('Component', 'Stand')) info.append(('Type', meta.get_field('Instrument|Microscope|Stand|%s'%instance)[0])) info.append(('Make', meta.get_field('Instrument|Microscope|Stand|%s'%instance)[1])) info.append(('Model', meta.get_field('Instrument|Microscope|Stand|%s'%instance)[2])) info.append(('Orientation', meta.get_field('Instrument|Microscope|Stand|%s'%instance)[3])) info.append(('Number of Lampss', str(meta.get_field('Instrument|Microscope|Stand|%s'%instance)[4]))) info.append(('Number of Detectors', str(meta.get_field('Instrument|Microscope|Stand|%s'%instance)[5]))) if meta.get_field('Instrument|Microscope|Condensor|%s'%instance) is not None: info.append(('Component', 'Condensor')) info.append(('Type', meta.get_field('Instrument|Microscope|Condensor|%s'%instance)[0])) info.append(('Make', meta.get_field('Instrument|Microscope|Condensor|%s'%instance)[1])) info.append(('Model', meta.get_field('Instrument|Microscope|Condensor|%s'%instance)[2])) if meta.get_field('Instrument|Microscope|Stage|%s'%instance) is not None: info.append(('Component', 'Stage')) info.append(('Type', meta.get_field('Instrument|Microscope|Stage|%s'%instance)[0])) info.append(('Make', meta.get_field('Instrument|Microscope|Stage|%s'%instance)[1])) info.append(('Model', meta.get_field('Instrument|Microscope|Stage|%s'%instance)[2])) info.append(('Stage Holder', meta.get_field('Instrument|Microscope|Stage|%s'%instance)[3])) info.append(('Holder Code', meta.get_field('Instrument|Microscope|Stage|%s'%instance)[4])) if meta.get_field('Instrument|Microscope|Incubator|%s'%instance) is not None: info.append(('Component', 'Incubator')) info.append(('Make', meta.get_field('Instrument|Microscope|Incubator|%s'%instance)[0])) info.append(('Model', meta.get_field('Instrument|Microscope|Incubator|%s'%instance)[1])) info.append(('Temperature(C)', meta.get_field('Instrument|Microscope|Incubator|%s'%instance)[2])) info.append(('CO2%', meta.get_field('Instrument|Microscope|Incubator|%s'%instance)[3])) info.append(('Humidity', meta.get_field('Instrument|Microscope|Incubator|%s'%instance)[4])) info.append(('Pressure', meta.get_field('Instrument|Microscope|Incubator|%s'%instance)[5])) if meta.get_field('Instrument|Microscope|LightSource|%s'%instance) is not None: info.append(('Component', 'Light Source')) info.append(('Type', meta.get_field('Instrument|Microscope|LightSource|%s'%instance)[0])) info.append(('Source', meta.get_field('Instrument|Microscope|LightSource|%s'%instance)[1])) info.append(('Make', meta.get_field('Instrument|Microscope|LightSource|%s'%instance)[2])) info.append(('Model', meta.get_field('Instrument|Microscope|LightSource|%s'%instance)[3])) info.append(('Measured Power (User)', meta.get_field('Instrument|Microscope|LightSource|%s'%instance)[4])) info.append(('Measured Power (Instrument)', meta.get_field('Instrument|Microscope|LightSource|%s'%instance)[5])) info.append(('Shutter Used', meta.get_field('Instrument|Microscope|LightSource|%s'%instance)[6])) info.append(('Shutter Type', meta.get_field('Instrument|Microscope|LightSource|%s'%instance)[7])) info.append(('Shutter Make', meta.get_field('Instrument|Microscope|LightSource|%s'%instance)[8])) info.append(('Shutter Model', meta.get_field('Instrument|Microscope|LightSource|%s'%instance)[9])) if meta.get_field('Instrument|Microscope|ExtFilter|%s'%instance) is not None: info.append(('Component', 'Excitation Filter')) info.append(('Wavelength Range (nm)', str(meta.get_field('Instrument|Microscope|ExtFilter|%s'%instance)[0])+' - '+str(meta.get_field('Instrument|Microscope|ExtFilter|%s'%instance)[1]))) info.append(('Make', meta.get_field('Instrument|Microscope|ExtFilter|%s'%instance)[2])) info.append(('Model', meta.get_field('Instrument|Microscope|ExtFilter|%s'%instance)[3])) if meta.get_field('Instrument|Microscope|Mirror|%s'%instance) is not None: info.append(('Component', 'Dichroic Mirror')) info.append(('Wavelength Range (nm)', str(meta.get_field('Instrument|Microscope|Mirror|%s'%instance)[0])+' - '+str(meta.get_field('Instrument|Microscope|Mirror|%s'%instance)[1]))) info.append(('Mode', meta.get_field('Instrument|Microscope|Mirror|%s'%instance)[2])) info.append(('Make', meta.get_field('Instrument|Microscope|Mirror|%s'%instance)[3])) info.append(('Model', meta.get_field('Instrument|Microscope|Mirror|%s'%instance)[4])) info.append(('Modification', meta.get_field('Instrument|Microscope|Mirror|%s'%instance)[5])) if meta.get_field('Instrument|Microscope|EmsFilter|%s'%instance) is not None: info.append(('Component', 'Emission Filter')) info.append(('Wavelength Range (nm)', str(meta.get_field('Instrument|Microscope|EmsFilter|%s'%instance)[0])+' - '+str(meta.get_field('Instrument|Microscope|EmsFilter|%s'%instance)[1]))) info.append(('Make', meta.get_field('Instrument|Microscope|EmsFilter|%s'%instance)[2])) info.append(('Model', meta.get_field('Instrument|Microscope|EmsFilter|%s'%instance)[3])) if meta.get_field('Instrument|Microscope|Lens|%s'%instance) is not None: info.append(('Component', 'Lens')) info.append(('Make', meta.get_field('Instrument|Microscope|Lens|%s'%instance)[0])) info.append(('Model', meta.get_field('Instrument|Microscope|Lens|%s'%instance)[1])) info.append(('Objective Magnification', meta.get_field('Instrument|Microscope|Lens|%s'%instance)[2])) info.append(('Objective NA', meta.get_field('Instrument|Microscope|Lens|%s'%instance)[3])) info.append(('Calibrated Magnification', meta.get_field('Instrument|Microscope|Lens|%s'%instance)[4])) info.append(('Immersion', meta.get_field('Instrument|Microscope|Lens|%s'%instance)[5])) info.append(('Correction Collar', meta.get_field('Instrument|Microscope|Lens|%s'%instance)[6])) info.append(('Correction Value', meta.get_field('Instrument|Microscope|Lens|%s'%instance)[7])) info.append(('Correction Type', meta.get_field('Instrument|Microscope|Lens|%s'%instance)[8])) if meta.get_field('Instrument|Microscope|Lens|%s'%instance) is not None: info.append(('Component', 'Detector')) info.append(('Type', meta.get_field('Instrument|Microscope|Detector|%s'%instance)[0])) info.append(('Make', meta.get_field('Instrument|Microscope|Detector|%s'%instance)[1])) info.append(('Model', meta.get_field('Instrument|Microscope|Detector|%s'%instance)[2])) info.append(('Binning', str(meta.get_field('Instrument|Microscope|Detector|%s'%instance)[3]))) info.append(('Exposure Time', meta.get_field('Instrument|Microscope|Detector|%s'%instance)[4]+' '+meta.get_field('Instrument|Microscope|Detector|%s'%instance)[5])) info.append(('Gain', meta.get_field('Instrument|Microscope|Detector|%s'%instance)[6]+' '+meta.get_field('Instrument|Microscope|Detector|%s'%instance)[7])) info.append(('Offset', meta.get_field('Instrument|Microscope|Detector|%s'%instance)[8]+' '+meta.get_field('Instrument|Microscope|Detector|%s'%instance)[9])) return (header, info) if exp.get_tag_event(protocol) == 'Flowcytometer': header += meta.get_field('Instrument|Flowcytometer|Manufacter|%s'%instance, default='') if meta.get_field('Instrument|Flowcytometer|Model|%s'%instance) is not None: header += '(model: %s)' %meta.get_field('Instrument|Flowcytometer|Model|%s'%instance, default = 'not specified') header += ' was used. ' for attribute, description in sorted(meta.get_attribute_dict('Instrument|Flowcytometer|%s'%instance).iteritems()): if attribute.startswith('Manufacter') or attribute.startswith('Model'): continue else: info.append((attribute, description)) # attribute is Ch# and description is the component list return(header, info) if exp.get_tag_event(protocol) == 'Seed': if meta.get_field('CellTransfer|Seed|StockInstance|%s'%instance) is not None: header += meta.get_field('StockCulture|Sample|CellLine|%s'%meta.get_field('CellTransfer|Seed|StockInstance|%s'%instance)) header += ' cells were seeded with a density of %s from the stock flask (Instance %s). ' %(meta.get_field('CellTransfer|Seed|SeedingDensity|%s'%instance, default = ''), meta.get_field('CellTransfer|Seed|StockInstance|%s'%instance)) #if meta.get_field('CellTransfer|Seed|HarvestInstance|%s'%instance) is not None: #header += meta.get_field('StockCulture|Sample|CellLine|%s'%meta.get_field('CellTransfer|Seed|HarvestInstance|%s'%instance)) #header += ' cells were seeded with a density of %s from the Wells depicted bellow. ' %meta.get_field('CellTransfer|Seed|SeedingDensity|%s'%instance, default = '') if meta.get_field('CellTransfer|Seed|MediumUsed|%s'%instance) is not None: header += meta.get_field('CellTransfer|Seed|MediumUsed|%s'%instance)+' medium was used ' if meta.get_field('CellTransfer|Seed|MediumAddatives|%s'%instance) is not None: header += 'with following medium additives: %s. ' %meta.get_field('CellTransfer|Seed|MediumAddatives|%s'%instance) if meta.get_field('CellTransfer|Seed|Trypsinizatiton|%s'%instance) is 'Yes': header += 'Also trypsinisation was performed' return (header, info) if exp.get_tag_event(protocol) == 'Chem': if meta.get_field('Perturbation|Chem|ChemName|%s'%instance) is not None: header += meta.get_field('Perturbation|Chem|ChemName|%s'%instance) subtext = '%s,%s' %(meta.get_field('Perturbation|Chem|Manufacturer|%s'%instance, default=''), meta.get_field('Perturbation|Chem|CatNum|%s'%instance, default='')) if re.search('\w+', subtext): #if the mfg and or cat number of the chemical is mentioned header += '[%s]'%subtext header += ' was added' if meta.get_field('Perturbation|Chem|Conc|%s'%instance) is not None: header += ' with a concentration of %s %s' %(meta.get_field('Perturbation|Chem|Conc|%s'%instance), meta.get_field('Perturbation|Chem|Unit|%s'%instance, default='')) if meta.get_field('Perturbation|Chem|Additives|%s'%instance) is not None: header += '. Following additives were included: %s' %meta.get_field('Perturbation|Chem|Additives|%s'%instance) if meta.get_field('Perturbation|Chem|Other|%s'%instance) is not None: header += '. Other information: %s'%meta.get_field('Perturbation|Chem|Other|%s'%instance) return (header, info) if exp.get_tag_event(protocol) == 'Bio': header += 'Biological perturbation was done with following agent' info.append(('RNAi Sequence', meta.get_field('Perturbation|Bio|SeqName|%s'%instance, default = 'Not specified'))) info.append(('Acession Number', meta.get_field('Perturbation|Bio|AccessNumber|%s'%instance, default = 'Not specified'))) info.append(('Target Gene Accession Number', meta.get_field('Perturbation|Bio|TargetGeneAccessNum|%s'%instance, default = 'Not specified'))) info.append(('Concentration', meta.get_field('Perturbation|Bio|Conc|%s'%instance, default = 'Not specified')+' '+meta.get_field('Perturbation|Bio|Unit|%s'%instance, default = ''))) info.append(('Additives', meta.get_field('Perturbation|Bio|Additives|%s'%instance, default = 'Not specified'))) info.append(('Other Information', meta.get_field('Perturbation|Bio|Other|%s'%instance, default = 'Not specified'))) return (header, info) if exp.get_tag_event(protocol) == 'Dye': header += meta.get_field('Staining|Dye|ProtocolName|%s'%instance) steps = sorted(meta.get_attribute_list_by_instance('Staining|Dye|Step', str(instance)), key = meta.stringSplitByNumbers) for step in steps: info.append(meta.get_field('Staining|Dye|%s|%s'%(step,instance))) return (header, info) if exp.get_tag_event(protocol) == 'Immuno': header += meta.get_field('Staining|Immuno|ProtocolName|%s'%instance) if meta.get_field('Staining|Immuno|Target|%s'%instance) is not None: footer.append('Target antibody %s was used.'%meta.get_field('Staining|Immuno|Target|%s'%instance)) if meta.get_field('Staining|Immuno|Clonality|%s'%instance) is not None: footer.append('Clonality was %s.'%meta.get_field('Staining|Immuno|Clonality|%s'%instance)) if meta.get_field('Staining|Immuno|Primary|%s'%instance) is not None: token ='' token += 'Primary antibody %s was used'%meta.get_field('Staining|Immuno|Primary|%s'%instance)[0] if len(meta.get_field('Staining|Immuno|Primary|%s'%instance)[1])>0: token += ' with %s'%meta.get_field('Staining|Immuno|Primary|%s'%instance)[1] footer.append(token) if meta.get_field('Staining|Immuno|Secondary|%s'%instance) is not None: token ='' token += 'Secondary antibody %s was used'%meta.get_field('Staining|Immuno|Secondary|%s'%instance)[0] if len(meta.get_field('Staining|Immuno|Secondary|%s'%instance)[1])>0: token += ' with %s'%meta.get_field('Staining|Immuno|Secondary|%s'%instance)[1] footer.append(token) if meta.get_field('Staining|Immuno|Tertiary|%s'%instance) is not None: token ='' token += 'Tertiary antibody %s was used'%meta.get_field('Staining|Immuno|Tertiary|%s'%instance)[0] if len(meta.get_field('Staining|Immuno|Tertiary|%s'%instance)[1])>0: token += ' with %s'%meta.get_field('Staining|Immuno|Tertiary|%s'%instance)[1] footer.append(token) steps = sorted(meta.get_attribute_list_by_instance('Staining|Immuno|Step', str(instance)), key = meta.stringSplitByNumbers) for step in steps: info.append(meta.get_field('Staining|Immuno|%s|%s'%(step,instance))) return (header, info, footer) if exp.get_tag_event(protocol) == 'Genetic': header += meta.get_field('Staining|Genetic|ProtocolName|%s'%instance) footer.append(('Target Sequence', meta.get_field('Staining|Genetic|Target|%s'%instance, default = 'Not specified'))) footer.append(('Primer Sequence', meta.get_field('Staining|Genetic|Primer|%s'%instance, default = 'Not specified'))) footer.append(('Temperature', meta.get_field('Staining|Genetic|Temp|%s'%instance, default = 'Not specified'))) footer.append(('Temperature', meta.get_field('Staining|Genetic|GC|%s'%instance, default = 'Not specified'))) steps = sorted(meta.get_attribute_list_by_instance('Staining|Genetic|Step', str(instance)), key = meta.stringSplitByNumbers) for step in steps: info.append(meta.get_field('Staining|Genetic|%s|%s'%(step,instance))) return (header, info, footer) if exp.get_tag_event(protocol) == 'Spin': header += meta.get_field('AddProcess|Spin|ProtocolName|%s'%instance) steps = sorted(meta.get_attribute_list_by_instance('AddProcess|Spin|Step', str(instance)), key = meta.stringSplitByNumbers) for step in steps: info.append(meta.get_field('AddProcess|Spin|%s|%s'%(step,instance))) return (header, info) if exp.get_tag_event(protocol) == 'Wash': header += meta.get_field('AddProcess|Wash|ProtocolName|%s'%instance) steps = sorted(meta.get_attribute_list_by_instance('AddProcess|Wash|Step', str(instance)), key = meta.stringSplitByNumbers) for step in steps: info.append(meta.get_field('AddProcess|Wash|%s|%s'%(step,instance))) return (header, info) if exp.get_tag_event(protocol) == 'Dry': header += meta.get_field('AddProcess|Dry|ProtocolName|%s'%instance) steps = sorted(meta.get_attribute_list_by_instance('AddProcess|Dry|Step', str(instance)), key = meta.stringSplitByNumbers) for step in steps: info.append(meta.get_field('AddProcess|Dry|%s|%s'%(step,instance))) return (header, info) if exp.get_tag_event(protocol) == 'Medium': header += meta.get_field('AddProcess|Medium|ProtocolName|%s'%instance) if meta.get_field('AddProcess|Medium|MediumAdditives|%s'%instance) is not None: footer.append('Medium additives used: %s'%meta.get_field('AddProcess|Medium|MediumAdditives|%s'%instance)) steps = sorted(meta.get_attribute_list_by_instance('AddProcess|Medium|Step', str(instance)), key = meta.stringSplitByNumbers) for step in steps: info.append(meta.get_field('AddProcess|Medium|%s|%s'%(step,instance))) return (header, info, footer) if exp.get_tag_event(protocol) == 'Incubator': header += meta.get_field('AddProcess|Incubator|ProtocolName|%s'%instance) footer.append(('Incubator settings', '')) footer.append(('Manufacturer', meta.get_field('AddProcess|Incubator|Manufacter|%s'%instance, default = 'Not specified'))) footer.append(('Model', meta.get_field('AddProcess|Incubator|Model|%s'%instance, default = 'Not specified'))) footer.append(('Temperature', meta.get_field('AddProcess|Incubator|Temp|%s'%instance, default = 'Not specified'))) footer.append(('CO2%', meta.get_field('AddProcess|Incubator|CO2|%s'%instance, default = 'Not specified'))) footer.append(('Humidity', meta.get_field('AddProcess|Incubator|Humidity|%s'%instance, default = 'Not specified'))) footer.append(('Pressure', meta.get_field('AddProcess|Incubator|Pressure|%s'%instance, default = 'Not specified'))) steps = sorted(meta.get_attribute_list_by_instance('AddProcess|Medium|Step', str(instance)), key = meta.stringSplitByNumbers) for step in steps: info.append(meta.get_field('AddProcess|Medium|%s|%s'%(step,instance))) return (header, info, footer) if exp.get_tag_event(protocol) == 'TLM': if meta.get_field('DataAcquis|TLM|MicroscopeInstance|%s'%instance) is not None: ch_name = meta.get_field('DataAcquis|TLM|MicroscopeInstance|%s'%instance) cytometer_instance=meta.get_instance_by_field_value('Instrument|Microscope|ChannelName|', ch_name) header += ch_name+' channel was used (see microscope instance %s for details)'%cytometer_instance info.append(('Image Format', meta.get_field('DataAcquis|TLM|Format|%s'%instance, default = 'Not specified'))) info.append(('Time Interval (min)', meta.get_field('DataAcquis|TLM|TimeInterval|%s'%instance, default = 'Not specified'))) info.append(('Total Frame/Pane Number', meta.get_field('DataAcquis|TLM|FrameNumber|%s'%instance, default = 'Not specified'))) info.append(('Stacking Order', meta.get_field('DataAcquis|TLM|StackProcess|%s'%instance, default = 'Not specified'))) info.append(('Pixel Size', meta.get_field('DataAcquis|TLM|PixelSize|%s'%instance, default = 'Not specified'))) info.append(('Pixel Conversion', meta.get_field('DataAcquis|TLM|PixelConvert|%s'%instance, default = 'Not specified'))) info.append(('Software', meta.get_field('DataAcquis|TLM|Software|%s'%instance, default = 'Not specified'))) return (header, info) if exp.get_tag_event(protocol) == 'HCS': if meta.get_field('DataAcquis|HCS|MicroscopeInstance|%s'%instance) is not None: ch_name = meta.get_field('DataAcquis|HCS|MicroscopeInstance|%s'%instance) cytometer_instance=meta.get_instance_by_field_value('Instrument|Microscope|ChannelName|', ch_name) header += ch_name+' channel was used (see microscope instance %s for details)'%cytometer_instance info.append(('Image Format', meta.get_field('DataAcquis|HCS|Format|%s'%instance, default = 'Not specified'))) info.append(('Pixel Size', meta.get_field('DataAcquis|HCS|PixelSize|%s'%instance, default = 'Not specified'))) info.append(('Pixel Conversion', meta.get_field('DataAcquis|HCS|PixelConvert|%s'%instance, default = 'Not specified'))) info.append(('Software', meta.get_field('DataAcquis|HCS|Software|%s'%instance, default = 'Not specified'))) return (header, info) if exp.get_tag_event(protocol) == 'FCS': if meta.get_field('DataAcquis|FCS|FlowcytInstance|%s'%instance) is not None: cytometer_instance = meta.get_field('DataAcquis|FCS|FlowcytInstance|%s'%instance) header += meta.get_field('Instrument|Flowcytometer|Manufacter|%s'%cytometer_instance, default='')+' flowcytometer ' if meta.get_field('Instrument|Flowcytometer|Model|%s'%cytometer_instance) is not None: header += '(model: %s)' %meta.get_field('Instrument|Flowcytometer|Model|%s'%cytometer_instance, default = 'not specified') header += ' was used (see flowcytometer instance %s for details).'%cytometer_instance if meta.get_field('DataAcquis|FCS|Software|%s'%instance) is not None: info.append(meta.get_field('DataAcquis|FCS|Software|%s'%instance)+' software was used for data acquisition. ') if meta.get_field('DataAcquis|FCS|Format|%s'%instance) is not None: info.append('FCS files in %s'%meta.get_field('DataAcquis|FCS|Format|%s'%instance)+' format were saved in following location\n') return (header, info) #if event == 'Harvest': ##if meta.get_field('CellTransfer|Harvest|StockInstance|%s'%instance) is not None: ##text += meta.get_field('StockCulture|Sample|CellLine|%s'%meta.get_field('CellTransfer|Harvest|StockInstance|%s'%instance)) #if meta.get_field('CellTransfer|Seed|Trypsinizatiton|%s'%instance) is 'Yes': #text += ' cells were harvested by trypsinisation ' #text += 'cell density was %s. ' %meta.get_field('CellTransfer|Seed|SeedingDensity|%s'%instance, default = '') #if meta.get_field('CellTransfer|Seed|MediumUsed|%s'%instance) is not None: #text += meta.get_field('CellTransfer|Seed|MediumUsed|%s'%instance)+' medium was used ' #if meta.get_field('CellTransfer|Seed|MediumAddatives|%s'%instance) is not None: #text += 'with following medium additives: %s. ' %meta.get_field('CellTransfer|Seed|MediumAddatives|%s'%instance) def decode_event_location(self, plate_well_info): d = {} for pw in meta.get_field(plate_well_info): plate = pw[0] well = pw[1] if d.get(plate, None) is None: d[plate] = [well] else: d[plate] += [well] return d def printlocation(self, spatial_info): for plate, wells in spatial_info.iteritems(): self.printfile.write('<br /><cite>'+plate+'</cite><br />') self.printfile.write('<table border="1">') for row in exp.PlateDesign.get_row_labels(exp.PlateDesign.get_plate_format(plate)): self.printfile.write('<tr>') for col in exp.PlateDesign.get_col_labels(exp.PlateDesign.get_plate_format(plate)): well = row+col if well in wells: self.printfile.write('<td BGCOLOR=yellow>'+well+'</td>') else: self.printfile.write('<td><code>'+well+'</code></td>') self.printfile.write('</tr>') self.printfile.write('</table><br />') def printCellTransfer(self, harvest_inst, timepoint): seed_instances = meta.get_protocol_instances('CellTransfer|Seed|HarvestInstance|') for seed_inst in seed_instances: if (meta.get_field('CellTransfer|Seed|Wells|%s|%s'%(seed_inst, str(timepoint+1))) is not None) and (meta.get_field('CellTransfer|Seed|HarvestInstance|%s'%seed_inst) == harvest_inst): harvest_spatial_info = self.decode_event_location('CellTransfer|Harvest|Wells|%s|%s'%(harvest_inst, str(timepoint))) seed_spatial_info = self.decode_event_location('CellTransfer|Seed|Wells|%s|%s'%(seed_inst, str(timepoint+1))) self.printfile.write('<table border="0">') self.printfile.write('<tr><td>') for plate, wells in harvest_spatial_info.iteritems(): self.printfile.write('<br /><cite>'+plate+'</cite><br />') self.printfile.write('<table border="1">') for row in exp.PlateDesign.get_row_labels(exp.PlateDesign.get_plate_format(plate)): self.printfile.write('<tr>') for col in exp.PlateDesign.get_col_labels(exp.PlateDesign.get_plate_format(plate)): well = row+col if well in wells: self.printfile.write('<td BGCOLOR=yellow>'+well+'</td>') else: self.printfile.write('<td><code>'+well+'</code></td>') self.printfile.write('</tr>') self.printfile.write('</table>') self.printfile.write('</td><td> -- Transferred to --> </td><td>') for plate, wells in seed_spatial_info.iteritems(): self.printfile.write('<br /><cite>'+plate+'</cite><br />') self.printfile.write('<table border="1">') for row in exp.PlateDesign.get_row_labels(exp.PlateDesign.get_plate_format(plate)): self.printfile.write('<tr>') for col in exp.PlateDesign.get_col_labels(exp.PlateDesign.get_plate_format(plate)): well = row+col if well in wells: self.printfile.write('<td BGCOLOR=yellow>'+well+'</td>') else: self.printfile.write('<td><code>'+well+'</code></td>') self.printfile.write('</tr>') self.printfile.write('</table>') self.printfile.write('</td></tr>') self.printfile.write('</table><br />') class wxHTML(HtmlWindow): #---------------------------------------------------------------------- def __init__(self, parent, id): html.HtmlWindow.__init__(self, parent, id, style=wx.NO_FULL_REPAINT_ON_RESIZE) if __name__ == '__main__': app = wx.App(False) frame = PrintProtocol() #frame.Show() app.MainLoop()
def OnSavingData(self, event): ctrl = event.GetEventObject() tag = [t for t, c in self.settings_controls.items() if c==ctrl][0] if isinstance(ctrl, wx.ListBox) and ctrl.GetStringSelection() == 'Other': other = wx.GetTextFromUser('Insert Other', 'Other') ctrl.Append(other) ctrl.SetStringSelection(other) if tag.startswith('Admin'): # if this is an Admin date = self.settings_controls['Admin|1'].GetValue() self.curr_protocol['ADMIN'] = [self.settings_controls['Admin|0'].GetValue(), '%02d/%02d/%4d'%(date.Day, date.Month+1, date.Year), self.settings_controls['Admin|2'].GetValue() ] elif tag.startswith('Seed'): self.curr_protocol['SEED'] = [self.settings_controls['Seed|0'].GetValue(), self.settings_controls['Seed|1'].GetStringSelection() ] elif tag.startswith('Harvest'): self.curr_protocol['HARVEST'] = [self.settings_controls['Harvest|0'].GetValue(), self.settings_controls['Harvest|1'].GetStringSelection() ] elif tag.startswith('Reseed'): self.curr_protocol['SEED'] = [self.settings_controls['Reseed|0'].GetValue(), self.settings_controls['Reseed|1'].GetStringSelection() ] elif tag.startswith('Vessel'): self.curr_protocol['VESSEL'] = [self.settings_controls['Vessel|0'].GetStringSelection()] else: # if this is a step step = tag.split('|')[0] # get the sibling controls like description, duration, temp controls for this step info = [] for tg in [t for t, c in self.settings_controls.items()]: if exp.get_tag_stump(tag, 1) == exp.get_tag_stump(tg, 1) and tg.startswith('Step'): c_num = int(tg.split('|')[1]) if isinstance(self.settings_controls[tg], wx.Choice): info.insert(c_num, self.settings_controls[tg].GetStringSelection()) elif isinstance(self.settings_controls[tg], wx.ListBox): info.insert(c_num, self.settings_controls[tg].GetStringSelection()) else: user_input = self.settings_controls[tg].GetValue() user_input.rstrip('\n') user_input.rstrip('\t') info.insert(c_num, user_input) self.curr_protocol[step] = info date = self.curr_protocol['ADMIN'][1].split('/') time = self.curr_protocol['ADMIN'][2].split(':') self.sel_date_time = map(int, [date[2],date[1],date[0],time[0],time[1], time[2]]) self.selected_datetime = datetime.datetime(*map(int, [date[2],date[1],date[0],time[0],time[1], time[2]])) if (self.initial_datetime and self.initial_seed_density and self.curr_protocol['HARVEST']): # *** Harvest density can be less then seed density if cells die # the forumula is different check with Paul #=elapsedtime*LN(2)/LN(harvest density/seed density) # ** time resloution can be days or hours time_elapsed = (self.selected_datetime-self.initial_datetime) elapsed_minutes = (time_elapsed.days * 1440) + (time_elapsed.seconds / 60) if elapsed_minutes < 360: dlg = wx.MessageDialog(None, 'Difference of seed-harvest time should be minimum 6 hr.\nReselect time', 'Time selection error', wx.OK| wx.ICON_STOP) dlg.ShowModal() return if (self.selected_datetime>self.initial_datetime and self.curr_protocol['HARVEST'][0] > self.initial_seed_density): cell_growth = max(math.log(self.curr_protocol['HARVEST'][0]/self.initial_seed_density), 1) pdt = (elapsed_minutes*math.log(2)/cell_growth)/60 self.pd_text.SetLabel('PD Time %.2f Hr' %pdt) self.curr_protocol['PD'].append(pdt) self.curr_protocol['PD'].append((elapsed_minutes/60)/pdt) self.curr_protocol['PD'].append((elapsed_minutes/60)) if self.initial_seed_density and self.curr_protocol['HARVEST']: self.selection_btn.Enable() if (self.initial_seed_density is None) and self.curr_protocol['SEED']: self.selection_btn.Enable()
def __init__(self, parent, protocol, currpassageNo, action_type): wx.Dialog.__init__(self, parent, -1, size=(850,500), style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER) self.protocol = protocol self.currpassageNo = currpassageNo self.action_type = action_type self.SetTitle(self.action_type.title()) self.top_panel = wx.Panel(self) self.bot_panel = wx.ScrolledWindow(self) self.settings_controls = {} self.curr_protocol = {} self.admin_info = {} self.today_datetime = datetime.datetime.now() self.tag_stump = exp.get_tag_stump(self.protocol, 2) self.instance = exp.get_tag_attribute(self.protocol) if meta.get_field(self.tag_stump+'|Passage%s|%s' %(str(self.currpassageNo-1), self.instance)) is None: self.curr_protocol = Default_Protocol else: d = meta.get_field(self.tag_stump+'|Passage%s|%s' %(str(self.currpassageNo-1), self.instance)) for k, v in d: self.curr_protocol[k] = v date= None self.initial_datetime = None self.initial_seed_density = None self.curr_protocol['PD'] = [] self.curr_protocol['HARVEST'] = [] self.curr_protocol['RESEED'] = [] #datetime.datetime.fromtimestamp(wx.DateTime.Now().GetTicks()) #wx.DateTimeFromTimeT(time.mktime(datetime.datetime.now().timetuple())) if self.curr_protocol['ADMIN'][1]: date = self.curr_protocol['ADMIN'][1].split('/') time = self.curr_protocol['ADMIN'][2].split(':') self.initial_datetime = datetime.datetime(*map(int, [date[2],date[1],date[0],time[0],time[1], time[2]])) if self.curr_protocol['SEED']: self.initial_seed_density = self.curr_protocol['SEED'][0] #Admin self.settings_controls['Admin|0'] = wx.TextCtrl(self.top_panel, size=(70,-1), value=self.curr_protocol['ADMIN'][0]) self.settings_controls['Admin|1'] = wx.DatePickerCtrl(self.top_panel, style = wx.DP_DROPDOWN | wx.DP_SHOWCENTURY) if date is None: self.curr_protocol['ADMIN'][1] = str(self.today_datetime.day)+'/'+str(self.today_datetime.month)+'/'+str(self.today_datetime.year) else: self.settings_controls['Admin|1'].SetValue(wx.DateTimeFromDMY(int(date[0]), int(date[1])-1, int(date[2]))) self.settings_controls['Admin|2'] = masked.TimeCtrl( self.top_panel, -1, name="24 hour control", fmt24hr=True ) h = self.settings_controls['Admin|2'].GetSize().height spin1 = wx.SpinButton( self.top_panel, -1, wx.DefaultPosition, (-1,h), wx.SP_VERTICAL ) self.settings_controls['Admin|2'].BindSpinButton( spin1 ) self.curr_protocol['ADMIN'][2] = str(self.today_datetime.hour)+':'+str(self.today_datetime.minute)+':'+str(self.today_datetime.second) self.settings_controls['Admin|2'].SetValue(self.curr_protocol['ADMIN'][2]) self.set_curr_time = wx.Button(self.top_panel, -1, 'Set Current Date Time') if (self.action_type == 'passage') or (self.action_type == 'seed'): self.settings_controls['Seed|0'] = wx.lib.masked.NumCtrl(self.top_panel, size=(20,-1), style=wx.TE_PROCESS_ENTER) unit_choices =['nM2', 'uM2', 'mM2','Other'] self.settings_controls['Seed|1'] = wx.ListBox(self.top_panel, -1, wx.DefaultPosition, (50,20), unit_choices, wx.LB_SINGLE) if self.curr_protocol['SEED']: self.settings_controls['Seed|0'].SetValue(self.curr_protocol['SEED'][0]) self.settings_controls['Seed|0'].Disable() self.settings_controls['Seed|1'].Append(self.curr_protocol['SEED'][1]) self.settings_controls['Seed|1'].SetStringSelection(self.curr_protocol['SEED'][1]) self.settings_controls['Seed|1'].Disable() self.settings_controls['Seed|0'].Bind(wx.EVT_TEXT, self.OnSavingData) self.settings_controls['Seed|1'].Bind(wx.EVT_LISTBOX, self.OnSavingData) if (self.action_type == 'passage'): self.settings_controls['Harvest|0'] = wx.lib.masked.NumCtrl(self.top_panel, size=(20,-1), style=wx.TE_PROCESS_ENTER) unit_choices =['nM2', 'uM2', 'mM2','Other'] self.settings_controls['Harvest|1'] = wx.ListBox(self.top_panel, -1, wx.DefaultPosition, (50,20), unit_choices, wx.LB_SINGLE) self.settings_controls['Reseed|0'] = wx.lib.masked.NumCtrl(self.top_panel, size=(20,-1), style=wx.TE_PROCESS_ENTER) unit_choices =['nM2', 'uM2', 'mM2','Other'] self.settings_controls['Reseed|1'] = wx.ListBox(self.top_panel, -1, wx.DefaultPosition, (50,20), unit_choices, wx.LB_SINGLE) self.settings_controls['Harvest|0'].Bind(wx.EVT_TEXT, self.OnSavingData) self.settings_controls['Harvest|1'].Bind(wx.EVT_LISTBOX, self.OnSavingData) self.settings_controls['Reseed|0'].Bind(wx.EVT_TEXT, self.OnSavingData) self.settings_controls['Reseed|1'].Bind(wx.EVT_LISTBOX, self.OnSavingData) # CHANGE IT VESSEL DESIGN TWO SELECTIONS vessel_types =['T75', 'T25', '6WellPlate','12WellPlate', 'Other'] self.settings_controls['Vessel|0'] = wx.ListBox(self.top_panel, -1, wx.DefaultPosition, (100,20), vessel_types, wx.LB_SINGLE) if self.curr_protocol['VESSEL']: self.settings_controls['Vessel|0'].Append(self.curr_protocol['VESSEL'][0]) self.settings_controls['Vessel|0'].SetStringSelection(self.curr_protocol['VESSEL'][0]) self.pd_text = wx.StaticText(self.top_panel, -1, '') font = wx.Font(12, wx.FONTFAMILY_MODERN, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD) self.pd_text.SetFont(font) self.selection_btn = wx.Button(self, wx.ID_OK, 'Record Passage') self.close_btn = wx.Button(self, wx.ID_CANCEL) #self.selection_btn.Disable() #Bind self.settings_controls['Admin|0'].Bind(wx.EVT_TEXT, self.OnSavingData) self.settings_controls['Admin|1'].Bind(wx.EVT_DATE_CHANGED, self.OnSavingData) self.settings_controls['Admin|2'].Bind(wx.EVT_TEXT, self.OnSavingData) self.settings_controls['Vessel|0'].Bind(wx.EVT_LISTBOX, self.OnSavingData) self.set_curr_time.Bind(wx.EVT_BUTTON, self.setCurrDateTime) # Sizers and layout staticbox = wx.StaticBox(self.top_panel, -1, "Admin") adminsizer = wx.StaticBoxSizer(staticbox, wx.HORIZONTAL) adminsizer.Add(wx.StaticText(self.top_panel, -1, 'Operator Name'),0, wx.RIGHT, 5) adminsizer.Add(self.settings_controls['Admin|0'] , 0, wx.EXPAND) adminsizer.Add(wx.StaticText(self.top_panel, -1, 'Date'),0, wx.RIGHT|wx.LEFT, 5) adminsizer.Add(self.settings_controls['Admin|1'], 0, wx.EXPAND) adminsizer.Add(wx.StaticText(self.top_panel, -1, 'Time'),0, wx.LEFT, 5) adminsizer.Add(self.settings_controls['Admin|2'], 0, wx.EXPAND) adminsizer.Add( spin1, 0, wx.ALIGN_CENTRE ) adminsizer.Add(self.set_curr_time, 0, wx.ALIGN_RIGHT|wx.LEFT, 15) stat_fgs = wx.FlexGridSizer(cols=4, hgap=5, vgap=5) if (self.action_type == 'passage') or (self.action_type == 'seed'): stat_fgs.Add(wx.StaticText(self.top_panel, -1, 'Seed Density'),0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL) stat_fgs.Add(self.settings_controls['Seed|0'], 0, wx.EXPAND) stat_fgs.Add(wx.StaticText(self.top_panel, -1, ' cells/'),0, wx.ALIGN_LEFT|wx.ALIGN_CENTER_VERTICAL) stat_fgs.Add(self.settings_controls['Seed|1'], 0, wx.EXPAND) if (self.action_type == 'passage'): stat_fgs.Add(wx.StaticText(self.top_panel, -1, 'Harvest Density'),0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL) stat_fgs.Add(self.settings_controls['Harvest|0'], 0, wx.EXPAND) stat_fgs.Add(wx.StaticText(self.top_panel, -1, ' cells/'),0, wx.ALIGN_LEFT|wx.ALIGN_CENTER_VERTICAL) stat_fgs.Add(self.settings_controls['Harvest|1'], 0, wx.EXPAND) stat_fgs.Add(wx.StaticText(self.top_panel, -1, 'Reseed Density'),0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL) stat_fgs.Add(self.settings_controls['Reseed|0'], 0, wx.EXPAND) stat_fgs.Add(wx.StaticText(self.top_panel, -1, ' cells/'),0, wx.ALIGN_LEFT|wx.ALIGN_CENTER_VERTICAL) stat_fgs.Add(self.settings_controls['Reseed|1'], 0, wx.EXPAND) stat_fgs.Add(wx.StaticText(self.top_panel, -1, 'Vessel Type'),0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL) stat_fgs.Add(self.settings_controls['Vessel|0'], 0, wx.EXPAND) staticbox = wx.StaticBox(self.top_panel, -1, "Statistics") statsizer = wx.StaticBoxSizer(staticbox, wx.HORIZONTAL) statsizer.Add(stat_fgs, 0, wx.ALIGN_LEFT) statsizer.Add(self.pd_text, 0, wx.ALIGN_CENTRE|wx.ALIGN_RIGHT|wx.ALL, 20) self.top_panel_sizer = wx.BoxSizer(wx.VERTICAL) self.top_panel_sizer.Add(adminsizer, 0, wx.EXPAND|wx.ALL, 5) self.top_panel_sizer.Add(statsizer, 0, wx.EXPAND|wx.ALL, 5) self.fgs = wx.FlexGridSizer(cols=7, hgap=5, vgap=5) self.showSteps() btnSizer = wx.BoxSizer(wx.HORIZONTAL) btnSizer.Add(self.selection_btn , 0, wx.ALL, 5) btnSizer.Add(self.close_btn , 0, wx.ALL, 5) self.top_panel.SetSizer(self.top_panel_sizer) self.bot_panel.SetSizer(self.fgs) self.bot_panel.SetScrollbars(20, 20, self.Size[0]+20, self.Size[1]+20, 0, 0) btnSizer = wx.BoxSizer(wx.HORIZONTAL) btnSizer.Add(self.selection_btn , 0, wx.ALL, 5) btnSizer.Add(self.close_btn , 0, wx.ALL, 5) self.Sizer = wx.BoxSizer(wx.VERTICAL) self.Sizer.Add(self.top_panel, 0, wx.EXPAND|wx.ALL, 5) self.Sizer.Add(wx.StaticLine(self), 0, wx.EXPAND|wx.ALL, 5) self.Sizer.Add(self.bot_panel, 1, wx.EXPAND|wx.ALL, 5) self.Sizer.Add(btnSizer) self.Show()
def _on_mouse_click(self, evt): if self.current_node is None: return for tag in self.current_node.get_tags(): if tag.startswith("DataAcquis|TLM") or tag.startswith("DataAcquis|HCS"): for well in self.current_node.get_well_ids(): image_tag = "%s|Images|%s|%s|%s" % ( exp.get_tag_stump(tag, 2), exp.get_tag_instance(tag), exp.get_tag_timepoint(tag), well, ) urls = meta.get_field(image_tag, []) image_viewer_path = "" if os.path.isfile("C:\Program Files\ImageJ\ImageJ.exe"): ImageJPath = "C:\Program Files\ImageJ\ImageJ.exe" subprocess.Popen("%s %s" % (ImageJPath, " ".join(urls))) else: dlg = wx.lib.dialogs.ScrolledMessageDialog( self, str("\n".join(urls)), "ERROR!! ImageJ was not found in C\Program Files directory to show following images", ) dlg.ShowModal() return # for url in urls: # im = Image.open(url) # im.show() ##TODO: make it Try with ImageJ first then Exception is Image.open(url) # ImageJPath = r'C:\Program Files\ImageJ\ImageJ' # subprocess.Popen("%s %s" % (ImageJPath, url)) elif tag.startswith("DataAcquis|FCS"): for well in self.current_node.get_well_ids(): image_tag = "%s|Images|%s|%s|%s" % ( exp.get_tag_stump(tag, 2), exp.get_tag_instance(tag), exp.get_tag_timepoint(tag), well, ) urls = meta.get_field(image_tag, []) for url in urls: os.startfile(url) # print self.current_node.get_well_ids() # print self.current_node.get_parent() ## message = '' ## for well in sorted(self.current_node.get_well_ids()): ## message += ', '.join(well) ## message += '\n' ## msg = wx.MessageDialog(self, message, caption='Info', style=wx.OK | wx.ICON_INFORMATION | wx.STAY_ON_TOP, pos=(200,200)) ## msg.ShowModal() ## msg.Destroy() try: bench = wx.GetApp().get_bench() except: return # --- Update the Bench view --- bench.set_timepoint(self.current_node.get_timepoint()) bench.taglistctrl.set_selected_protocols([exp.get_tag_protocol(tag) for tag in self.current_node.get_tags()]) bench.group_checklist.SetCheckedStrings( [exp.PlateDesign.get_plate_group(well[0]) for well in self.current_node.get_well_ids()] ) bench.update_plate_groups() bench.update_well_selections() try: exptsettings = wx.GetApp().get_exptsettings() except: return # -- Update the expt setting/metadata view --# exptsettings.OnLeafSelect() if self.current_node.get_tags(): exptsettings.ShowInstance(self.current_node.get_tags()[0]) ancestors = [ exp.get_tag_stump(ptag, 2) for pnode in timeline.reverse_iter_tree(self.current_node) if pnode for ptag in pnode.tags ]
def _on_mouse_click(self, evt): if self.current_node is None: return # --- Update the Bench view --- try: bench = wx.GetApp().get_bench() except: return bench.set_timepoint(self.current_node.get_timepoint()) bench.taglistctrl.set_selected_protocols( [exp.get_tag_protocol(tag) for tag in self.current_node.get_tags()]) bench.group_checklist.SetCheckedStrings( [exp.PlateDesign.get_plate_group(well[0]) for well in self.current_node.get_well_ids()]) bench.update_plate_groups() bench.update_well_selections() bench.del_evt_button.Enable() # -- Update the expt setting/metadata view --# try: exptsettings = wx.GetApp().get_exptsettings() except: return exptsettings.OnLeafSelect() if self.current_node.get_tags(): exptsettings.ShowInstance(self.current_node.get_tags()[0]) ancestors = [exp.get_tag_stump(ptag, 2) for pnode in timeline.reverse_iter_tree(self.current_node) if pnode for ptag in pnode.tags] # -- show the data url list --- # data_acquis = False for tag in self.current_node.get_tags(): if tag.startswith('DataAcquis'): data_acquis = True break if data_acquis: dia = DataLinkListDialog(self, self.current_node.get_well_ids()) if dia.ShowModal() == wx.ID_OK: if dia.output_options.GetSelection() == 0: file_dlg = wx.FileDialog(None, message='Exporting Data URL...', defaultDir=os.getcwd(), defaultFile='data urls', wildcard='.csv', style=wx.SAVE|wx.FD_OVERWRITE_PROMPT) if file_dlg.ShowModal() == wx.ID_OK: os.chdir(os.path.split(file_dlg.GetPath())[0]) myfile = open(file_dlg.GetPath(), 'wb') wr = csv.writer(myfile, quoting=csv.QUOTE_ALL) for row in dia.listctrl.get_selected_urls(): wr.writerow(row) myfile.close() file_dlg.Destroy() if dia.output_options.GetSelection() == 1: file_dlg = wx.FileDialog(None, message='Exporting Data URL...', defaultDir=os.getcwd(), defaultFile='data urls', wildcard='.csv', style=wx.SAVE|wx.FD_OVERWRITE_PROMPT) if file_dlg.ShowModal() == wx.ID_OK: os.chdir(os.path.split(file_dlg.GetPath())[0]) myfile = open(file_dlg.GetPath(), 'wb') wr = csv.writer(myfile, quoting=csv.QUOTE_ALL) for row in dia.listctrl.get_all_urls(): wr.writerow(row) myfile.close() file_dlg.Destroy() if dia.output_options.GetSelection() == 2: image_urls = [] for row in dia.listctrl.get_selected_urls(): image_urls.append(row[2]) if os.path.isfile('C:\Program Files\ImageJ\ImageJ.exe') is False: #err_dlg = wx.lib.dialogs.ScrolledMessageDialog(self, str("\n".join(urls)), "ERROR!! ImageJ was not found in C\Program Files directory to show following images") err_dlg = wx.MessageDialog(None, 'ImageJ was not found in C\Program Files directory to show images!!', 'Error', wx.OK | wx.ICON_ERROR) err_dlg.ShowModal() return else: #TO DO: check the image format to be shown in ImageJ ImageJPath = 'C:\Program Files\ImageJ\ImageJ.exe' subprocess.Popen("%s %s" % (ImageJPath, ' '.join(image_urls))) dia.Destroy()
def __init__(self, parent, protocol, currpassageNo): wx.Dialog.__init__(self, parent, -1, size=(700, 500), style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER, title='Passage %s' % str(currpassageNo)) self.protocol = protocol self.currpassageNo = currpassageNo self.top_panel = wx.Panel(self) self.bot_panel = wx.ScrolledWindow(self) self.settings_controls = {} self.curr_protocol = {} self.admin_info = {} self.tag_stump = exp.get_tag_stump(self.protocol, 2) self.instance = exp.get_tag_attribute(self.protocol) if meta.get_field( self.tag_stump + '|Passage%s|%s' % (str(self.currpassageNo - 1), self.instance)) is None: self.curr_protocol = Default_Protocol else: #self.curr_protocol = meta.get_field(self.tag_stump+'|Passage%s|%s' %(str(self.currpassageNo-1), self.instance)) d = meta.get_field(self.tag_stump + '|Passage%s|%s' % (str(self.currpassageNo - 1), self.instance)) for k, v in d: self.curr_protocol[k] = v today = datetime.date.today() self.myDate = '%02d/%02d/%4d' % (today.day, today.month, today.year) self.curr_protocol['ADMIN'][ 1] = self.myDate # set todays date as current self.settings_controls['Admin|0'] = wx.TextCtrl( self.top_panel, size=(70, -1), value=self.curr_protocol['ADMIN'][0]) self.settings_controls['Admin|1'] = wx.DatePickerCtrl( self.top_panel, style=wx.DP_DROPDOWN | wx.DP_SHOWCENTURY) self.settings_controls['Admin|2'] = wx.TextCtrl( self.top_panel, size=(20, -1), value=self.curr_protocol['ADMIN'][2]) #self.settings_controls['Admin|3'] = wx.TextCtrl(self.top_panel, size=(20,-1), value=self.curr_protocol['ADMIN'][3]) self.settings_controls['Admin|3'] = wx.lib.masked.NumCtrl( self.top_panel, size=(20, -1), style=wx.TE_PROCESS_ENTER) if isinstance(self.curr_protocol['ADMIN'][3], int): #it had value self.settings_controls['Admin|3'].SetValue( self.curr_protocol['ADMIN'][3]) unit_choices = ['nM2', 'uM2', 'mM2', 'Other'] self.settings_controls['Admin|4'] = wx.ListBox(self.top_panel, -1, wx.DefaultPosition, (50, 20), unit_choices, wx.LB_SINGLE) if self.curr_protocol['ADMIN'][4] is not None: self.settings_controls['Admin|4'].Append( self.curr_protocol['ADMIN'][4]) self.settings_controls['Admin|4'].SetStringSelection( self.curr_protocol['ADMIN'][4]) self.settings_controls['Admin|0'].Bind(wx.EVT_TEXT, self.OnSavingData) self.settings_controls['Admin|1'].Bind(wx.EVT_DATE_CHANGED, self.OnSavingData) self.settings_controls['Admin|2'].Bind(wx.EVT_TEXT, self.OnSavingData) self.settings_controls['Admin|3'].Bind(wx.EVT_TEXT, self.OnSavingData) self.settings_controls['Admin|4'].Bind(wx.EVT_LISTBOX, self.OnSavingData) self.selection_btn = wx.Button(self, wx.ID_OK, 'Record Passage') self.close_btn = wx.Button(self, wx.ID_CANCEL) # Sizers and layout top_fgs = wx.FlexGridSizer(cols=10, vgap=5) top_fgs.Add(wx.StaticText(self.top_panel, -1, 'Operator Name'), 0, wx.RIGHT, 5) top_fgs.Add(self.settings_controls['Admin|0'], 0, wx.EXPAND) top_fgs.Add(wx.StaticText(self.top_panel, -1, 'Date'), 0, wx.RIGHT | wx.LEFT, 5) top_fgs.Add(self.settings_controls['Admin|1'], 0, wx.EXPAND) top_fgs.Add(wx.StaticText(self.top_panel, -1, 'Split 1:'), 0, wx.LEFT, 5) top_fgs.Add(self.settings_controls['Admin|2'], 0, wx.EXPAND) top_fgs.Add(wx.StaticText(self.top_panel, -1, 'Cell Count'), 0, wx.RIGHT | wx.LEFT, 5) top_fgs.Add(self.settings_controls['Admin|3'], 0, wx.EXPAND) top_fgs.Add(wx.StaticText(self.top_panel, -1, ' cells/'), 0) top_fgs.Add(self.settings_controls['Admin|4'], 0, wx.EXPAND) self.fgs = wx.FlexGridSizer(cols=7, hgap=5, vgap=5) self.showSteps() btnSizer = wx.BoxSizer(wx.HORIZONTAL) btnSizer.Add(self.selection_btn, 0, wx.ALL, 5) btnSizer.Add(self.close_btn, 0, wx.ALL, 5) self.top_panel.SetSizer(top_fgs) self.bot_panel.SetSizer(self.fgs) self.bot_panel.SetScrollbars(20, 20, self.Size[0] + 20, self.Size[1] + 20, 0, 0) self.Sizer = wx.BoxSizer(wx.VERTICAL) self.Sizer.Add(self.top_panel, 0, wx.EXPAND | wx.ALL, 5) self.Sizer.Add(wx.StaticLine(self), 0, wx.EXPAND | wx.ALL, 5) self.Sizer.Add(self.bot_panel, 1, wx.EXPAND | wx.ALL, 10) self.Sizer.Add(btnSizer) self.Show()
def __init__(self, parent, protocol, currpassageNo): wx.Dialog.__init__(self, parent, -1, size=(700,500), style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER, title = 'Passage %s' %str(currpassageNo)) self.protocol = protocol self.currpassageNo = currpassageNo self.top_panel = wx.Panel(self) self.bot_panel = wx.ScrolledWindow(self) self.settings_controls = {} self.curr_protocol = {} self.admin_info = {} self.tag_stump = exp.get_tag_stump(self.protocol, 2) self.instance = exp.get_tag_attribute(self.protocol) if meta.get_field(self.tag_stump+'|Passage%s|%s' %(str(self.currpassageNo-1), self.instance)) is None: self.curr_protocol = Default_Protocol else: #self.curr_protocol = meta.get_field(self.tag_stump+'|Passage%s|%s' %(str(self.currpassageNo-1), self.instance)) d = meta.get_field(self.tag_stump+'|Passage%s|%s' %(str(self.currpassageNo-1), self.instance)) for k, v in d: self.curr_protocol[k] = v today = datetime.date.today() self.myDate = '%02d/%02d/%4d'%(today.day, today.month, today.year) self.curr_protocol['ADMIN'][1] = self.myDate # set todays date as current self.settings_controls['Admin|0'] = wx.TextCtrl(self.top_panel, size=(70,-1), value=self.curr_protocol['ADMIN'][0]) self.settings_controls['Admin|1'] = wx.DatePickerCtrl(self.top_panel, style = wx.DP_DROPDOWN | wx.DP_SHOWCENTURY) self.settings_controls['Admin|2'] = wx.TextCtrl(self.top_panel, size=(20,-1), value=self.curr_protocol['ADMIN'][2]) #self.settings_controls['Admin|3'] = wx.TextCtrl(self.top_panel, size=(20,-1), value=self.curr_protocol['ADMIN'][3]) self.settings_controls['Admin|3'] = wx.lib.masked.NumCtrl(self.top_panel, size=(20,-1), style=wx.TE_PROCESS_ENTER) if isinstance(self.curr_protocol['ADMIN'][3], int): #it had value self.settings_controls['Admin|3'].SetValue(self.curr_protocol['ADMIN'][3]) unit_choices =['nM2', 'uM2', 'mM2','Other'] self.settings_controls['Admin|4'] = wx.ListBox(self.top_panel, -1, wx.DefaultPosition, (50,20), unit_choices, wx.LB_SINGLE) if self.curr_protocol['ADMIN'][4] is not None: self.settings_controls['Admin|4'].Append(self.curr_protocol['ADMIN'][4]) self.settings_controls['Admin|4'].SetStringSelection(self.curr_protocol['ADMIN'][4]) self.settings_controls['Admin|0'].Bind(wx.EVT_TEXT, self.OnSavingData) self.settings_controls['Admin|1'].Bind(wx.EVT_DATE_CHANGED, self.OnSavingData) self.settings_controls['Admin|2'].Bind(wx.EVT_TEXT, self.OnSavingData) self.settings_controls['Admin|3'].Bind(wx.EVT_TEXT, self.OnSavingData) self.settings_controls['Admin|4'].Bind(wx.EVT_LISTBOX, self.OnSavingData) self.selection_btn = wx.Button(self, wx.ID_OK, 'Record Passage') self.close_btn = wx.Button(self, wx.ID_CANCEL) # Sizers and layout top_fgs = wx.FlexGridSizer(cols=10, vgap=5) top_fgs.Add(wx.StaticText(self.top_panel, -1, 'Operator Name'),0, wx.RIGHT, 5) top_fgs.Add(self.settings_controls['Admin|0'] , 0, wx.EXPAND) top_fgs.Add(wx.StaticText(self.top_panel, -1, 'Date'),0, wx.RIGHT|wx.LEFT, 5) top_fgs.Add(self.settings_controls['Admin|1'], 0, wx.EXPAND) top_fgs.Add(wx.StaticText(self.top_panel, -1, 'Split 1:'),0, wx.LEFT, 5) top_fgs.Add(self.settings_controls['Admin|2'], 0, wx.EXPAND) top_fgs.Add(wx.StaticText(self.top_panel, -1, 'Cell Count'),0, wx.RIGHT|wx.LEFT, 5) top_fgs.Add(self.settings_controls['Admin|3'], 0, wx.EXPAND) top_fgs.Add(wx.StaticText(self.top_panel, -1, ' cells/'),0) top_fgs.Add(self.settings_controls['Admin|4'], 0, wx.EXPAND) self.fgs = wx.FlexGridSizer(cols=7, hgap=5, vgap=5) self.showSteps() btnSizer = wx.BoxSizer(wx.HORIZONTAL) btnSizer.Add(self.selection_btn , 0, wx.ALL, 5) btnSizer.Add(self.close_btn , 0, wx.ALL, 5) self.top_panel.SetSizer(top_fgs) self.bot_panel.SetSizer(self.fgs) self.bot_panel.SetScrollbars(20, 20, self.Size[0]+20, self.Size[1]+20, 0, 0) self.Sizer = wx.BoxSizer(wx.VERTICAL) self.Sizer.Add(self.top_panel, 0, wx.EXPAND|wx.ALL, 5) self.Sizer.Add(wx.StaticLine(self), 0, wx.EXPAND|wx.ALL, 5) self.Sizer.Add(self.bot_panel, 1, wx.EXPAND|wx.ALL, 10) self.Sizer.Add(btnSizer) self.Show()
def get_ancestral_tags(self, node): return [ exp.get_tag_stump(ptag, 2) for pnode in timeline.reverse_iter_tree(node) if pnode for ptag in pnode.tags ]
def _on_paint(self, evt=None): '''Handler for paint events. ''' if self.nodes_by_timepoint == {}: evt.Skip() return t0 = time() PAD = self.PAD + self.NODE_R NODE_R = self.NODE_R MIN_X_GAP = self.MIN_X_GAP MIN_Y_GAP = self.MIN_Y_GAP FLASK_GAP = self.FLASK_GAP MAX_TIMEPOINT = self.timepoints[0] timepoints = self.timepoints nodes_by_tp = self.nodes_by_timepoint self.current_node = None # Node with the mouse over it w_win, h_win = (float(self.Size[0]), float(self.Size[1])) if self.time_x: if timepoints[0] == 0: px_per_time = 1 else: px_per_time = max((w_win - PAD * 2 - FLASK_GAP) / MAX_TIMEPOINT, MIN_X_GAP) if len(nodes_by_tp) == 2: x_gap = 1 else: # calculate the number of pixels to separate each generation timepoint x_gap = max(MIN_X_GAP, (w_win - PAD * 2 - FLASK_GAP) / (len(nodes_by_tp) - 2)) if len(nodes_by_tp[timepoints[0]]) == 1: y_gap = MIN_Y_GAP else: # calcuate the minimum number of pixels to separate nodes on the y axis y_gap = max(MIN_Y_GAP, (h_win - PAD * 2) / (len(nodes_by_tp[MAX_TIMEPOINT]) - 1)) nodeY = {} # Store y coords of children so we can calculate where to draw the parents Y = PAD X = w_win - PAD dc = wx.PaintDC(self) dc.Clear() dc.BeginDrawing() #dc.SetPen(wx.Pen("BLACK",1)) def hover(mouse_pos, node_pos, node_r): '''returns whether the mouse is hovering over a node mouse_pos - the mouse position node_pos - the node position node_r - the node radius ''' if mouse_pos is None: return False MX,MY = mouse_pos X,Y = node_pos return (X - node_r < MX < X + node_r and Y - node_r < MY < Y + node_r) # Iterate from leaf nodes up to the root, and draw R->L, Top->Bottom for i, t in enumerate(timepoints): if t == -1: X = PAD elif self.time_x: X = PAD + FLASK_GAP + t * px_per_time x_gap = PAD + FLASK_GAP + timepoints[i-1] * px_per_time - X else: X = PAD + FLASK_GAP + (len(timepoints) - i - 2) * x_gap # NO EVENTS. JUST DRAW THE STOCK, CENTERED. if len(nodes_by_tp) == 1: X = w_win / 2 Y = h_win / 2 if hover(self.cursor_pos, (X,Y), self.NODE_R): dc.SetBrush(wx.Brush('#FFFFAA')) self.current_node = nodes_by_tp.values()[t][0] else: dc.SetBrush(wx.Brush('#FAF9F7')) self.current_node = None dc.DrawRectangle(X-NODE_R, Y-NODE_R, NODE_R*2, NODE_R*2) ## dc.DrawText(str(nodes_by_tp[t][0].get_timepoint()), X, Y+NODE_R) # LEAF NODES elif i == 0: for node in nodes_by_tp[t]: empty_path = False # whether this path follows a harvesting if len(node.get_tags()) > 0: # Event occurred dc.SetBrush(wx.Brush('YELLOW')) else: # No event dc.SetBrush(wx.Brush('WHITE')) if 'CellTransfer|Harvest' in [exp.get_tag_stump(ptag, 2) for pnode in timeline.reverse_iter_tree(node) if pnode for ptag in pnode.tags]: empty_path = True if hover(self.cursor_pos, (X,Y), self.NODE_R): # MouseOver dc.SetPen(wx.Pen('#000000', 3)) self.current_node = node else: # No MouseOver dc.SetPen(wx.Pen('#000000', 1)) if not empty_path: dc.DrawCircle(X, Y, NODE_R) ## dc.DrawText(str(node.get_tags()), X, Y+NODE_R) nodeY[node.id] = Y Y += y_gap # INTERNAL NODES else: for node in nodes_by_tp[t]: empty_path = False # whether this path follows a harvesting ys = [] for child in node.get_children(): ys.append(nodeY[child.id]) Y = (min(ys) + max(ys)) / 2 if len(node.get_tags()) > 0: # Event occurred dc.SetBrush(wx.Brush('YELLOW')) else: # No event dc.SetBrush(wx.Brush('WHITE')) if 'CellTransfer|Harvest' in [exp.get_tag_stump(ptag, 2) for pnode in timeline.reverse_iter_tree(node) if pnode for ptag in pnode.tags]: empty_path = True if hover(self.cursor_pos, (X,Y), self.NODE_R): # MouseOver dc.SetPen(wx.Pen(wx.BLACK, 3)) self.current_node = node else: # No MouseOver dc.SetPen(wx.Pen(wx.BLACK, 1)) if t == -1: dc.DrawRectangle(X-NODE_R, Y-NODE_R, NODE_R*2, NODE_R*2) else: if not empty_path: dc.DrawCircle(X, Y, NODE_R) ## dc.DrawText(str(node.get_tags()), X, Y+NODE_R) # DRAW LINES CONNECTING THIS NODE TO ITS CHILDREN dc.SetBrush(wx.Brush('#FAF9F7')) dc.SetPen(wx.Pen(wx.BLACK, 1)) harvest_tag = False for tag in node.get_tags(): if tag.startswith('CellTransfer|Harvest'): harvest_tag = tag for child in node.get_children(): if t == -1: if self.time_x: dc.DrawLine(X + NODE_R, Y, X + FLASK_GAP + px_per_time * timepoints[i-1] - NODE_R ,nodeY[child.id]) else: dc.DrawLine(X + NODE_R, Y, X + FLASK_GAP - NODE_R ,nodeY[child.id]) else: if harvest_tag: # TODO: improve performance by caching reseed # events from the previous timepoint for nn in nodes_by_tp[timepoints[i-1]]: for tag in nn.get_tags(): if (tag.startswith('CellTransfer|Seed') and meta.get_field('CellTransfer|Seed|HarvestInstance|'+exp.get_tag_instance(tag)) == exp.get_tag_instance(harvest_tag)): dc.SetPen(wx.Pen('BLACK', 1, wx.SHORT_DASH)) dc.DrawLine(X + NODE_R, Y, X + x_gap - NODE_R ,nodeY[nn.id]) else: if not empty_path: dc.SetPen(wx.Pen(wx.BLACK, 1)) dc.DrawLine(X + NODE_R, Y, X + x_gap - NODE_R, nodeY[child.id]) nodeY[node.id] = Y dc.EndDrawing()
def formatProtocolInfo(self): ''' this method format the information of the annoted protocols ready for printing''' meta = exp.ExperimentSettings.getInstance() self.printfile = file('screenshot.htm', 'w') timepoints = meta.get_timeline().get_unique_timepoints() timeline = meta.get_timeline() self.events_by_timepoint = timeline.get_events_by_timepoint() #---- Overview Secion ---# protocol_info = self.decode_event_description('Overview|Project|1') #this 1 is psedo to make it coherent with other instance based tabs self.printfile.write('<html><head><title>Experiment Protocol</title></head>' '<br/><body><h1>'+protocol_info[0]+'</h1>' '<h3>1. Experiment Overview</h3>' ) for element in protocol_info[1]: self.printfile.write('<dfn>'+element[0]+': </dfn><code>'+element[1]+'</code><br />') #---- Stock Culture ----# stockcultures = meta.get_field_instances('StockCulture|Sample') self.printfile.write('<h3>2. Stock Culture</h3>') if stockcultures: for instance in stockcultures: protocol_info = self.decode_event_description('StockCulture|Sample|%s'%instance) self.printfile.write('<i>'+protocol_info[0]+' </i><br />') for element in protocol_info[1]: self.printfile.write('<dfn>'+element[0]+': </dfn><code>'+element[1]+'</code><br />') #self.printfile.write('<code>'+protocol_info[2]+' </code><br />') self.printfile.write('<br />') self.printfile.write('<dfn>'+protocol_info[2][0]+'</dfn><br />') else: self.printfile.write('<code>No stock culture was used for this experiment</code>') #---- Instrument Secion ---# self.printfile.write('<h3>3. Instrument Settings</h3>') microscopes = meta.get_field_instances('Instrument|Microscope') flowcytometers = meta.get_field_instances('Instrument|Flowcytometer') if microscopes: for instance in microscopes: protocol_info = self.decode_event_description('Instrument|Microscope|%s'%instance) self.printfile.write('<i>Channel Name: '+protocol_info[0]+' (microscope instance %s)'%instance+'</i><br />') for component in protocol_info[1]: if component[0] == 'Component': self.printfile.write('<strong>'+component[1]+'</strong><br />') else: self.printfile.write('<code><b>'+component[0]+': </b>'+component[1]+'</code><br />') self.printfile.write('<p></p>') if flowcytometers: for instance in flowcytometers: protocol_info = self.decode_event_description('Instrument|Flowcytometer|%s'%instance) self.printfile.write('<i>'+protocol_info[0]+' </i><br />') for element in protocol_info[1]: # channels self.printfile.write('<ul><li><code><b>'+element[0]+': </b>') # channel name for i, component in enumerate(element[1]): # config of each component of this channel if i == len(element[1])-1: self.printfile.write(meta.decode_ch_component(component[0])) else: self.printfile.write(meta.decode_ch_component(component[0])+' >> ') self.printfile.write('</code></li></ul>') self.printfile.write('<p></p>') #---- Material and Method Secion ---# self.printfile.write('<h3>4. Materials and Methods</h3>') for i, timepoint in enumerate(timepoints): for protocol in set([exp.get_tag_protocol(ev.get_welltag()) for ev in self.events_by_timepoint[timepoint]]): instance = exp.get_tag_attribute(protocol) # protocol info includes the description of the attributes for each of the protocol e.g. Perturbation|Chem|1 is passed protocol_info = self.decode_event_description(protocol) # spatial info includes plate well inforamtion for this event well tag e.g. Perturbation|Bio|Wells|1|793 ####spatial_info = self.decode_event_location(ev.get_welltag()) ##THIS THING DOES NOT WORK WHEN SAME EVENT AT SAME TIME POINT HAPPENS welltag = exp.get_tag_stump(protocol, 2)+'|Wells|%s|%s'%(instance, str(timepoint)) spatial_info = self.decode_event_location(welltag) # -- write the description and location of the event --# if (exp.get_tag_event(protocol) == 'Seed') and (meta.get_field('CellTransfer|Seed|StockInstance|%s'%instance) is not None): self.printfile.write('Step '+str(i+1)+': <em><b>Seeding</b></em> at '+exp.format_time_string(timepoint)+' hrs<br />') self.printfile.write('<code>'+protocol_info[0]+'</code><br />') self.printlocation(spatial_info) # if harvest precede seeding #if meta.get_field('CellTransfer|Seed|HarvestInstance|%s'%instance) is not None: ## origin(harvesting instance), destination(seeding instance), timepoint #self.printCellTransfer(meta.get_field('CellTransfer|Seed|HarvestInstance|%s'%instance), #instance, timepoint) if exp.get_tag_event(protocol) == 'Harvest': self.printfile.write('Step '+str(i+1)+': <em><b>Harvest-Seed (Cell Transfer)</b></em> at '+exp.format_time_string(timepoint)+' hrs<br />') self.printCellTransfer(instance, timepoint) if exp.get_tag_event(protocol) == 'Chem': #TO DO self.printfile.write('Step '+str(i+1)+': <em><b>Chemical Perturbation</b></em> at '+exp.format_time_string(timepoint)+' hrs<br />') self.printfile.write('<code>'+protocol_info[0]+'</code><br />') self.printlocation(spatial_info) if exp.get_tag_event(protocol) == 'Bio': self.printfile.write('Step '+str(i+1)+': <em><b>Biological Perturbation</b></em> at '+exp.format_time_string(timepoint)+' hrs<br />') self.printfile.write('<code>'+protocol_info[0]+'</code><br />') for element in protocol_info[1]: self.printfile.write('<code><i>'+element[0]+': </i>'+element[1]+'</code><br />') self.printlocation(spatial_info) if exp.get_tag_event(protocol) == 'Dye': self.printfile.write('Step '+str(i+1)+': <em><b>Staining with chemical dye</b></em> at '+exp.format_time_string(timepoint)+' hrs<br />') self.printfile.write('<i>'+protocol_info[0]+'</i><br />') # header part for element in protocol_info[1]: # step description description = element[0] duration = element[1] temp = element[2] if len(duration) > 0: # duration is mentioned duration = ' for %s minutes'%element[1] if len(temp) > 0: # duration is mentioned temp = ' at %s C.'%element[2] self.printfile.write('<ul><li><code>'+description+duration+temp+'</code></li></ul>') self.printlocation(spatial_info) if exp.get_tag_event(protocol) == 'Immuno': self.printfile.write('Step '+str(i+1)+': <em><b>Staining with immunofluorescence</b></em> at '+exp.format_time_string(timepoint)+' hrs<br />') self.printfile.write('<i>'+protocol_info[0]+'</i><br />') # header part for element in protocol_info[2]: #footer part goes here self.printfile.write('<code>'+element+'</code><br />') #footer part for element in protocol_info[1]: # step description description = element[0] duration = element[1] temp = element[2] if len(duration) > 0: # duration is mentioned duration = ' for %s minutes'%element[1] if len(temp) > 0: # duration is mentioned temp = ' at %s C.'%element[2] self.printfile.write('<ul><li><code>'+description+duration+temp+'</code></li></ul>') self.printlocation(spatial_info) if exp.get_tag_event(protocol) == 'Genetic': self.printfile.write('Step '+str(i+1)+': <em><b>Staining with genetic materials</b></em> at '+exp.format_time_string(timepoint)+' hrs<br />') self.printfile.write('<i>'+protocol_info[0]+'</i><br />') # header part for element in protocol_info[2]: #footer part goes here self.printfile.write('<code><i>'+element[0]+': </i>'+element[1]+'</code><br />')#footer part for element in protocol_info[1]: # step description description = element[0] duration = element[1] temp = element[2] if len(duration) > 0: # duration is mentioned duration = ' for %s minutes'%element[1] if len(temp) > 0: # duration is mentioned temp = ' at %s C.'%element[2] self.printfile.write('<ul><li><code>'+description+duration+temp+'</code></li></ul>') self.printlocation(spatial_info) if exp.get_tag_event(protocol) == 'Spin': self.printfile.write('Step '+str(i+1)+': <em><b>Spinning</b></em> at '+exp.format_time_string(timepoint)+' hrs<br />') self.printfile.write('<i>'+protocol_info[0]+'</i><br />') # header part for element in protocol_info[1]: # step description description = element[0] if len(element[1]) > 0: # duration is mentioned duration = ' for %s minutes'%element[1] else: duration = '' self.printfile.write('<ul><li><code>'+description+duration+'</code></li></ul>') self.printlocation(spatial_info) if exp.get_tag_event(protocol) == 'Wash': self.printfile.write('Step '+str(i+1)+': <em><b>Washing</b></em> at '+exp.format_time_string(timepoint)+' hrs<br />') self.printfile.write('<i>'+protocol_info[0]+'</i><br />') # header part for element in protocol_info[1]: # step description description = element[0] if len(element[1]) > 0: # duration is mentioned duration = ' for %s minutes'%element[1] else: duration = '' self.printfile.write('<ul><li><code>'+description+duration+'</code></li></ul>') self.printlocation(spatial_info) if exp.get_tag_event(protocol) == 'Dry': self.printfile.write('Step '+str(i+1)+': <em><b>Drying</b></em> at '+exp.format_time_string(timepoint)+' hrs<br />') self.printfile.write('<i>'+protocol_info[0]+'</i><br />') # header part for element in protocol_info[1]: # step description description = element[0] if len(element[1]) > 0: # duration is mentioned duration = ' for %s minutes'%element[1] else: duration = '' self.printfile.write('<ul><li><code>'+description+duration+'</code></li></ul>') self.printlocation(spatial_info) if exp.get_tag_event(protocol) == 'Medium': self.printfile.write('Step '+str(i+1)+': <em><b>Addition of medium</b></em> at '+exp.format_time_string(timepoint)+' hrs<br />') self.printfile.write('<i>'+protocol_info[0]+'</i><br />') # header part for element in protocol_info[2]: #footer part goes here self.printfile.write('<code>'+element+'</code><br />') #footer part for element in protocol_info[1]: # step description description = element[0] if len(element[1]) > 0: # duration is mentioned duration = ' for %s minutes'%element[1] else: duration = '' self.printfile.write('<ul><li><code>'+description+duration+'</code></li></ul>') self.printlocation(spatial_info) if exp.get_tag_event(protocol) == 'Incubator': self.printfile.write('Step '+str(i+1)+': <em><b>Incubation</b></em> at '+exp.format_time_string(timepoint)+' hrs<br />') self.printfile.write('<i>'+protocol_info[0]+'</i><br />') # header part for element in protocol_info[2]: #footer part goes here self.printfile.write('<code><i>'+element[0]+': </i>'+element[1]+'</code><br />') #footer part for element in protocol_info[1]: # step description description = element[0] if len(element[1]) > 0: # duration is mentioned duration = ' for %s minutes'%element[1] else: duration = '' self.printfile.write('<ul><li><code>'+description+duration+'</code></li></ul>') self.printlocation(spatial_info) if exp.get_tag_event(protocol) == 'TLM': self.printfile.write('Step '+str(i+1)+': <em><b>Timelapse image acquisition</b></em> at '+exp.format_time_string(timepoint)+' hrs<br />') self.printfile.write('<code>'+protocol_info[0]+'</code><br />') # header part wrtie wich setting instance being used for element in protocol_info[1]: self.printfile.write('<code><i>'+element[0]+': </i>'+element[1]+'</code><br />') self.printlocation(spatial_info) # write the image urls self.printfile.write('<table border="0">') for plate, wells in spatial_info.iteritems(): for well in wells: pw = plate, well self.printfile.write('<code><b>Well '+well+'</b></code><br />') for url in meta.get_field('DataAcquis|TLM|Images|%s|%s|%s'%(instance,timepoint, pw), []): self.printfile.write('<small>'+url+'</small><br />') #self.printfile.write('<tr><code><td>'+well+':</td><td>'+('<br />'.join(meta.get_field('DataAcquis|FCS|Images|%s|%s|%s'%(instance,timepoint, pw), [])))+'</td></code></tr>') self.printfile.write('</table><br />') if exp.get_tag_event(protocol) == 'HCS': self.printfile.write('Step '+str(i+1)+': <em><b>Static image acquisition</b></em> at '+exp.format_time_string(timepoint)+' hrs<br />') self.printfile.write('<code>'+protocol_info[0]+'</code><br />') # header part wrtie wich setting instance being used for element in protocol_info[1]: self.printfile.write('<code><i>'+element[0]+': </i>'+element[1]+'</code><br />') self.printlocation(spatial_info) # write the image urls self.printfile.write('<table border="0">') for plate, wells in spatial_info.iteritems(): for well in wells: pw = plate, well self.printfile.write('<code><b>Well '+well+'</b></code><br />') for url in meta.get_field('DataAcquis|HCS|Images|%s|%s|%s'%(instance,timepoint, pw), []): self.printfile.write('<small>'+url+'</small><br />') #self.printfile.write('<tr><code><td>'+well+':</td><td>'+('<br />'.join(meta.get_field('DataAcquis|FCS|Images|%s|%s|%s'%(instance,timepoint, pw), [])))+'</td></code></tr>') self.printfile.write('</table><br />') if exp.get_tag_event(protocol) == 'FCS': self.printfile.write('Step '+str(i+1)+': <em><b> FCS file acquisition</b></em> at '+exp.format_time_string(timepoint)+' hrs<br />') self.printfile.write('<code>'+protocol_info[0]+'</code><br />') # header part wrtie wich setting instance being used for element in protocol_info[1]: self.printfile.write('<code><i>'+element[0]+': </i>'+element[1]+'</code><br />') self.printlocation(spatial_info) # write the image urls self.printfile.write('<table border="0">') for plate, wells in spatial_info.iteritems(): for well in wells: pw = plate, well self.printfile.write('<code><b>'+plate+'['+well+']'+'</b></code><br />') for url in meta.get_field('DataAcquis|FCS|Images|%s|%s|%s'%(instance,timepoint, pw), []): self.printfile.write('<small>'+url+'</small><br />') #self.printfile.write('<tr><code><td>'+well+':</td><td>'+('<br />'.join(meta.get_field('DataAcquis|FCS|Images|%s|%s|%s'%(instance,timepoint, pw), [])))+'</td></code></tr>') self.printfile.write('</table><br />') if exp.get_tag_event(protocol) == 'CriticalPoint': # to implement if there are events at the same timepoint write those event first then the critical point self.printfile.write('<font size="2" color="red">Critical point: '+meta.get_field('Notes|CriticalPoint|Description|%s'%instance)+'</font></em><br />') if exp.get_tag_event(protocol) == 'Hint': self.printfile.write('<font size="2" color="blue">Hint: '+meta.get_field('Notes|Hint|Description|%s'%instance)+'</font></em><br />') if exp.get_tag_event(protocol) == 'Rest': self.printfile.write('<font size="2" color="green">Rest: '+meta.get_field('Notes|Rest|Description|%s'%instance)+'</font></em><br />') if exp.get_tag_event(protocol) == 'URL': self.printfile.write('<code>To find out more information please visit '+meta.get_field('Notes|URL|Description|%s'%instance)+'</code><br />') if exp.get_tag_event(protocol) == 'Video': self.printfile.write('<code>For more information please watch the media file: '+meta.get_field('Notes|Video|Description|%s'%instance)+'</code><br />') self.printfile.write('<br />') #---- Protocol Map ---# self.printfile.write('<br />'.join(['<h3>5. Methodology Map</h3>', '<br/><br/>', '<center><img src=myImage.png width=500 height=600></center>', '</body></html>'])) self.printfile.close()
def __init__(self, parent, protocol, curractionNo, action_type, ldt): wx.Dialog.__init__(self, parent, -1, size=(850,500), style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER) self.protocol = protocol self.curractionNo = curractionNo self.action_type = action_type self.last_date_time = ldt self.action_attr = '%s %s'%(self.action_type, str(self.curractionNo)) self.tag_stump = exp.get_tag_stump(self.protocol, 2) self.instance = exp.get_tag_attribute(self.protocol) self.SetTitle(self.action_attr) self.sw = wx.ScrolledWindow(self) self.swsizer = wx.BoxSizer(wx.VERTICAL) self.settings_controls = {} self.curr_protocol = {} self.admin_info = {} self.mandatory_tags = [] self.labels = {} # Set Protocol (if prev instance is there copy that else set STD protocol if meta.get_field(self.tag_stump+'|%s%s|%s' %(self.action_type, str(self.curractionNo-1), self.instance)): d = meta.get_field(self.tag_stump+'|%s%s|%s' %(self.action_type, str(self.curractionNo-1), self.instance)) for k, v in d: self.curr_protocol[k] = v else: self.curr_protocol = STD_PROTOCOLS[self.action_type] # Set the time prev or curr if self.last_date_time: self.initial_datetime = datetime.datetime(*map(int,self.last_date_time)) else: self.initial_datetime = datetime.datetime.now() self.sel_date_time = map(int, [self.initial_datetime.year,self.initial_datetime.month,self.initial_datetime.day, self.initial_datetime.hour,self.initial_datetime.minute, self.initial_datetime.second]) # set the cell density self.initial_seed_density = None #self.curr_protocol['PD'] = [] self.curr_protocol['HARVEST'] = [] if self.curr_protocol['SEED']: self.initial_seed_density = self.curr_protocol['SEED'][0] #Admin self.settings_controls['Admin|0'] = wx.TextCtrl(self.sw, size=(70,-1), value=self.curr_protocol['ADMIN'][0]) self.settings_controls['Admin|1'] = wx.DatePickerCtrl(self.sw, style = wx.DP_DROPDOWN | wx.DP_SHOWCENTURY) self.settings_controls['Admin|1'].SetValue(wx.DateTimeFromDMY(self.initial_datetime.day, self.initial_datetime.month-1, self.initial_datetime.year)) self.curr_protocol['ADMIN'][1] = str(self.initial_datetime.day)+'/'+str(self.initial_datetime.month)+'/'+str(self.initial_datetime.year) self.settings_controls['Admin|2'] = masked.TimeCtrl( self.sw, -1, name="24 hour control", fmt24hr=True ) h = self.settings_controls['Admin|2'].GetSize().height spin1 = wx.SpinButton( self.sw, -1, wx.DefaultPosition, (-1,h), wx.SP_VERTICAL ) self.settings_controls['Admin|2'].BindSpinButton( spin1 ) self.settings_controls['Admin|2'].SetValue(wx.DateTimeFromHMS(self.initial_datetime.hour, self.initial_datetime.minute, self.initial_datetime.second)) self.curr_protocol['ADMIN'][2] = str(self.initial_datetime.hour)+':'+str(self.initial_datetime.minute)+':'+str(self.initial_datetime.second) self.set_curr_time = wx.Button(self.sw, -1, 'Set Current Date Time') self.attr_fgs = wx.FlexGridSizer(cols=4, hgap=5, vgap=5) if self.action_type == 'Seed': self.settings_controls['Seed|0'] = wx.lib.masked.NumCtrl(self.sw, size=(20,-1), style=wx.TE_PROCESS_ENTER) unit_choices =['nM2', 'uM2', 'mM2','Other'] self.settings_controls['Seed|1'] = wx.ListBox(self.sw, -1, wx.DefaultPosition, (50,20), unit_choices, wx.LB_SINGLE) self.settings_controls['Seed|0'].Bind(wx.EVT_TEXT, self.OnSavingData) self.settings_controls['Seed|1'].Bind(wx.EVT_LISTBOX, self.OnSavingData) vessel_types =['T75', 'T25', '6WellPlate','12WellPlate', 'Other'] self.settings_controls['Vessel|0'] = wx.ListBox(self.sw, -1, wx.DefaultPosition, (100,20), vessel_types, wx.LB_SINGLE) if self.curr_protocol['VESSEL']: self.settings_controls['Vessel|0'].Append(self.curr_protocol['VESSEL'][0]) self.settings_controls['Vessel|0'].SetStringSelection(self.curr_protocol['VESSEL'][0]) self.settings_controls['Vessel|0'].Bind(wx.EVT_LISTBOX, self.OnSavingData) self.attr_fgs.Add(wx.StaticText(self.sw, -1, 'Seed Density'),0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL) self.attr_fgs.Add(self.settings_controls['Seed|0'], 0, wx.EXPAND) self.attr_fgs.Add(wx.StaticText(self.sw, -1, ' cells/'),0, wx.ALIGN_LEFT|wx.ALIGN_CENTER_VERTICAL) self.attr_fgs.Add(self.settings_controls['Seed|1'], 0, wx.EXPAND) self.attr_fgs.Add(wx.StaticText(self.sw, -1, 'Vessel Type'),0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL) self.attr_fgs.Add(self.settings_controls['Vessel|0'], 0, wx.EXPAND) if self.action_type == 'Passage': self.settings_controls['Harvest|0'] = wx.lib.masked.NumCtrl(self.sw, size=(20,-1), style=wx.TE_PROCESS_ENTER) unit_choices =['nM2', 'uM2', 'mM2','Other'] self.settings_controls['Harvest|1'] = wx.ListBox(self.sw, -1, wx.DefaultPosition, (50,20), unit_choices, wx.LB_SINGLE) self.settings_controls['Harvest|0'].Bind(wx.EVT_TEXT, self.OnSavingData) self.settings_controls['Harvest|1'].Bind(wx.EVT_LISTBOX, self.OnSavingData) self.settings_controls['Seed|0'] = wx.lib.masked.NumCtrl(self.sw, size=(20,-1), style=wx.TE_PROCESS_ENTER) unit_choices =['nM2', 'uM2', 'mM2','Other'] self.settings_controls['Seed|1'] = wx.ListBox(self.sw, -1, wx.DefaultPosition, (50,20), unit_choices, wx.LB_SINGLE) self.settings_controls['Seed|0'].Bind(wx.EVT_TEXT, self.OnSavingData) self.settings_controls['Seed|1'].Bind(wx.EVT_LISTBOX, self.OnSavingData) vessel_types =['T75', 'T25', '6WellPlate','12WellPlate', 'Other'] self.settings_controls['Vessel|0'] = wx.ListBox(self.sw, -1, wx.DefaultPosition, (100,20), vessel_types, wx.LB_SINGLE) if self.curr_protocol['VESSEL']: self.settings_controls['Vessel|0'].Append(self.curr_protocol['VESSEL'][0]) self.settings_controls['Vessel|0'].SetStringSelection(self.curr_protocol['VESSEL'][0]) self.settings_controls['Vessel|0'].Bind(wx.EVT_LISTBOX, self.OnSavingData) self.attr_fgs.Add(wx.StaticText(self.sw, -1, 'Harvest Density'),0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL) self.attr_fgs.Add(self.settings_controls['Harvest|0'], 0, wx.EXPAND) self.attr_fgs.Add(wx.StaticText(self.sw, -1, ' cells/'),0, wx.ALIGN_LEFT|wx.ALIGN_CENTER_VERTICAL) self.attr_fgs.Add(self.settings_controls['Harvest|1'], 0, wx.EXPAND) self.attr_fgs.Add(wx.StaticText(self.sw, -1, '(Re)seed Density'),0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL) self.attr_fgs.Add(self.settings_controls['Seed|0'], 0, wx.EXPAND) self.attr_fgs.Add(wx.StaticText(self.sw, -1, ' cells/'),0, wx.ALIGN_LEFT|wx.ALIGN_CENTER_VERTICAL) self.attr_fgs.Add(self.settings_controls['Seed|1'], 0, wx.EXPAND) self.attr_fgs.Add(wx.StaticText(self.sw, -1, 'Vessel Type'),0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL) self.attr_fgs.Add(self.settings_controls['Vessel|0'], 0, wx.EXPAND) if self.action_type == 'Freeze': self.settings_controls['Split'] = wx.Choice(self.sw, -1, choices= map(str, range(1,21)), style=wx.TE_PROCESS_ENTER) self.settings_controls['Split'].Bind(wx.EVT_CHOICE, self.OnSavingData) self.settings_controls['Make'] = wx.TextCtrl(self.sw, size=(70,-1), value='Test') self.settings_controls['Make'].Bind(wx.EVT_TEXT, self.OnSavingData) self.settings_controls['Model'] = wx.TextCtrl(self.sw, size=(70,-1), value='Test') self.settings_controls['Make'].Bind(wx.EVT_TEXT, self.OnSavingData) self.settings_controls['Seed|0'] = wx.lib.masked.NumCtrl(self.sw, size=(20,-1), style=wx.TE_PROCESS_ENTER) unit_choices =['nM2', 'uM2', 'mM2','Other'] self.settings_controls['Seed|1'] = wx.ListBox(self.sw, -1, wx.DefaultPosition, (50,20), unit_choices, wx.LB_SINGLE) self.settings_controls['Seed|0'].Bind(wx.EVT_TEXT, self.OnSavingData) self.settings_controls['Seed|1'].Bind(wx.EVT_LISTBOX, self.OnSavingData) vessel_types =['T75', 'T25', '6WellPlate','12WellPlate', 'Other'] self.settings_controls['Vessel|0'] = wx.ListBox(self.sw, -1, wx.DefaultPosition, (100,20), vessel_types, wx.LB_SINGLE) self.settings_controls['Vessel|0'].Bind(wx.EVT_LISTBOX, self.OnSavingData) self.attr_fgs.Add(wx.StaticText(self.sw, -1, 'Split 1: '),0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL) self.attr_fgs.Add(self.settings_controls['Split'], 0, wx.EXPAND) self.attr_fgs.Add(wx.StaticText(self.sw, -1, ''),0) self.attr_fgs.Add(wx.StaticText(self.sw, -1, ''),0) self.attr_fgs.Add(wx.StaticText(self.sw, -1, 'Make'),0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL) self.attr_fgs.Add(self.settings_controls['Make'], 0, wx.EXPAND) self.attr_fgs.Add(wx.StaticText(self.sw, -1, ' Model'),0, wx.ALIGN_LEFT|wx.ALIGN_CENTER_VERTICAL) self.attr_fgs.Add(self.settings_controls['Model'], 0, wx.EXPAND) self.attr_fgs.Add(wx.StaticText(self.sw, -1, '(Re)seed Density'),0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL) self.attr_fgs.Add(self.settings_controls['Seed|0'], 0, wx.EXPAND) self.attr_fgs.Add(wx.StaticText(self.sw, -1, ' cells/'),0, wx.ALIGN_LEFT|wx.ALIGN_CENTER_VERTICAL) self.attr_fgs.Add(self.settings_controls['Seed|1'], 0, wx.EXPAND) self.attr_fgs.Add(wx.StaticText(self.sw, -1, 'Vessel Type'),0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL) self.attr_fgs.Add(self.settings_controls['Vessel|0'], 0, wx.EXPAND) if self.action_type == 'Enrich': self.settings_controls['Split'] = wx.Choice(self.sw, -1, choices= map(str, range(1,21)), style=wx.TE_PROCESS_ENTER) self.settings_controls['Split'].Bind(wx.EVT_CHOICE, self.OnSavingData) self.settings_controls['Make'] = wx.TextCtrl(self.sw, size=(70,-1), value='Test') self.settings_controls['Make'].Bind(wx.EVT_TEXT, self.OnSavingData) self.settings_controls['Model'] = wx.TextCtrl(self.sw, size=(70,-1), value='Test') self.settings_controls['Make'].Bind(wx.EVT_TEXT, self.OnSavingData) self.settings_controls['Seed|0'] = wx.lib.masked.NumCtrl(self.sw, size=(20,-1), style=wx.TE_PROCESS_ENTER) unit_choices =['nM2', 'uM2', 'mM2','Other'] self.settings_controls['Seed|1'] = wx.ListBox(self.sw, -1, wx.DefaultPosition, (50,20), unit_choices, wx.LB_SINGLE) self.settings_controls['Seed|0'].Bind(wx.EVT_TEXT, self.OnSavingData) self.settings_controls['Seed|1'].Bind(wx.EVT_LISTBOX, self.OnSavingData) vessel_types =['T75', 'T25', '6WellPlate','12WellPlate', 'Other'] self.settings_controls['Vessel|0'] = wx.ListBox(self.sw, -1, wx.DefaultPosition, (100,20), vessel_types, wx.LB_SINGLE) self.settings_controls['Vessel|0'].Bind(wx.EVT_LISTBOX, self.OnSavingData) self.attr_fgs.Add(wx.StaticText(self.sw, -1, 'Split 1: '),0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL) self.attr_fgs.Add(self.settings_controls['Split'], 0, wx.EXPAND) self.attr_fgs.Add(wx.StaticText(self.sw, -1, ''),0) self.attr_fgs.Add(wx.StaticText(self.sw, -1, ''),0) self.attr_fgs.Add(wx.StaticText(self.sw, -1, 'Flow Cytometer'),0) self.attr_fgs.Add(wx.StaticText(self.sw, -1, ''),0) self.attr_fgs.Add(wx.StaticText(self.sw, -1, ''),0) self.attr_fgs.Add(wx.StaticText(self.sw, -1, ''),0) self.attr_fgs.Add(wx.StaticText(self.sw, -1, 'Make'),0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL) self.attr_fgs.Add(self.settings_controls['Make'], 0, wx.EXPAND) self.attr_fgs.Add(wx.StaticText(self.sw, -1, ' Model'),0, wx.ALIGN_LEFT|wx.ALIGN_CENTER_VERTICAL) self.attr_fgs.Add(self.settings_controls['Model'], 0, wx.EXPAND) self.attr_fgs.Add(wx.StaticText(self.sw, -1, '(Re)seed Density'),0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL) self.attr_fgs.Add(self.settings_controls['Seed|0'], 0, wx.EXPAND) self.attr_fgs.Add(wx.StaticText(self.sw, -1, ' cells/'),0, wx.ALIGN_LEFT|wx.ALIGN_CENTER_VERTICAL) self.attr_fgs.Add(self.settings_controls['Seed|1'], 0, wx.EXPAND) self.attr_fgs.Add(wx.StaticText(self.sw, -1, 'Vessel Type'),0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL) self.attr_fgs.Add(self.settings_controls['Vessel|0'], 0, wx.EXPAND) self.selection_btn = wx.Button(self, wx.ID_OK, 'Record') self.close_btn = wx.Button(self, wx.ID_CANCEL) #self.selection_btn.Disable() #Bind self.settings_controls['Admin|0'].Bind(wx.EVT_TEXT, self.OnSavingData) self.settings_controls['Admin|1'].Bind(wx.EVT_DATE_CHANGED, self.OnSavingData) self.settings_controls['Admin|2'].Bind(wx.EVT_TEXT, self.OnSavingData) self.set_curr_time.Bind(wx.EVT_BUTTON, self.setCurrDateTime) # Sizers and layout staticbox = wx.StaticBox(self.sw, -1, "Admin") adminsizer = wx.StaticBoxSizer(staticbox, wx.HORIZONTAL) adminsizer.Add(wx.StaticText(self.sw, -1, 'Operator Name'),0, wx.RIGHT, 5) adminsizer.Add(self.settings_controls['Admin|0'] , 0, wx.EXPAND) adminsizer.Add(wx.StaticText(self.sw, -1, 'Date'),0, wx.RIGHT|wx.LEFT, 5) adminsizer.Add(self.settings_controls['Admin|1'], 0, wx.EXPAND) adminsizer.Add(wx.StaticText(self.sw, -1, 'Time'),0, wx.LEFT, 5) adminsizer.Add(self.settings_controls['Admin|2'], 0, wx.EXPAND) adminsizer.Add( spin1, 0, wx.ALIGN_CENTRE ) adminsizer.Add(self.set_curr_time, 0, wx.ALIGN_RIGHT|wx.LEFT, 15) btnSizer = wx.BoxSizer(wx.HORIZONTAL) btnSizer.Add(self.selection_btn , 0, wx.ALL, 5) btnSizer.Add(self.close_btn , 0, wx.ALL, 5) self.step_fgs = wx.FlexGridSizer(cols=8, hgap=5, vgap=5) self.staticbox = wx.StaticBox(self.sw, -1, "Actions") self.staticbox_sizer = wx.StaticBoxSizer(self.staticbox, wx.VERTICAL) self.staticbox_sizer.Add(self.attr_fgs, 0, wx.EXPAND|wx.ALL, 5) self.staticbox_sizer.Add((-1,10)) self.staticbox_sizer.Add(self.step_fgs, 0, wx.EXPAND|wx.ALL, 5) self.swsizer.Add(adminsizer, 0, wx.EXPAND|wx.ALL, 5) self.swsizer.Add(self.staticbox_sizer,0,wx.EXPAND|wx.ALL, 5) self.sw.SetSizer(self.swsizer) self.sw.SetScrollbars(20, 20, self.Size[0]+10, self.Size[1]+10, 0, 0) self.Sizer = wx.BoxSizer(wx.VERTICAL) self.Sizer.Add(self.sw, 1, wx.EXPAND) self.Sizer.Add(btnSizer) self.SetSizer(self.Sizer) self.showSteps()