Merge branch 'develop' into bug/JAL-2431splitFrameNewView
[jalview.git] / src / jalview / viewmodel / AlignmentViewport.java
index b62c61c..47dceec 100644 (file)
  */
 package jalview.viewmodel;
 
+import java.awt.Color;
+import java.beans.PropertyChangeSupport;
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.BitSet;
+import java.util.Deque;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+
 import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder;
 import jalview.analysis.Conservation;
 import jalview.api.AlignCalcManagerI;
@@ -57,17 +68,6 @@ import jalview.workers.ComplementConsensusThread;
 import jalview.workers.ConsensusThread;
 import jalview.workers.StrucConsensusThread;
 
-import java.awt.Color;
-import java.beans.PropertyChangeSupport;
-import java.util.ArrayDeque;
-import java.util.ArrayList;
-import java.util.BitSet;
-import java.util.Deque;
-import java.util.HashMap;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.Map;
-
 /**
  * base class holding visualization and analysis attributes and common logic for
  * an active alignment view displayed in the GUI
@@ -78,7 +78,7 @@ import java.util.Map;
 public abstract class AlignmentViewport implements AlignViewportI,
         CommandListener, VamsasSource
 {
-  protected ViewportPositionProps posProps;
+  protected ViewportRanges ranges;
 
   protected ViewStyleI viewStyle = new ViewStyle();
 
@@ -589,9 +589,9 @@ public abstract class AlignmentViewport implements AlignViewportI,
     return isDataset;
   }
 
+  private Map<SequenceI, SequenceCollectionI> hiddenRepSequences;
 
-
-  // protected ColumnSelection colSel = new ColumnSelection();
+  protected ColumnSelection colSel = new ColumnSelection();
 
   public boolean autoCalculateConsensus = true;
 
@@ -632,7 +632,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
       {
         residueShading.setConservation(hconservation);
       }
-      residueShading.alignmentChanged(alignment, getHiddenRepSequences());
+      residueShading.alignmentChanged(alignment, hiddenRepSequences);
     }
 
     /*
@@ -651,8 +651,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
         if (cs != null)
         {
           sg.getGroupColourScheme()
-.alignmentChanged(sg,
-                  getHiddenRepSequences());
+                  .alignmentChanged(sg, hiddenRepSequences);
         }
       }
     }
@@ -675,6 +674,8 @@ public abstract class AlignmentViewport implements AlignViewportI,
 
   protected AlignmentAnnotation complementConsensus;
 
+  protected AlignmentAnnotation gapcounts;
+
   protected AlignmentAnnotation strucConsensus;
 
   protected AlignmentAnnotation conservation;
@@ -777,6 +778,12 @@ public abstract class AlignmentViewport implements AlignViewportI,
   }
 
   @Override
+  public AlignmentAnnotation getAlignmentGapAnnotation()
+  {
+    return gapcounts;
+  }
+
+  @Override
   public AlignmentAnnotation getComplementConsensusAnnotation()
   {
     return complementConsensus;
@@ -816,7 +823,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
   public void updateConsensus(final AlignmentViewPanel ap)
   {
     // see note in mantis : issue number 8585
-    if (consensus == null || !autoCalculateConsensus)
+    if ((consensus == null || gapcounts == null) || !autoCalculateConsensus)
     {
       return;
     }
@@ -1095,27 +1102,24 @@ public abstract class AlignmentViewport implements AlignViewportI,
 
   public void setHiddenColumns(ColumnSelection colsel)
   {
-    posProps.setHiddenColumns(colsel);
-    // this.colSel = colsel;
+    this.colSel = colsel;
   }
 
   @Override
   public ColumnSelection getColumnSelection()
   {
-    return posProps.getColumnSelection();
-    // return colSel;
+    return colSel;
   }
 
   @Override
   public void setColumnSelection(ColumnSelection colSel)
   {
-    posProps.setColumnSelection(colSel);
-    /*this.colSel = colSel;
+    this.colSel = colSel;
     if (colSel != null)
     {
       updateHiddenColumns();
     }
-    isColSelChanged(true);*/
+    isColSelChanged(true);
   }
 
   /**
@@ -1125,14 +1129,14 @@ public abstract class AlignmentViewport implements AlignViewportI,
   @Override
   public Map<SequenceI, SequenceCollectionI> getHiddenRepSequences()
   {
-    return posProps.getHiddenRepSequences();
+    return hiddenRepSequences;
   }
 
   @Override
   public void setHiddenRepSequences(
           Map<SequenceI, SequenceCollectionI> hiddenRepSequences)
   {
-    posProps.getHiddenRepSequences();
+    this.hiddenRepSequences = hiddenRepSequences;
   }
 
   @Override
@@ -1145,8 +1149,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
   @Override
   public boolean hasHiddenColumns()
   {
-    return posProps.hasHiddenColumns();
-    // return colSel != null && colSel.hasHiddenColumns();
+    return colSel != null && colSel.hasHiddenColumns();
   }
 
   public void updateHiddenColumns()
@@ -1216,7 +1219,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
 
   }
 
-  private long sgrouphash = -1;
+  private long sgrouphash = -1, colselhash = -1;
 
   /**
    * checks current SelectionGroup against record of last hash value, and
@@ -1252,8 +1255,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
    */
   public boolean isColSelChanged(boolean b)
   {
-    return posProps.isColSelChanged(b);
-    /*int hc = (colSel == null || colSel.isEmpty()) ? -1 : colSel.hashCode();
+    int hc = (colSel == null || colSel.isEmpty()) ? -1 : colSel.hashCode();
     if (hc != -1 && hc != colselhash)
     {
       if (b)
@@ -1262,7 +1264,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
       }
       return true;
     }
-    return false;*/
+    return false;
   }
 
   @Override
