/*
 * 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.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.jlab.groot.group.DataGroup;
import org.jlab.groot.group.DataGroupDescriptor;
import org.jlab.hipo.data.HipoEvent;
import org.jlab.hipo.data.HipoNode;
import org.jlab.hipo.io.HipoReader;
import org.jlab.hipo.io.HipoWriter;

/**
 *
 * @author gavalian
 */
public class TDirectory extends Directory {
    
    Map  groupDescriptors = new LinkedHashMap<>();
    
    public TDirectory(){
        
    }
    
    public void addGroupDescriptor(String name, int cols, int rows){
        groupDescriptors.put(name, new DataGroupDescriptor(name,cols,rows));
    }
    
    public void addGroup(String name, int order, String dataset){
        if(groupDescriptors.containsKey(name)==true){
            groupDescriptors.get(name).add(order, dataset);
        } else {
            System.out.println("[TDirectory] --> error : data group descriptos does not exist ["+name+"]");
        }
        //System.out.println(groupDescriptors.get(name));
    }
    
    public DataGroup getDataGroup(String name){
        
        DataGroupDescriptor desc = groupDescriptors.get(name);
        DataGroup          group = new DataGroup(name,desc.getCols(),desc.getRows());
        
        int groupSize = desc.getCols()*desc.getRows();
        
        for(int i = 0; i < groupSize; i++){
            List  items = desc.getList(i);
            String encoded = desc.getEncodedString(i);
            //System.out.println(i + " : " + encoded);
            for(String item : items){
                //System.out.println("getting object : " + item + "  for pad " + i);
                IDataSet ds = this.getObject(item);
                if(ds!=null){
                    group.addDataSet(ds, i);
                }
            }
        }
        return group;
    }
    
    
    public void addDataSet(IDataSet... dataSets){
        for(IDataSet ds : dataSets){
            add(ds.getName(),ds);
        }
    }
    
    public void writeFile(String filename){
        
        HipoWriter  writer = new HipoWriter();
        writer.setCompressionType(1);
        writer.open(filename);
        
        List  objectList = this.getCompositeObjectList(this);
        for(String object : objectList){
            //System.out.println("writing object ---> " + object);
            IDataSet ds = getObject(object);
            if(ds!=null){
                ds.setName(object);
                List  nodes = DataSetSerializer.serializeDataSet(ds);
                HipoEvent       event = new HipoEvent();
                event.addNodes(nodes);
                writer.writeEvent(event.getDataBuffer());
            } else {
                System.out.println("[TDirectory::writeFile] error getting object : " + object);
            }
        }
        System.out.println("---> writing data group descriptors, size = " + groupDescriptors.size());
        for(Map.Entry entry : groupDescriptors.entrySet()){
            List  nodes = DataSetSerializer.serializeDataGroupDescriptor(entry.getValue());
            HipoEvent       event = new HipoEvent();
            event.addNodes(nodes);
            event.updateNodeIndex();
            System.out.println(event);
            writer.writeEvent(event.getDataBuffer());
        }
        writer.close();
    }
    
    public static void addFiles(String outputFile, List inputFiles){
        TDirectory dir = new TDirectory();
        
        dir.readFile(inputFiles.get(0));
        
        List  objectList = dir.getCompositeObjectList(dir);

        System.out.println("********* OBJECT LIST ***********");
        for(String object : objectList){
            System.out.println("-> " + object);
        }        
        System.out.println("******* END OBJECT LIST *********");
        for(int loop = 1; loop < inputFiles.size(); loop++){
            TDirectory inDir = new TDirectory();
            inDir.readFile(inputFiles.get(loop));
            for(String object : objectList){
                try {
                    IDataSet dataset = (IDataSet) dir.getObject(object);
                    if(dataset instanceof H1F){
                        H1F h1 = (H1F) dataset;
                        H1F h2 = (H1F) inDir.getObject(object);
                        if(h2!=null){
                            h1.add(h2);
                        }
                    }
                } catch (Exception e) {
                    System.out.println("--> error with dataset : " + object);
                }
            }
        }
        
        dir.writeFile(outputFile);
    }
    
