/*
 * 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.tree;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.swing.JDialog;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;
import org.jlab.groot.data.DataVector;
import org.jlab.groot.data.H1F;
import org.jlab.groot.data.H2F;
import org.jlab.groot.graphics.EmbeddedCanvas;

/**
 *
 * @author gavalian
 */
public class TreeTextFile extends Tree implements TreeProvider {
    
    private static int TREEFILE_CSV       = 1;
    private static int TREEFILE_SPACE     = 2;
    private static int TREEFILE_SEMICOLON = 3;
    
    private String dataSeparator = "\\s+";
    private int    textFileType  = 2;
    
    private List  dataVectors = new ArrayList();
    private int               currentData = 0;
    
    public TreeTextFile(String name) {
        super(name);
        
    }
    
    public TreeTextFile(String name, int type) {
        super(name);
        this.textFileType = type;
        if(type==TreeTextFile.TREEFILE_CSV){
            dataSeparator = ",";
        }
        if(type==TreeTextFile.TREEFILE_SEMICOLON){
            dataSeparator = ";";
        }
    }
    
    public TreeTextFile(String name, String filename, int columns) {
        super(name);
    }
    
    public void readFile(String filename){
        this.readFile(filename, dataSeparator);
    }
    
    public void readFile(String filename, String separator){
        
        dataVectors.clear();
        String line = null;
        try {
            // FileReader reads text files in the default encoding.
            FileReader fileReader =  new FileReader(filename);
            // Always wrap FileReader in BufferedReader.
            BufferedReader bufferedReader =  new BufferedReader(fileReader);
            int lineNumber = 0;
            int firstLineRead = 0;
            
            while((line = bufferedReader.readLine()) != null) {
                if(line.startsWith("#")==false){
                    //System.out.println(line);
                    String[] tokens = line.split(separator);
                    if(tokens.length>0){                        
                        DataVector  vector = new DataVector();
                        for(int i = 0; i < tokens.length; i++){
                            
                            try {
                                double value = Double.parseDouble(tokens[i]);
                                vector.add(value);
                            } catch (Exception e) {
                                
                            }                            
                        }
                        
                        if(dataVectors.size()>0){
                            if(vector.getSize()!=dataVectors.get(0).getSize()){
                                System.out.println("[TreeTextFile::read] ---> error on line # " + lineNumber);
                            } else {
                                dataVectors.add(vector);
                            }
                        } else {
                            dataVectors.add(vector);
                        }
                        
                        if(firstLineRead==0&&this.getListOfBranches().size()==0){
                            int size = vector.getSize();
                            String[] names = this.generateBranchNames(size);
                            this.initBranches(names);
                            firstLineRead++;
                        }
                    }
                }else{
                	line = line.replace("#!","");
                    String[] labels = line.split(":");
                    initBranches(labels);   
                }
                lineNumber++;
            }   
            // Always close files.
            bufferedReader.close();
            this.currentData = 0;
        }
        catch(FileNotFoundException ex) {
            //ClasUtilsFile.printLog("Unable to open file : '" + filename + "'");             
        }
        catch(IOException ex) {
            // Or we could just do this: 
            // ex.printStackTrace();
        }
    }
    
    
    private String[] generateBranchNames(int count){
        byte currentH = 'a';
        byte currentL = 'a';
        int  clow = 0;
        String[] branchNames = new String[count];
        for(int i = 0; i < count; i++){
            branchNames[i] = new String(new byte[]{currentH,currentL});
            currentL++;
            clow++;
            if(clow>=26){
                clow = 0;
                currentL = 'a';
                currentH++;
            }
        }
        return branchNames;
    }
    
    public void initBranches(String[] names){        
       this.getBranches().clear();
       for(String n : names){
           addBranch(n,"","");
           //System.out.println("---> adding branch : " + n);
       }
       System.out.println("[TreeTextFile::init] ---> initializing branches. count = " + this.getBranches().size());
    }
    
    public double[] getRow(){
        double[] data = new double[getBranches().size()];
        
        return data;
    }
    
    @Override
    public void reset(){
        this.currentData = 0;
    }
    
    @Override
    public boolean readNext() {
        if(this.currentData>=this.dataVectors.size()) return false;
        this.readEntry(currentData);
        currentData++;
        return true;
    }
    
    public void openFile(){
        
    }
    
    @Override
    public int getEntries(){
        return this.dataVectors.size();
    }
    
    @Override
    public int readEntry(int entry){
        DataVector vec = this.dataVectors.get(entry);
        int icounter = 0;
        for(Map.Entry branches : getBranches().entrySet()){
            String key = branches.getKey();
            branches.getValue().setValue(vec.getValue(icounter));
            icounter++;
        }
        return 1;
    }
       

    @Override
    public TreeModel getTreeModel() {
        return new DefaultTreeModel(getRootNode());
    }

    @Override
    public List  actionTreeNode(TreePath[] path, int limit) {
        
        String expression = "";
        List vectors = new ArrayList();
        
        if(path.length==1){
            expression = path[0].getLastPathComponent().toString();
            DataVector vec = getDataVector(expression, "", limit);
            vectors.add(vec);
            return vectors;
        } 
        
        if(path.length>1){
            String xTitle = path[0].getLastPathComponent().toString();
            String yTitle = path[1].getLastPathComponent().toString();            
            expression = xTitle +":"+yTitle;
            scanTree(expression, "", limit,false);
            List vecs = this.getScanResults();
            return vecs;
            /*
            H2F h2d = H2F.create(expression, 100,100,vecs.get(0),vecs.get(1));
            h2d.setTitle(expression);
            h2d.setTitleX(xTitle);
            h2d.setTitleY(yTitle);            
            canvas.drawNext(h2d);
            canvas.update();*/
        }
        return vectors;
        // this.drawCanvas.drawNext(h1d);
        // this.drawCanvas.getPad(0).addPlotter(new HistogramPlotter(h1d));
        //canvas.update();
    }

    @Override
    public void setSource(String filename) {
        this.readFile(filename);
        //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public JDialog treeConfigure() {
        return null;
    }
    
    @Override
    public Tree tree() {
        return this;
    }
    
    public static void main(String[] args){
        TreeTextFile tree = new TreeTextFile("T");
        tree.readFile("/Users/gavalian/Desktop/pp_10k.txt");
        System.out.println( " entries = " + tree.getEntries());
        for(int i = 0; i < 10; i++){
            tree.readEntry(i);
            tree.print();
        }
        
        DataVector vec = tree.getDataVector("vec3m(ac,ad,ae)", "ac>0.5&&ad>0.5", 10);
        System.out.println(" datavector size =  " + vec.getSize());
        for(int i = 0; i < vec.getSize(); i++){
            System.out.println(" element " + i + " =  " + vec.getValue(i));
        }
    }

 
    
}

 

Ads help maintain this website.