@@ -1293,14 +1295,6 @@ public abstract class AlignmentViewport implements AlignViewportI,
    */
   private boolean followHighlight = true;
 
-  /*private int startRes;
-
-  private int endRes;
-
-  private int startSeq;
-
-  private int endSeq;*/
-
   /**
    * Property change listener for changes in alignment
    * 
@@ -1343,21 +1337,6 @@ public abstract class AlignmentViewport implements AlignViewportI,
 
   // common hide/show column stuff
 
-  public void hideColumns(int start, int end)
-  {
-    posProps.hideColumns(start, end);
-  }
-
-  public void showColumn(int col)
-  {
-    posProps.showColumn(col);
-  }
-
-  public void showAllHiddenColumns()
-  {
-    posProps.showAllHiddenColumns();
-  }
-
   public void hideSelectedColumns()
   {
     if (colSel.isEmpty())
@@ -1370,41 +1349,61 @@ public abstract class AlignmentViewport implements AlignViewportI,
     isColSelChanged(true);
   }
 
+  public void hideColumns(int start, int end)
+  {
+    if (start == end)
+    {
+      colSel.hideColumns(start);
+    }
+    else
+    {
+      colSel.hideColumns(start, end);
+    }
+    isColSelChanged(true);
+  }
 
+  public void showColumn(int col)
+  {
+    colSel.revealHiddenColumns(col);
+    isColSelChanged(true);
+  }
+
+  public void showAllHiddenColumns()
+  {
+    colSel.revealAllHiddenColumns();
+    isColSelChanged(true);
+  }
 
   // common hide/show seq stuff
   public void showAllHiddenSeqs()
   {
-    selectionGroup = posProps.showAllHiddenSeqs(selectionGroup);
-
-    /*    if (alignment.getHiddenSequences().getSize() > 0)
-        {
-          if (selectionGroup == null)
-          {
-            selectionGroup = new SequenceGroup();
-            selectionGroup.setEndRes(alignment.getWidth() - 1);
-          }
-          List<SequenceI> tmp = alignment.getHiddenSequences().showAll(
-                  hiddenRepSequences);
-          for (SequenceI seq : tmp)
-          {
-            selectionGroup.addSequence(seq, false);
-            setSequenceAnnotationsVisible(seq, true);
-          }
+    if (alignment.getHiddenSequences().getSize() > 0)
+    {
+      if (selectionGroup == null)
+      {
+        selectionGroup = new SequenceGroup();
+        selectionGroup.setEndRes(alignment.getWidth() - 1);
+      }
+      List<SequenceI> tmp = alignment.getHiddenSequences().showAll(
+              hiddenRepSequences);
+      for (SequenceI seq : tmp)
+      {
+        selectionGroup.addSequence(seq, false);
+        setSequenceAnnotationsVisible(seq, true);
+      }
 
-          hiddenRepSequences = null;
+      hiddenRepSequences = null;
 
-          firePropertyChange("alignment", null, alignment.getSequences());
-          // used to set hasHiddenRows/hiddenRepSequences here, after the property
-          // changed event
-          sendSelection();
-        }*/
+      firePropertyChange("alignment", null, alignment.getSequences());
+      // used to set hasHiddenRows/hiddenRepSequences here, after the property
+      // changed event
+      sendSelection();
+    }
   }
 
   public void showSequence(int index)
   {
-    posProps.showSequence(index, selectionGroup);
-    /*List<SequenceI> tmp = alignment.getHiddenSequences().showSequence(
+    List<SequenceI> tmp = alignment.getHiddenSequences().showSequence(
             index, hiddenRepSequences);
     if (tmp.size() > 0)
     {
@@ -1421,13 +1420,12 @@ public abstract class AlignmentViewport implements AlignViewportI,
       }
       firePropertyChange("alignment", null, alignment.getSequences());
       sendSelection();
-    }*/
+    }
   }
 
   public void hideAllSelectedSeqs()
   {
-    posProps.hideAllSelectedSeqs(selectionGroup);
-    /*if (selectionGroup == null || selectionGroup.getSize() < 1)
+    if (selectionGroup == null || selectionGroup.getSize() < 1)
     {
       return;
     }
@@ -1436,13 +1434,12 @@ public abstract class AlignmentViewport implements AlignViewportI,
 
     hideSequence(seqs);
 
-    setSelectionGroup(null);*/
+    setSelectionGroup(null);
   }
 
   public void hideSequence(SequenceI[] seq)
   {
-    posProps.hideSequence(seq);
-    /*if (seq != null)
+    if (seq != null)
     {
       for (int i = 0; i < seq.length; i++)
       {
@@ -1450,7 +1447,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
         setSequenceAnnotationsVisible(seq[i], false);
       }
       firePropertyChange("alignment", null, alignment.getSequences());
-    }*/
+    }
   }
 
   /**
@@ -1464,8 +1461,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
    */
   public void hideSequences(SequenceI sequence, boolean representGroup)
   {
-    posProps.hideSequences(sequence, representGroup, selectionGroup);
-    /*if (selectionGroup == null || selectionGroup.getSize() < 1)
+    if (selectionGroup == null || selectionGroup.getSize() < 1)
     {
       hideSequence(new SequenceI[] { sequence });
       return;
@@ -1484,14 +1480,33 @@ public abstract class AlignmentViewport implements AlignViewportI,
 
     hideSequence(hseqs);
     setSelectionGroup(null);
-    sendSelection();*/
+    sendSelection();
   }
 
