Home : Map : Chapter 7 : Java : Tech : Physics :
Generating Custom Random Distributions
JavaTech
Course Map
Chapter 7

Introduction
Event Overview
Event Processing
Button Events
  Demo 1
 Demo 2
Mouse Events
  Demo3

More Components
  Demo 4  Demo 5
  Demo 6  Demo 7

LayoutManagers-1
  Demo 8     Demo 9
  Demo 10  Demo 11
  Demo 12

LayoutManagers-2
  Demo 13  Demo 14
  Demo 15  Demo 16
  Demo 17

Inner Classes
Anonymous Class
Adapter Classes
  Demo 18  Demo 19
Frames & Menus
  Demo 20  Demo 21
Exercises

    Supplements
AWT Components
  Button
     Demo 1
  Canvas
     Demo 2
  AWT GUI Demo
     Demo 3
Swing Dialogs
JOptionPane Dialog
  Demo 1
JDialog
  Demo 2
UI Enhancement: P1
  Demo 1   Demo 2
  Demo 3

UI Enhancement: P2
  Demo 1
     About JavaTech
     Codes List
     Exercises
     Feedback
     References
     Resources
     Tips
     Topic Index
     Course Guide
     What's New
In Chapter 7: Tech : Generating Non-uniform Distributions we discussed the transformation and rejection methods for generating random distributions. The transformation method provides for those distributions that follow a behaved analytical function while the rejection method can provide for any type of distribution, even custom designed ones with discontinuities and gaps.

So where might one need to use such a custom probability distribution? One situation where they come in a handy is in in complex, multi-part experiment simulations.

For example, an experiment at a particle accelerator might need one part of the program to simulate the beam and its interactions with a target. A second part of the program would follow scattered particles from the interaction into the detector. The detector, in turn, is usually a complex of many types of detectors, each of which needs a unique simulation program.

If we want to study one of these sub-detector simulators in isolation, we usually don't want to run the full beam simulator and the tracking of the particles before they reach the sub-detector. This will slow down the processing considerably. Instead, we can eliminate those parts and just generate the particles entering the detector with, say, angles produced according to a custom distribution that matches well with that produced by the full simulation.

Figure Phy.7.1 Diagram of an experiment at a particle accelerato showing a cross section of the target and detector elements. The particle beam goes left to right and passes through a target where occasionally one of the beam particles collides with a particle such as a proton in the target. The detector system measures the tracks of particles in the debris of the collisison. Most of the beam goes right through the target and is typically too intense to place a detector directly in the beam. In that case, the detector will only cover part of the forward area and will miss some of the debris particles.

Suppose we want to study out detectors and we want to distribute the debris tracks in a distribution in angles similar to what would occur in the experiment. Below we show a

Figure Phy.7.2 A fictional plot of how the particles might be distributed in forward angle (with respect to the beamline) for a sample of the detector elements. The bars show the ranges of angles covered by each of the 6 detector elements.

From the plot we can see that the distribution for a detector element would rise towards the beamline. We can use the rejection method to create a sloped distribution of angles values. In the applet below we


RanDistAnglesApplet.java - This program creates a random distribution of angles as might be seen for tracks entering a detector element in a particle scattering experiment.

+ Previous classes:
Chapter 6:Tech: Histogram.java, HistPanel.java
Chapter 6:Tech: PlotPanel.java, PlotFormat.java

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

/**
  *  This program creates a random distribution of angles to
  *  artificially simulate the tracks in a particle scattering
  *  experiment entering a detector element.
  *
  *  The applet uses the HistPanel to display contents of
  *  an instance of Histogram.
  *
  *  Includes "Go" button to add random values from a Gaussian
  *  distribution to the histogram. The number of values taken from
  *  entry in a JTextField. "Clear"  button clears the histogram.
  *  In standalone mode, the Exit button closes the program.
  *  
  *  This program will run as an applet inside
  *  an application frame.
  *
 **/
