// default setup agent func BasicSetupAgent(request *LHRequest, params *liquidhandling.LHProperties) *LHRequest { // this is quite tricky and requires extensive interaction with the liquid handling // parameters // the principal question is how to define constraints on the system // I think this needs to remain tbd for now // instead we can rely on the preference system I already use plate_lookup := make(map[string]string, 5) tip_lookup := make([]*wtype.LHTipbox, 0, 5) tip_preferences := params.Tip_preferences input_preferences := params.Input_preferences output_preferences := params.Output_preferences // how do we set the below? // we don't know how many tips we need until we generate // instructions; ditto input or output plates until we've done layout // input plates input_plates := request.Input_plates // output plates output_plates := request.Output_plates // tips tips := request.Tips // we put tips on first setup := request.Setup if len(setup) == 0 { setup = wtype.NewLHSetup() } for _, tb := range tips { // get the first available position from the preferences pos := get_first_available_preference(tip_preferences, setup) if pos == -1 { RaiseError("No positions left for tipbox") } position := "position_" + strconv.Itoa(pos) setup[position] = tb plate_lookup[tb.ID] = position tip_lookup = append(tip_lookup, tb) } setup["tip_lookup"] = tip_lookup // this logic may not transfer well but I expect that outputs are more constrained // than inputs for the simple reason that most output takes place to single wells // while input takes place from reservoirs // outputs for _, p := range output_plates { pos := get_first_available_preference(output_preferences, setup) if pos == -1 { RaiseError("No positions left for output") } position := "position_" + strconv.Itoa(pos) setup[position] = p plate_lookup[p.ID] = position params.AddPlate(position, p) } // inputs for _, p := range input_plates { pos := get_first_available_preference(input_preferences, setup) if pos == -1 { RaiseError("No positions left for input") } position := "position_" + strconv.Itoa(pos) setup[position] = p plate_lookup[p.ID] = position params.AddPlate(position, p) } request.Setup = setup request.Plate_lookup = plate_lookup return request }