package org.jlab.groot.ui;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.border.TitledBorder;
import org.jlab.groot.tree.Tree;
import org.jlab.groot.tree.TreeAnalyzer;
import org.jlab.groot.data.DataVector;
import org.jlab.groot.data.H1F;
import org.jlab.groot.graphics.EmbeddedCanvas;
import org.jlab.groot.tree.DatasetDescriptor;
import org.jlab.groot.tree.TreeCut;
import org.jlab.groot.tree.TreeExpression;
public class DescriptorPanel extends JPanel {
int type = 1;
Tree tree;
TreeAnalyzer treeAnalyzer;
DatasetDescriptor descriptor = null;
ArrayList branches;
ArrayList cutStrings;
ArrayList cutBoxes = new ArrayList();
Map cutMap;
private int iconSizeX = 15;
private int iconSizeY = 15;
ImageIcon checkIcon = new ImageIcon();
ImageIcon xIcon = new ImageIcon();
boolean initialized = false;
boolean editMode = false;
// checkImage = checkImage.getScaledInstance(iconSizeX, iconSizeY,
// Image.SCALE_SMOOTH);
// xImage = xImage.getScaledInstance(iconSizeX, iconSizeY,
// Image.SCALE_SMOOTH);
JComboBox branchComboBoxX = new JComboBox();
JComboBox branchComboBoxY = new JComboBox();
JLabel validationPlaceHolderX = new JLabel();
JLabel validationPlaceHolderY = new JLabel();
JCheckBox previewCheckBox = new JCheckBox("Instant Preview");
JCheckBox estimateCheckBox = new JCheckBox("Estimate Range/Binning");
JTextField name = new JTextField();
JTextField descriptorName = new JTextField();
JTextField branchVariableFieldX = new JTextField();
JTextField branchVariableFieldXerr = new JTextField();
JTextField binTextFieldX = new JTextField();
JTextField minTextFieldX = new JTextField();
JTextField maxTextFieldX = new JTextField();
JTextField branchVariableFieldY = new JTextField();
JTextField branchVariableFieldYerr = new JTextField();
JTextField binTextFieldY = new JTextField();
JTextField minTextFieldY = new JTextField();
JTextField maxTextFieldY = new JTextField();
JPanel histogramOptions = new JPanel();
JPanel cutOptions = new JPanel();
JPanel leftPanel = new JPanel();
EmbeddedCanvas previewCanvas = new EmbeddedCanvas();
public DescriptorPanel(Tree tree, TreeAnalyzer treeAnalyzer, DatasetDescriptor descriptor) {
editMode=true;
this.type = descriptor.getDescriptorType();
this.tree = tree;
this.treeAnalyzer = treeAnalyzer;
if(this.type==DatasetDescriptor.DESCRIPTOR_H1){
previewCheckBox.setSelected(true);
}else{
previewCheckBox.setSelected(false);
}
this.estimateCheckBox.setSelected(false);
init();
if(this.type==DatasetDescriptor.DESCRIPTOR_H1){
this.branchVariableFieldX.setText(descriptor.getExpressionX());
this.binTextFieldX.setText(""+descriptor.getNbinsX());
this.minTextFieldX.setText(""+descriptor.getMinX());
this.maxTextFieldX.setText(""+descriptor.getMaxX());
this.descriptorName.setText(""+descriptor.getDescName());
this.validateExpression(0);
}else if(this.type==DatasetDescriptor.DESCRIPTOR_H2){
this.descriptorName.setText(""+descriptor.getDescName());
this.branchVariableFieldX.setText(descriptor.getExpressionX());
this.binTextFieldX.setText(""+descriptor.getNbinsX());
this.minTextFieldX.setText(""+descriptor.getMinX());
this.maxTextFieldX.setText(""+descriptor.getMaxX());
this.branchVariableFieldY.setText(descriptor.getExpressionY());
this.binTextFieldY.setText(""+descriptor.getNbinsY());
this.minTextFieldY.setText(""+descriptor.getMinY());
this.maxTextFieldY.setText(""+descriptor.getMaxY());
this.validateExpression(0);
this.validateExpression(1);
}
descriptorName.setEditable(false);
}
public DescriptorPanel(Tree tree, TreeAnalyzer treeAnalyzer, int type) {
this.type = type;
this.tree = tree;
this.treeAnalyzer = treeAnalyzer;
if(this.type==DatasetDescriptor.DESCRIPTOR_H1){
previewCheckBox.setSelected(true);
}else{
previewCheckBox.setSelected(false);
}
estimateCheckBox.setSelected(true);
init();
}
public DescriptorPanel(Tree tree, TreeAnalyzer treeAnalyzer) {
this.type = 1;
this.tree = tree;
this.treeAnalyzer = treeAnalyzer;
if(this.type==DatasetDescriptor.DESCRIPTOR_H1){
previewCheckBox.setSelected(true);
}else{
previewCheckBox.setSelected(false);
}
estimateCheckBox.setSelected(true);
init();
}
private void init() {
this.removeAll();
leftPanel.removeAll();
this.repaint();
if(!initialized) previewCheckBox.addActionListener(e -> {System.out.println("init!");init();});
leftPanel.setLayout(new GridBagLayout());
GridBagConstraints cMain = new GridBagConstraints();
cMain.gridy = 0;
cMain.weightx = 1.0;
cMain.weighty = 1.0;
cMain.fill = GridBagConstraints.BOTH;
try {
Image checkImage = ImageIO.read(Tree.class.getClassLoader().getResource("icons/general/checkmark.png"));
Image xImage = ImageIO.read(Tree.class.getClassLoader().getResource("icons/general/xmark.png"));
checkIcon = new ImageIcon(checkImage.getScaledInstance(iconSizeX, iconSizeY, Image.SCALE_SMOOTH));
xIcon = new ImageIcon(xImage.getScaledInstance(iconSizeX, iconSizeY, Image.SCALE_SMOOTH));
} catch (Exception e) {
}
if (this.descriptor == null) {
this.descriptor = new DatasetDescriptor("Dataset Name", this.type);
}
JLabel typeLabel = new JLabel("Dataset Type:");
String[] types = {"1D Histogram", "2D Histogram", "GraphErrors"};
JComboBox typeComboBox = new JComboBox(types);
if (this.type == DatasetDescriptor.DESCRIPTOR_H1) {
typeComboBox.setSelectedIndex(0);
} else if (this.type == DatasetDescriptor.DESCRIPTOR_H2) {
typeComboBox.setSelectedIndex(1);
} else {
typeComboBox.setSelectedIndex(2);
}
descriptorName = new JTextField(20);
descriptorName.setText(this.descriptor.getDescName());
JPanel headerPanel = new JPanel(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.gridy = 0;
c.weightx = 1.0;
c.weighty = 1.0;
c.fill = GridBagConstraints.BOTH;
headerPanel.add(typeLabel, c);
headerPanel.add(typeComboBox, c);
c.gridy++;
headerPanel.add(new JLabel("Dataset Name:"), c);
headerPanel.add(descriptorName, c);
headerPanel.setBorder(new TitledBorder("Main"));
this.setLayout(new GridBagLayout());
leftPanel.add(headerPanel, cMain);
if(!initialized)this.initHistogramOptions();
cMain.gridy++;
leftPanel.add(histogramOptions, cMain);
cutMap = tree.getSelector().getSelectorCuts();
cutStrings = new ArrayList();
Object[] keys = cutMap.keySet().toArray();
for (int i = 0; i < cutMap.keySet().size(); i++) {
cutStrings.add((String) keys[i]);
}
JPanel previewOptions = new JPanel(new GridBagLayout());
GridBagConstraints cPreview = new GridBagConstraints();
cPreview.fill = GridBagConstraints.BOTH;
cPreview.weightx = 1.0;
cPreview.weighty = 1.0;
previewOptions.setBorder(new TitledBorder("Options"));
// String[] previewOptionsList = {"Cut Preview", "Lines", "Blue/Red"};
// JComboBox previewOptionBox = new JComboBox(previewOptionsList);
previewOptions.add(previewCheckBox, cPreview);
previewOptions.add(estimateCheckBox, cPreview);
cMain.gridy++;
leftPanel.add(previewOptions, cMain);
if(!initialized)initCutOptions();
if (cutStrings != null && cutStrings.size() > 0) {
cMain.gridy++;
leftPanel.add(this.cutOptions, cMain);
}
JButton saveAndClose = new JButton("Apply");
GridBagConstraints c1 = new GridBagConstraints();
c1.gridy = 0;
c1.weightx = 1.0;
c1.weighty = 1.0;
c1.fill = GridBagConstraints.BOTH;
c1.gridx = 0;
this.add(leftPanel, c1);
if(this.previewCheckBox.isSelected()){
c1.gridx++;
this.add(previewCanvas, c1);
}
c1.gridx = 0;
c1.gridy++;
this.add(saveAndClose, c1);
saveAndClose.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// if(descriptor==null){
if (type == DatasetDescriptor.DESCRIPTOR_H1) {
String expressionx = branchVariableFieldX.getText();
int binsx = Integer.parseInt(binTextFieldX.getText());
Double minx = Double.parseDouble(minTextFieldX.getText());
Double maxx = Double.parseDouble(maxTextFieldX.getText());
//descriptor = new DatasetDescriptor(descriptorName.getText(), binsx, minx, maxx, expressionx, tree);
descriptor.setDescName(descriptorName.getText());
descriptor.setNbinsX(binsx);
descriptor.setMinX(minx);
descriptor.setMaxX(maxx);
descriptor.setExpression(expressionx,tree);
descriptor.initDatasets();
} else if (type == DatasetDescriptor.DESCRIPTOR_H2) {
String expressionx = branchVariableFieldX.getText();
int binsx = Integer.parseInt(binTextFieldX.getText());
Double minx = Double.parseDouble(minTextFieldX.getText());
Double maxx = Double.parseDouble(maxTextFieldX.getText());
String expressiony = branchVariableFieldY.getText();
int binsy = Integer.parseInt(binTextFieldY.getText());
Double miny = Double.parseDouble(minTextFieldY.getText());
Double maxy = Double.parseDouble(maxTextFieldY.getText());
descriptor = new DatasetDescriptor(descriptorName.getText(), binsx, minx, maxx, binsy, miny, maxy,
expressionx + ":" + expressiony, tree);
} else {
String x = branchVariableFieldX.getText();
String xerr = branchVariableFieldXerr.getText();
String y = branchVariableFieldY.getText();
String yerr = branchVariableFieldYerr.getText();
if ((xerr == "" || xerr == "0") && (yerr == "" || yerr == "0")) {
descriptor = new DatasetDescriptor(descriptorName.getText(), x + ":" + y, tree);
} else if ((xerr == "" || xerr == "0")) {
descriptor = new DatasetDescriptor(descriptorName.getText(), x + ":" + y + ":" + yerr, tree);
} else {
descriptor = new DatasetDescriptor(descriptorName.getText(),
x + ":" + y + ":" + xerr + ":" + yerr, tree);
}
}
descriptor.clearCuts();
for (int i = 0; i < cutBoxes.size(); i++) {
if (cutBoxes.get(i).isSelected()) {
descriptor.addCut(cutMap.get(cutStrings.get(i)));
//System.out.println("Adding Cut"+cutMap.get(cutStrings.get(i)).getName()+" "+cutMap.get(cutStrings.get(i)).getExpression());
}
}
if(!editMode){
treeAnalyzer.addDescriptor(descriptor);
}else{
treeAnalyzer.updateDescriptor(descriptor);
System.out.println("Update descriptor"+descriptor.getDescName());
}
System.out.println("Save and close descriptor!");
SwingUtilities.getWindowAncestor(branchVariableFieldX).dispose();
}
});
try{
JFrame topFrame = (JFrame) SwingUtilities.getWindowAncestor(this);
topFrame.pack();
}catch(Exception e){
}
initialized = true;
}
private void initCutOptions() {
if (cutStrings != null && cutStrings.size() > 0) {
cutOptions.setLayout(new GridBagLayout());
cutOptions.setBorder(new TitledBorder("Cuts"));
GridBagConstraints c = new GridBagConstraints();
int gridy = 0;
for (int i = 0; i < cutStrings.size(); i++) {
System.out.println("Cut " + i + " " + cutStrings.get(i));
cutBoxes.add(new JCheckBox(cutStrings.get(i)));
cutBoxes.get(i).addActionListener((e) -> {
this.validateExpression(0);
this.validateExpression(1);
});
c.gridy = i;
cutOptions.add(cutBoxes.get(i), c);
}
}
}
private void initHistogramOptions() {
branches = (ArrayList) tree.getListOfBranches();
/*
* for(int i=0; i {
branchVariableFieldX.setText(branchVariableFieldX.getText() + branchComboBoxX.getSelectedItem());
this.validateExpression(0);
});
branchComboBoxY = new JComboBox(tree.getListOfBranches().toArray());
branchComboBoxY.setMaximumSize(new Dimension(52, branchComboBoxY.getPreferredSize().height));
branchComboBoxY.setPreferredSize(new Dimension(52, branchComboBoxY.getPreferredSize().height));
branchComboBoxY.setMinimumSize(new Dimension(52, branchComboBoxY.getPreferredSize().height));
branchComboBoxY.addActionListener((e) -> {
branchVariableFieldY.setText(branchVariableFieldY.getText() + branchComboBoxY.getSelectedItem());
this.validateExpression(1);
});
KeyListener binningListener = new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
estimateCheckBox.setSelected(false);
validateExpression(0);
if (type == DatasetDescriptor.DESCRIPTOR_H2) {
validateExpression(1);
}
}
};
/*this.branchVariableFieldX.setText("");
this.branchVariableFieldY.setText("");
this.branchVariableFieldXerr.setText("");
this.branchVariableFieldYerr.setText("");*/
branchVariableFieldX.setColumns(10);
branchVariableFieldXerr.setColumns(10);
branchVariableFieldY.setColumns(10);
branchVariableFieldYerr.setColumns(10);
//binTextFieldX.setText("");
binTextFieldX.setColumns(5);
binTextFieldX.addKeyListener(binningListener);
//minTextFieldX.setText("");
minTextFieldX.setColumns(5);
minTextFieldX.addKeyListener(binningListener);
//maxTextFieldX.setText("");
maxTextFieldX.setColumns(5);
maxTextFieldX.addKeyListener(binningListener);
//binTextFieldY.setText("");
binTextFieldY.setColumns(5);
binTextFieldY.addKeyListener(binningListener);
//minTextFieldY.setText("");
minTextFieldY.setColumns(5);
minTextFieldY.addKeyListener(binningListener);
//maxTextFieldY.setText("");
maxTextFieldY.setColumns(5);
maxTextFieldY.addKeyListener(binningListener);
branchVariableFieldX.addActionListener((e) -> {
validateExpression(0);
});
branchVariableFieldY.addActionListener((e) -> {
validateExpression(1);
});
branchVariableFieldX.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
// System.out.println("key pressed:" + e.getKeyChar() + " " +
// branchVariableFieldX.getText());
validateExpression(0);
}
});
branchVariableFieldY.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
validateExpression(1);
}
});
/*
* if(descriptor!=null){ name.setText(descriptor.getName());
* name.setColumns(15);
* binTextFieldX.setText(""+descriptor.getNBinsX());
* binTextFieldX.setColumns(5);
* minTextFieldX.setText(""+descriptor.getMinX());
* minTextFieldX.setColumns(5);
* maxTextFieldX.setText(""+descriptor.getMaxX());
* maxTextFieldX.setColumns(5); if(nDim>1){
* binTextFieldY.setText(""+descriptor.getNBinsY());
* binTextFieldY.setColumns(5);
* minTextFieldY.setText(""+descriptor.getMinY());
* minTextFieldY.setColumns(5);
* maxTextFieldY.setText(""+descriptor.getMaxY());
* maxTextFieldY.setColumns(5); } }
*/
histogramOptions.setLayout(new GridBagLayout());
histogramOptions.setBorder(new TitledBorder("Histogram Options"));
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 1.0;
c.weighty = 1.0;
int gridy = 0;
c.gridy = gridy++;
if (type == DatasetDescriptor.DESCRIPTOR_H1) {
c.gridy = gridy++;
histogramOptions.add(new JLabel("Variable:"), c);
histogramOptions.add(branchVariableFieldX, c);
histogramOptions.add(branchComboBoxX, c);
histogramOptions.add(validationPlaceHolderX, c);
c.gridy = gridy++;
histogramOptions.add(new JLabel("#Bins:"), c);
c.gridwidth = 3;
histogramOptions.add(binTextFieldX, c);
c.gridwidth = 1;
c.gridy = gridy++;
histogramOptions.add(new JLabel("Min:"), c);
c.gridwidth = 3;
histogramOptions.add(minTextFieldX, c);
c.gridwidth = 1;
c.gridy = gridy++;
histogramOptions.add(new JLabel("Max:"), c);
c.gridwidth = 3;
histogramOptions.add(maxTextFieldX, c);
c.gridwidth = 1;
} else if (type == DatasetDescriptor.DESCRIPTOR_H2) {
c.gridwidth = 1;
c.gridy = gridy++;
histogramOptions.add(new JLabel("Variable:"), c);
histogramOptions.add(branchVariableFieldX, c);
histogramOptions.add(branchComboBoxX, c);
histogramOptions.add(validationPlaceHolderX, c);
histogramOptions.add(branchVariableFieldY, c);
histogramOptions.add(branchComboBoxY, c);
histogramOptions.add(validationPlaceHolderY, c);
c.gridy = gridy++;
histogramOptions.add(new JLabel("#Bins:"), c);
c.gridwidth = 3;
histogramOptions.add(binTextFieldX, c);
histogramOptions.add(binTextFieldY, c);
c.gridwidth = 1;
c.gridy = gridy++;
histogramOptions.add(new JLabel("Min:"), c);
c.gridwidth = 3;
histogramOptions.add(minTextFieldX, c);
histogramOptions.add(minTextFieldY, c);
c.gridwidth = 1;
c.gridy = gridy++;
histogramOptions.add(new JLabel("Max:"), c);
c.gridwidth = 3;
histogramOptions.add(maxTextFieldX, c);
histogramOptions.add(maxTextFieldY, c);
c.gridwidth = 3;
} else {
c.gridy = gridy++;
histogramOptions.add(new JLabel("Variable:"), c);
histogramOptions.add(branchVariableFieldX, c);
histogramOptions.add(branchComboBoxX, c);
histogramOptions.add(branchVariableFieldY, c);
histogramOptions.add(branchComboBoxY, c);
c.gridy = gridy++;
histogramOptions.add(new JLabel("Variable Error:"), c);
histogramOptions.add(branchVariableFieldXerr, c);
histogramOptions.add(branchVariableFieldYerr, c);
}
validateExpression(0);
validateExpression(1);
}
private void validateExpression(int i) {
String cuts = "";
boolean xPassed = false;
for (int j = 0; j < cutBoxes.size(); j++) {
if (cutBoxes.get(j).isSelected()) {
if (cuts == "") {
cuts += "("+cutMap.get(cutStrings.get(j)).getExpression()+")";
} else {
cuts += "*(" + cutMap.get(cutStrings.get(j)).getExpression()+")";
}
}
}
//System.out.println("cuts:[" + cuts + "]");
if (i == 0 || i==1) {
boolean passed = TreeExpression.validateExpression(this.branchVariableFieldX.getText(),
this.tree.getListOfBranches());
if (passed) {
try {
this.tree.scanTree(this.branchVariableFieldX.getText(), cuts, 1000, true);
//System.out.println("Preview: "+ this.branchVariableFieldX.getText()+" "+cuts+" "+1000+" " +true);
List vecs = this.tree.getScanResults();
if (this.estimateCheckBox.isSelected()) {
if (vecs.size() >= 1) {
this.minTextFieldX.setText(String.format("%4.2f", vecs.get(0).getMin()));
this.maxTextFieldX.setText(String.format("%4.2f", vecs.get(0).getMax()));
this.binTextFieldX.setText(String.format("%d", vecs.get(0).getBinSuggestion()));
}
}
} catch (Exception e) {
passed = false;
}
}
if (!passed) {
validationPlaceHolderX.setIcon(xIcon);
validationPlaceHolderX.repaint();
if (this.estimateCheckBox.isSelected()) {
this.minTextFieldX.setText("");
this.maxTextFieldX.setText("");
this.binTextFieldX.setText("");
}
//System.out.println("X Validation Failed");
} else {
validationPlaceHolderX.setIcon(checkIcon);
validationPlaceHolderX.repaint();
if (this.previewCheckBox.isSelected()) {
drawPreviewHistogram();
}
//System.out.println("X Validation Succeeded");
}
}
if (i == 1) {
boolean passed = TreeExpression.validateExpression(this.branchVariableFieldY.getText(),
this.tree.getListOfBranches());
if (passed) {
try {
this.tree.scanTree(this.branchVariableFieldY.getText(), cuts, 1000, true);
if (this.estimateCheckBox.isSelected()) {
List vecs = this.tree.getScanResults();
if (vecs.size() >= 1) {
this.minTextFieldY.setText(String.format("%4.2f", vecs.get(0).getMin()));
this.maxTextFieldY.setText(String.format("%4.2f", vecs.get(0).getMax()));
this.binTextFieldY.setText(String.format("%d", vecs.get(0).getBinSuggestion()));
}
}
} catch (Exception e) {
passed = false;
}
}
if (!passed) {
validationPlaceHolderY.setIcon(xIcon);
validationPlaceHolderY.repaint();
if (this.estimateCheckBox.isSelected()) {
this.minTextFieldY.setText("");
this.maxTextFieldY.setText("");
this.binTextFieldY.setText("");
}
//System.out.println("Y Validation Failed");
} else {
validationPlaceHolderY.setIcon(checkIcon);
validationPlaceHolderY.repaint();
//System.out.println("Y Validation Succeeded");
}
}
}
private void drawPreviewHistogram() {
List vecs = this.tree.getScanResults();
int bins = Integer.parseInt(binTextFieldX.getText());
double min = Double.parseDouble(minTextFieldX.getText());
double max = Double.parseDouble(maxTextFieldX.getText());
// System.out.println("Histogram "+bins+" "+min+ " "+max);
H1F htemp = new H1F("PreviewHistogram", bins, min, max);
// System.out.println("Datavector size"+vecs.get(0).getSize());
htemp.fill(vecs.get(0),vecs.get(1));
// TCanvas can = new TCanvas("Blah",500,800);
// can.draw(htemp);
// previewCanvas.divide(1, 1);
previewCanvas.draw(htemp);
previewCanvas.update();
}
}
Ads help maintain this website.