@@ -10533,6 +10533,7 @@ def map_to_vcf_model(
1053310533 ploidy = None ,
1053410534 name_metadata_key = None ,
1053510535 individual_names = None ,
10536+ include_non_sample_nodes = None ,
1053610537 ):
1053710538 """
1053810539 Maps the sample nodes in this tree sequence to a representation suitable for
@@ -10571,6 +10572,8 @@ def map_to_vcf_model(
1057110572 ID is specified, if a specified individual has no nodes, or if the number of
1057210573 individuals doesn't match the number of names.
1057310574 """
10575+ if include_non_sample_nodes is None :
10576+ include_non_sample_nodes = False
1057410577
1057510578 if name_metadata_key is not None and individual_names is not None :
1057610579 raise ValueError (
@@ -10596,63 +10599,31 @@ def map_to_vcf_model(
1059610599 if ploidy is None :
1059710600 ploidy = 1
1059810601 individuals_nodes = self .sample_nodes_by_ploidy (ploidy )
10599- ts_individual_names = [f"tsk_{ i } " for i in range (len (individuals_nodes ))]
10602+ if individual_names is None :
10603+ individual_names = [f"tsk_{ i } " for i in range (len (individuals_nodes ))]
1060010604 else :
10601- individuals_nodes = []
10602- ts_individual_names = []
1060310605 if individuals is None :
10604- for ind in self . individuals ():
10605- if len ( ind . nodes ) == 0 :
10606- warnings . warn (
10607- f"Individual { ind . id } has no nodes associated with it." ,
10608- stacklevel = 1 ,
10609- )
10610- continue
10611- is_sample = np .array (
10612- [ self .nodes_flags [u ] & tskit .NODE_IS_SAMPLE for u in ind . nodes ]
10606+ individuals = np . arange ( self . num_individuals , dtype = np . int32 )
10607+ if min ( individuals ) < 0 or max ( individuals ) >= self . num_individuals :
10608+ raise ValueError ( "Invalid individual ID" )
10609+
10610+ individuals_nodes = self . individuals_nodes [ individuals ]
10611+ if not include_non_sample_nodes :
10612+ individuals_nodes [
10613+ np .logical_not (
10614+ self .nodes_flags [individuals_nodes ] & tskit .NODE_IS_SAMPLE
1061310615 )
10614- if all (is_sample ):
10615- individuals_nodes .append (ind .nodes )
10616- if name_metadata_key is not None :
10617- ts_individual_names .append (ind .metadata [name_metadata_key ])
10618- else :
10619- ts_individual_names .append (f"tsk_{ ind .id } " )
10620- elif all (np .logical_not (is_sample )):
10621- continue
10622- else :
10623- warnings .warn (
10624- f"Individual { ind .id } has both sample and non-sample nodes "
10625- "associated with it." ,
10626- stacklevel = 1 ,
10627- )
10628- else :
10629- for i in individuals :
10630- if i < 0 or i >= self .num_individuals :
10631- raise ValueError (f"Invalid individual ID { i } " )
10632- ind = self .individual (i )
10633- if len (ind .nodes ) == 0 :
10634- raise ValueError (
10635- f"Individual { i } has no nodes associated with it."
10636- )
10637- individuals_nodes .append (ind .nodes )
10638- if name_metadata_key is not None :
10639- ts_individual_names .append (ind .metadata [name_metadata_key ])
10640- else :
10641- ts_individual_names .append (f"tsk_{ ind .id } " )
10616+ ] = - 1
1064210617
10643- if len (individuals_nodes ) > 0 :
10644- max_nodes = max (len (nodes ) for nodes in individuals_nodes )
10645- result = np .full (
10646- (len (individuals_nodes ), max_nodes ), - 1 , dtype = np .int32
10647- )
10648- for i , nodes in enumerate (individuals_nodes ):
10649- result [i , : len (nodes )] = nodes
10650- individuals_nodes = result
10651- else :
10652- individuals_nodes = np .empty ((0 , 0 ), dtype = np .int32 )
10618+ if individual_names is None :
10619+ if name_metadata_key is not None :
10620+ individual_names = [
10621+ self .individual (i ).metadata [name_metadata_key ]
10622+ for i in individuals
10623+ ]
10624+ else :
10625+ individual_names = [f"tsk_{ i } " for i in individuals ]
1065310626
10654- if individual_names is None :
10655- individual_names = ts_individual_names
1065610627 individual_names = np .array (individual_names , dtype = object )
1065710628
1065810629 if len (individuals_nodes ) != len (individual_names ):
0 commit comments