+  /**
+   * Set visibility for any annotations for the given sequence.
+   * 
+   * @param sequenceI
+   */
+  protected void setSequenceAnnotationsVisible(SequenceI sequenceI,
+          boolean visible)
+  {
+    AlignmentAnnotation[] anns = alignment.getAlignmentAnnotation();
+    if (anns != null)
+    {
+      for (AlignmentAnnotation ann : anns)
+      {
+        if (ann.sequenceRef == sequenceI)
+        {
+          ann.visible = visible;
+        }
+      }
+    }
+  }
 
   public void hideRepSequences(SequenceI repSequence, SequenceGroup sg)
   {
-    posProps.hideRepSequences(repSequence, sg);
-    /*int sSize = sg.getSize();
+    int sSize = sg.getSize();
     if (sSize < 2)
     {
       return;
@@ -1521,7 +1536,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
     }
     sg.setSeqrep(repSequence); // note: not done in 2.7applet
     sg.setHidereps(true); // note: not done in 2.7applet
-    hideSequence(seqs);*/
+    hideSequence(seqs);
 
   }
 
@@ -1551,9 +1566,8 @@ public abstract class AlignmentViewport implements AlignViewportI,
    */
   public boolean isHiddenRepSequence(SequenceI seq)
   {
-    return posProps.isHiddenRepSequence(seq);
-    // return (hiddenRepSequences != null && hiddenRepSequences
-    // .containsKey(seq));
+    return (hiddenRepSequences != null && hiddenRepSequences
+            .containsKey(seq));
   }
 
   /**
@@ -1564,24 +1578,21 @@ public abstract class AlignmentViewport implements AlignViewportI,
    */
   public SequenceGroup getRepresentedSequences(SequenceI seq)
   {
-    return posProps.getRepresentedSequences(seq);
-    // return (SequenceGroup) (hiddenRepSequences == null ? null
-    // : hiddenRepSequences.get(seq));
+    return (SequenceGroup) (hiddenRepSequences == null ? null
+            : hiddenRepSequences.get(seq));
   }
 
   @Override
   public int adjustForHiddenSeqs(int alignmentIndex)
   {
-    return posProps.adjustForHiddenSeqs(alignmentIndex);
-    // return alignment.getHiddenSequences().adjustForHiddenSeqs(
-    // alignmentIndex);
+    return alignment.getHiddenSequences().adjustForHiddenSeqs(
+            alignmentIndex);
   }
 
   @Override
   public void invertColumnSelection()
   {
-    posProps.invertColumnSelection();
-    // colSel.invertColumnSelection(0, alignment.getWidth());
+    colSel.invertColumnSelection(0, alignment.getWidth());
   }
 
   @Override
