def test_one_basic_feature_set_per_crossing_calculated(self):

        for expt in self.expts:

            # loop through crossing groups with this determined threshold
            threshold = session.query(models.Threshold).filter_by(determination=DETERMINATION,
                                                                  experiment=expt).first()
            for cg in threshold.crossing_groups:
                for crossing in cg.crossings:
                    self.assertTrue(crossing.feature_set_basic is not None)
    def test_example_crossings_basic_feature_set_calculated_correctly(self):

        for expt in self.expts:

            # loop through crossing groups with this determined threshold
            threshold = session.query(models.Threshold).filter_by(determination=DETERMINATION,
                                                                  experiment=expt).first()
            for cg in threshold.crossing_groups:
                for crossing in cg.crossings[:N_EXAMPLE_CROSSINGS]:
                    # check that positions are correct
                    position_x_entry = crossing.timepoint_field(session, 'position_x', 0, 0, 'entry', 'entry')[0]
                    position_y_entry = crossing.timepoint_field(session, 'position_y', 0, 0, 'entry', 'entry')[0]
                    position_z_entry = crossing.timepoint_field(session, 'position_z', 0, 0, 'entry', 'entry')[0]

                    position_x_peak = crossing.timepoint_field(session, 'position_x', 0, 0, 'peak', 'peak')[0]
                    position_y_peak = crossing.timepoint_field(session, 'position_y', 0, 0, 'peak', 'peak')[0]
                    position_z_peak = crossing.timepoint_field(session, 'position_z', 0, 0, 'peak', 'peak')[0]

                    position_x_exit = crossing.timepoint_field(session, 'position_x', 0, 0, 'exit', 'exit')[0]
                    position_y_exit = crossing.timepoint_field(session, 'position_y', 0, 0, 'exit', 'exit')[0]
                    position_z_exit = crossing.timepoint_field(session, 'position_z', 0, 0, 'exit', 'exit')[0]

                    heading_xy_entry = crossing.timepoint_field(session, 'heading_xy', 0, 0, 'entry', 'entry')[0]
                    heading_xz_entry = crossing.timepoint_field(session, 'heading_xz', 0, 0, 'entry', 'entry')[0]
                    heading_xyz_entry = crossing.timepoint_field(session, 'heading_xyz', 0, 0, 'entry', 'entry')[0]

                    heading_xy_peak = crossing.timepoint_field(session, 'heading_xy', 0, 0, 'peak', 'peak')[0]
                    heading_xz_peak = crossing.timepoint_field(session, 'heading_xz', 0, 0, 'peak', 'peak')[0]
                    heading_xyz_peak = crossing.timepoint_field(session, 'heading_xyz', 0, 0, 'peak', 'peak')[0]

                    heading_xy_exit = crossing.timepoint_field(session, 'heading_xy', 0, 0, 'exit', 'exit')[0]
                    heading_xz_exit = crossing.timepoint_field(session, 'heading_xz', 0, 0, 'exit', 'exit')[0]
                    heading_xyz_exit = crossing.timepoint_field(session, 'heading_xyz', 0, 0, 'exit', 'exit')[0]

                    self.assertAlmostEqual(position_x_entry, crossing.feature_set_basic.position_x_entry)
                    self.assertAlmostEqual(position_y_entry, crossing.feature_set_basic.position_y_entry)
                    self.assertAlmostEqual(position_z_entry, crossing.feature_set_basic.position_z_entry)

                    self.assertAlmostEqual(position_x_peak, crossing.feature_set_basic.position_x_peak)
                    self.assertAlmostEqual(position_y_peak, crossing.feature_set_basic.position_y_peak)
                    self.assertAlmostEqual(position_z_peak, crossing.feature_set_basic.position_z_peak)

                    self.assertAlmostEqual(position_x_exit, crossing.feature_set_basic.position_x_exit)
                    self.assertAlmostEqual(position_y_exit, crossing.feature_set_basic.position_y_exit)
                    self.assertAlmostEqual(position_z_exit, crossing.feature_set_basic.position_z_exit)

                    self.assertAlmostEqual(heading_xy_entry, crossing.feature_set_basic.heading_xy_entry)
                    self.assertAlmostEqual(heading_xz_entry, crossing.feature_set_basic.heading_xz_entry)
                    self.assertAlmostEqual(heading_xyz_entry, crossing.feature_set_basic.heading_xyz_entry)

                    self.assertAlmostEqual(heading_xy_peak, crossing.feature_set_basic.heading_xy_peak)
                    self.assertAlmostEqual(heading_xz_peak, crossing.feature_set_basic.heading_xz_peak)
                    self.assertAlmostEqual(heading_xyz_peak, crossing.feature_set_basic.heading_xyz_peak)

                    self.assertAlmostEqual(heading_xy_exit, crossing.feature_set_basic.heading_xy_exit)
                    self.assertAlmostEqual(heading_xz_exit, crossing.feature_set_basic.heading_xz_exit)
                    self.assertAlmostEqual(heading_xyz_exit, crossing.feature_set_basic.heading_xyz_exit)

                    # make sure these are the same as would be calculated by directly looking up the
                    # timepoint value given the timepoint id

                    entry_tp_id = crossing.entry_timepoint_id
                    peak_tp_id = crossing.peak_timepoint_id
                    exit_tp_id = crossing.exit_timepoint_id

                    # just look up a few values
                    position_x_entry = session.query(models.Timepoint.position_x).filter_by(id=entry_tp_id).first()[0]
                    heading_xy_peak = session.query(models.Timepoint.heading_xy).filter_by(id=peak_tp_id).first()[0]
                    heading_xyz_exit = session.query(models.Timepoint.heading_xyz).filter_by(id=exit_tp_id).first()[0]

                    self.assertAlmostEqual(position_x_entry, crossing.feature_set_basic.position_x_entry)
                    self.assertAlmostEqual(heading_xy_peak, crossing.feature_set_basic.heading_xy_peak)
                    self.assertAlmostEqual(heading_xyz_exit, crossing.feature_set_basic.heading_xyz_exit)
    def setUp(self):

        self.expts = session.query(models.Experiment)