diff edger.xml @ 15:119f41ec0ada draft

planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/edger commit 76bd257ee51e9d7b912f570fb9ced1084ef44212
author iuc
date Wed, 15 Oct 2025 10:24:03 +0000
parents c5fa04118f83
children 09965c918573
line wrap: on
line diff
--- a/edger.xml	Wed Sep 04 15:49:53 2024 +0000
+++ b/edger.xml	Wed Oct 15 10:24:03 2025 +0000
@@ -4,7 +4,7 @@
     </description>
     <macros>
         <token name="@TOOL_VERSION@">3.36.0</token>
-        <token name="@VERSION_SUFFIX@">5</token>
+        <token name="@VERSION_SUFFIX@">6</token>
     </macros>
     <edam_topics>
         <edam_topic>topic_3308</edam_topic>
@@ -212,7 +212,7 @@
                 <repeat name="rep_contrast" title="Contrast" min="1" default="1">
                     <param name="contrast" type="text" label="Contrast of Interest" help="Names of two groups to compare separated by a hyphen e.g. Mut-WT. If the order is Mut-WT the fold changes in the results will be up/down in Mut relative to WT. If you have more than one contrast enter each separately using the Insert Contrast button below. For differences between contrasts use e.g. (MT.t1-MT.t0)-(WT.t1-WT.t0). For more info, see Chapter 8 in the limma User's guide: https://www.bioconductor.org/packages/release/bioc/vignettes/limma/inst/doc/usersguide.pdf or https://bioconductor.org/packages/release/bioc/vignettes/edgeR/inst/doc/edgeRUsersGuide.pdf page 36 for nested comparisons.">
                         <validator type="empty_field"/>
-                        <validator type="regex" message="Please only use letters, numbers, parentheses or underscores">^[\w\-()]+$</validator>
+                        <validator type="regex" message="Please only use letters, numbers, parentheses, colon or underscores">^[\w\-():]+$</validator>
                     </param>
                 </repeat>
             </when>
@@ -295,20 +295,21 @@
     <tests>
         <!-- Ensure report is output -->
         <test expect_num_outputs="2">
-            <param name="format" value="matrix"/>
-            <param name="counts" value="matrix.txt"/>
-            <repeat name="rep_factor">
+            <param name="input|format" value="matrix"/>
+            <param name="input|counts" value="matrix.txt"/>
+            <param name="input|fact|ffile" value="no"/>
+            <repeat name="input|fact|rep_factor">
                 <param name="factorName" value="Genotype"/>
                 <param name="groupNames" value="Mut,Mut,Mut,WT,WT,WT"/>
             </repeat>
-            <param name="contrastOpt" value="manual"/>
-            <repeat name="rep_contrast">
+            <param name="contrasts|contrastOpt" value="manual"/>
+            <repeat name="contrasts|rep_contrast">
                 <param name="contrast" value="Mut-WT"/>
             </repeat>
-            <repeat name="rep_contrast">
+            <repeat name="contrasts|rep_contrast">
                 <param name="contrast" value="WT-Mut"/>
             </repeat>
-            <param name="normalisationOption" value="TMM"/>
+            <param name="adv|normalisationOption" value="TMM"/>
             <output_collection name="outTables" count="2">
                 <element name="edgeR_Mut-WT" ftype="tabular">
                     <assert_contents>
@@ -334,17 +335,18 @@
         </test>
         <!-- Complex contrasts constructions -->
         <test expect_num_outputs="2">
-            <param name="format" value="matrix"/>
-            <param name="counts" value="matrix-complex.txt"/>
-            <repeat name="rep_factor">
+            <param name="input|format" value="matrix"/>
+            <param name="input|counts" value="matrix-complex.txt"/>
+            <param name="input|fact|ffile" value="no"/>
+            <repeat name="input|fact|rep_factor">
                 <param name="factorName" value="Genotype"/>
                 <param name="groupNames" value="MutA,MutA,MutA,MutB,MutB,MutB,WTA,WTA,WTA,WTB,WTB,WTB"/>
             </repeat>
