{"id":176,"date":"2023-10-10T12:08:30","date_gmt":"2023-10-10T10:08:30","guid":{"rendered":"http:\/\/eines-informatiques.recursos.uoc.edu\/workflows\/?page_id=176"},"modified":"2025-02-11T14:42:29","modified_gmt":"2025-02-11T12:42:29","slug":"2-4-hello-world","status":"publish","type":"page","link":"http:\/\/eines-informatiques.recursos.uoc.edu\/workflows\/2-4-hello-world\/","title":{"rendered":"2.4. \u00abHello world\u00bb"},"content":{"rendered":"<p>Comen\u00e7arem per un <em>script<\/em> senzill (helloworld.nf) on imprimim una frase, per exemple \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 lloc, a l\u2019<em>script <\/em><code>nf<\/code> li indicarem que utilitzem <code>DSL2<\/code>.<\/li>\n<li>Crearem un par\u00e0metre que anomenarem \u00abHello world!\u00bb. El nom del par\u00e0metre est\u00e0 precedit per un punt i l&#8217;expressi\u00f3\u00a0<code>params<\/code>. En aquesta secci\u00f3, com que es tracta d&#8217;un \u00fanic par\u00e0metre, no cal crear un canal, ja que Nextflow assigna directament un canal <em>value<\/em>. Hi ha diferents tipus de canals, com veurem m\u00e9s endavant, i el canal <em>value<\/em> \u00e9s el m\u00e9s simple.<\/li>\n<li>El seg\u00fcent segment defineix un proc\u00e9s al qual anomenarem printStr. La nomenclatura dels processos \u00e9s <em>process<\/em> seguit del nom que li assignem. Els processos estan formats per tres parts: <em>input<\/em>,<em> output<\/em> i <em>script<\/em>. En aquest cas, li indiquem que l\u2019<em>output<\/em> sigui l\u2019est\u00e0ndard, i en ser un valor simple tampoc cal que definim un canal espec\u00edficament. Dins del proc\u00e9s definirem qu\u00e8 volem fer. Imprimim el par\u00e0metre str.<\/li>\n<li>Finalment, assignem l\u2019\u00faltima secci\u00f3 al flux del <em>workflow<\/em>.<\/li>\n<\/ul>\n<p>Un cop creat l\u2019<em>script<\/em> l\u2019executarem:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ nextflow run helloworld.nf<\/pre>\n<p>El resultat es mostra a 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. Execuci\u00f3 de l\u2019<em>script<\/em> helloworld.nf.<br \/>Font: elaboraci\u00f3 pr\u00f2pia.<\/figcaption><\/figure>\n<p>Com es pot observar, s\u2019ha executat un proc\u00e9s <code>printStr<\/code> i se\u2019n visualitza el resultat. Si voleu modificar un par\u00e0metre, en aquest cas <code>str<\/code>, des de la l\u00ednia d\u2019ordres executarem:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ nextflow run helloworld.nf --str 'Bye Bye World'<\/pre>\n<p>I obtindrem el nou resultat.<\/p>\n<p>Ara li afegirem un segon proc\u00e9s: posar totes les lletres en maj\u00fascula. Per aix\u00f2 afegirem el proc\u00e9s <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>I el resultat el visualitzem a 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 processos a Nextflow.<br \/>Font: elaboraci\u00f3 pr\u00f2pia.<\/figcaption><\/figure>\n<p>Com podeu comprovar a la secci\u00f3 <em>workflow<\/em>, primer executem <code>printStr<\/code>, posteriorment <code>allToUpper<\/code> i finalment el visualitzem mitjan\u00e7ant <code>view( ). view<\/code> \u00e9s un operador que veurem m\u00e9s endavant.<\/p>\n<p>Seguidament substitu\u00efm l\u2019ordre <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>per:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">rev $x<\/pre>\n<p>i tornem a executar l\u2019<em>script<\/em>. En aquest cas, volem imprimir \u00abHello world!\u00bb al rev\u00e9s. Com que el primer pas ja l\u2019hav\u00edem llan\u00e7at anteriorment, podem resumir l\u2019execuci\u00f3 mitjan\u00e7ant l\u2019opci\u00f3 <em>resume<\/em>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ nextflow run helloworld.nf -resume<\/pre>\n<p>i ens generar\u00e0 <em>l\u2019output <\/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 l\u2019execuci\u00f3 de l\u2019<em>script<\/em> helloworld.nf.<br \/>Font: elaboraci\u00f3 pr\u00f2pia.<\/figcaption><\/figure>\n<p>Com podeu veure, el primer pas de <em>l\u2019script<\/em> no ha estat calculat de nou, sin\u00f3 que s\u2019ha utilitzat el proc\u00e9s ja generat anteriorment (<em>cached<\/em>). D\u2019aquesta manera, si en algun pas del <em>pipeline<\/em> hi ha hagut algun error que ha aturat el proc\u00e9s, es pot resumir pr\u00e8via esmena del problema.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Comen\u00e7arem per un script senzill (helloworld.nf) on imprimim una frase, per exemple \u00abHello world\u00bb. nextflow.enable.dsl=2 params.str = &#8216;Hello world!&#8217; process printStr { \u00a0output: \u00a0\u00a0\u00a0 stdout \u00a0 &#8220;&#8221;&#8221; echo &#8216;${params.str}&#8217; \u00a0 &#8220;&#8221;&#8221; } workflow { \u00a0printStr | view ( ) } En primer lloc, a l\u2019script nf li indicarem que utilitzem DSL2. Crearem un par\u00e0metre que [&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\/wp-json\/wp\/v2\/pages\/176"}],"collection":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/workflows\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/workflows\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/workflows\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/workflows\/wp-json\/wp\/v2\/comments?post=176"}],"version-history":[{"count":13,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/workflows\/wp-json\/wp\/v2\/pages\/176\/revisions"}],"predecessor-version":[{"id":294,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/workflows\/wp-json\/wp\/v2\/pages\/176\/revisions\/294"}],"wp:attachment":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/workflows\/wp-json\/wp\/v2\/media?parent=176"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}