{"id":94,"date":"2023-09-02T15:48:53","date_gmt":"2023-09-02T13:48:53","guid":{"rendered":"http:\/\/eines-informatiques.recursos.uoc.edu\/workflows\/?page_id=94"},"modified":"2025-03-09T13:52:44","modified_gmt":"2025-03-09T11:52:44","slug":"2-4-hello-world","status":"publish","type":"page","link":"http:\/\/eines-informatiques.recursos.uoc.edu\/workflows\/es\/2-4-hello-world\/","title":{"rendered":"2.4. \u00abHello world\u00bb"},"content":{"rendered":"<p>Empezaremos por un <em>script<\/em> sencillo (helloworld.nf) donde imprimimos una frase, por ejemplo \u00abHello world\u00bb.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">nextflow.enable.dsl=2\r\n\r\n\r\nparams.str = 'Hello world!'\r\n\r\n\r\nprocess printStr {\r\n\r\n\u00a0output:\r\n\r\n\u00a0\u00a0\u00a0 stdout\r\n\r\n\r\n\u00a0 \"\"\"\r\n\r\necho '${params.str}'\r\n\r\n\u00a0 \"\"\"\r\n\r\n}\r\n\r\n\r\n\r\nworkflow {\r\n\r\n\u00a0printStr | view ( )\r\n\r\n}<\/pre>\n<ul>\n<li>En primer lugar, al <em>script <\/em><code>nf<\/code> le indicaremos que utilizamos <code>DSL2<\/code>.<\/li>\n<li>Crearemos un par\u00e1metro al cual nombraremos str y le asignaremos la frase \u00abHello world!\u00bb. El nombre del par\u00e1metro est\u00e1 precedido por un punto y la palabra <code>params<\/code>. En esta secci\u00f3n, al ser un \u00fanico par\u00e1metro no hace falta crear un canal, ya que Nextflow le asigna directamente un canal <em>value<\/em>. Hay distintos tipos de canales, como veremos m\u00e1s adelante, y el canal <em>value<\/em> es el m\u00e1s simple.<\/li>\n<li>El siguiente segmento define un proceso al cual nombraremos printStr. La nomenclatura de los procesos es <em>process<\/em> seguido del nombre que le asignamos. Los procesos est\u00e1n formados de tres partes: <em>input<\/em>,<em> output<\/em> y <em>script<\/em>. En este caso, le indicamos que el <em>output<\/em> sea el est\u00e1ndar, y al ser un valor simple tampoco hace falta que definamos un canal espec\u00edficamente. Dentro del proceso definiremos qu\u00e9 queremos hacer. Imprimimos el par\u00e1metro str.<\/li>\n<li>Finalmente asignamos la \u00faltima secci\u00f3n al flujo del <em>workflow<\/em>.<\/li>\n<\/ul>\n<p>Una vez creado el <em>script<\/em> lo ejecutaremos:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ nextflow run helloworld.nf<\/pre>\n<p>El resultado se muestra en la figura 2.<\/p>\n<figure id=\"attachment_72\" aria-describedby=\"caption-attachment-72\" style=\"width: 880px\" class=\"wp-caption alignnone\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-72 size-full\" src=\"\/wp-content\/uploads\/sites\/7\/2023\/09\/image003.png\" alt=\"\" width=\"880\" height=\"148\" srcset=\"\/wp-content\/uploads\/sites\/7\/2023\/09\/image003.png 880w, \/wp-content\/uploads\/sites\/7\/2023\/09\/image003-300x50.png 300w, \/wp-content\/uploads\/sites\/7\/2023\/09\/image003-768x129.png 768w\" sizes=\"(max-width: 880px) 100vw, 880px\" \/><figcaption id=\"caption-attachment-72\" class=\"wp-caption-text\">Figura 2. Ejecuci\u00f3n del <em>script<\/em> helloworld.nf.<br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>\n<p>Como se puede observar, se ha ejecutado un proceso <code>printStr<\/code> y se visualiza su resultado. Si quisi\u00e9ramos modificar un par\u00e1metro, en este caso <code>str<\/code>, desde la l\u00ednea de comandos ejecutaremos:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ nextflow run helloworld.nf --str 'Bye Bye World'<\/pre>\n<p>Y obtendremos el nuevo resultado.<\/p>\n<p>Ahora le a\u00f1adiremos un segundo proceso: poner todas las letras en may\u00fascula. Para ello a\u00f1adiremos el proceso <em>allToUpper<\/em>.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">nextflow.enable.dsl=2\r\n\r\nparams.str = 'Hello world!'\r\n\r\nprocess printStr {\r\n\r\n\u00a0 output:\r\n\r\n\u00a0\u00a0 path 'test.txt'\r\n\r\n\r\n\u00a0 \"\"\"\u00a0\r\n\r\necho '${params.str}' &gt; test.txt\r\n\r\n\u00a0 \"\"\"\r\n\r\n}\r\n\r\nprocess allToUpper {\r\n\r\n\u00a0input:\r\n\r\n\u00a0\u00a0 path x\r\n\r\n\u00a0 output:\r\n\r\n \u00a0\u00a0 stdout\r\n\r\n\u00a0 \"\"\"\r\n\r\ncat $x | tr '[a-z]' '[A-Z]'\r\n\r\n\u00a0 \"\"\"\r\n\r\n}\r\n\r\n\r\nworkflow {\r\n\r\n\u00a0printStr | allToUpper | view ( )\r\n\r\n}<\/pre>\n<p>Y el resultado lo visualizamos en la figura 3.<\/p>\n<figure id=\"attachment_76\" aria-describedby=\"caption-attachment-76\" style=\"width: 914px\" class=\"wp-caption alignnone\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-76 size-full\" src=\"\/wp-content\/uploads\/sites\/7\/2023\/09\/image005.png\" alt=\"\" width=\"914\" height=\"180\" srcset=\"\/wp-content\/uploads\/sites\/7\/2023\/09\/image005.png 914w, \/wp-content\/uploads\/sites\/7\/2023\/09\/image005-300x59.png 300w, \/wp-content\/uploads\/sites\/7\/2023\/09\/image005-768x151.png 768w\" sizes=\"(max-width: 914px) 100vw, 914px\" \/><figcaption id=\"caption-attachment-76\" class=\"wp-caption-text\">Figura 3. <em>Output<\/em> de dos procesos en Nextflow.<br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>\n<p>Como pod\u00e9is comprobar en la secci\u00f3n <em>workflow<\/em>, primero ejecutamos <code>printStr<\/code>, posteriormente <code>allToUpper<\/code> y finalmente lo visualizamos mediante <code>view( ). view<\/code> es un operador que veremos m\u00e1s adelante.<\/p>\n<p>Seguidamente sustituimos el comando de <code>allToUpper<\/code>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">cat $x | tr '[a-z]' '[A-Z]'<\/pre>\n<p>por:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">rev $x<\/pre>\n<p>y volvemos a ejecutar el <em>script<\/em>. En este caso, queremos imprimir \u00abHello world!\u00bb del rev\u00e9s. Como el primer paso ya lo hab\u00edamos lanzado anteriormente, podemos resumir la ejecuci\u00f3n mediante la opci\u00f3n <em>resume<\/em>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ nextflow run helloworld.nf -resume<\/pre>\n<p>y nos generar\u00e1 el <em>output <\/em>de la figura 4.<\/p>\n<figure id=\"attachment_80\" aria-describedby=\"caption-attachment-80\" style=\"width: 898px\" class=\"wp-caption alignnone\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-80 size-full\" src=\"\/wp-content\/uploads\/sites\/7\/2023\/09\/image007.png\" alt=\"\" width=\"898\" height=\"174\" srcset=\"\/wp-content\/uploads\/sites\/7\/2023\/09\/image007.png 898w, \/wp-content\/uploads\/sites\/7\/2023\/09\/image007-300x58.png 300w, \/wp-content\/uploads\/sites\/7\/2023\/09\/image007-768x149.png 768w\" sizes=\"(max-width: 898px) 100vw, 898px\" \/><figcaption id=\"caption-attachment-80\" class=\"wp-caption-text\">Figura 4. Resumir la ejecuci\u00f3n del <em>script<\/em> helloworld.nf.<br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>\n<p>Como pod\u00e9is ver, el primer paso del <em>script<\/em> no ha sido calculado de nuevo, sino que se ha utilizado el proceso ya generado anteriormente (<em>cached<\/em>). De esta forma, si en alg\u00fan paso del <em>pipeline<\/em> ha habido alg\u00fan error que ha parado el proceso, se puede resumir previa subsanaci\u00f3n del problema.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Empezaremos por un script sencillo (helloworld.nf) donde imprimimos una frase, por ejemplo \u00abHello world\u00bb. nextflow.enable.dsl=2 params.str = &#8216;Hello world!&#8217; process printStr { \u00a0output: \u00a0\u00a0\u00a0 stdout \u00a0 \u00ab\u00bb\u00bb echo &#8216;${params.str}&#8217; \u00a0 \u00ab\u00bb\u00bb } workflow { \u00a0printStr | view ( ) } En primer lugar, al script nf le indicaremos que utilizamos DSL2. Crearemos un par\u00e1metro al [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"acf":[],"_links":{"self":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/workflows\/es\/wp-json\/wp\/v2\/pages\/94"}],"collection":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/workflows\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/workflows\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/workflows\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/workflows\/es\/wp-json\/wp\/v2\/comments?post=94"}],"version-history":[{"count":8,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/workflows\/es\/wp-json\/wp\/v2\/pages\/94\/revisions"}],"predecessor-version":[{"id":300,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/workflows\/es\/wp-json\/wp\/v2\/pages\/94\/revisions\/300"}],"wp:attachment":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/workflows\/es\/wp-json\/wp\/v2\/media?parent=94"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}