-            <param name="contrastOpt" value="manual"/>
-            <repeat name="rep_contrast">
+            <param name="contrasts|contrastOpt" value="manual"/>
+            <repeat name="contrasts|rep_contrast">
                 <param name="contrast" value="(MutA-MutB)-(WTA-WTB)"/>
             </repeat>
-            <param name="normalisationOption" value="TMM"/>
+            <param name="adv|normalisationOption" value="TMM"/>
             <output_collection name="outTables" count="1">
                 <element name="edgeR_(MutA-MutB)-(WTA-WTB)" ftype="tabular">
                     <assert_contents>
@@ -364,19 +366,20 @@
         </test>
         <!-- Ensure annotation file input works -->
         <test expect_num_outputs="2">
-            <param name="format" value="matrix"/>
-            <param name="annoOpt" value="yes"/>
-            <param name="geneanno" value="anno.txt"/>
-            <param name="counts" value="matrix.txt"/>
-            <repeat name="rep_factor">
+            <param name="input|format" value="matrix"/>
+            <param name="anno|annoOpt" value="yes"/>
+            <param name="anno|geneanno" value="anno.txt"/>
+            <param name="input|counts" value="matrix.txt"/>
+            <param name="input|fact|ffile" value="no"/>
+            <repeat name="input|fact|rep_factor">
                 <param name="factorName" value="Genotype"/>
                 <param name="groupNames" value="Mut,Mut,Mut,WT,WT,WT"/>
             </repeat>
-            <param name="contrastOpt" value="manual"/>
-            <repeat name="rep_contrast">
+            <param name="contrasts|contrastOpt" value="manual"/>
+            <repeat name="contrasts|rep_contrast">
                 <param name="contrast" value="Mut-WT"/>
             </repeat>
-            <param name="normalisationOption" value="TMM"/>
+            <param name="adv|normalisationOption" value="TMM"/>
             <output_collection name="outTables" count="1">
                 <element name="edgeR_Mut-WT" ftype="tabular">
                     <assert_contents>
@@ -388,19 +391,20 @@
         </test>
         <!-- Ensure RScript and RData file can be output -->
         <test expect_num_outputs="3">
-            <param name="format" value="matrix"/>
-            <param name="rscript" value="True"/>
-            <param name="rdaOption" value="true"/>
-            <param name="counts" value="matrix.txt"/>
-            <repeat name="rep_factor">
+            <param name="input|format" value="matrix"/>
+            <param name="out|rscript" value="True"/>
+            <param name="out|rdaOption" value="true"/>
+            <param name="input|counts" value="matrix.txt"/>
+            <param name="input|fact|ffile" value="no"/>
+            <repeat name="input|fact|rep_factor">
                 <param name="factorName" value="Genotype"/>
                 <param name="groupNames" value="Mut,Mut,Mut,WT,WT,WT"/>
             </repeat>
-            <param name="contrastOpt" value="manual"/>
-            <repeat name="rep_contrast">
+            <param name="contrasts|contrastOpt" value="manual"/>
+            <repeat name="contrasts|rep_contrast">
                 <param name="contrast" value="Mut-WT"/>
             </repeat>
-            <param name="normalisationOption" value="TMM"/>
+            <param name="adv|normalisationOption" value="TMM"/>
             <output name="outReport">
                 <assert_contents>
                     <has_text text="RData"/>
@@ -414,21 +418,22 @@
         </test>
         <!-- Ensure secondary factors work -->
         <test expect_num_outputs="2">
-            <param name="format" value="matrix"/>
-            <param name="counts" value="matrix.txt"/>
-            <repeat name="rep_factor">
+            <param name="input|format" value="matrix"/>
+            <param name="input|counts" value="matrix.txt"/>
+            <param name="input|fact|ffile" value="no"/>
+            <repeat name="input|fact|rep_factor">
                 <param name="factorName" value="Genotype"/>
                 <param name="groupNames" value="Mut,Mut,Mut,WT,WT,WT"/>
             </repeat>
