/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package org.jlab.groot.data;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.jlab.groot.base.DatasetAttributes;
import org.jlab.groot.group.DataGroupDescriptor;
import org.jlab.groot.math.F1D;
import org.jlab.groot.math.Func1D;
import org.jlab.hipo.data.HipoEvent;
import org.jlab.hipo.data.HipoNode;
import org.jlab.hipo.data.HipoNodeType;

/**
 *
 * @author gavalian
 */
public class DataSetSerializer {

    /**
     * serialization of H1F into HipoNodes
     * @param h1
     * @return 
     */
    public static List  serializeH1F(H1F h1){
        
        List nodes = new ArrayList<>();


        HipoNode dataType   = new HipoNode(100,1, HipoNodeType.INT,1);
        HipoNode dataName   = new HipoNode(100,2, h1.getName());
        //HipoNode dataAttr   = DataSetSerializer.serializeDataAttributes(100, 3, h1.getAttributes());
        HipoNode axisBins   = new HipoNode(100,4, HipoNodeType.INT,1);
        HipoNode axisLimits = new HipoNode(100,5, HipoNodeType.FLOAT,2);
        HipoNode axisData   = new HipoNode(100,6, HipoNodeType.FLOAT, h1.getxAxis().getNBins());        
        
        axisBins.setInt(0, h1.getXaxis().getNBins());
        axisLimits.setFloat(0, (float) h1.getXaxis().min());
        axisLimits.setFloat(1, (float) h1.getXaxis().max());
        
        for(int i = 0; i < h1.getXaxis().getNBins(); i++) axisData.setFloat(i, (float) h1.getBinContent(i));
        Collections.addAll(nodes, dataType,dataName,axisBins,axisLimits,axisData);
        
        List  attrNodes = DataSetSerializer.serializeAttributes(100, h1.getAttributes());
        nodes.addAll(attrNodes);
        
        if(h1.getFunction()!=null){
            List funcNodes = DataSetSerializer.serializeF1D(h1.getFunction());
            nodes.addAll(funcNodes);
        }
        return nodes;
    }
    
    public static List  serializeH2F(H2F h2){
        
        List nodes = new ArrayList<>();

        HipoNode dataType   = new HipoNode(200,1,HipoNodeType.INT,1);
        HipoNode dataName   = new HipoNode(200,2,h2.getName());
        HipoNode axisBins   = new HipoNode(200,3,HipoNodeType.INT,2);
        HipoNode axisLimits = new HipoNode(200,4,HipoNodeType.FLOAT,4);
        HipoNode dataBuffer = new HipoNode(200,5,HipoNodeType.FLOAT,h2.getDataBufferSize());
        
        axisBins.setInt(0, h2.getXAxis().getNBins());
        axisBins.setInt(1, h2.getYAxis().getNBins());
        axisLimits.setFloat(0, (float) h2.getXAxis().min());
        axisLimits.setFloat(1, (float) h2.getXAxis().max());
        axisLimits.setFloat(2, (float) h2.getYAxis().min());
        axisLimits.setFloat(3, (float) h2.getYAxis().max());
        
        for(int i = 0; i < h2.getDataBufferSize();i++){
            dataBuffer.setFloat(i, h2.getDataBufferBin(i));
        }
        
        Collections.addAll(nodes, dataType,dataName,axisBins,axisLimits,dataBuffer);
        
        List  attrNodes = DataSetSerializer.serializeAttributes(200, h2.getAttributes());
        nodes.addAll(attrNodes);
        
        /*HipoNode axisData   = new HipoNode(800,5,HipoNodeType.FLOAT, h2data.length);
        
        axisBins.setInt(0, h2.getXaxis().getNBins());
        axisBins.setInt(1, h2.getYaxis().getNBins());
        axisLimits.setFloat(0, (float) h2.getXaxis().min());
        axisLimits.setFloat(1, (float) h2.getXaxis().max());
        axisLimits.setFloat(2, (float) h2.getYaxis().min());
        axisLimits.setFloat(3, (float) h2.getYaxis().max());
        
        for(int i = 0; i < h2data.length; i++) axisData.setFloat(i, h2data[i]);
        */
        return nodes;
    }
    
