You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 24 Next »

This is a collection of thoughts on AIDA Styles and on their use in the new plotter.

Style Store

This is an object that can save and retrieve styles from a store (xml file on disk, database table). The basic xml style definition is the AIDA one. Next to the style itself we also identified the need to define Style Rules that should also be saved/retrieved to/from the store:

<styleStore>
   <styles>
       <style>
          .......
          <rules>
             <rule>
                .......
             </rule>
          </rules>
       </style>
   </styles>
</styleStore>

Multiple stores might be loaded at once: System Store, Personal Store, Group Store, Experiment Store. Their information is grouped and managed by a Style Registry

Style Rules

It should be possible to define rules on how to attach a style to a particular plot object. Multiple rules might be applied to a given style. It should be possible to apply rules to:

  • object type: hep.aida.IHistogram1D, org.myproject.MyData1D
  • object path: with path expressions like "MC/**"
  • plot order: a specific order position, 0, 7 or a cyclical recurrence (3) -> every third plot
  • action: like printing (plots for printing might require less details)
  • category: "experiment=GLAST, quality=preliminary"

Style Registry

A style registry combines the styles and rules from different style stores and provides the right set of styles (with the appropriate Style Order) for a given plot object.

Style Order

We have to define the order in which the styles are applied to an object:

  • passed style (when plotting)
  • explicit in annotation (like labels)
  • implicit:
    • action
    • category
    • plot order
    • path
    • type

Style Editor

GUI front end for viewing and editing individual styles or combinations of styles.
We already have a first version of the style editor. We need to add the possibility to view the information contained in a style registry, i.e. the chain of styles contributing to a given object and the set of rules that have contributed to it.

Comments to AIDA Styles

  • does isVisible() belong to IBaseStyle?
  • can we plot an object by passing only an IDataStyle (rather than an IPlotterStyle)?

 

Ideas for Implementation

 Let's leave Style Store out of this discussion just for the moment.

So Style Registry is created and is getting populated by (or just acts as a manager/façade for) the Style Stores, but it has access to Style/Rules information.

Just before object is plotted/printed and we know the object's path in a Tree, object's type, order of the object in particular IPlotterRegion, etc. All this information is used to query the Style Registry and create a cumulative IPlotterStyle for the implicit parameters.

Information that we need:

  • Object type: from the object itself
  • Object path: from AIDA tree, from initial user plotting request, or from the object
  • Plot order: from the current IPlotterRegion - is it overlay or not, and if it is - how many objects are already plotted there
  • Attribute: arbitrary attributes in a form of "key=value" pair can be added
  • Action: program that is performing action should know what it is doing - plotting, printing, etc.
  • Category: this is an external parameter and has to come from a separate service. We must be able to keep track of multiple categories and their current values, e.g. "experiment=BaBar" _and_ "quality=draft"
    • Can be part of Style Registry functionality, or independent service
    • Example: selected by user from the list of available Categories - PAW style plots, GLAST style plots
    • Action looks a lot like Category: "printing" -> "printing=true"

If any styles are passed explicitly to the plotter, this implicit cumulative style will be set as parent (or merged in as a lower priority Style).

I've set three interfaces that might do the job (below), have a look.

IStyleRegistry interface:

IPlotterStore in StyleRegistry is identified by a name (storeName). Store names have to be unique.

Also StyleRegistry can manage the Categories: list of all available keys and set of current values.

public interface IStyleRegistry {

    // To work with Style Stores
   
    String[] getAvailableStoreNames();
   
    IStyleStore getStore(String storeName);
   
   
    // To work with categories, this can be a separate service
    // Available category keys are filled from Rules of all available Stores
   
    String[] getAvailableCategoryKeys();
   
    String getCategoryValue(String categoryKey);
   
    void setCategoryCurrentValue(String categoryKey, String categoryValue);
   
    // Following methods are used to obtain cumulative IPlotterStyle
    // for particular region, object, action, and (possibly) categories
   
    IPlotterStyle getStyleForState(IPlotterState state);
}

IStyleStore interface:

All Rules that are added to a particular Style are assumed to have "AND" groupping

import hep.aida.IPlotterStyle;

