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()
Beispiel #2
0
    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 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]
Beispiel #5
0
    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))
Beispiel #9
0
    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()
Beispiel #10
0
    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
        ]
Beispiel #17
0
    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()
Beispiel #22
0
    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 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()