Example #1
0
    def test_bad_records(self):
        expected_messages = {
            "sample_type": "Line 2: Invalid sample type: 'invalid_type'",
            "experiment_id": "Line 3: Mismatch in 'experiment_id' value",
            "sample_id": "Line 3: Mismatch in 'sample_id' value",
            "barcode":
            "Line 2: Bad 'barcode' name 'bad'; expected a name like 'barcode01'",
            "internal_barcode":
            "Line 2: Bad 'internal_barcode' name 'bad'; expected a name like 'internal01'",
            "external_barcode":
            "Line 2: Bad 'external_barcode' name 'bad'; expected a name like 'external01'",
            "rapid_barcode":
            "Line 2: Bad 'rapid_barcode' name 'bad'; expected a name like 'barcode01'",
            "fip_barcode":
            "Line 2: Bad 'fip_barcode' name 'bad'; expected a name like 'FIP01'",
            "duplicate_barcode": "Line 3: Duplicate barcode: 'barcode01'",
            "duplicate_alias": "Line 3: Duplicate alias: 'alias'",
        }

        for filename, message in expected_messages.items():
            with self.assertRaisesRegex(
                    SampleSheetParseError,
                    "^" + re.escape(message) + "$",
                    msg="Test file: " + filename,
            ):
                load_sample_sheet_csv(
                    sample_sheet_csv_path("bad_records", filename))
Example #2
0
    def test_bad_column_names(self):
        expected_messages = {
            "no_columns":
            "No columns in sample sheet",
            "invalid_columns":
            "Unrecognised columns in sample sheet: 'a', 'b'",
            "duplicate_columns":
            "Duplicate columns in sample sheet: 'sample_id'",
            "no_position_information":
            "Invalid position information in sample sheet. Must have exactly one of 'flow_cell_id' and 'position_id'",
            "both_position_information":
            "Invalid position information in sample sheet. Must have exactly one of 'flow_cell_id' and 'position_id'",
            "conflicting_barcoding_columns":
            "Conflicting barcode column names: 'barcode', 'rapid_barcode', 'fip_barcode'",
            "missing_barcoding_column":
            "Missing barcoding column names: 'external_barcode'",
            "barcoding_no_alias":
            "Missing 'alias' column",
            "alias_no_barcoding":
            "'alias' column supplied, but no other barcode information in sample sheet",
            "type_no_barcoding":
            "'type' column supplied, but no other barcode information in sample sheet",
            "no_user_info_columns":
            "Sample sheet contains no user info. " +
            "Should contain 'sample_id', 'experiment_id' or some barcode information",
        }

        for filename, message in expected_messages.items():
            with self.assertRaisesRegex(
                    SampleSheetParseError,
                    "^" + re.escape(message) + "$",
                    msg="Test file: " + filename,
            ):
                load_sample_sheet_csv(
                    sample_sheet_csv_path("bad_column_names", filename),
                    exception_on_unknown_field=True,
                )

            if filename != "invalid_columns":
                with self.assertRaisesRegex(
                        SampleSheetParseError,
                        "^" + re.escape(message) + "$",
                        msg="Test file: " + filename,
                ):
                    load_sample_sheet_csv(
                        sample_sheet_csv_path("bad_column_names", filename),
                        exception_on_unknown_field=False,
                    )
Example #3
0
    def test_multiple_positions(self):
        sample_sheet = load_sample_sheet_csv(
            sample_sheet_csv_path("good", "multiple_positions"))

        self.compare_sample_sheet(
            sample_sheet,
            [
                ParsedSampleSheetEntry(
                    flow_cell_id=None,
                    position_id="A1",
                    sample_id="my_sample_1",
                    experiment_id="my_experiment",
                    barcode_info=[
                        BarcodeUserData(barcode_name="barcode01",
                                        alias="alias01"),
                    ],
                ),
                ParsedSampleSheetEntry(
                    flow_cell_id=None,
                    position_id="A2",
                    sample_id="my_sample_2",
                    experiment_id="my_experiment",
                    barcode_info=[
                        BarcodeUserData(barcode_name="barcode01",
                                        alias="alias01"),
                    ],
                ),
            ],
        )
Example #4
0
    def test_lampore_barcoding(self):
        sample_sheet = load_sample_sheet_csv(
            sample_sheet_csv_path("good", "lampore_barcoding"))

        self.compare_sample_sheet(
            sample_sheet,
            [
                ParsedSampleSheetEntry(
                    flow_cell_id="FC001",
                    position_id=None,
                    sample_id=None,
                    experiment_id=None,
                    barcode_info=[
                        BarcodeUserData(
                            barcode_name="barcode01",
                            lamp_barcode_id="FIP01",
                            alias="alias01",
                        ),
                        BarcodeUserData(
                            barcode_name="barcode02",
                            lamp_barcode_id="FIP01",
                            alias="alias02",
                        ),
                    ],
                ),
            ],
        )