public class RanDistAnglesApplet extends JApplet
             implements ActionListener
{
  // Use the HistPanel JPanel subclass here
  HistPanel fOutputPanel;

  Histogram fHistogram;
  int fNumDataPoints = 20000;

  // Set the angular range for scattered tracks
  double fMinAngle;
  double fMaxAngle;

  // Random number generator
  java.util.Random fRan;

  // A text field for input strings
  JTextField fTextField;

  // Flag for whether the applet is in a browser
  // or running via the main () below.
  boolean fInBrowser = true;

  //Buttons
  JButton fGoButton;
  JButton fClearButton;
  JButton fExitButton;

  /**
    * Create a User Interface with histograms and buttons to
    * control the program. A textfield holds number of entries
    * to be generated for the histogram.
   **/
  public void init () {

    JPanel panel = new JPanel (new BorderLayout ());

    // Create a histogram with Gaussian distribution.
    makeHist ();

    // JPanel subclass here.
    fOutputPanel = new HistPanel (fHistogram);

    panel.add (fOutputPanel,"Center");

    // Use a textfield for an input parameter.
    fTextField =
      new JTextField (Integer.toString (fNumDataPoints), 10);

    // If return hit after entering text, the
    // actionPerformed will be invoked.
    fTextField.addActionListener (this);

    fGoButton = new JButton ("Go");
    fGoButton.addActionListener (this);

    fClearButton = new JButton ("Clear");
    fClearButton.addActionListener (this);

    fExitButton = new JButton ("Exit");
    fExitButton.addActionListener (this);

    JPanel control_panel = new JPanel ();

    control_panel.add (fTextField);
    control_panel.add (fGoButton);
    control_panel.add (fClearButton);
    control_panel.add (fExitButton);

    if (fInBrowser) fExitButton.setEnabled (false);

    panel.add (control_panel,"South");

    // Add text area with scrolling to the contentPane.
    add (panel);

  } // init

  public void actionPerformed (ActionEvent e) {
    Object source = e.getSource ();
    if (source == fGoButton || source == fTextField) {
      String strNumDataPoints = fTextField.getText ();
      try {
        fNumDataPoints = Integer.parseInt (strNumDataPoints);
      }
      catch (NumberFormatException ex) {
        // Could open an error dialog here but just
        // display a message on the browser status line.
        showStatus ("Bad input value");
        return;
      }
      makeHist ();
      repaint ();
    }
    else if ( source == fClearButton  ) {
        fHistogram.clear ();
        repaint ();
    } else if (!fInBrowser)
        System.exit (0);
  } // actionPerformed

  /**
    * Create a random distribution of angles to
    * simulate the tracks in a particle scattering
    * experiment entering a detector element.
   **/
  void makeHist () {
    // Create an instance of the Random class for
    // producing our random values.
    fRan = new java.util.Random ();

    // Could modify the program to select these via the GUI
    fMinAngle = 25.0;
    fMaxAngle = 50.0;

    // Create an instance of our basic histogram class.
    // Make it wide enough enough to include most of the
    // gaussian values.
    if (fHistogram == null)
      fHistogram = new Histogram ("Scatter Angles into a Detector",
                                    "Degrees",
                                    25,fMinAngle,fMaxAngle);

    // Use the transformation method to generate a
    // radioactive decay distribution
    for (int i=0; i < fNumDataPoints; i++) {
      // Generate random vals 0.0 to 1.0
      double r1 = fRan.nextDouble ();
      double angle = fMinAngle +  (fMaxAngle-fMinAngle)*r1;
      if (acceptAngle (angle) ) {
            fHistogram.add (angle);
      }
    }
  } // makeHist

  /**
    * This rejection function uses a simple linear
    * function to determine the acceptance of the
    * angle.
   **/
  boolean acceptAngle (double angle){
    if (angle < fMinAngle || angle > fMaxAngle) return false;
    double c = 0.2;
    double slope = 0.032;

    double limit = c +  (angle - fMinAngle) * slope;
    double r2 = fRan.nextDouble ();
    if ( r2 <= limit) return true;
    return false;

  } // acceptAngle

  /** Can run applet as an application. **/
  public static void main (String[] args) {
    //
    int frame_width=450;
    int frame_height=300;

    // Create the applet and add it to a frame.
    RanDistAnglesApplet applet = new RanDistAnglesApplet ();
    applet.fInBrowser = false;
    applet.init ();

    // Following anonymous class used to close window & exit program
    JFrame f = new JFrame ("Demo");
    f.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

    // Add applet to the frame
    f.getContentPane ().add ( applet);
    f.setSize (new Dimension (frame_width,frame_height));
    f.setVisible (true);

  } // main

} // RanDistAnglesApplet


Why would you ever need to use non-uniform distributions? Perhaps such an angle distributions might be used to study the effects of radiation damage to sensitive areas of the detector that are closer to the beam line and therefore receive higher dosages.

References & Web Resources

Last Update: Oct. 22, 2005

           Tech
Histogram UI
  Demo 1
Probablity Distrib.
  Demo 2 Demo 3
RejectionMethod
Histogram Stats
  Demo 4
Exercises

           Physics
Sim & Randomness
Custom Prob. Dist.
   Demo 1
Histogram Dist.
   Demo 2
Monte Carlo
  Demo 3
Exercises

  Part I Part II Part III
Java Core 1  2  3  4  5  6  7  8  9  10  11  12 13 14 15 16 17
18 19 20
21
22 23 24
Supplements

1  2  3  4  5  6  7  8  9  10  11  12

Tech 1  2  3  4  5  6  7  8  9  10  11  12
Physics 1  2  3  4  5  6  7  8  9  10  11  12

Java is a trademark of Sun Microsystems, Inc.