// Copyright 2000, CERN, Geneva, Switzerland
package hep.physics.yappi;
import java.io.*;
import java.util.*;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import hep.physics.yappi.*;
public class XMLYappiReader extends DefaultHandler
{
boolean debug = false;
private static boolean setValidation = false; //defaults
private static boolean setNameSpaces = true;
private static boolean setSchemaSupport = true;
private XMLReader xmlReader = null;
private Yappi yappi = null;
private Family family = null;
private ParticleType particle = null;
private DecayGroup group = null;
public XMLYappiReader(Yappi yappi)
{
this.yappi = yappi;
try {
// Create SAX2 parser ...
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(true);
xmlReader = factory.newSAXParser().getXMLReader();
// Set the ContentHandler ...
xmlReader.setContentHandler(this);
xmlReader.setFeature( "http://xml.org/sax/features/validation", setValidation);
} catch (Exception e) {}
try {
xmlReader.setFeature( "http://xml.org/sax/features/namespaces", setNameSpaces );
} catch (Exception e) {}
try {
xmlReader.setFeature( "http://apache.org/xml/features/validation/schema", setSchemaSupport );
} catch (Exception e) {}
}
/**
* XMLReader
*
* Read another XML file
*/
public void read(String filename) throws SAXException, FileNotFoundException, IOException {
read(new FileReader(filename));
}
public void read(Reader reader) throws SAXException, FileNotFoundException, IOException {
family = null;
particle = null;
group = null;
// Parse the file ...
xmlReader.parse(new InputSource(reader));
}
public void startDocument() throws SAXException
{
// START DOCUMENT
}
public void endDocument() throws SAXException
{
// END DOCUMENT
}
public void startElement(String namespaceURI, String tag, String qName, Attributes attr) throws SAXException
{
if (tag.equals("ParticleType")) {
String name = attr.getValue("name");
particle = yappi.getParticle(name);
if (particle == null) {
particle = new ParticleType(name);
}
if (attr.getValue("texName") != null) particle.texName = attr.getValue("texName");
if (attr.getValue("antiName") != null) particle.antiName = attr.getValue("antiName");
if (attr.getValue("antiTexName") != null) particle.antiTexName = attr.getValue("antiTexName");
try {
PDGID pdgid = new PDGID(Integer.parseInt(attr.getValue("PDGID")));
if (pdgid != null) particle.pdgid = pdgid;
} catch (NumberFormatException nfe) {}
yappi.addParticle(particle);
if (family != null) {
family.addParticle(particle);
}
} else if (tag.equals("Data")) {
String name = attr.getValue("name");
Data data = particle.getData(name);
if (data == null) {
data = new Data(name);
particle.addData(data);
}
if (attr.getValue("texName") != null) data.texName = attr.getValue("texName");
if (attr.getValue("value") != null) data.value = attr.getValue("value");
if (attr.getValue("unit") != null) data.unit = attr.getValue("unit");
if (attr.getValue("posError") != null) data.posError = attr.getValue("posError");
if (attr.getValue("negError") != null) data.negError = attr.getValue("negError");
if (attr.getValue("confidenceLevel") != null) data.confidenceLevel = Double.parseDouble(attr.getValue("confidenceLevel"));
if (attr.getValue("scaleFactor") != null) data.scaleFactor = Double.parseDouble(attr.getValue("scaleFactor"));
} else if (tag.equals("PPML")) {
// ignored
/*
} else if (tag.equals("AdditionalData")) {
additionalData = new AdditionalData();
println("AdditionalData="+Name);
for (int i=0;i<attr.getLength();i++)
{
if (attr.getLocalName(i).equals("name")) additionalData.setName(attr.getValue(i));
if (attr.getLocalName(i).equals("value")) additionalData.setName(attr.getValue(i));
}
if (!isNewParticle)
{
println(" Looking for existing additional Data");
Iterator searchData = data.getAdditionalData();
if (searchData != null) {
while (searchData.hasNext())
{
AdditionalData searchAdd = (AdditionalData) searchData.next();
if (searchAdd.getName().equals(additionalData.getName()))
{
searchAdd.setValue(additionalData.getValue());
}
}
} else {
println(" No Additional Data field was found");
}
}
*/
} else if (tag.equals("Decay")) {
String name = attr.getValue("name");
String fraction = attr.getValue("fraction");
DecayChannel decay = particle.getDecayChannel(name);
if (decay == null) {
decay = new DecayChannel(name, fraction);
particle.addDecayChannel(decay);
} else {
// change fraction and reindex
decay.fraction = fraction;
particle.addDecayChannel(decay);
}
if (group != null) {
decay.group = group;
}
if (attr.getValue("texName") != null) decay.texName = attr.getValue("texName");
if (attr.getValue("posError") != null) decay.posError = attr.getValue("posError");
if (attr.getValue("negError") != null) decay.negError = attr.getValue("negError");
if (attr.getValue("confidenceLevel") != null) decay.confidenceLevel = Double.parseDouble(attr.getValue("confidenceLevel"));
if (attr.getValue("scaleFactor") != null) decay.scaleFactor = Double.parseDouble(attr.getValue("scaleFactor"));
if (attr.getValue("P") != null) decay.P = attr.getValue("P");
if (attr.getValue("PUnit") != null) decay.PUnit = attr.getValue("PUnit");
} else if (tag.equals("DecayGroup")) {
String groupName = attr.getValue("name");
group = particle.getDecayGroup(groupName);
if (group == null) {
group = new DecayGroup(groupName);
particle.addDecayGroup(group);
}
} else if (tag.equals("ParticleRef")) {
// FIXME: ignored for now
} else if (tag.equals("Source")) {
} else if (tag.equals("Author")) {
} else if (tag.equals("Name")) {
} else if (tag.equals("Link")) {
} else if (tag.equals("Date")) {
} else if (tag.equals("Type")) {
} else if (tag.equals("Reliability")) {
} else if (tag.equals("Family")) {
String name = attr.getValue("name");
family = yappi.getFamily(name);
if (family == null) {
family = new Family(name);
yappi.addFamily(family);
}
if (attr.getValue("texName") != null) family.texName = attr.getValue("texName");
} else {
System.err.println("Unknown tag: "+tag);
}
}
public void endElement(String namespaceURI, String tag, String qName) throws SAXException
{
// END ELEMENT
if (tag.equals("ParticleType")) {
particle = null;
} else if (tag.equals("Data")) {
// ignored
} else if (tag.equals("PPML")) {
// ignored
} else if (tag.equals("AdditionalData")) {
// ignored
} else if (tag.equals("DecayGroup")) {
group = null;
} else if (tag.equals("Decay")) {
} else if (tag.equals("ParticleRef")) {
} else if (tag.equals("Source")) {
} else if (tag.equals("Author")) {
} else if (tag.equals("Name")) {
} else if (tag.equals("Link")) {
} else if (tag.equals("Date")) {
} else if (tag.equals("Type")) {
} else if (tag.equals("Reliability")) {
} else if (tag.equals("Family")) {
family = null;
} else {
System.err.println("Unknown end tag: "+tag);
}
}
public void characters (char[] ch, int start, int length) throws SAXException
{
// ignored
}
private void println(String text)
{
if (debug) System.out.println(text);
}
private void print(String text)
{
if (debug) System.out.print(text);
}
}