    public void readFile(String filename){

        HipoReader reader = new HipoReader();
        reader.open(filename);
        
        clear();
        this.groupDescriptors.clear();
        
        int nevents = reader.getEventCount();
        for(int i = 0; i < nevents; i++){
            byte[] eventBuffer = reader.readEvent(i);
            //System.out.println(" EVENT # " + i + "  SIZE = " + eventBuffer.length);
            HipoEvent    event = new HipoEvent(eventBuffer);
            
            if(event.hasGroup(1200)==true){
                System.out.println("--> reading data group descriptor");
                System.out.println(event);
                DataGroupDescriptor desc = DataSetSerializer.deserializeDataGroupDescriptor(event);
                this.groupDescriptors.put(desc.getName(), desc);
            } else {            
                //System.out.println(event.toString());
                IDataSet h1 = DataSetSerializer.deserializeDataSet(event);
                String h1name = h1.getName();
                //System.out.println("name -> : " + h1name + " -> " + this.stringDirectoryFromPath(h1name)
                //+ " obj ---> " + this.stringObjectFromPath(h1name));
                String dirname = this.stringDirectoryFromPath(h1name);
                mkdir(dirname);
                cd(dirname);
                //pwd();
                h1.setName(this.stringObjectFromPath(h1name));
                addDataSet(h1);
                this.ls();
            }
        }
    }
    
    
    public static void main(String[] args){
        
        if(args.length<3){
            System.out.println("error: \n\n Usage : hadd [outputfile] [input1] [input2] ....\n\n");
            System.exit(0);
        }
        
        String outputFile = args[0];
        
        List inputFiles = new ArrayList<>();
        for(int i = 1; i < args.length;i++) inputFiles.add(args[i]);
        
        TDirectory.addFiles(outputFile, inputFiles);
        /*
        TDirectory dir = new TDirectory();
        dir.mkdir("/calibration/PCAL");
        dir.mkdir("/calibration/ECIN");
        dir.mkdir("/calibration/ECOUT");
        
        dir.cd("/calibration/PCAL");
        
        H1F h1pcal = new H1F("h1pcal",100,0.0,2.0);
        for(int i = 0; i < 600; i++) h1pcal.fill(Math.random()+Math.random());
        dir.addDataSet(h1pcal);
        
        dir.cd("/calibration/ECIN");
        H1F h1ecin = new H1F("h1ecin",100,0.0,2.0);
        H2F h2ecin = new H2F("h2ecin",120,0.0,2.0,120,0.0,2.0);
        for(int i = 0; i < 60000; i++){
            h1ecin.fill(Math.random()+Math.random());
            h2ecin.fill(Math.random()+Math.random(),Math.random()+Math.random());
        }
        dir.addDataSet(h1ecin);
        dir.addDataSet(h2ecin);
        
        dir.cd("/calibration/ECOUT");
        H1F h1ecout = new H1F("h1ecout",100,0.0,2.0);
        h1ecout.setLineColor(4);
        h1ecout.setLineWidth(3);
        h1ecout.setFillColor(3);
        h1ecout.setTitle("Random Generator");
        h1ecout.setTitleX("ep #rarrow ep#pi^+#pi^- [GeV^2]");
        h1ecout.setTitleY("counts");
        h1ecout.setOptStat(1111001111);
        F1D func  = new F1D("func","[amp]*gaus(x,[mean],[sigma])",0.0,2.0);
        F1D funcL = new F1D("func","[a]+[b]*x",0.5,3.5);
        func.setParameter(0, 25.0);
        func.setParameter(1, 0.5);
        func.setParameter(2, 0.5);
        for(int i = 0; i < 600; i++) h1ecout.fill(Math.random()+Math.random());
        
        GraphErrors graph = new GraphErrors("Attenuation");
        graph.getAttributes().setOptStat("111111");
        graph.addPoint(1.0, 1.5, 0.0, 0.2);
        graph.addPoint(2.0, 2.6, 0.0, 0.15);
        graph.addPoint(3.0, 3.4, 0.0, 0.10);
        
        dir.addDataSet(h1ecout);
        dir.addDataSet(graph);
        DataFitter.fit(func, h1ecout, "N");
        DataFitter.fit(funcL, graph, "N");        
        
        System.out.println(">>>>>>>>>>>>>>>>>>>>");
        System.out.println(func);
        func.setLineColor(2);
        func.setLineWidth(3);
       
        dir.cd();
        dir.tree();
        dir.writeFile("testfile.hipo");
        
        
        TDirectory dirRead = new TDirectory();
        dirRead.readFile("testfile.hipo");
        dirRead.cd();        
        H1F h1 = (H1F) dirRead.getObject("/calibration/ECOUT/h1ecout");
        H2F h2 = (H2F) dirRead.getObject("/calibration/ECIN/h2ecin");
        GraphErrors graphR = (GraphErrors) dirRead.getObject("/calibration/ECOUT/Attenuation");
        dirRead.cd("calibration");
        dirRead.pwd();
        System.out.println(h1);
        
        dirRead.cd();
        dirRead.tree();
        TCanvas c1 = new TCanvas("c1",900,900);
        c1.divide(2,2);
        c1.cd(0);
        c1.draw(h1);
        c1.cd(1);
        c1.draw(graphR);
        c1.cd(2);
        c1.draw(h2);
        System.out.println("***********************");
        System.out.println(h1.getFunction());
       */
    }
}

 

Ads help maintain this website.