Beispiel #1
0
// 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
}