mount_sample_id = None mount_sample_detected = None def mount(segment, puck, sample, force=False, read_dm=False, auto_unmount=False): """ """ global mount_sample_id, mount_sample_detected evlog = Controller.getInstance().logEvent tg = time.time t1 = tg() print "mount('%s', %d, %d, force=%d, read_dm=%d, auto_unmount=%d)" % (segment, puck, sample, force, read_dm, auto_unmount) is_aux = (segment == AUX_SEGMENT) is_rt = (segment == RT_SEGMENT) is_normal = not (is_aux or is_rt) previous_mounted = get_setting("mounted_sample_position") if previous_mounted is not None: previous_segment, previous_puck, previous_sample = previous_mounted[0], int(previous_mounted[1]), int(previous_mounted[2:]) else: previous_segment, previous_puck, previous_sample = "-", 0, 0 mounting_in_same_segment = (previous_segment == segment) was_cold = robot.is_cold() was_warm = not was_cold needs_chilling = not is_rt and was_warm needs_drying = is_rt and was_cold count_mount = is_normal or (is_aux and was_cold) zero_counts = (is_aux and not was_cold) or (is_rt and was_cold) pin_offset = get_pin_offset() puck_address = get_puck_address(puck) if puck_address is None: puck_obj = get_puck_obj_by_id(puck) if puck_obj is not None: puck_address = puck_obj.name if puck_address is not None: print "puck address: ", puck_address segment = puck_address[:1] puck = int(puck_address[1:]) sampleAddress = str(segment) + str(puck) + "-" + str(sample) set_status("Mounting: " + sampleAddress) evlog(">>>>>>>>>>>>>>> MOUNT <<<<<<<<<<<<<<<<<<<<<") evlog("mount() Mount Sample", sampleAddress) #Initial checks print "%4.1f s asserting" % (tg() - t1,) assert_valid_address(segment, puck, sample) assert_puck_detected(segment, puck) if robot.simulated: time.sleep(3.0) mount_sample_detected = True mount_sample_id = "YYY0001" update_samples_info_sample_mount(get_puck_name(segment, puck), sample, mount_sample_detected, mount_sample_id) set_setting("mounted_sample_position", get_sample_name(segment, puck, sample)) return [mount_sample_detected, mount_sample_id] robot.assert_no_task() robot.reset_motion() robot.wait_ready() robot.assert_cleared() #robot.assert_in_known_point() hexiposi.assert_homed() assert_mount_position() do_unmount = False print "%4.1f s asserted " % (tg() - t1,) # detect sample before moving to cold if smart_magnet.get_supress() == True: smart_magnet.set_supress(False) time.sleep(0.2) sample_det = smart_magnet.check_mounted(idle_time=0.25, timeout = 1.0) evlog("mount() SMC Sample Detection", str(sample_det)) #hasSample = robot.gripper_has_sample() #if hasSample: # msg = "CRITICAL ERROR: the gripper has a sample stuck to it, call local contact." # evlog(msg) # evlog("mount() terminating mount early") # raise Exception(msg) mounting_in_same_segment = False try: if sample_det == True: if was_warm and previous_segment in COLD_SEGMENTS: print " was warm previous %s %s %s" % (previous_segment, COLD_SEGMENTS, previous_mounted) robot.move_cold() time.sleep(30.0) if auto_unmount and (get_setting("mounted_sample_position") is not None): if mounting_in_same_segment: print " Mounting from the same segment" #auto_unmount set to true so detection remains enabled print "%4.1f s unmounting" % (tg() - t1,) sample_det = unmount(force = True, auto_unmount = True, mounting_in_same_segment=mounting_in_same_segment, next_segment=segment) print "%4.1f s ....done" % (tg() - t1,) do_unmount = True if sample_det == True: msg = "CRITICAL a pin is being detected on gonio after an unmount attempt, either trash the sample or try unmounting again" evlog(msg) evlog("mount() terminating mount early") raise Exception(msg) if is_normal and not robot.is_cold(): evlog("mount() needs_chilling") robot.move_cold() time.sleep(30.0) #Enabling. If did unmount then it is already enabled. if not do_unmount: enable_motion() if needs_drying: dry(wait_cold=-1) # move to park after dry if is_aux: if not robot.is_aux(): robot.move_aux() robot.get_aux(sample) elif is_rt: if not robot.is_rt(): robot.move_rt() robot.get_rt(puck, sample) else: evlog("moving lid to " + segment) set_hexiposi(segment) if not force: visual_check_hexiposi(segment) if (not robot.is_dewar()) and (not mounting_in_same_segment): robot.move_dewar() robot.get_dewar(segment, puck, sample, mounting_in_same_segment=mounting_in_same_segment) #hasSample = robot.gripper_has_sample() #msg = "mount() WARNING GRIPPER-TEST - after get_(dewar,rt,aux) gripper has sample: {}".format(hasSample) #evlog(msg) #if not hasSample: # if is_aux or is_rt: # robot.move_park() # else: # robot.move_cold() # msg = "MISSING SAMPLE in position {} - try the next one".format(sampleAddress) # evlog(msg) # evlog("mount() terminating mount early") # raise Exception(msg) if read_dm: barcode_reader.start_read(10.0) robot.move_scanner() robot.move_gonio() if read_dm: mount_sample_id = barcode_reader.get_readout() evlog("mount() read pin barcode: %s" % (mount_sample_id,)) else: mount_sample_id = None curpos = cryopos.getPosition() speed = cryopos.getSpeed() / 1000. movetime = int(round(3000 + abs(15. - curpos) / speed)) cryopos.move(15.0, movetime) cryopos.waitValueInRange(15.0, 1.0, movetime) robot.put_gonio() if is_normal: cryopos.moveAsync(12.0) if count_mount: try: dry_mount_count = int(get_setting("dry_mount_counter")) except: dry_mount_count = 0 finally: set_setting("dry_mount_counter", dry_mount_count+1) elif zero_counts: set_setting("dry_mount_counter", 0) if is_rt: robot.move_park() elif is_normal: robot.move_cold() elif is_aux: robot.move_park() else: robot.move_cold() mount_sample_detected = smart_magnet.check_mounted(idle_time=0.25, timeout = 1.0) evlog("mount() SMC Detection", str(mount_sample_detected)) update_samples_info_sample_mount(get_puck_name(segment, puck), sample, mount_sample_detected, mount_sample_id) if mount_sample_detected == False: raise Exception("SAMPLE MISSING: No pin detected on gonio") # Check gripper for frozen sample after trying to mount on gonio # if we detect a sample after closing gripper then we move the # gripper back to cold/park and call for local contact or give user # option to dry gripper and lose the sample # reallyEmpty = is_gripper_really_empty(1.2) # if not reallyEmpty: # msg = "CRITICAL The gripper still has sample {} after mount attempt, call local contact".format(sampleAddress) # evlog(msg) # evlog("mount() terminating mount early") # raise Exception(msg) # sampleDelivered = True # robot.open_tool() # open gripper # # if sampleDelivered and not mount_sample_detected: # msg = "CRITICAL The sample {} seems to have been lost during mount procedure. Try another sample or call your local contact".format(sampleAddress) # evlog(msg) # evlog("mount() terminating mount early") # raise Exception(msg) # smart_magnet.set_default_current() if is_aux and was_cold: evlog("mount() drying after tool mount") set_exec_pars(then = "dry(wait_cold=-1)") elif is_force_dry(): evlog("mount() Starting async auto dry") set_exec_pars(then = "dry()") set_setting("mounted_sample_position", get_sample_name(segment, puck, sample)) return [mount_sample_detected, mount_sample_id] finally: evlog("############### MOUNT-FINISHED ####################") smart_magnet.set_default_current() smart_magnet.set_supress(True)