-            <repeat name="rep_factor">
+            <repeat name="input|fact|rep_factor">
                 <param name="factorName" value="Batch"/>
                 <param name="groupNames" value="b1,b2,b3,b1,b2,b3"/>
             </repeat>
-            <param name="contrastOpt" value="manual"/>
-            <repeat name="rep_contrast">
+            <param name="contrasts|contrastOpt" value="manual"/>
+            <repeat name="contrasts|rep_contrast">
                 <param name="contrast" value="Mut-WT"/>
             </repeat>
-            <param name="normalisationOption" value="TMM"/>
+            <param name="adv|normalisationOption" value="TMM"/>
             <output_collection name="outTables" count="1">
                 <element name="edgeR_Mut-WT" ftype="tabular">
                     <assert_contents>
@@ -440,15 +445,15 @@
         </test>
         <!-- Ensure factors file with unordered samples works -->
         <test expect_num_outputs="2">
-            <param name="format" value="matrix"/>
-            <param name="ffile" value="yes"/>
-            <param name="finfo" value="factorinfo.txt"/>
-            <param name="counts" value="matrix.txt"/>
-            <param name="contrastOpt" value="manual"/>
-            <repeat name="rep_contrast">
+            <param name="input|format" value="matrix"/>
+            <param name="input|fact|ffile" value="yes"/>
+            <param name="input|fact|finfo" value="factorinfo.txt"/>
+            <param name="input|counts" value="matrix.txt"/>
+            <param name="contrasts|contrastOpt" value="manual"/>
+            <repeat name="contrasts|rep_contrast">
                 <param name="contrast" value="Mut-WT"/>
             </repeat>
-            <param name="normalisationOption" value="TMM"/>
+            <param name="adv|normalisationOption" value="TMM"/>
             <output_collection name="outTables" count="1">
                 <element name="edgeR_Mut-WT" ftype="tabular">
                     <assert_contents>
@@ -460,18 +465,19 @@
         </test>
         <!-- Ensure normalised counts file output works-->
         <test expect_num_outputs="2">
-            <param name="format" value="matrix"/>
-            <param name="normCounts" value="true"/>
-            <param name="counts" value="matrix.txt"/>
-            <repeat name="rep_factor">
+            <param name="input|format" value="matrix"/>
+            <param name="out|normCounts" value="true"/>
+            <param name="input|counts" value="matrix.txt"/>
+            <param name="input|fact|ffile" value="no"/>
+            <repeat name="input|fact|rep_factor">
                 <param name="factorName" value="Genotype"/>
                 <param name="groupNames" value="Mut,Mut,Mut,WT,WT,WT"/>
             </repeat>
-            <param name="contrastOpt" value="manual"/>
-            <repeat name="rep_contrast">
+            <param name="contrasts|contrastOpt" value="manual"/>
+            <repeat name="contrasts|rep_contrast">
                 <param name="contrast" value="Mut-WT"/>
             </repeat>
-            <param name="normalisationOption" value="TMM"/>
+            <param name="adv|normalisationOption" value="TMM"/>
             <output_collection name="outTables" count="2">
                 <element name="edgeR_Mut-WT" ftype="tabular">
                     <assert_contents>
@@ -489,18 +495,19 @@
         </test>
         <!-- Ensure likelihood ratio option works -->
         <test expect_num_outputs="2">
-            <param name="format" value="matrix"/>
-            <param name="counts" value="matrix.txt"/>
-            <repeat name="rep_factor">
+            <param name="input|format" value="matrix"/>
+            <param name="input|counts" value="matrix.txt"/>
+            <param name="input|fact|ffile" value="no"/>
+            <repeat name="input|fact|rep_factor">
                 <param name="factorName" value="Genotype"/>
                 <param name="groupNames" value="Mut,Mut,Mut,WT,WT,WT"/>
             </repeat>