@@ -1629,7 +1640,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
   @Override
   public CigarArray getViewAsCigars(boolean selectedRegionOnly)
   {
-    return new CigarArray(alignment, posProps.getColumnSelection(),
+    return new CigarArray(alignment, colSel,
             (selectedRegionOnly ? selectionGroup : null));
   }
 
@@ -1644,8 +1655,8 @@ public abstract class AlignmentViewport implements AlignViewportI,
   public jalview.datamodel.AlignmentView getAlignmentView(
           boolean selectedOnly, boolean markGroups)
   {
-    return new AlignmentView(alignment, posProps.getColumnSelection(),
-            selectionGroup, posProps.hasHiddenColumns(), selectedOnly,
+    return new AlignmentView(alignment, colSel, selectionGroup,
+            colSel != null && colSel.hasHiddenColumns(), selectedOnly,
             markGroups);
   }
 
@@ -1689,9 +1700,9 @@ public abstract class AlignmentViewport implements AlignViewportI,
     }
 
     selection = new String[iSize];
-    if (posProps.hasHiddenColumns())
+    if (colSel != null && colSel.hasHiddenColumns())
     {
-      selection = posProps.getVisibleSequenceStrings(start, end, seqs);
+      selection = colSel.getVisibleSequenceStrings(start, end, seqs);
     }
     else
     {
@@ -1707,52 +1718,49 @@ public abstract class AlignmentViewport implements AlignViewportI,
   @Override
   public List<int[]> getVisibleRegionBoundaries(int min, int max)
   {
-    return posProps.getVisibleRegionBoundaries(min, max);
-    /*    ArrayList<int[]> regions = new ArrayList<int[]>();
-        int start = min;
-        int end = max;
+    ArrayList<int[]> regions = new ArrayList<int[]>();
+    int start = min;
+    int end = max;
 
-        do
+    do
+    {
+      if (colSel != null && colSel.hasHiddenColumns())
+      {
+        if (start == 0)
         {
-          if (colSel != null && colSel.hasHiddenColumns())
-          {
-            if (start == 0)
-            {
-              start = colSel.adjustForHiddenColumns(start);
-            }
-
-            end = colSel.getHiddenBoundaryRight(start);
-            if (start == end)
-            {
-              end = max;
-            }
-            if (end > max)
-            {
-              end = max;
-            }
-          }
+          start = colSel.adjustForHiddenColumns(start);
+        }
+
+        end = colSel.getHiddenBoundaryRight(start);
+        if (start == end)
+        {
+          end = max;
+        }
+        if (end > max)
+        {
+          end = max;
+        }
+      }
 
-          regions.add(new int[] { start, end });
+      regions.add(new int[] { start, end });
 
-          if (posProps.hasHiddenColumns())
-          {
-            start = colSel.adjustForHiddenColumns(end);
-            start = colSel.getHiddenBoundaryLeft(start) + 1;
-          }
-        } while (end < max);
+      if (colSel != null && colSel.hasHiddenColumns())
+      {
+        start = colSel.adjustForHiddenColumns(end);
+        start = colSel.getHiddenBoundaryLeft(start) + 1;
+      }
+    } while (end < max);
 
-        int[][] startEnd = new int[regions.size()][2];
+    int[][] startEnd = new int[regions.size()][2];
 
-        return regions;*/
+    return regions;
   }
 
   @Override
   public List<AlignmentAnnotation> getVisibleAlignmentAnnotation(
           boolean selectedOnly)
   {
-    return posProps.getVisibleAlignmentAnnotation(selectedOnly,
-            selectionGroup);
-    /*ArrayList<AlignmentAnnotation> ala = new ArrayList<AlignmentAnnotation>();
+    ArrayList<AlignmentAnnotation> ala = new ArrayList<AlignmentAnnotation>();
     AlignmentAnnotation[] aa;
     if ((aa = alignment.getAlignmentAnnotation()) != null)
     {
@@ -1771,7 +1779,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
         ala.add(clone);
       }
     }
-    return ala;*/
+    return ala;
   }
 
   @Override
@@ -1844,7 +1852,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
     ResidueShaderI rs = residueShading;
     if (rs != null)
     {
-      rs.alignmentChanged(alignment, posProps.getHiddenRepSequences());
+      rs.alignmentChanged(alignment, hiddenRepSequences);
 
       rs.setConsensus(hconsensus);
       if (rs.conservationApplied())
@@ -1859,7 +1867,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
     {
       if (sg.cs != null)
       {
-        sg.cs.alignmentChanged(sg, posProps.getHiddenRepSequences());
+        sg.cs.alignmentChanged(sg, hiddenRepSequences);
       }
       sg.recalcConservation();
     }
@@ -1885,16 +1893,21 @@ public abstract class AlignmentViewport implements AlignViewportI,
       consensus = new AlignmentAnnotation("Consensus", "PID",
               new Annotation[1], 0f, 100f, AlignmentAnnotation.BAR_GRAPH);
       initConsensus(consensus);
+      gapcounts = new AlignmentAnnotation("Occupancy",
+              "Number of aligned positions",
+              new Annotation[1], 0f, alignment.getHeight(),
+              AlignmentAnnotation.BAR_GRAPH);
+      initGapCounts(gapcounts);
 
       initComplementConsensus();
     }
   }
 
   /**
-   * If this is a protein alignment and there are mappings to cDNA, add the cDNA
-   * consensus annotation.
+   * If this is a protein alignment and there are mappings to cDNA, adds the
+   * cDNA consensus annotation and returns true, else returns false.
    */
-  public void initComplementConsensus()
+  public boolean initComplementConsensus()
   {
     if (!alignment.isNucleotide())
     {
@@ -1921,9 +1934,11 @@ public abstract class AlignmentViewport implements AlignViewportI,
                   "PID for cDNA", new Annotation[1], 0f, 100f,
                   AlignmentAnnotation.BAR_GRAPH);
           initConsensus(complementConsensus);
+          return true;
         }
       }
     }
