@@ -106,7 +106,7 @@ def __init__(
106
106
rg : Optional [Dict [str , str ]] = None ,
107
107
extra_header : Optional [Dict [str , Any ]] = None ,
108
108
seed : int = 42 ,
109
- sort_order : Optional [ SamOrder ] = SamOrder .Coordinate ,
109
+ sort_order : SamOrder = SamOrder .Coordinate ,
110
110
) -> None :
111
111
"""Initializes a new SamBuilder for generating alignment records and SAM/BAM files.
112
112
@@ -119,21 +119,17 @@ def __init__(
119
119
extra_header: a dictionary of extra values to add to the header, None otherwise. See
120
120
`::class::~pysam.AlignmentHeader` for more details.
121
121
seed: a seed value for random number/string generation
122
- sort_order: optional sort order, if `None` reads will be output in the same order as
123
- they were appended.
122
+ sort_order: Order to sort records when writing to file, or output of to_sorted_list()
124
123
"""
125
124
126
125
self .r1_len : int = r1_len if r1_len is not None else self .DEFAULT_R1_LENGTH
127
126
self .r2_len : int = r2_len if r2_len is not None else self .DEFAULT_R2_LENGTH
128
127
self .base_quality : int = base_quality
129
128
self .mapping_quality : int = mapping_quality
130
129
131
- sort_order = SamOrder .Unsorted if sort_order is None else sort_order
132
- assert sort_order in [SamOrder .Coordinate , SamOrder .QueryName , SamOrder .Unsorted ], (
133
- "`sort_order` for `SamBuilder` must be one of `Coordinate` `QueryName` or `Unsorted`."
134
- + f" Found { sort_order } "
135
- )
136
- self .sort_order : SamOrder = sort_order
130
+ if not isinstance (sort_order , SamOrder ):
131
+ raise ValueError (f"sort_order must be a SamOrder, got { type (sort_order )} " )
132
+ self ._sort_order = sort_order
137
133
138
134
self ._header : Dict [str , Any ] = {
139
135
"HD" : {"VN" : "1.5" , "SO" : sort_order .value },
@@ -580,7 +576,7 @@ def to_path(
580
576
581
577
with NamedTemporaryFile (suffix = ".bam" , delete = True ) as fp :
582
578
file_handle : IO
583
- if self .sort_order is SamOrder .Unsorted :
579
+ if self ._sort_order in { SamOrder .Unsorted , SamOrder . Unknown } :
584
580
file_handle = path .open ("w" )
585
581
else :
586
582
file_handle = fp .file
@@ -592,18 +588,17 @@ def to_path(
592
588
if pred (rec ):
593
589
writer .write (rec )
594
590
595
- default_samtools_opt_list = ["-o" , str (path ), fp .name ]
591
+ samtools_sort_args = ["-o" , str (path ), fp .name ]
596
592
597
593
file_handle .close ()
598
- if self .sort_order == SamOrder .QueryName :
594
+ if self ._sort_order == SamOrder .QueryName :
599
595
# Ignore type hints for now until we have wrappers to use here.
600
- pysam .sort (* ([ "-n" ] + default_samtools_opt_list ) ) # type: ignore
601
- elif self .sort_order == SamOrder .Coordinate :
596
+ pysam .sort ("-n" , * samtools_sort_args ) # type: ignore
597
+ elif self ._sort_order == SamOrder .Coordinate :
602
598
# Ignore type hints for now until we have wrappers to use here.
603
- pysam .sort (* default_samtools_opt_list ) # type: ignore
604
599
if index :
605
- # Ignore type hints for now until we have wrappers to use here.
606
- pysam .index ( str ( path ) ) # type: ignore
600
+ samtools_sort_args . insert ( 0 , "--write-index" )
601
+ pysam .sort ( * samtools_sort_args ) # type: ignore
607
602
608
603
return path
609
604
0 commit comments