-            <param name="contrastOpt" value="manual"/>
-            <repeat name="rep_contrast">
+            <param name="contrasts|contrastOpt" value="manual"/>
+            <repeat name="contrasts|rep_contrast">
                 <param name="contrast" value="Mut-WT"/>
             </repeat>
-            <param name="normalisationOption" value="TMM"/>
-            <param name="lrtOption" value="true"/>
+            <param name="adv|normalisationOption" value="TMM"/>
+            <param name="adv|lrtOption" value="true"/>
             <output name="outReport">
                 <assert_contents>
                     <has_text text="likelihood ratio"/>
@@ -510,8 +517,8 @@
         </test>
         <!-- Ensure multiple counts files input works -->
         <test expect_num_outputs="2">
-            <param name="format" value="files"/>
-            <repeat name="rep_factor">
+            <param name="input|format" value="files"/>
+            <repeat name="input|rep_factor">
                 <param name="factorName" value="Genotype"/>
                 <repeat name="rep_group">
                     <param name="groupName" value="WT"/>
@@ -522,7 +529,7 @@
                     <param name="countsFile" value="Mut1.counts,Mut2.counts,Mut3.counts"/>
                 </repeat>
             </repeat>
-            <repeat name="rep_factor">
+            <repeat name="input|rep_factor">
                 <param name="factorName" value="Batch"/>
                 <repeat name="rep_group">
                     <param name="groupName" value="b1"/>
@@ -537,16 +544,16 @@
                     <param name="countsFile" value="WT3.counts,Mut3.counts"/>
                 </repeat>
             </repeat>
-            <param name="annoOpt" value="yes"/>
-            <param name="geneanno" value="anno.txt"/>
-            <param name="contrastOpt" value="manual"/>
-            <repeat name="rep_contrast">
+            <param name="anno|annoOpt" value="yes"/>
+            <param name="anno|geneanno" value="anno.txt"/>
+            <param name="contrasts|contrastOpt" value="manual"/>
+            <repeat name="contrasts|rep_contrast">
                 <param name="contrast" value="Mut-WT"/>
             </repeat>
-            <repeat name="rep_contrast">
+            <repeat name="contrasts|rep_contrast">
                 <param name="contrast" value="WT-Mut"/>
             </repeat>
-            <param name="normCounts" value="true"/>
+            <param name="out|normCounts" value="true"/>
             <output_collection name="outTables" count="3">
                 <element name="edgeR_Mut-WT" ftype="tabular">
                     <assert_contents>
@@ -570,23 +577,24 @@
         </test>
         <!-- Ensure filtering on CPM in Mnimum Samples works -->
         <test expect_num_outputs="2">
-            <param name="format" value="matrix"/>
-            <param name="counts" value="matrix.txt"/>
-            <repeat name="rep_factor">
+            <param name="input|format" value="matrix"/>
+            <param name="input|counts" value="matrix.txt"/>
+            <param name="input|fact|ffile" value="no"/>
+            <repeat name="input|fact|rep_factor">
                 <param name="factorName" value="Genotype"/>
                 <param name="groupNames" value="Mut,Mut,Mut,WT,WT,WT"/>
             </repeat>
-            <param name="contrastOpt" value="manual"/>
-            <repeat name="rep_contrast">
+            <param name="contrasts|contrastOpt" value="manual"/>
+            <repeat name="contrasts|rep_contrast">
                 <param name="contrast" value="Mut-WT"/>
             </repeat>
-            <param name="normalisationOption" value="TMM"/>
-            <param name="filt_select" value="yes"/>
-            <param name="format_select" value="cpm"/>
+            <param name="adv|normalisationOption" value="TMM"/>
+            <param name="f|filt|filt_select" value="yes"/>
+            <param name="f|filt|cformat|format_select" value="cpm"/>
             <!-- real cpmReq values would be a lot lower
                  this is just for this tiny test dataset -->