+    return false;
   }
 
   private void initConsensus(AlignmentAnnotation aa)
@@ -1937,6 +1952,20 @@ public abstract class AlignmentViewport implements AlignViewportI,
     }
   }
 
+  // these should be extracted from the view model - style and settings for
+  // derived annotation
+  private void initGapCounts(AlignmentAnnotation counts)
+  {
+    counts.hasText = false;
+    counts.autoCalculated = true;
+    counts.graph = AlignmentAnnotation.BAR_GRAPH;
+
+    if (showConsensus)
+    {
+      alignment.addAnnotation(counts);
+    }
+  }
+
   private void initConservation()
   {
     if (showConservation)
@@ -2639,76 +2668,9 @@ public abstract class AlignmentViewport implements AlignViewportI,
   }
 
   @Override
-  public ViewportPositionProps getPosProps()
+  public ViewportRanges getRanges()
   {
-    return posProps;
-  }
-
-  @Override
-  public int getStartRes()
-  {
-    return posProps.getStartRes();
-  }
-
-  @Override
-  public int getEndRes()
-  {
-    return posProps.getEndRes();
-  }
-
-  @Override
-  public int getStartSeq()
-  {
-    return posProps.getStartSeq();
-  }
-
-  public void setStartRes(int res)
-  {
-    posProps.setStartRes(res);
-    // this.startRes = res;
-  }
-
-  public void setStartSeq(int seq)
-  {
-    posProps.setStartSeq(seq);
-    // this.startSeq = seq;
-  }
-
-  public void setEndRes(int res)
-  {
-    posProps.setEndRes(res);
-    /*if (res > alignment.getWidth() - 1)
-    {
-      // log.System.out.println(" Corrected res from " + res + " to maximum " +
-      // (alignment.getWidth()-1));
-      res = alignment.getWidth() - 1;
-    }
-    if (res < 0)
-    {
-      res = 0;
-    }
-    this.endRes = res;*/
-  }
-
-  public void setEndSeq(int seq)
-  {
-    posProps.setEndSeq(seq);
-    /*if (seq > alignment.getHeight())
-    {
-      seq = alignment.getHeight();
-    }
-    if (seq < 0)
-    {
-      seq = 0;
-    }
-    this.endSeq = seq;*/
-  }
-
-  @Override
-  public int getEndSeq()
-  {
-    return posProps.getEndSeq();
-    // return endSeq;
+    return ranges;
   }
 
   /**
@@ -2748,7 +2710,8 @@ public abstract class AlignmentViewport implements AlignViewportI,
      * locate 'middle' column (true middle if an odd number visible, left of
      * middle if an even number visible)
      */