    public static List  serializeF1D(Func1D func){
        
        List  nodes = new ArrayList<>();
        
        HipoNode dataType    = new HipoNode(500,1,HipoNodeType.INT,2);
        HipoNode dataName    = new HipoNode(500,2,func.getName());
        HipoNode dataAttr    = DataSetSerializer.serializeDataAttributes(500, 3, func.getAttributes());
        HipoNode dataClass   = new HipoNode(500,4,func.getClass().getName());
        HipoNode dataExpr    = new HipoNode(500,5,func.getExpression());
        HipoNode dataLimits  = new HipoNode(500,6,HipoNodeType.FLOAT,3);
        HipoNode dataPars    = new HipoNode(500,7,HipoNodeType.FLOAT,func.getNPars());
        HipoNode dataParsErr = new HipoNode(500,8,HipoNodeType.FLOAT,func.getNPars());
        
        
        dataLimits.setFloat(0, (float) func.getMin());
        dataLimits.setFloat(1, (float) func.getMax());
        dataLimits.setFloat(2, (float) func.getChiSquare());
        
        dataType.setInt(0, 5);
        dataType.setInt(1, func.getNDF());
        
        for(int i = 0; i < func.getNPars(); i++){
            dataPars.setFloat(i, (float) func.getParameter(i));
            dataParsErr.setFloat(i, (float) func.parameter(i).error());
        }
        
        Collections.addAll(nodes, dataType,dataName,dataAttr,dataClass,dataExpr,dataLimits,dataPars,dataParsErr);
        return nodes;
    }
    
    public static List  serializeGraphErrors(GraphErrors gr){
        
        List nodes = new ArrayList();
        
        HipoNode dataType   = new HipoNode(300,1,HipoNodeType.INT,1);
        HipoNode dataName   = new HipoNode(300,2,gr.getName());                
        HipoNode axisDataX  = new HipoNode(300,3,HipoNodeType.FLOAT,gr.getDataSize(0));
        HipoNode axisDataY  = new HipoNode(300,4,HipoNodeType.FLOAT,gr.getDataSize(0));
        HipoNode axisDataXE = new HipoNode(300,5,HipoNodeType.FLOAT,gr.getDataSize(0));
        HipoNode axisDataYE = new HipoNode(300,6,HipoNodeType.FLOAT,gr.getDataSize(0));

        for(int i = 0; i < gr.getDataSize(0); i++){
            axisDataX.setFloat(i, (float) gr.getDataX(i));
            axisDataY.setFloat(i, (float) gr.getDataY(i));
            axisDataXE.setFloat(i, (float) gr.getDataEX(i));
            axisDataYE.setFloat(i, (float) gr.getDataEY(i));
        }
        
        List attrNodes = DataSetSerializer.serializeAttributes(300, gr.getAttributes());
        
        nodes.add(dataType);
        nodes.add(dataName);
        nodes.add(axisDataX);
        nodes.add(axisDataY);
        nodes.add(axisDataXE);
        nodes.add(axisDataYE);
        nodes.addAll(attrNodes);
        
        if(gr.getFunction()!=null){
            List funcNodes = DataSetSerializer.serializeF1D(gr.getFunction());
            nodes.addAll(funcNodes);
        }
        
        return nodes;
    }
    
    
    public static List  serializeDataGroupDescriptor(DataGroupDescriptor desc){
        List  nodes = new ArrayList<>();
        
        HipoNode  header   = new HipoNode(1200,1,HipoNodeType.INT,3);
        HipoNode  descName = new HipoNode(1200,2,desc.getName());
        header.setInt(0, 120);
        header.setInt(1, desc.getCols());
        header.setInt(2, desc.getRows());
        int npads = desc.getCols()*desc.getRows();
        nodes.add(header);
        nodes.add(descName);
        
        for(int i = 0; i < npads; i++){
            String encoded = desc.getEncodedString(i);
            HipoNode node = new HipoNode(1200,20+i,encoded);
            nodes.add(node);
        }
        return nodes;
    }
    
    public static DataGroupDescriptor  deserializeDataGroupDescriptor(HipoEvent event){
        Map nodes = event.getGroup(1200);
        String name = nodes.get(2).getString();
        int   ncols = nodes.get(1).getInt(1);
        int   nrows = nodes.get(1).getInt(2);
        DataGroupDescriptor desc = new DataGroupDescriptor(name,ncols,nrows);
        for(Map.Entry entry : nodes.entrySet()){
            if(entry.getKey()>=20){
                int order = entry.getKey() - 20;
                desc.addEncoded(order, entry.getValue().getString());
            }
        }
        return desc;
    }
    