Example #5
0
    def test_no_error_on_unknown_fields(self):
        sample_sheet = load_sample_sheet_csv(
            sample_sheet_csv_path("bad_column_names", "invalid_columns"),
            exception_on_unknown_field=False,
        )

        # Should have an empty sample sheet, since no entries
        self.assertFalse(sample_sheet)
Example #6
0
 def test_no_barcoding(self):
     sample_sheet = load_sample_sheet_csv(
         sample_sheet_csv_path("good", "no_barcoding"))
     self.compare_sample_sheet(
         sample_sheet,
         [
             ParsedSampleSheetEntry(
                 flow_cell_id="FC001",
                 position_id=None,
                 sample_id="my_sample",
                 experiment_id="my_experiment",
                 barcode_info=None,
             ),
         ],
     )
Example #7
0
    def test_single_barcoding(self):
        sample_sheet = load_sample_sheet_csv(
            sample_sheet_csv_path("good", "single_barcoding"))
        SampleType = BarcodeUserData.SampleType

        self.compare_sample_sheet(
            sample_sheet,
            [
                ParsedSampleSheetEntry(
                    flow_cell_id="FC001",
                    position_id=None,
                    sample_id=None,
                    experiment_id=None,
                    barcode_info=[
                        BarcodeUserData(
                            barcode_name="barcode01",
                            alias="alias01",
                            type=SampleType.test_sample,
                        ),
                        BarcodeUserData(
                            barcode_name="barcode02",
                            alias="alias02",
                            type=SampleType.positive_control,
                        ),
                        BarcodeUserData(
                            barcode_name="barcode03",
                            alias="alias03",
                            type=SampleType.negative_control,
                        ),
                        BarcodeUserData(
                            barcode_name="barcode04",
                            alias="alias04",
                            type=SampleType.no_template_control,
                        ),
                    ],
                ),
            ],
        )
Example #8
0
def add_sample_sheet_entries(experiment_specs: ExperimentSpecs, args):
    if args.sample_sheet:
        assert not args.position
        assert not args.flow_cell_id
        try:
            sample_sheet = load_sample_sheet_csv(args.sample_sheet)
        except SampleSheetParseError as e:
            print("Error loading sample sheet CSV: {}".format(e))
            sys.exit(1)
        except FileNotFoundError as e:
            print("Sample sheet file not found: {}".format(args.sample_sheet))
            sys.exit(1)

        for entry in sample_sheet:

            # Fix up the `sample_id` and `experiment_id` with values supplied on the command line
            # (provided they don't clash with sample sheet values)
            if args.sample_id:
                if entry.sample_id and args.sample_id != entry.sample_id:
                    print(
                        "`--sample-id` specified on command line does not match `sample_id` specified in sample sheet"
                    )
                    sys.exit(1)
                else:
                    sample_id = args.sample_id
            else:
                sample_id = entry.sample_id

            if args.experiment_group:
                if entry.experiment_id and args.experiment_group != entry.experiment_id:
                    print(
                        "`--experiment-group` specified on command line does not match `experiment_id` specified in sample sheet"
                    )
                    sys.exit(1)
                else:
                    experiment_id = args.experiment_group
            else:
                experiment_id = entry.experiment_id

            # Check that we have exactly one of `position_id` and `flow_cell_id`
            assert not (entry.position_id and entry.flow_cell_id)

            # Add the entry to the specs
            experiment_specs.append(
                ExperimentSpec(entry=ParsedSampleSheetEntry(
                    flow_cell_id=entry.flow_cell_id,
                    position_id=entry.position_id,
                    sample_id=sample_id,
                    experiment_id=experiment_id,
                    barcode_info=entry.barcode_info,
                )))

    elif args.position:
        assert not args.sample_sheet
        assert not args.flow_cell_id
        experiment_specs.append(
            ExperimentSpec(entry=ParsedSampleSheetEntry(
                flow_cell_id=None,
                position_id=args.position,
                sample_id=args.sample_id,
                experiment_id=args.experiment_group,
                barcode_info=None,
            )))

    elif args.flow_cell_id:
        assert not args.sample_sheet
        assert not args.position
        experiment_specs.append(
            ExperimentSpec(entry=ParsedSampleSheetEntry(
                flow_cell_id=args.flow_cell_id,
                position_id=None,
                sample_id=args.sample_id,
                experiment_id=args.experiment_group,
                barcode_info=None,
            )))
    else:
        print(
            "No sample position specified; specify either `--position`, `--flow-cell-id` or `--sample-sheet`"
        )
        sys.exit(1)