-            <param name="cpmReq" value="1000"/>
-            <param name="cpmSampleReq" value="3"/>
+            <param name="f|filt|cformat|cpmReq" value="1000"/>
+            <param name="f|filt|cformat|cpmSampleReq" value="3"/>
             <output name="outReport">
                 <assert_contents>
                     <has_text text="CPM in at least"/>
@@ -606,22 +614,23 @@
         </test>
         <!-- Ensure filtering on Count in Minmum Samples works -->
         <test expect_num_outputs="2">
-            <param name="format" value="matrix"/>
-            <param name="counts" value="matrix.txt"/>
-            <repeat name="rep_factor">
+            <param name="input|format" value="matrix"/>
+            <param name="input|counts" value="matrix.txt"/>
+            <param name="input|fact|ffile" value="no"/>
+            <repeat name="input|fact|rep_factor">
                 <param name="factorName" value="Genotype"/>
                 <param name="groupNames" value="Mut,Mut,Mut,WT,WT,WT"/>
             </repeat>
-            <param name="contrastOpt" value="manual"/>
-            <repeat name="rep_contrast">
+            <param name="contrasts|contrastOpt" value="manual"/>
+            <repeat name="contrasts|rep_contrast">
                 <param name="contrast" value="Mut-WT"/>
             </repeat>
-            <param name="normalisationOption" value="TMM"/>
-            <param name="filt_select" value="yes"/>
-            <param name="format_select" value="counts"/>
-            <param name="cntReq" value="10"/>
-            <param name="count_select" value="sample"/>
-            <param name="cntSampleReq" value="3"/>
+            <param name="adv|normalisationOption" value="TMM"/>
+            <param name="f|filt|filt_select" value="yes"/>
+            <param name="f|filt|cformat|format_select" value="counts"/>
+            <param name="f|filt|cformat|cntReq" value="10"/>
+            <param name="f|filt|cformat|samples|count_select" value="sample"/>
+            <param name="f|filt|cformat|samples|cntSampleReq" value="3"/>
             <output name="outReport">
                 <assert_contents>
                     <has_text text="counts in at least"/>
@@ -641,23 +650,24 @@
         </test>
         <!-- Ensure filtering on Total Count works -->
         <test expect_num_outputs="2">
-            <param name="format" value="matrix"/>
-            <param name="counts" value="matrix.txt"/>
-            <repeat name="rep_factor">
+            <param name="input|format" value="matrix"/>
+            <param name="input|counts" value="matrix.txt"/>
+            <param name="input|fact|ffile" value="no"/>
+            <repeat name="input|fact|rep_factor">
                 <param name="factorName" value="Genotype"/>
                 <param name="groupNames" value="Mut,Mut,Mut,WT,WT,WT"/>
             </repeat>
-            <param name="contrastOpt" value="manual"/>
-            <repeat name="rep_contrast">
+            <param name="contrasts|contrastOpt" value="manual"/>
+            <repeat name="contrasts|rep_contrast">
                 <param name="contrast" value="Mut-WT"/>
             </repeat>
-            <param name="normalisationOption" value="TMM"/>
-            <param name="filt_select" value="yes"/>
-            <param name="format_select" value="counts"/>
+            <param name="adv|normalisationOption" value="TMM"/>
+            <param name="f|filt|filt_select" value="yes"/>
+            <param name="f|filt|cformat|format_select" value="counts"/>
             <!-- real cntReq values would be a lot lower
                  this is just for this tiny test dataset -->
-            <param name="cntReq" value="1000"/>
-            <param name="count_select" value="total"/>
+            <param name="f|filt|cformat|cntReq" value="1000"/>
+            <param name="f|filt|cformat|samples|count_select" value="total"/>
             <output name="outReport">
                 <assert_contents>
                     <has_text text="after summing counts for all samples"/>
@@ -677,20 +687,21 @@
         </test>
         <!-- Ensure formula and contrast file work -->
         <test expect_num_outputs="2">