/**
 * This interface can be implemented as "In-Memory" copy of persistent
 * facility, or as keeping live connections and committing any change
 * immediately.
 */

public interface IStyleStore {
   
    String getStoreName();
   
    String getStoreType();
   
    boolean isReadOnly();
   
   
    // Manage Styles

    void addStyle(String styleName, IPlotterStyle style);
   
    boolean hasStyle(String styleName);
   
    IPlotterStyle getStyle(String styleName);
   
    /**
     * Remove Style and all Rules associated with it from the Store
     */
    IPlotterStyle removeStyle(String styleName);
   
    String[] getAllStyleNames();
   

    // Create new Rules for this Store - or should we have Store-specific RuleFactory?

    IStyleRule createRule(int ruleType);

    IStyleRule createRuleFromDescription(String description);


    // Manage Rules

    IStyleRule[] getRulesForStyle(String styleName);
   
    void addRuleForStyle(String styleName, IStyleRule rule);
   
    void setRuleForStyle(String styleName, IStyleRule rule);
   
    void removeRuleForStyle(String styleName, IStyleRule rule);
   
    void removeAllRulesForStyle(String styleName);
   
    /**
     * Write all information from Store to the undelying persistent
     * facility: XML file, database, etc.
     */
    void commit();
          
    /**
     * Close all connections and free all resources.
     * Store is not usable after this method is executed.
     */
    void close();
          
}

IStyleRule interface:

Style Rule has type and value. Rule applies to the IPlotterState if state has approptiate type, and rule value is compatible with the state value. Rules can be logically groupped together with "OR" or "AND" operation.

Also Rule has a priority - defines the order in which Style that corresponds to this Rule will be used if Rule does apply.

public interface IStyleRule {

     // Possible types of Style Rules
     static int CLASS     = 0; // Class of the object: hep.aida.IHistogram1D
     static int PATH      = 1; // Position of the object in a Tree
     static int ORDER     = 2; // Order in the IPlotterRegion: specific number, or cyclical
     static int ATTRIBUTE = 3; // Arbitrary "key=value" pair, evalyated by the Rule
                               // From AIDA object's annotation any entry with "plotterState." prefix in key
                               // will be stripped of this prefix and put into PlotterState with ATTRIBUTE
                               // type before obtaining Style from the StyleRegistry
     static int ACTION    = 4; // What is going to happen with the object: plotting, printing
     static int CATEGORY  = 5; // "experiment=GLAST", "quality=preliminary"
                               // ACTION seems like a sub-type of CATEGORY: "printing=true"

     int getType();

     /**
      * Priority determines the order in which corresponding IPlotterStyle
      * should be used when assembling the cumulative IPlotterStyle
      */
      int getPriority();

     // Should have some conventions for describing Rules (XML-based ?)
     String getDescription();

     // Evaluates the Rule, including all added Rules
     boolean ruleApplies(IPlotterState state);

}


public interface IComplexStyleRule extends IStyleRule {

    // Operations that chain rules together
     static int OR  = 0;
     static int AND = 1;


     // Manage Rule Chaining

     void addRule(IStyleRule rule, int operation);

     int getNRules();

     int getRuleOperation(int n);

     IStyleRule getRule(int n);

     void removeRule(int n);
}

How to Evaluate Style Rules

  • CLASS
    • Plotted object is exactly instance of specified class
    • Plotted object is derived from specified class
  • PATH
    • Path contains specified sub-path
      • Case sensitive
      • NOT Case sensitive
    • Regular expression
  • ORDER
    • Absolute number of overlaid plots, like 3-rd
    • Position in the recurring sequence, like 4-th out of 7
  • ATTRIBUTE: match "key=value" pair
    • Case sensitive
    • NOT Case sensitive
  • ACTION: match action name
    • Case sensitive
    • NOT Case sensitive
  • CATEGORY: match "key=value" pair
    • Case sensitive
    • NOT Case sensitive

IPlotterState interface:

/**
 * This object encapsulates information about relevant
 * IPlotterRegion, object, and actions.
 * It is used for obtaining implicit IPlotterStyle
 */
public interface IPlotterState {
     // IStyleRule types are used here
     String getValueForType(int styleRuleType);
}
  • No labels