-    int middleColumn = getStartRes() + (getEndRes() - getStartRes()) / 2;
+    int middleColumn = ranges.getStartRes()
+            + (ranges.getEndRes() - ranges.getStartRes()) / 2;
     final HiddenSequences hiddenSequences = getAlignment()
             .getHiddenSequences();
 
@@ -2758,7 +2721,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
      */
     int lastSeq = alignment.getHeight() - 1;
     List<AlignedCodonFrame> seqMappings = null;
-    for (int seqNo = getStartSeq(); seqNo < lastSeq; seqNo++, seqOffset++)
+    for (int seqNo = ranges.getStartSeq(); seqNo < lastSeq; seqNo++, seqOffset++)
     {
       sequence = getAlignment().getSequenceAt(seqNo);
       if (hiddenSequences != null && hiddenSequences.isHidden(sequence))
@@ -2800,11 +2763,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
    */
   public void expandColSelection(SequenceGroup sg, boolean wholewidth)
   {
-    if (!this.hasSelectedColumns())
-    {
-      posProps.expandColSelection(sg, wholewidth);
-    }
-    /*int sgs, sge;
+    int sgs, sge;
     if (sg != null && (sgs = sg.getStartRes()) >= 0
             && sg.getStartRes() <= (sge = sg.getEndRes())
             && !this.hasSelectedColumns())
@@ -2822,7 +2781,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
       {
         colSel.addElement(cspos);
       }
-    }*/
+    }
   }
 
   /**
@@ -2830,7 +2789,6 @@ public abstract class AlignmentViewport implements AlignViewportI,
    */
   private boolean selectionIsDefinedGroup = false;
 
-
   @Override
   public boolean isSelectionDefinedGroup()
   {