Snakemake Using expand with dictionary
up vote
1
down vote
favorite
I am writing this rule:
rule process_files:
input:
dataout=expand("{{dataset}}/{{sample}}.{{ref}}.{{state}}.{{case}}.myresult.{name}.tsv", name=my_list[wildcards.ref])
output:
"{dataset}/{sample}.{ref}.{state}.{case}.endresult.tsv"
shell:
do something ...
Were expand will get value from dictionary my_dictionary based on the ref value. I used wildcards like this my_dictionary[wildcards.ref]. But it ends up with this error name 'wildcards' is not defined
my_dictionary something like:
{A:[1,2,3], B:[s1,s2..].....}
I could use
def myfun(wildcards):
return expand("{{dataset}}/{{sample}}.{{ref}}.{{state}}.{{case}}.myresult.{name}.tsv", name=my_dictionary[wildcards.ref])
and use myfun as input , but this does not answer why I can not use expand in place directly
Any suggestion how to fix it?
expand snakemake
add a comment |
up vote
1
down vote
favorite
I am writing this rule:
rule process_files:
input:
dataout=expand("{{dataset}}/{{sample}}.{{ref}}.{{state}}.{{case}}.myresult.{name}.tsv", name=my_list[wildcards.ref])
output:
"{dataset}/{sample}.{ref}.{state}.{case}.endresult.tsv"
shell:
do something ...
Were expand will get value from dictionary my_dictionary based on the ref value. I used wildcards like this my_dictionary[wildcards.ref]. But it ends up with this error name 'wildcards' is not defined
my_dictionary something like:
{A:[1,2,3], B:[s1,s2..].....}
I could use
def myfun(wildcards):
return expand("{{dataset}}/{{sample}}.{{ref}}.{{state}}.{{case}}.myresult.{name}.tsv", name=my_dictionary[wildcards.ref])
and use myfun as input , but this does not answer why I can not use expand in place directly
Any suggestion how to fix it?
expand snakemake
add a comment |
up vote
1
down vote
favorite
up vote
1
down vote
favorite
I am writing this rule:
rule process_files:
input:
dataout=expand("{{dataset}}/{{sample}}.{{ref}}.{{state}}.{{case}}.myresult.{name}.tsv", name=my_list[wildcards.ref])
output:
"{dataset}/{sample}.{ref}.{state}.{case}.endresult.tsv"
shell:
do something ...
Were expand will get value from dictionary my_dictionary based on the ref value. I used wildcards like this my_dictionary[wildcards.ref]. But it ends up with this error name 'wildcards' is not defined
my_dictionary something like:
{A:[1,2,3], B:[s1,s2..].....}
I could use
def myfun(wildcards):
return expand("{{dataset}}/{{sample}}.{{ref}}.{{state}}.{{case}}.myresult.{name}.tsv", name=my_dictionary[wildcards.ref])
and use myfun as input , but this does not answer why I can not use expand in place directly
Any suggestion how to fix it?
expand snakemake
I am writing this rule:
rule process_files:
input:
dataout=expand("{{dataset}}/{{sample}}.{{ref}}.{{state}}.{{case}}.myresult.{name}.tsv", name=my_list[wildcards.ref])
output:
"{dataset}/{sample}.{ref}.{state}.{case}.endresult.tsv"
shell:
do something ...
Were expand will get value from dictionary my_dictionary based on the ref value. I used wildcards like this my_dictionary[wildcards.ref]. But it ends up with this error name 'wildcards' is not defined
my_dictionary something like:
{A:[1,2,3], B:[s1,s2..].....}
I could use
def myfun(wildcards):
return expand("{{dataset}}/{{sample}}.{{ref}}.{{state}}.{{case}}.myresult.{name}.tsv", name=my_dictionary[wildcards.ref])
and use myfun as input , but this does not answer why I can not use expand in place directly
Any suggestion how to fix it?
expand snakemake
expand snakemake
edited Nov 14 at 15:22
asked Nov 13 at 22:26
Medhat Helmy
934820
934820
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
up vote
0
down vote
accepted
Your question seems similar to snakemake wildcards or expand command and the bottom line is that wildcards is not defined in the input. So your solution of using an input function (or a lambda function) seems correct.
(As to why wildcards is not defined in input, I don't know...)
Thanks, The function worked but it did not resolve the variable between double curly braces so it will ask for input for{dataset}/{sample}.{ref}.{state}.{case}and raise an error.
– Medhat Helmy
Nov 14 at 16:37
add a comment |
up vote
0
down vote
As @dariober mentioned there is the wildcards objects but this is only accesible in the run/shell portion but can be accessed using an input function in input.
Here is an example implementation that will expand the input based on the wildcards.ref:
rule all:
input: expand("{dataset}/{sample}.{ref}.{state}.{case}.endresult.tsv", dataset=["D1", "D2"], sample=["S1", "S2"], ref=["R1", "R2"], state=["STATE1", "STATE2"], case=["C1", "C2"])
my_list = {"R1": [1, 2, 3], "R2": ["s1", "s2"]}
rule process_files:
input:
lambda wildcards: expand(
"{{dataset}}/{{sample}}.{{ref}}.{{state}}.{{case}}.myresult.{name}.tsv", name=my_list[wildcards.ref])
output:
"{dataset}/{sample}.{ref}.{state}.{case}.endresult.tsv"
shell:
"echo '{input}' > {output}"
If you implement it as the lambda function example above, it should resolve the issue you mention:
The function worked but it did not resolve the variable between double curly braces so it will ask for input for {dataset}/{sample}.{ref}.{state}.{case}and raise an error.
Actually my function is the same as your lambda function and raises this error. defmyfun(wildcards): return expand("{{dataset}}/{{sample}}.{{ref}}.{{state}}.{{case}}.myresult.{name}.tsv", name=my_list[wildcards.ref]). to overcome the issue I need to resolve each var for exampleref. would be `wildcards.ref`` and so on.
– Medhat Helmy
Nov 14 at 19:38
There should not really be need to do that. You are saying you pass to expand, in the case of{dataset},dataset = wildcards.dataset? Seems redundant. I am using snakemake 5.3.0 in the example and it works using yourmyfunor lambda.
– JohnnyBD
Nov 14 at 20:43
The issue is after using expand; the variable passed tosampleis{sample}so it would besample={sample}not the actual value of sample, which makes problem in processing for next step because now there is nothing called{dataset}/{sample...}in the input file
– Medhat Helmy
Nov 14 at 21:23
I am sorry but I cannot seem to reproduce this issue you are mentioning. Could you maybe edit your question and provide example of what an input would look like for one input wildcard combination? Either I am misunderstanding what are you trying to do or our implementations are different? You want to have a single value for all the wildcards exceptname? Essentially group a set ofnameinputs together? In that case you should have{sample}in the result of expand as that wildcard will be deduced fromrule alland output.
– JohnnyBD
Nov 14 at 22:26
add a comment |
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
0
down vote
accepted
Your question seems similar to snakemake wildcards or expand command and the bottom line is that wildcards is not defined in the input. So your solution of using an input function (or a lambda function) seems correct.
(As to why wildcards is not defined in input, I don't know...)
Thanks, The function worked but it did not resolve the variable between double curly braces so it will ask for input for{dataset}/{sample}.{ref}.{state}.{case}and raise an error.
– Medhat Helmy
Nov 14 at 16:37
add a comment |
up vote
0
down vote
accepted
Your question seems similar to snakemake wildcards or expand command and the bottom line is that wildcards is not defined in the input. So your solution of using an input function (or a lambda function) seems correct.
(As to why wildcards is not defined in input, I don't know...)
Thanks, The function worked but it did not resolve the variable between double curly braces so it will ask for input for{dataset}/{sample}.{ref}.{state}.{case}and raise an error.
– Medhat Helmy
Nov 14 at 16:37
add a comment |
up vote
0
down vote
accepted
up vote
0
down vote
accepted
Your question seems similar to snakemake wildcards or expand command and the bottom line is that wildcards is not defined in the input. So your solution of using an input function (or a lambda function) seems correct.
(As to why wildcards is not defined in input, I don't know...)
Your question seems similar to snakemake wildcards or expand command and the bottom line is that wildcards is not defined in the input. So your solution of using an input function (or a lambda function) seems correct.
(As to why wildcards is not defined in input, I don't know...)
answered Nov 14 at 8:25
dariober
9061121
9061121
Thanks, The function worked but it did not resolve the variable between double curly braces so it will ask for input for{dataset}/{sample}.{ref}.{state}.{case}and raise an error.
– Medhat Helmy
Nov 14 at 16:37
add a comment |
Thanks, The function worked but it did not resolve the variable between double curly braces so it will ask for input for{dataset}/{sample}.{ref}.{state}.{case}and raise an error.
– Medhat Helmy
Nov 14 at 16:37
Thanks, The function worked but it did not resolve the variable between double curly braces so it will ask for input for
{dataset}/{sample}.{ref}.{state}.{case}and raise an error.– Medhat Helmy
Nov 14 at 16:37
Thanks, The function worked but it did not resolve the variable between double curly braces so it will ask for input for
{dataset}/{sample}.{ref}.{state}.{case}and raise an error.– Medhat Helmy
Nov 14 at 16:37
add a comment |
up vote
0
down vote
As @dariober mentioned there is the wildcards objects but this is only accesible in the run/shell portion but can be accessed using an input function in input.
Here is an example implementation that will expand the input based on the wildcards.ref:
rule all:
input: expand("{dataset}/{sample}.{ref}.{state}.{case}.endresult.tsv", dataset=["D1", "D2"], sample=["S1", "S2"], ref=["R1", "R2"], state=["STATE1", "STATE2"], case=["C1", "C2"])
my_list = {"R1": [1, 2, 3], "R2": ["s1", "s2"]}
rule process_files:
input:
lambda wildcards: expand(
"{{dataset}}/{{sample}}.{{ref}}.{{state}}.{{case}}.myresult.{name}.tsv", name=my_list[wildcards.ref])
output:
"{dataset}/{sample}.{ref}.{state}.{case}.endresult.tsv"
shell:
"echo '{input}' > {output}"
If you implement it as the lambda function example above, it should resolve the issue you mention:
The function worked but it did not resolve the variable between double curly braces so it will ask for input for {dataset}/{sample}.{ref}.{state}.{case}and raise an error.
Actually my function is the same as your lambda function and raises this error. defmyfun(wildcards): return expand("{{dataset}}/{{sample}}.{{ref}}.{{state}}.{{case}}.myresult.{name}.tsv", name=my_list[wildcards.ref]). to overcome the issue I need to resolve each var for exampleref. would be `wildcards.ref`` and so on.
– Medhat Helmy
Nov 14 at 19:38
There should not really be need to do that. You are saying you pass to expand, in the case of{dataset},dataset = wildcards.dataset? Seems redundant. I am using snakemake 5.3.0 in the example and it works using yourmyfunor lambda.
– JohnnyBD
Nov 14 at 20:43
The issue is after using expand; the variable passed tosampleis{sample}so it would besample={sample}not the actual value of sample, which makes problem in processing for next step because now there is nothing called{dataset}/{sample...}in the input file
– Medhat Helmy
Nov 14 at 21:23
I am sorry but I cannot seem to reproduce this issue you are mentioning. Could you maybe edit your question and provide example of what an input would look like for one input wildcard combination? Either I am misunderstanding what are you trying to do or our implementations are different? You want to have a single value for all the wildcards exceptname? Essentially group a set ofnameinputs together? In that case you should have{sample}in the result of expand as that wildcard will be deduced fromrule alland output.
– JohnnyBD
Nov 14 at 22:26
add a comment |
up vote
0
down vote
As @dariober mentioned there is the wildcards objects but this is only accesible in the run/shell portion but can be accessed using an input function in input.
Here is an example implementation that will expand the input based on the wildcards.ref:
rule all:
input: expand("{dataset}/{sample}.{ref}.{state}.{case}.endresult.tsv", dataset=["D1", "D2"], sample=["S1", "S2"], ref=["R1", "R2"], state=["STATE1", "STATE2"], case=["C1", "C2"])
my_list = {"R1": [1, 2, 3], "R2": ["s1", "s2"]}
rule process_files:
input:
lambda wildcards: expand(
"{{dataset}}/{{sample}}.{{ref}}.{{state}}.{{case}}.myresult.{name}.tsv", name=my_list[wildcards.ref])
output:
"{dataset}/{sample}.{ref}.{state}.{case}.endresult.tsv"
shell:
"echo '{input}' > {output}"
If you implement it as the lambda function example above, it should resolve the issue you mention:
The function worked but it did not resolve the variable between double curly braces so it will ask for input for {dataset}/{sample}.{ref}.{state}.{case}and raise an error.
Actually my function is the same as your lambda function and raises this error. defmyfun(wildcards): return expand("{{dataset}}/{{sample}}.{{ref}}.{{state}}.{{case}}.myresult.{name}.tsv", name=my_list[wildcards.ref]). to overcome the issue I need to resolve each var for exampleref. would be `wildcards.ref`` and so on.
– Medhat Helmy
Nov 14 at 19:38
There should not really be need to do that. You are saying you pass to expand, in the case of{dataset},dataset = wildcards.dataset? Seems redundant. I am using snakemake 5.3.0 in the example and it works using yourmyfunor lambda.
– JohnnyBD
Nov 14 at 20:43
The issue is after using expand; the variable passed tosampleis{sample}so it would besample={sample}not the actual value of sample, which makes problem in processing for next step because now there is nothing called{dataset}/{sample...}in the input file
– Medhat Helmy
Nov 14 at 21:23
I am sorry but I cannot seem to reproduce this issue you are mentioning. Could you maybe edit your question and provide example of what an input would look like for one input wildcard combination? Either I am misunderstanding what are you trying to do or our implementations are different? You want to have a single value for all the wildcards exceptname? Essentially group a set ofnameinputs together? In that case you should have{sample}in the result of expand as that wildcard will be deduced fromrule alland output.
– JohnnyBD
Nov 14 at 22:26
add a comment |
up vote
0
down vote
up vote
0
down vote
As @dariober mentioned there is the wildcards objects but this is only accesible in the run/shell portion but can be accessed using an input function in input.
Here is an example implementation that will expand the input based on the wildcards.ref:
rule all:
input: expand("{dataset}/{sample}.{ref}.{state}.{case}.endresult.tsv", dataset=["D1", "D2"], sample=["S1", "S2"], ref=["R1", "R2"], state=["STATE1", "STATE2"], case=["C1", "C2"])
my_list = {"R1": [1, 2, 3], "R2": ["s1", "s2"]}
rule process_files:
input:
lambda wildcards: expand(
"{{dataset}}/{{sample}}.{{ref}}.{{state}}.{{case}}.myresult.{name}.tsv", name=my_list[wildcards.ref])
output:
"{dataset}/{sample}.{ref}.{state}.{case}.endresult.tsv"
shell:
"echo '{input}' > {output}"
If you implement it as the lambda function example above, it should resolve the issue you mention:
The function worked but it did not resolve the variable between double curly braces so it will ask for input for {dataset}/{sample}.{ref}.{state}.{case}and raise an error.
As @dariober mentioned there is the wildcards objects but this is only accesible in the run/shell portion but can be accessed using an input function in input.
Here is an example implementation that will expand the input based on the wildcards.ref:
rule all:
input: expand("{dataset}/{sample}.{ref}.{state}.{case}.endresult.tsv", dataset=["D1", "D2"], sample=["S1", "S2"], ref=["R1", "R2"], state=["STATE1", "STATE2"], case=["C1", "C2"])
my_list = {"R1": [1, 2, 3], "R2": ["s1", "s2"]}
rule process_files:
input:
lambda wildcards: expand(
"{{dataset}}/{{sample}}.{{ref}}.{{state}}.{{case}}.myresult.{name}.tsv", name=my_list[wildcards.ref])
output:
"{dataset}/{sample}.{ref}.{state}.{case}.endresult.tsv"
shell:
"echo '{input}' > {output}"
If you implement it as the lambda function example above, it should resolve the issue you mention:
The function worked but it did not resolve the variable between double curly braces so it will ask for input for {dataset}/{sample}.{ref}.{state}.{case}and raise an error.
answered Nov 14 at 17:47
JohnnyBD
8615
8615
Actually my function is the same as your lambda function and raises this error. defmyfun(wildcards): return expand("{{dataset}}/{{sample}}.{{ref}}.{{state}}.{{case}}.myresult.{name}.tsv", name=my_list[wildcards.ref]). to overcome the issue I need to resolve each var for exampleref. would be `wildcards.ref`` and so on.
– Medhat Helmy
Nov 14 at 19:38
There should not really be need to do that. You are saying you pass to expand, in the case of{dataset},dataset = wildcards.dataset? Seems redundant. I am using snakemake 5.3.0 in the example and it works using yourmyfunor lambda.
– JohnnyBD
Nov 14 at 20:43
The issue is after using expand; the variable passed tosampleis{sample}so it would besample={sample}not the actual value of sample, which makes problem in processing for next step because now there is nothing called{dataset}/{sample...}in the input file
– Medhat Helmy
Nov 14 at 21:23
I am sorry but I cannot seem to reproduce this issue you are mentioning. Could you maybe edit your question and provide example of what an input would look like for one input wildcard combination? Either I am misunderstanding what are you trying to do or our implementations are different? You want to have a single value for all the wildcards exceptname? Essentially group a set ofnameinputs together? In that case you should have{sample}in the result of expand as that wildcard will be deduced fromrule alland output.
– JohnnyBD
Nov 14 at 22:26
add a comment |
Actually my function is the same as your lambda function and raises this error. defmyfun(wildcards): return expand("{{dataset}}/{{sample}}.{{ref}}.{{state}}.{{case}}.myresult.{name}.tsv", name=my_list[wildcards.ref]). to overcome the issue I need to resolve each var for exampleref. would be `wildcards.ref`` and so on.
– Medhat Helmy
Nov 14 at 19:38
There should not really be need to do that. You are saying you pass to expand, in the case of{dataset},dataset = wildcards.dataset? Seems redundant. I am using snakemake 5.3.0 in the example and it works using yourmyfunor lambda.
– JohnnyBD
Nov 14 at 20:43
The issue is after using expand; the variable passed tosampleis{sample}so it would besample={sample}not the actual value of sample, which makes problem in processing for next step because now there is nothing called{dataset}/{sample...}in the input file
– Medhat Helmy
Nov 14 at 21:23
I am sorry but I cannot seem to reproduce this issue you are mentioning. Could you maybe edit your question and provide example of what an input would look like for one input wildcard combination? Either I am misunderstanding what are you trying to do or our implementations are different? You want to have a single value for all the wildcards exceptname? Essentially group a set ofnameinputs together? In that case you should have{sample}in the result of expand as that wildcard will be deduced fromrule alland output.
– JohnnyBD
Nov 14 at 22:26
Actually my function is the same as your lambda function and raises this error. def
myfun(wildcards): return expand("{{dataset}}/{{sample}}.{{ref}}.{{state}}.{{case}}.myresult.{name}.tsv", name=my_list[wildcards.ref]) . to overcome the issue I need to resolve each var for example ref . would be `wildcards.ref`` and so on.– Medhat Helmy
Nov 14 at 19:38
Actually my function is the same as your lambda function and raises this error. def
myfun(wildcards): return expand("{{dataset}}/{{sample}}.{{ref}}.{{state}}.{{case}}.myresult.{name}.tsv", name=my_list[wildcards.ref]) . to overcome the issue I need to resolve each var for example ref . would be `wildcards.ref`` and so on.– Medhat Helmy
Nov 14 at 19:38
There should not really be need to do that. You are saying you pass to expand, in the case of
{dataset}, dataset = wildcards.dataset? Seems redundant. I am using snakemake 5.3.0 in the example and it works using your myfun or lambda.– JohnnyBD
Nov 14 at 20:43
There should not really be need to do that. You are saying you pass to expand, in the case of
{dataset}, dataset = wildcards.dataset? Seems redundant. I am using snakemake 5.3.0 in the example and it works using your myfun or lambda.– JohnnyBD
Nov 14 at 20:43
The issue is after using expand; the variable passed to
sample is {sample} so it would be sample={sample} not the actual value of sample, which makes problem in processing for next step because now there is nothing called {dataset}/{sample...} in the input file– Medhat Helmy
Nov 14 at 21:23
The issue is after using expand; the variable passed to
sample is {sample} so it would be sample={sample} not the actual value of sample, which makes problem in processing for next step because now there is nothing called {dataset}/{sample...} in the input file– Medhat Helmy
Nov 14 at 21:23
I am sorry but I cannot seem to reproduce this issue you are mentioning. Could you maybe edit your question and provide example of what an input would look like for one input wildcard combination? Either I am misunderstanding what are you trying to do or our implementations are different? You want to have a single value for all the wildcards except
name? Essentially group a set of name inputs together? In that case you should have {sample} in the result of expand as that wildcard will be deduced from rule all and output.– JohnnyBD
Nov 14 at 22:26
I am sorry but I cannot seem to reproduce this issue you are mentioning. Could you maybe edit your question and provide example of what an input would look like for one input wildcard combination? Either I am misunderstanding what are you trying to do or our implementations are different? You want to have a single value for all the wildcards except
name? Essentially group a set of name inputs together? In that case you should have {sample} in the result of expand as that wildcard will be deduced from rule all and output.– JohnnyBD
Nov 14 at 22:26
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53290456%2fsnakemake-using-expand-with-dictionary%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown