package hep.graphics.heprep.test; import hep.aida.IAnalysisFactory; import hep.aida.ITree; import hep.aida.ITuple; import hep.aida.ITupleFactory; import hep.graphics.heprep.HasHepRep; import hep.graphics.heprep.HepRep; import hep.graphics.heprep.HepRepInstance; import hep.graphics.heprep.HepRepInstanceTree; import hep.graphics.heprep.HepRepPoint; import hep.graphics.heprep.HepRepType; import hep.graphics.heprep.HepRepTypeTree; import java.util.Collection; import java.util.Iterator; import java.util.List; import org.freehep.record.loop.event.RecordAdapter; import org.freehep.record.loop.event.RecordSuppliedEvent; /** * Analyzes an HepRep file for occurences of HepRep objects. * * @author duns * @version $Id: HepRepAnalyze.java 8584 2006-08-10 23:06:37Z duns $ */ public class HepRepAnalyze extends RecordAdapter { private ITuple tuple; /** * Creates the analyzer */ public HepRepAnalyze() { IAnalysisFactory af = IAnalysisFactory.create(); ITree tree = af.createTreeFactory().create(); ITupleFactory tf = af.createTupleFactory(tree); String[] columnNames = { "TypeTrees", "InstanceTrees", "Types", "Instances", "Points", "AttDefs", "AttValuesOnTypes", "AttValuesOnInstances", "AttValuesOnPoints"}; Class[] columnClasses = { Integer.TYPE, Integer.TYPE, Integer.TYPE, Integer.TYPE, Integer.TYPE, Integer.TYPE, Integer.TYPE, Integer.TYPE, Integer.TYPE}; tuple = tf.create( "HepRep", "HepRep Analysis", columnNames, columnClasses); } public void recordSupplied(RecordSuppliedEvent event) { Object record = event.getRecord(); HepRep heprep; if (record instanceof HepRep) { heprep = (HepRep)record; } else if (record instanceof HasHepRep) { heprep = ((HasHepRep)record).getHepRep(); } else if (record == null) { heprep = null; } else { System.out.println("Cannot handle record '"+record+"' of class: "+record.getClass()); return; } Collection typeTrees = heprep.getTypeTreeList(); tuple.fill(0, typeTrees.size()); int noOfTypes = 0; for (Iterator i=typeTrees.iterator(); i.hasNext(); ) { HepRepTypeTree typeTree = (HepRepTypeTree)i.next(); noOfTypes += countTypes(typeTree.getTypeList()); } tuple.fill(2, noOfTypes); int noOfAttDefs = 0; for (Iterator i=typeTrees.iterator(); i.hasNext(); ) { HepRepTypeTree typeTree = (HepRepTypeTree)i.next(); noOfAttDefs += countAttDefs(typeTree.getTypeList()); } tuple.fill(5, noOfAttDefs); Collection instanceTrees = heprep.getInstanceTreeList(); tuple.fill(1, instanceTrees.size()); int noOfInstances = 0; for (Iterator i=instanceTrees.iterator(); i.hasNext(); ) { HepRepInstanceTree instanceTree = (HepRepInstanceTree)i.next(); noOfInstances += countInstances(instanceTree.getInstances()); } tuple.fill(3, noOfInstances); int noOfPoints = 0; for (Iterator i=instanceTrees.iterator(); i.hasNext(); ) { HepRepInstanceTree instanceTree = (HepRepInstanceTree)i.next(); noOfPoints += countPoints(instanceTree.getInstances()); } tuple.fill(4, noOfPoints); int noOfAttValuesOnTypes = 0; for (Iterator i=typeTrees.iterator(); i.hasNext(); ) { HepRepTypeTree typeTree = (HepRepTypeTree)i.next(); noOfAttValuesOnTypes += countAttValuesOnTypes(typeTree.getTypeList()); } tuple.fill(6, noOfAttValuesOnTypes); int noOfAttValuesOnInstances = 0; for (Iterator i=instanceTrees.iterator(); i.hasNext(); ) { HepRepInstanceTree instanceTree = (HepRepInstanceTree)i.next(); noOfAttValuesOnInstances += countAttValuesOnInstances(instanceTree.getInstances()); } tuple.fill(7, noOfAttValuesOnInstances); int noOfAttValuesOnPoints = 0; for (Iterator i=instanceTrees.iterator(); i.hasNext(); ) { HepRepInstanceTree instanceTree = (HepRepInstanceTree)i.next(); noOfAttValuesOnPoints += countAttValuesOnPoints(instanceTree.getInstances()); } tuple.fill(8, noOfAttValuesOnPoints); tuple.addRow(); } private int countTypes(Collection types) { int count = types.size(); for (Iterator i=types.iterator(); i.hasNext(); ) { HepRepType type = (HepRepType)i.next(); count += countTypes(type.getTypeList()); } return count; } private int countAttDefs(Collection types) { int count = 0; for (Iterator i=types.iterator(); i.hasNext(); ) { HepRepType type = (HepRepType)i.next(); count += type.getAttDefsFromNode().size(); count += countAttDefs(type.getTypeList()); } return count; } private int countAttValuesOnTypes(Collection types) { int count = 0; for (Iterator i=types.iterator(); i.hasNext(); ) { HepRepType type = (HepRepType)i.next(); count += type.getAttValuesFromNode().size(); count += countAttValuesOnTypes(type.getTypeList()); } return count; } private int countInstances(List instances) { int count = instances.size(); for (Iterator i=instances.iterator(); i.hasNext(); ) { HepRepInstance instance = (HepRepInstance)i.next(); count += countInstances(instance.getInstances()); } return count; } private int countPoints(List instances) { int count = 0; for (Iterator i=instances.iterator(); i.hasNext(); ) { HepRepInstance instance = (HepRepInstance)i.next(); count += instance.getPoints().size(); count += countPoints(instance.getInstances()); } return count; } private int countAttValuesOnInstances(List instances) { int count = 0; for (Iterator i=instances.iterator(); i.hasNext(); ) { HepRepInstance instance = (HepRepInstance)i.next(); count += instance.getAttValuesFromNode().size(); count += countAttValuesOnInstances(instance.getInstances()); } return count; } private int countAttValuesOnPoints(List instances) { int count = 0; for (Iterator i=instances.iterator(); i.hasNext(); ) { HepRepInstance instance = (HepRepInstance)i.next(); for (Iterator p=instance.getPoints().iterator(); p.hasNext(); ) { HepRepPoint point = (HepRepPoint)p.next(); count += point.getAttValuesFromNode().size(); } count += countAttValuesOnPoints(instance.getInstances()); } return count; } }