import hep.io.stdhep.StdhepWriter;
import hep.io.stdhep.StdhepEvent;
import hep.io.stdhep.StdhepBeginRun;
import hep.io.stdhep.StdhepRecord;
import hep.io.stdhep.StdhepEndRun;

public class EvtGen {
    public native void initialize();
	public native void nextEvent(int[] nev,int[] isthep, int[] idhep,
					   int[] jmohep, int[] jdahep,
					   double[] phep, double[] vhep);
	public native void finalize();

 //  static {
 //       System.loadLibrary("evtgen");
 //   }

	public void nextEvent()
	{
	nextEvent(_nhep, _isthep, _idhep, _jmohep, _jdahep, _phep, _vhep);
	++_eventnum;
	}

	public EvtGen()
	{
	initialize();
	}

	public int eventNumber()
	{
	return _eventnum;
	}

	public void printIsthep()
	{
	for(int i=0; i<_nhep[0]; ++i)
	{ 
	  System.out.println("ISTHEP["+i+"]= "+_isthep[i]);
	}
	}

    public void printIdhep()
	{
	for(int i=0; i<_nhep[0]; ++i)
	{ 
	  System.out.println("IDHEP["+i+"]= "+_idhep[i]);
	}
	}

    public void printJmohep()
	{
	for(int i=0; i<_nhep[0]; ++i)
	{ 
	  System.out.println("JMOHEP["+i+"]= "+_jmohep[2*i]+" " +_jmohep[2*i+1]);
	}
	}

    public void printJdahep()
	{
	for(int i=0; i<_nhep[0]; ++i)
	{ 
	  System.out.println("JDAHEP["+i+"]= "+_jdahep[2*i]+" " +_jdahep[2*i+1]);
	}
	}

    public void printPhep()
	{
	for(int i=0; i<_nhep[0]; ++i)
	{ 
	  System.out.println("PHEP["+i+"]= "+_phep[5*i]+" " +_phep[5*i+1]+" " +_phep[5*i+2]+" " +_phep[5*i+3]+" " +_phep[5*i+4]);
	}
	}

    public void printVhep()
	{
	for(int i=0; i<_nhep[0]; ++i)
	{ 
	  System.out.println("VHEP["+i+"]= "+_vhep[4*i]+" " +_vhep[4*i+1]+" " +_vhep[4*i+2]+" " +_vhep[4*i+3]);
	}
	}

	public int numberOfParticles()
	{
	return _nhep[0];
	}

      public StdhepEvent genStdhepEvent()
{
return new StdhepEvent( _eventnum, _nhep[0], _isthep,  _idhep, _jmohep,  _jdahep, _phep,  _vhep);
}


    public static void main(String[] args) {
//
// Set some defaults...
//
		int nevmax = 1;   
        String libToLoad = "pythia"; 
//
// override the number of events to generate...
//
		if(args.length > 0) nevmax = Integer.valueOf(args[0]).intValue();
//
// override the native event generating library to load
//
		if(args.length > 1) libToLoad = args[1];
//
// open the output file to which we will be writing...
//
String outputFile = "events.stdhep";
StdhepWriter w = null;
	try{
		w = new StdhepWriter(outputFile,"EvtGen","Snowmass01 version",nevmax);
}
catch(java.io.IOException ex)
{
System.err.println("Error opening file: "+outputFile);
ex.printStackTrace();
System.exit(1);
}
//
        System.loadLibrary(libToLoad+"evtgen");
        EvtGen eg = new EvtGen();
try{
 //
// loop over the number of events requested...
//
// should fix this here. just a placeholder for now.
int nevtreq = 1;
 int nevtgen = 1;
 int nevtwrt = 1;
 float stdecom = 2.F;
 float stdxsec = 2.F;
 double stdseed1 = 137.;
 double stdseed2 = 138.;
// write a begin run record


		w.writeRecord( new StdhepBeginRun(nevtreq, nevtgen, nevtwrt, stdecom, stdxsec, stdseed1, stdseed2) );


		for(int i = 0; i<nevmax; ++i)
		{
		  eg.nextEvent();
//		  System.out.println("Event: "+eg.eventNumber()+" has "+eg.numberOfParticles()+" particles");
//		  eg.printIsthep();
//		  eg.printIdhep();
//		  eg.printJmohep();
//            eg.printJdahep();
//		  eg.printPhep();
//		  eg.printVhep();

//
// Create an StdhepEvent
//
StdhepEvent evt = eg.genStdhepEvent();
//
// write it out...
//
//				System.out.println("record="+evt);

				w.writeRecord(evt);

		}
// finish up...
		eg.finalize();
// write an end run record


		w.writeRecord( new StdhepEndRun(nevtreq, nevtgen, nevtwrt, stdecom, stdxsec, stdseed1, stdseed2) );

}
catch(java.io.IOException ex)
{
System.err.println("Error writing to file: "+outputFile);
ex.printStackTrace();
System.exit(1);
}
		finally
		{
			try{
			w.close();
			}
			catch(java.io.IOException ex)
{
System.err.println("Error closing file: "+outputFile);
ex.printStackTrace();
System.exit(1);
}

		}

}
// The HEPEVT common block information...
private int _nmax = 4000;
private int _eventnum = 0;
private int[] _nhep = new int[1]; 
private int[] _isthep = new int[_nmax];
private int[] _idhep = new int[_nmax];
int[] _jmohep = new int[2*_nmax];
int[] _jdahep = new int[2*_nmax];
double[] _phep = new double[5*_nmax];
double[] _vhep = new double[4*_nmax];

}