    public static List  serializeAttributes(int group, DatasetAttributes attr){
        
        List  attrNodes = new ArrayList();
        
        HipoNode attrNode   = new HipoNode(group,31,HipoNodeType.BYTE,8);
        
        attrNode.setByte(0, (byte) attr.getLineColor());
        attrNode.setByte(1, (byte) attr.getLineWidth());
        attrNode.setByte(2, (byte) attr.getLineStyle());
        attrNode.setByte(3, (byte) attr.getMarkerColor());
        attrNode.setByte(4, (byte) attr.getMarkerSize());
        attrNode.setByte(5, (byte) attr.getMarkerStyle());
        attrNode.setByte(6, (byte) attr.getFillColor());
        attrNode.setByte(7, (byte) attr.getFillStyle());
        
        HipoNode attrTitle   = new HipoNode(group,32,attr.getTitle());
        HipoNode attrTitleX  = new HipoNode(group,33,attr.getTitleX());
        HipoNode attrTitleY  = new HipoNode(group,34,attr.getTitleY());
        HipoNode attrOptStat = new HipoNode(group,35,attr.getOptStat());
        
        Collections.addAll(attrNodes, attrNode,attrTitle,attrTitleX,attrTitleY,attrOptStat);
        return attrNodes;
    }
    
    public static HipoNode  serializeDataAttributes(int group, int item, DatasetAttributes attr){
        
        HipoNode attrNode   = new HipoNode(group,item,HipoNodeType.BYTE,8);
        
        attrNode.setByte(0, (byte) attr.getLineColor());
        attrNode.setByte(1, (byte) attr.getLineWidth());
        attrNode.setByte(2, (byte) attr.getLineStyle());
        attrNode.setByte(3, (byte) attr.getMarkerColor());
        attrNode.setByte(4, (byte) attr.getMarkerSize());
        attrNode.setByte(5, (byte) attr.getMarkerStyle());
        attrNode.setByte(6, (byte) attr.getFillColor());
        attrNode.setByte(7, (byte) attr.getFillStyle());
        
        return attrNode;
    }
    
    public static void copyAttributes(DatasetAttributes attr, IDataSet ds){
        ds.getAttributes().setLineColor(attr.getLineColor());
        ds.getAttributes().setLineWidth(attr.getLineWidth());
        ds.getAttributes().setLineStyle(attr.getLineStyle()); 
        ds.getAttributes().setMarkerColor(attr.getMarkerColor());
        ds.getAttributes().setMarkerSize(attr.getMarkerSize());
        ds.getAttributes().setMarkerStyle(attr.getMarkerStyle());
        ds.getAttributes().setFillColor(attr.getFillColor());
        ds.getAttributes().setFillStyle(attr.getFillStyle());
    }
    
    public static DatasetAttributes deserializeAttributes(Map dataNodes){
        DatasetAttributes  attr = new DatasetAttributes();
        HipoNode node = dataNodes.get(31);
        attr.setLineColor(node.getByte(0));
        attr.setLineWidth(node.getByte(1));
        attr.setLineStyle(node.getByte(2));
        attr.setMarkerColor(node.getByte(3));
        attr.setMarkerSize(node.getByte(4));
        attr.setMarkerStyle(node.getByte(5));
        attr.setFillColor(node.getByte(6));
        attr.setFillStyle(node.getByte(7));
        
        attr.setTitle(dataNodes.get(32).getString());
        attr.setTitleX(dataNodes.get(33).getString());
        attr.setTitleY(dataNodes.get(34).getString());
        attr.setOptStat(dataNodes.get(35).getString());
        
        return attr;
    }
    public static DatasetAttributes deserializeDataAttributes(HipoNode node){
        DatasetAttributes  attr = new DatasetAttributes();        
        attr.setLineColor(node.getByte(0));
        attr.setLineWidth(node.getByte(1));
        attr.setLineStyle(node.getByte(2));
        attr.setMarkerColor(node.getByte(3));
        attr.setMarkerSize(node.getByte(4));
        attr.setMarkerStyle(node.getByte(5));
        attr.setFillColor(node.getByte(6));
        attr.setFillStyle(node.getByte(7));
        return attr;
    }
    
    public static F1D deserializeF1D(HipoEvent event){
        Map nodes = event.getGroup(500);
        //System.out.println(" F1D DESERIALIZER NODES SIZE = " + nodes.size());
        if(nodes.size()!=8) return null;
        String funcname   = nodes.get(2).getString();
        String expression = nodes.get(5).getString();
        F1D func = new F1D(funcname,expression,nodes.get(6).getFloat(0),nodes.get(6).getFloat(1));
        func.setNDF(nodes.get(1).getInt(1));
        func.setChiSquare(nodes.get(6).getFloat(2));
        for(int i = 0; i < func.getNPars(); i++){ 
            func.setParameter(i, nodes.get(7).getFloat(i));
            func.parameter(i).setError(nodes.get(8).getFloat(i));
        }
        System.out.println(func);
        return func;
    }
    