-            <param name="format" value="matrix"/>
-            <param name="counts" value="matrix.txt"/>
-            <repeat name="rep_factor">
+            <param name="input|format" value="matrix"/>
+            <param name="input|counts" value="matrix.txt"/>
+            <param name="input|fact|ffile" value="no"/>
+            <repeat name="input|fact|rep_factor">
                 <param name="factorName" value="Genotype"/>
                 <param name="groupNames" value="Mut,Mut,Mut,WT,WT,WT"/>
             </repeat>
-            <repeat name="rep_factor">
+            <repeat name="input|fact|rep_factor">
                 <param name="factorName" value="Batch"/>
                 <param name="groupNames" value="b1,b2,b3,b1,b2,b3"/>
             </repeat>
-            <param name="contrastOpt" value="file"/>
-            <param name="cinfo" value="contrasts_file.txt"/>
+            <param name="contrasts|contrastOpt" value="file"/>
+            <param name="contrasts|cinfo" value="contrasts_file.txt"/>
             <param name="formula" value="~ 0 + Genotype + Batch"/>
-            <param name="normalisationOption" value="TMM"/>
+            <param name="adv|normalisationOption" value="TMM"/>
             <output_collection name="outTables" count="3">
                 <element name="edgeR_Mut-WT" ftype="tabular">
                     <assert_contents>
@@ -710,6 +721,78 @@
                 </element>
             </output_collection>
         </test>
