Repository: opentrons/opentrons
Issue: Multi Channel Dropping Tips On Side Of Trash

Multi channel pipette dropping tips over front edge of tall trash bin.

## Expected Behavior
- Robot should drop tips safely in the middle of the trash bin

## Observed Behavior
- Robot drops tips very close the the front of the trash bin, sometimes colliding.

## Steps to Recreate
- Connect to a robot with tall trash (tested with robot in Sales Demo room)
- Load protocol copied below
- Observe multi-channel crashes into trash bin when dropping tips


```
from opentrons import labware, instruments, robot


tiprack = labware.load('tiprack-200ul', '7')
tiprack2 = labware.load('tiprack-200ul', '11')

trash = robot.fixed_trash

trough = labware.load('trough-12row', '8')
plate = labware.load('96-PCR-flat', '9')
tuberack = labware.load('tube-rack-2ml', '10')

# Needs to have individual constructor
# m50 = instruments.Pipette(
#     name="p200",
#     tip_racks=[tiprack, tiprack2],
#     max_volume=50,
#     mount="left",
#     channels=8
# )

m50 = instruments.P300_Multi(
    tip_racks=[tiprack2],
    mount="left"
)

p200 = instruments.P300_Single(
    tip_racks=[tiprack],
    mount="right"
)

# dispense 6 standards from tube racks (A1, B1, C1, D1, A2, B2)
# to first two rows of 96 well plate (duplicates, A1/A2, B1/B2 etc.)
for i in range(6):
    p200.distribute(
        25, tuberack.wells(i), plate.rows(i)[0:2])

# dispense 4 samples from tube rack (C2, D2, A3, B3)
# to row 3 of 96 well plate (duplicates, A3/B3, C3/D3, E3/F3, G3/H3)
p200.distribute(
    50,
    tuberack.wells('C2', 'D2', 'A3', 'B3'),
    plate.cols('3'))

# fill rows 4 to 11 with 25 uL of dilutent each
m50.distribute(
    25,
    trough['A1'],
    plate.cols('4', length=8))

# dilute samples down all rows
m50.pick_up_tip()

m50.transfer(
    25,
    plate.cols('3', length=8),
    plate.cols('4', length=8),
    mix_after=(3, 25),
    new_tip='never')

# remove 25uL from last row
m50.aspirate(25, plate.cols('11')).dispense(trash.wells(0))
m50.drop_tip()

# fill rows 1 to 11 with 200 uL of Bradford reagent
m50.transfer(200, trough['A2'], plate.rows('A', length=11))
```

Changed files:
api/opentrons/server/main.py, api/opentrons/util/calibration_functions.py, api/opentrons/instruments/pipette.py, api/tests/opentrons/labware/test_pipette.py

diff --git a/api/opentrons/instruments/pipette.py b/api/opentrons/instruments/pipette.py
index fded5abe28..eff00f8711 100755
--- a/api/opentrons/instruments/pipette.py
+++ b/api/opentrons/instruments/pipette.py
@@ -1013,6 +1013,9 @@ class Pipette:
             if 'rack' in location.get_parent().get_type():
                 half_tip_length = self._tip_length / 2
                 location = location.top(-half_tip_length)
+            elif 'trash' in location.get_parent().get_type():
+                loc, coords = location.top()
+                location = (loc, coords + (0, self.model_offset[1], 0))
             else:
                 location = location.top()
 
diff --git a/api/opentrons/server/main.py b/api/opentrons/server/main.py
index 8f6d07747a..0cdba19963 100755
--- a/api/opentrons/server/main.py
+++ b/api/opentrons/server/main.py
@@ -60,7 +60,7 @@ def log_init():
         loggers={
             '__main__': {
                 'handlers': ['debug'],
-                'level': level_value
+                'level': logging.INFO
             },
             'opentrons.server': {
                 'handlers': ['debug'],
diff --git a/api/opentrons/util/calibration_functions.py b/api/opentrons/util/calibration_functions.py
index 0f9bcd0148..6f8dbfbf75 100644
--- a/api/opentrons/util/calibration_functions.py
+++ b/api/opentrons/util/calibration_functions.py
@@ -85,6 +85,7 @@ def probe_instrument(instrument, robot, tip_length=None) -> Point:
 
     safe_height = _calculate_safeheight(robot, Z_CROSSOVER_CLEARANCE)
 
+    log.info("Moving to safe z: {}".format(safe_height))
     robot.poses = instrument._move(robot.poses, z=safe_height)
 
     for axis, x, y, z, distance in hot_spots:
@@ -97,6 +98,7 @@ def probe_instrument(instrument, robot, tip_length=None) -> Point:
             x = x + center.x
             y = y + center.y
 
+        log.info("Moving to {}".format((x, y, z)))
         robot.poses = instrument._move(robot.poses, x=x, y=y)
         robot.poses = instrument._move(robot.poses, z=z)
 
diff --git a/api/tests/opentrons/labware/test_pipette.py b/api/tests/opentrons/labware/test_pipette.py
index 1ff4c2ff6b..2e637fa068 100755
--- a/api/tests/opentrons/labware/test_pipette.py
+++ b/api/tests/opentrons/labware/test_pipette.py
@@ -154,3 +154,29 @@ def test_delay_calls(monkeypatch):
     assert 'pause' in cmd
     assert 'sleep 64.0' in cmd
     assert 'resume' in cmd
+
+
+def test_drop_tip_in_trash(virtual_smoothie_env, monkeypatch):
+    from opentrons import robot, labware
+    from opentrons.instruments.pipette import Pipette
+    robot.reset()
+    robot.home()
+    tiprack = labware.load('tiprack-200ul', '1')
+    p300 = instruments.P300_Multi(mount='left', tip_racks=[tiprack])
+    p300.pick_up_tip()
+
+    movelog = []
+    move_fn = Pipette.move_to
+
+    def log_move(self, location, strategy=None):
+        movelog.append(location)
+        move_fn(self, location, strategy)
+
+    monkeypatch.setattr(Pipette, "move_to", log_move)
+
+    p300.drop_tip()
+
+    base_obj = movelog[0][0]
+    y_offset = movelog[0][1][1]
+    assert base_obj == robot.fixed_trash[0]
+    assert y_offset == 108