001/*
002 * Copyright (c) 2002-2010 The Regents of the University of California.
003 * All rights reserved.
004 *
005 * '$Author: welker $'
006 * '$Date: 2010-05-06 05:21:26 +0000 (Thu, 06 May 2010) $' 
007 * '$Revision: 24234 $'
008 * 
009 * Permission is hereby granted, without written agreement and without
010 * license or royalty fees, to use, copy, modify, and distribute this
011 * software and its documentation for any purpose, provided that the above
012 * copyright notice and the following two paragraphs appear in all copies
013 * of this software.
014 *
015 * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY
016 * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
017 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
018 * THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF
019 * SUCH DAMAGE.
020 *
021 * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
022 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
023 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE
024 * PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF
025 * CALIFORNIA HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
026 * ENHANCEMENTS, OR MODIFICATIONS.
027 *
028 */
029
030package org.geon;
031
032import java.awt.Point;
033import java.util.Map;
034import java.util.Set;
035import java.util.TreeMap;
036import java.util.TreeSet;
037
038//////////////////////////////////////////////////////////////////////////
039////RockSample
040/**
041 * @author Efrat Jaeger
042 * @version $Id: RockSample.java 24234 2010-05-06 05:21:26Z welker $
043 * @since Ptolemy II 3.0.2
044 */
045public class RockSample {
046
047        private static Set minerals = new TreeSet();
048
049        static {
050
051                minerals.add("quartz");
052                minerals.add("k-feldspar");
053                minerals.add("microcline");
054                minerals.add("plagioclase");
055                minerals.add("biotite");
056                minerals.add("muscovite");
057                minerals.add("amphibole");
058                minerals.add("olivine");
059                minerals.add("epidote");
060                minerals.add("allanite");
061                minerals.add("garnet");
062                minerals.add("clinopyroxene");
063                minerals.add("orthopyroxene");
064                minerals.add("ilmenite");
065                minerals.add("magnetite");
066                minerals.add("opaques");
067                minerals.add("zircon");
068                minerals.add("apatite");
069                minerals.add("carbonate");
070                minerals.add("hornblende");
071                minerals.add("magnesio-hornblende");
072                minerals.add("paragasitic-hornblende");
073        }
074
075        private String id;
076        private Map data = new TreeMap();
077
078        // add a mineral into this record
079        public void add(String att, String val) {
080                att = att.toLowerCase().replaceAll("_", "-");
081                if (att.equals("ssid")) {
082                        id = val;
083                        data.put(att, val);
084                } else if (minerals.contains(att)) {
085                        if (val.equals("") || val.equals("tr")) {
086                                data.put(att, new Float(0));
087                        } else {
088                                data.put(att, new Float(Float.parseFloat(val)));
089                        }
090                }
091        }
092
093        public float get(String att) {
094                att = att.toLowerCase().replaceAll("_", "-");
095                if (att.equals("ssid")) {
096                        return Float.parseFloat(id);
097                } else if (!minerals.contains(att)) {
098                        return 0;
099                } else {
100                        return ((Float) data.get(att)).floatValue();
101                }
102        }
103
104        private float getQ() {
105                return ((Float) data.get("quartz")).floatValue();
106        }
107
108        private float getA() {
109                return ((Float) data.get("k-feldspar")).floatValue()
110                                + ((Float) data.get("microcline")).floatValue();
111        }
112
113        private float getP() {
114
115                return ((Float) data.get("plagioclase")).floatValue();
116        }
117
118        private float getM() {
119                return ((Float) data.get("biotite")).floatValue()
120                                + ((Float) data.get("muscovite")).floatValue()
121                                + ((Float) data.get("amphibole")).floatValue()
122                                + ((Float) data.get("olivine")).floatValue()
123                                + ((Float) data.get("epidote")).floatValue()
124                                + ((Float) data.get("allanite")).floatValue()
125                                + ((Float) data.get("garnet")).floatValue()
126                                + ((Float) data.get("clinopyroxene")).floatValue()
127                                + ((Float) data.get("orthopyroxene")).floatValue()
128                                + ((Float) data.get("ilmenite")).floatValue()
129                                + ((Float) data.get("magnetite")).floatValue()
130                                + ((Float) data.get("opaques")).floatValue()
131                                + ((Float) data.get("zircon")).floatValue()
132                                + ((Float) data.get("apatite")).floatValue()
133                                + ((Float) data.get("carbonate")).floatValue();
134        }
135
136        public boolean isFelsic() {
137
138                float p = getP();
139                float a = getA();
140                float q = getQ();
141                float m = getM();
142
143                if (m / (p + a + q + m) < 0.9) {
144                        return true;
145                } else {
146                        return false;
147                }
148        }
149
150        public boolean isUltramafic() {
151                return !isFelsic();
152        }
153
154        public String getId() {
155                return id;
156        }
157
158        public Point getPointForGabbroOlivine(int leftPadding, int topPadding,
159                        int diagramWidth, int diagramHeight, int layer) {
160
161                float X = 0, Y = 0;
162
163                if (layer == 1) {
164                        float plagValue = getP();
165                        float quartzValue = getQ();
166                        float alakaliValue = getA();
167
168                        float sum = plagValue + quartzValue + alakaliValue;
169
170                        X = plagValue / sum;
171                        Y = quartzValue / sum;
172                        // alakaliValue = alakaliValue / sum;
173                } else if (layer == 2) {
174                        // System.out.println("HERE!!!");
175                        float plagValue = ((Float) data.get("plagioclase")).floatValue();
176                        float olValue = ((Float) data.get("olivine")).floatValue();
177                        float cpxValue = ((Float) data.get("clinopyroxene")).floatValue();
178                        float opxValue = ((Float) data.get("orthopyroxene")).floatValue();
179
180                        /*
181                         * System.out.println("diagramWidth: " + diagramWidth);
182                         * System.out.println("plagValue: " + plagValue);
183                         * System.out.println("olValue: " + olValue);
184                         * System.out.println("cpxValue: " + cpxValue);
185                         * System.out.println("opxValue: " + opxValue);
186                         */
187                        float pxValue = cpxValue + opxValue;
188                        float sum = plagValue + olValue + pxValue;
189
190                        // System.out.println("sum: " + sum);
191
192                        Y = plagValue / sum;
193                        X = olValue / sum;
194
195                        // System.out.println("X: " + X + "  ,  Y:" + Y);
196
197                        // pxValue = pxValue /sum;
198                }
199                // calculate x and y coordinates
200                int x1 = leftPadding + (int) (X * diagramWidth);
201                int y1 = topPadding + diagramHeight;
202
203                int y0 = topPadding + (int) ((1 - Y) * diagramHeight);
204                int x0 = x1 + (y1 - y0) / 2;
205
206                // System.out.println("x1 = " + x1 + " , y1 = " + y1 + " , x0 = " + x0 +
207                // " , y0 = " + y0);
208
209                return new Point(x0, y0);
210
211        }
212
213}