import ChaosDemos.*;
import java.awt.*;
import java.util.*;

//********************************************************************
/**                    
* Diagnostics for Map1D <br>
* Plots histogram of x values.<br>
* Region of x-axis can be enlarged using mouse drag.
* @version 10 October 1997
* @author Michael Cross
*/
//********************************************************************      

public class Map1DBin extends Map1DDiagnostics {

/** number of data points for power spectrum (must be power of 2!) and histogram */
      private int dataLength ;
/** 2*dataLength */
      private int dataLength2;
/** index point in accumulating Fourier data */      
      private int fourierIndex;
/** array for plotting histogram */
      private double[] plotData;  
/** array of accumulated numbers in bins */       
      private int[] binData;    
      private int binSkip=1;      
/** maximum bin content, for scaling histogram */      
      private int binMax=0;                              
      
//******************************************************************
/**
* @param inParent parent class
* @see Map1D
*/
//******************************************************************
      public Map1DBin(Map1D inParent) {
            super(inParent);
            parameters = new double[parent.nParameters];                                                                                         
      }
      
//********************************************************************
/**
* Updates parameters from the text controls in parent class 
*/ 
//********************************************************************
      public void updateParameters() {
            int i;           
                                
            x0=parent.variables.parseTextField(5,x0);
            x=x0;
            ntrans=parent.variables.parseTextField(3,ntrans);
            if(ntrans>0) runTrans=true;                                                

            nf=parent.variables.parseTextField(2,nf,true);
            parent.mapFunction.setCompose(nf);
            dataLength=parent.variables.parseTextField(4,10);
            dataLength2=2*dataLength;            
            
                             
      }      
                
//*********************************************************************
/**
* Restarts
*/
//*********************************************************************
      
      public void restart() {

            double data1[] = new double[6];
            int i,j;
            double xSave;
            double tSave;
            double f;
            int ip=0;

            iterations=0;
            
            // Eliminate transient
            if(runTrans) {
                for(i=0;i<ntrans;i++) 
                    x=parent.mapFunction.iterate(x);                   
                runTrans=false;
                iterations+=ntrans;        
            }
            xSave=x;                        
            
            // Reset graph
            ncurve=parent.resetGraph();
                        
            //Set up histogram
            binData = new int[dataLength2];
            plotData = new double[dataLength2];
            binMax=0;
            for(i=0,j=0;i<dataLength;i++) {
                  plotData[j]=xmin+(i+0.5)*(xmax-xmin)/dataLength;                        
                  j++;
                  binData[j]=0;
                  j++;
            }
            // Plot first histogram
            for(i=0;i<dataLength;i++) {     
                  x=parent.mapFunction.iterate(x);
                  int index=1+2*((int) ((dataLength)*(x-xmin)/(xmax-xmin)));
                  if(index>0 && index < dataLength2) {
                          binData[index]++;
                          if(binData[index] > binMax) binMax=binData[index];
                  }
            }  
            iterations+=dataLength;    
            data1[0]=xmin;
            data1[1]=0.;
            data1[2]=xmax;
            data1[3]=1.;
            ncurve = parent.graph.addCurve(data1,2,Color.black,0,7,1.);
            for(j=1;j<dataLength2;j+=2)
                  plotData[j]=((double)binData[j])/((double)binMax);
            ncurve = parent.graph.addCurve(plotData,dataLength,Color.blue);
            ncurve1=ncurve;
            parent.graph.paintAll=true;
            parent.graph.clearAll=true;
            parent.graph.repaint();

            if(parent.showTime) parent.status.setText("No. of Iterations "+ iterations);           
            
      }


//*********************************************************************
/**
* Iterates Map equations and updates graph 
*/
//*********************************************************************
      
      public boolean iterate() {
            int i,j;
            double[] moredata = new double[6];
            double[] moredata1 = new double[6];

            int index=0;                        
            for(i=0;i<binSkip;i++) {
                  x=parent.mapFunction.iterate(x);                           
                  index=1+2*((int) ((dataLength)*(x-xmin)/(xmax-xmin)));
                  if(index >=0 && index <dataLength2) {
                       binData[index]++;
                       if(binData[index] > binMax) binMax=binData[index];                                                                         
                  }
            }
            iterations+=binSkip;
            if(parent.showTime)
                  parent.status.setText("No. of Iterations "+ iterations);  
            parent.graph.clearAll=true;                            
            parent.graph.paintAll=false;
//            if(ncurve>=0) ncurve = graph.deleteAllCurves();
//            ncurve = graph.addCurve(moredata,2,Color.black,0,7,1);
            
            for(j=1;j<dataLength2;j+=2)
                    plotData[j]=((double)binData[j])/((double)binMax);                                                  
            parent.graph.deleteFromCurve(ncurve1);     
            parent.graph.appendToCurve(plotData,dataLength,ncurve1);  
                                   
            parent.graph.paintAll=true;
            parent.graph.repaint();            
            return true;
      }
      
//**********************************************************************
/**
* Sets default values of parameters depending on plot type
*/
//**********************************************************************          
      public void setPlotDefaults() {
                                      
            String[] label={"Transient"," Bins ","Start x",""};
            String[] text={"64","256","0.2",""};
            parent.setPlotTextBoxes(label,text); 
                     
            parent.choices.enable(0);              
      }                 

//**********************************************************************
/**
* Sets number of points plotted to histogram each update
*/
//**********************************************************************            
      public void setDelay(int inDelay)  {
            delay=inDelay;
            binSkip=1000/delay;
            if(binSkip==0) binSkip=1;
      }                 

//**********************************************************************
}      