    public static GraphErrors deserializeGraphErrors(HipoEvent event){
        Map nodes = event.getGroup(300);
        //if(nodes.size()!=6) return null;
        String grname   = nodes.get(2).getString();
        int npoints = nodes.get(3).getDataSize();
        GraphErrors graph = new GraphErrors(grname);
        
        for(int i = 0; i < npoints; i++){
            graph.addPoint(
                    nodes.get(3).getFloat(i),
                    nodes.get(4).getFloat(i),
                    nodes.get(5).getFloat(i),
                    nodes.get(6).getFloat(i)
                    );
        }
        
        DatasetAttributes attr = DataSetSerializer.deserializeAttributes(nodes);
        graph.getAttributes().setAttributes(attr);
        
        F1D func = DataSetSerializer.deserializeF1D(event);
        if(func!=null) graph.setFunction(func);
        
        return graph;
    }
    
    public static H1F deserializeH1F(HipoEvent event){
        
        Map nodes = event.getGroup(100);        
        //DatasetAttributes attr = DataSetSerializer.deserializeAttributes(nodes.get(3));
                
        H1F h1 = new H1F();
        DatasetAttributes attr = DataSetSerializer.deserializeAttributes(nodes);
        h1.getAttributes().setAttributes(attr);
        //DataSetSerializer.copyAttributes(attr, h1);
        
        h1.set(nodes.get(4).getInt(0),nodes.get(5).getFloat(0),nodes.get(5).getFloat(1));
        h1.setName(nodes.get(2).getString());
        for(int i = 0; i < h1.getXaxis().getNBins();i++) h1.setBinContent(i, nodes.get(6).getFloat(i));
        
        F1D func = DataSetSerializer.deserializeF1D(event);
        if(func!=null) h1.setFunction(func);
        return h1;
    }
    
    public static H2F deserializeH2F(HipoEvent event){
        
        Map nodes = event.getGroup(200); 
        //DatasetAttributes attr = DataSetSerializer.deserializeAttributes(nodes.get(3));
                
        H2F h2 = new H2F();
        DatasetAttributes attr = DataSetSerializer.deserializeAttributes(nodes);
        h2.getAttributes().setAttributes(attr);
        //DataSetSerializer.copyAttributes(attr, h1);        
        //h2.set(nodes.get(4).getInt(0),nodes.get(5).getFloat(0),nodes.get(5).getFloat(1));
        
        h2.setName(nodes.get(2).getString());
        h2.set(
                nodes.get(3).getInt(0), 
                nodes.get(4).getFloat(0),nodes.get(4).getFloat(1),
                nodes.get(3).getInt(1), 
                nodes.get(4).getFloat(2),nodes.get(4).getFloat(3)
        );
        
        for(int i = 0; i < nodes.get(5).getDataSize();i++) h2.setDataBufferBin(i, nodes.get(5).getFloat(i));
        
        return h2;
    }
    
    public static List  serializeDataSet(IDataSet ds){
        //List  attributes = DataSetSerializer.serializeDataAttributes(ds.getAttributes());
        
        if(ds instanceof H1F){
            List  dsNodes = DataSetSerializer.serializeH1F( (H1F) ds);
            //attributes.addAll(dsNodes);
            return dsNodes;
        }
        
        if(ds instanceof H2F){
            List  dsNodes = DataSetSerializer.serializeH2F( (H2F) ds);
            return dsNodes;
        }
        
        if(ds instanceof GraphErrors){
            List  dsNodes = DataSetSerializer.serializeGraphErrors( (GraphErrors) ds);
            return dsNodes;
        }
        
        if(ds instanceof F1D){
            List  dsNodes = DataSetSerializer.serializeF1D( (F1D) ds);
            return dsNodes;
        }
        
        return null;
    }
    
    public static IDataSet deserializeDataSet(HipoEvent event){
        
        Map  nodesGroup_h1 = event.getGroup(100);
        if(nodesGroup_h1.containsKey(1)==true){
            H1F h1 = DataSetSerializer.deserializeH1F(event);
            return h1;
        }
        Map  nodesGroup_h2 = event.getGroup(200);
        if(nodesGroup_h2.containsKey(1)==true){
            H2F h2 = DataSetSerializer.deserializeH2F(event);
            return h2;
        }
        
        Map  nodesGroup_gr = event.getGroup(300);
        if(nodesGroup_gr.containsKey(1)==true){
            GraphErrors gr = DataSetSerializer.deserializeGraphErrors(event);
            return gr;
        }
        
        Map  nodesGroup_f1 = event.getGroup(500);
        if(nodesGroup_f1.containsKey(1)==true){
            Func1D f1 = DataSetSerializer.deserializeF1D(event);
            return f1;
        }
        
        //H1F h1 = DataSetSerializer.deserializeH1F(event);
        return null;
    }
}

 

Ads help maintain this website.