/* * RmiHist1DConverter.java * * Created on October 14, 2003, 7:39 PM */ package hep.aida.ref.remote.rmi.converters; import hep.aida.IAnnotation; import hep.aida.ICloud2D; import hep.aida.IHistogram2D; import hep.aida.IManagedObject; import hep.aida.ref.Annotation; import hep.aida.ref.remote.RemoteCloud2D; import hep.aida.ref.remote.RemoteHistogram2D; import hep.aida.ref.remote.rmi.data.RmiAnnotationItem; import hep.aida.ref.remote.rmi.data.RmiCloud2DData; import hep.aida.ref.remote.rmi.data.RmiHist2DData; /** * * @author serbo */ public class RmiCloud2DConverter extends RmiConverter { private static RmiCloud2DConverter converter = null; /** Creates a new instance of RmiHist1DAdapter */ public static RmiCloud2DConverter getInstance() { if (converter == null) converter = new RmiCloud2DConverter(); return converter; } /** Creates a new instance of RmiHist1DConverter */ private RmiCloud2DConverter() { super(); dataType = "RmiCloud2DData"; aidaType = "ICloud2D"; } public Object createAidaObject(String name) { RemoteCloud2D result = new RemoteCloud2D(name); return result; } public Object extractData(Object aidaObject) { RmiCloud2DData data = null; if (aidaObject instanceof hep.aida.ICloud2D) { data = createData((hep.aida.ICloud2D) aidaObject); } else if (aidaObject instanceof Object[] && ((Object[]) aidaObject)[0] instanceof ICloud2D) { ICloud2D[] arr = new ICloud2D[((Object[]) aidaObject).length]; for (int i=0; i<arr.length; i++) { arr[i] = (ICloud2D) ((Object[]) aidaObject)[i]; } data = createData(arr); } else throw new IllegalArgumentException("Not supported data type: "+aidaObject.getClass().getName()); return data; } public boolean updateAidaObject(Object aidaObject, Object newData) { RmiCloud2DData data = null; if (newData instanceof RmiCloud2DData) { data = (RmiCloud2DData) newData; } if (!(aidaObject instanceof hep.aida.ref.remote.RemoteCloud2D)) throw new IllegalArgumentException("Not supported object type: "+aidaObject.getClass().getName()); if (!(data != null && data instanceof hep.aida.ref.remote.rmi.data.RmiCloud2DData)) throw new IllegalArgumentException("Not supported data type: "+(newData == null ? "null" : newData.getClass().getName())); updateData((RemoteCloud2D) aidaObject, data); return true; } // Service methods /** * Update data in RemoteHistogram1d from RmiHist1DData * and calls setDataValid(true) method. */ public IManagedObject updateData(RemoteCloud2D cloud, RmiCloud2DData data) { // If data == null, just leave the old dats in. // Maybe should clear the histogram instead? if (data == null) return cloud; synchronized (cloud) { cloud.setFillable(true); // Set historam info RmiHist2DData histData = data.getHist(); RemoteHistogram2D hist = (RemoteHistogram2D) cloud.histogram(); RmiHist2DConverter.getInstance().updateData(hist, histData); hist.setFillable(true); hist.setDataValid(true); // Check for "stat.Updated" info java.util.Date date = new java.util.Date(); java.text.DateFormat df = java.text.DateFormat.getTimeInstance(); String dateString = df.format(date); IAnnotation localAnnotation = cloud.annotation(); if (localAnnotation instanceof Annotation) ((Annotation) localAnnotation).setFillable(true); try { String value = localAnnotation.value("stat.Updated"); if (value == null || value.equals("0") || value.equals("")) localAnnotation.setValue("stat.Updated", dateString); } catch (IllegalArgumentException e) { localAnnotation.addItem("stat.Updated", dateString); } if (localAnnotation instanceof Annotation) ((Annotation) localAnnotation).setFillable(false); // Set all other information cloud.setConverted(data.getConverted()); cloud.setEntries(data.getEntries()); cloud.setSummOfWeights(data.getSumOfWeights()); cloud.setMaxEntries(data.getMaxEntries()); cloud.setNanEntries(data.getNanEntries()); cloud.setLowerEdgeX(data.getLowerEdgeX()); cloud.setLowerEdgeY(data.getLowerEdgeY()); cloud.setUpperEdgeX(data.getUpperEdgeX()); cloud.setUpperEdgeY(data.getUpperEdgeY()); cloud.setMeanX(data.getMeanX()); cloud.setMeanY(data.getMeanY()); cloud.setRmsX(data.getRmsX()); cloud.setRmsY(data.getRmsY()); cloud.setValuesX(data.getValuesX()); cloud.setValuesY(data.getValuesY()); cloud.setWeights(data.getWeights()); cloud.setFillable(false); cloud.setDataValid(true); } return cloud; } /** * Create RmiHist1DData structure from an IHistogram1D */ public RmiCloud2DData createData(ICloud2D cloud) { RmiCloud2DData data = new RmiCloud2DData(); RmiHist2DData histData = null; RmiAnnotationItem[] rAnnotation = null; boolean isConverted = false; int maxEntries = 0; int nanEntries = 0; int entries = 0; double sumOfWeights = 0.; double lowerEdgeX = Double.NaN; double lowerEdgeY = Double.NaN; double upperEdgeX = Double.NaN; double upperEdgeY = Double.NaN; double meanX = Double.NaN; double meanY = Double.NaN; double rmsX = Double.NaN; double rmsY = Double.NaN; double[] valuesX = null; double[] valuesY = null; double[] weights = null; synchronized (cloud) { isConverted = cloud.isConverted(); maxEntries = cloud.maxEntries(); nanEntries = cloud.nanEntries(); entries = cloud.entries(); sumOfWeights = cloud.sumOfWeights(); lowerEdgeX = cloud.lowerEdgeX(); lowerEdgeY = cloud.lowerEdgeY(); upperEdgeX = cloud.upperEdgeX(); upperEdgeY = cloud.upperEdgeY(); if (isConverted) { IHistogram2D hist = cloud.histogram(); histData = RmiHist2DConverter.getInstance().createData(hist); } else { // Get Annotation information boolean sticky = false; IAnnotation lAnnotation = cloud.annotation(); if (lAnnotation != null && lAnnotation.size() > 0) { rAnnotation = new RmiAnnotationItem[lAnnotation.size()]; for (int i=0; i<lAnnotation.size(); i++) { String key = lAnnotation.key(i); String value = lAnnotation.value(key); rAnnotation[i] = new RmiAnnotationItem(key, value, sticky); } } // Get global histogram information meanX = cloud.meanX(); meanY = cloud.meanY(); rmsX = cloud.rmsX(); rmsY = cloud.rmsY(); // Get bin information if (entries > 0) { valuesX = new double[entries]; valuesY = new double[entries]; weights = new double[entries]; int i = 0; for (i=0; i<entries; i++) { valuesX[i] = cloud.valueX(i); valuesY[i] = cloud.valueY(i); weights[i] = cloud.weight(i); } } } } // end synchronized // Set all the information if (isConverted) { data.setHist(histData); } else { histData = new RmiHist2DData(); histData.setAnnotationItems(rAnnotation); } data.setValuesX(valuesX); data.setValuesY(valuesY); data.setWeights(weights); data.setConverted(isConverted); data.setEntries(entries); data.setSumOfWeights(sumOfWeights); data.setMaxEntries(maxEntries); data.setNanEntries(nanEntries); data.setLowerEdgeX(lowerEdgeX); data.setLowerEdgeY(lowerEdgeY); data.setUpperEdgeX(upperEdgeX); data.setUpperEdgeY(upperEdgeY); data.setMeanX(meanX); data.setMeanY(meanY); data.setRmsX(rmsX); data.setRmsY(rmsY); return data; } /** * Create RmiHist1DData structure from an array of IHistogram1D */ public RmiCloud2DData createData(ICloud2D[] arr) { RmiCloud2DData[] allData = new RmiCloud2DData[arr.length]; for (int i=0; i<allData.length; i++) { allData[i] = createData(arr[i]); } /* RmiCloud2DData data = new RmiCloud2DData(); RmiHist2DData histData = null; RmiAnnotationItem[] rAnnotation = null; boolean isConverted = false; int maxEntries = 0; int entries = 0; double sumOfWeights = 0.; double lowerEdgeX = Double.NaN; double lowerEdgeY = Double.NaN; double upperEdgeX = Double.NaN; double upperEdgeY = Double.NaN; double meanX = Double.NaN; double meanY = Double.NaN; double rmsX = Double.NaN; double rmsY = Double.NaN; double[] valuesX = null; double[] valuesY = null; double[] weights = null; // Do Merging here: // Set all the information if (isConverted) { data.setHist(histData); } else { histData = new RmiHist2DData(); histData.setAnnotationItems(rAnnotation); } data.setValuesX(valuesX); data.setValuesY(valuesY); data.setWeights(weights); data.setConverted(isConverted); data.setEntries(entries); data.setSumOfWeights(sumOfWeights); data.setMaxEntries(maxEntries); data.setLowerEdgeX(lowerEdgeX); data.setLowerEdgeY(lowerEdgeY); data.setUpperEdgeX(upperEdgeX); data.setUpperEdgeY(upperEdgeY); data.setMeanX(meanX); data.setMeanY(meanY); data.setRmsX(rmsX); data.setRmsY(rmsY); return data; */ return allData[0]; } }