+        <!-- Test interaction contrasts with extended dataset (tests make.names fix for interaction terms) -->
+        <test expect_num_outputs="2">
+            <param name="input|format" value="matrix"/>
+            <param name="input|counts" value="matrix-extended.txt"/>
+            <param name="input|fact|ffile" value="yes"/>
+            <param name="input|fact|finfo" value="factorinfo-extended.txt"/>
+            <param name="formula" value="~ 0 + Genotype:Batch"/>
+            <param name="contrasts|contrastOpt" value="manual"/>
+            <repeat name="contrasts|rep_contrast">
+                <param name="contrast" value="Mut:b1-WT:b1"/>
+            </repeat>
+            <repeat name="contrasts|rep_contrast">
+                <param name="contrast" value="Mut:b2-Mut:b3"/>
+            </repeat>
+            <param name="adv|normalisationOption" value="TMM"/>
+            <output_collection name="outTables" count="2">
+                <element name="edgeR_Mut.b1-WT.b1" ftype="tabular">
+                    <assert_contents>
+                        <has_text_matching expression="GeneID.*logFC.*logCPM.*F.*PValue.*FDR"/>
+                        <has_text_matching expression="11304"/>
+                    </assert_contents>
+                </element>
+                <element name="edgeR_Mut.b2-Mut.b3" ftype="tabular">
+                    <assert_contents>
+                        <has_text_matching expression="GeneID.*logFC.*logCPM.*F.*PValue.*FDR"/>
+                        <has_text_matching expression="11304"/>
+                    </assert_contents>
+                </element>
+            </output_collection>
+            <output name="outReport">
+                <assert_contents>
+                    <has_text text="edgeR Analysis Output"/>
+                    <has_text text="quasi-likelihood"/>
+                </assert_contents>
+            </output>
+        </test>
+        <!-- Test full factorial interaction model (tests make.names fix with different interaction formula) -->
+        <test expect_num_outputs="2">
+            <param name="input|format" value="matrix"/>
+            <param name="input|counts" value="matrix-extended.txt"/>
+            <param name="input|fact|ffile" value="yes"/>
+            <param name="input|fact|finfo" value="factorinfo-extended.txt"/>
+            <param name="formula" value="~ Genotype * Batch"/>
+            <param name="contrasts|contrastOpt" value="manual"/>
+            <repeat name="contrasts|rep_contrast">
+                <param name="contrast" value="WT:b2"/>
+            </repeat>
+            <repeat name="contrasts|rep_contrast">
+                <param name="contrast" value="WT:b3-WT:b2"/>
+            </repeat>
+            <param name="adv|normalisationOption" value="TMM"/>
+            <output_collection name="outTables" count="2">
+                <element name="edgeR_WT.b2" ftype="tabular">
+                    <assert_contents>
+                        <has_text_matching expression="GeneID.*logFC.*logCPM.*F.*PValue.*FDR"/>
+                        <has_text_matching expression="11304"/>
+                    </assert_contents>
+                </element>
+                <element name="edgeR_WT.b3-WT.b2" ftype="tabular">
+                    <assert_contents>
+                        <has_text_matching expression="GeneID.*logFC.*logCPM.*F.*PValue.*FDR"/>
+                        <has_text_matching expression="11304"/>
+                    </assert_contents>
+                </element>
+            </output_collection>
+            <output name="outReport">
+                <assert_contents>
+                    <has_text text="edgeR Analysis Output"/>
+                    <has_text text="quasi-likelihood"/>
+                </assert_contents>
+            </output>
+        </test>
     </tests>
     <help><![CDATA[
 .. class:: infomark
@@ -811,6 +894,57 @@
 and one contrast per line on the first column (other columns are ignored). If using this option, make sure to
 remove any contrast section from the manual part, or the tool will fail.
 
+**Working with Interactions:**
+When you have multiple factors, you may want to test for interaction effects between them. 
+For example, with factors Genotype (Mut, WT) and Batch (b1, b2, b3), you might want to test 
+whether the effect of genotype differs between batches.
+
+*Interaction Formula:* To include interaction terms, use the Formula field with one of these patterns:
+
+- ``~ Genotype * Batch`` - Full factorial model (main effects + interactions)
+- ``~ Genotype + Batch + Genotype:Batch`` - Equivalent to above
+- ``~ 0 + Genotype:Batch`` - Cell-means model (each group combination separately)
+
+The cell-means model (``~ 0 + Genotype:Batch``) is often preferred for testing specific 
+group comparisons as it creates individual parameters for each combination (e.g., Mut.b1, WT.b1, etc.).
+
+*Interaction Contrasts:* When using interactions, contrast names will contain colons that get 
+converted to dots automatically. For example:
+
+**Cell-means model contrasts** (with ``~ 0 + Genotype:Batch``):
+- Input contrast: ``Mut:b1-WT:b1`` (compare Mut vs WT within batch b1)
+- Input contrast: ``Mut:b2-Mut:b3`` (compare batch b2 vs b3 within Mut genotype)  
+- Output file names: ``edgeR_Mut.b1-WT.b1.tsv``, ``edgeR_Mut.b2-Mut.b3.tsv``
+
+**Full factorial model contrasts** (with ``~ Genotype * Batch``):
+- Input contrast: ``WT:b2`` (interaction effect: WT×b2 vs baseline)
+- Input contrast: ``WT:b3-WT:b2`` (compare interaction effects: WT×b3 vs WT×b2)
+- Output file names: ``edgeR_WT.b2.tsv``, ``edgeR_WT.b3-WT.b2.tsv``
+
+*Using Contrasts Files with Interactions:* When using a contrasts file instead of manual entry, 
+the same interaction contrast syntax applies. Create a tab-separated file with a header and 
+one contrast per line:
+
+Example contrasts file for cell-means model::
+
+    Contrast
+    Mut:b1-WT:b1
+    Mut:b2-Mut:b3
+    WT:b1-WT:b2
+
+Example contrasts file for full factorial model::
+
+    Contrast
+    WT:b2
+    WT:b3-WT:b2
+    WT
+
+The colons in contrast names will be automatically converted to dots in output file names, 
+regardless of whether contrasts are entered manually or via file.
+
+Note: Ensure you have sufficient replicates for interaction models. With n factors each having 
+k levels, you need more than n×k samples to estimate interactions properly.
+
 **Filter Low Counts:**
 Genes with very low counts across all libraries provide little evidence for differential expression.
 In the biological point of view, a gene must be expressed at some minimal level before