diff --git a/NPLib/Detectors/MDM/CMakeLists.txt b/NPLib/Detectors/MDM/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..2a47544732ee9702637e2b00f2a64334222713cf
--- /dev/null
+++ b/NPLib/Detectors/MDM/CMakeLists.txt
@@ -0,0 +1,6 @@
+add_custom_command(OUTPUT TMDMPhysicsDict.cxx COMMAND ../../scripts/build_dict.sh TMDMPhysics.h TMDMPhysicsDict.cxx TMDMPhysics.rootmap libNPMDM.dylib DEPENDS TMDMPhysics.h)
+add_custom_command(OUTPUT TMDMDataDict.cxx COMMAND ../../scripts/build_dict.sh TMDMData.h TMDMDataDict.cxx TMDMData.rootmap libNPMDM.dylib DEPENDS TMDMData.h)
+add_library(NPMDM SHARED TMDMSpectra.cxx TMDMData.cxx TMDMPhysics.cxx TMDMDataDict.cxx TMDMPhysicsDict.cxx )
+target_link_libraries(NPMDM ${ROOT_LIBRARIES} NPCore) 
+install(FILES TMDMData.h TMDMPhysics.h TMDMSpectra.h DESTINATION ${CMAKE_INCLUDE_OUTPUT_DIRECTORY})
+
diff --git a/NPLib/Detectors/MDM/TMDMData.cxx b/NPLib/Detectors/MDM/TMDMData.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..6a5535c0ebcdbcbd2b4019c263d133b072b6f937
--- /dev/null
+++ b/NPLib/Detectors/MDM/TMDMData.cxx
@@ -0,0 +1,79 @@
+/*****************************************************************************
+ * Copyright (C) 2009-2017   this file is part of the NPTool Project       *
+ *                                                                           *
+ * For the licensing terms see $NPTOOL/Licence/NPTool_Licence                *
+ * For the list of contributors see $NPTOOL/Licence/Contributors             *
+ *****************************************************************************/
+
+/*****************************************************************************
+ * Original Author: Greg Christian  contact address: gchristian@tamu.edu                        *
+ *                                                                           *
+ * Creation Date  : October 2017                                           *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class hold MDM Raw data                                    *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *   
+ *                                                                           *
+ *****************************************************************************/
+#include "TMDMData.h"
+
+#include <iostream>
+#include <fstream>
+#include <sstream>
+#include <string>
+using namespace std; 
+
+ClassImp(TMDMData)
+
+
+//////////////////////////////////////////////////////////////////////
+TMDMData::TMDMData() {
+}
+
+
+
+//////////////////////////////////////////////////////////////////////
+TMDMData::~TMDMData() {
+}
+
+
+
+//////////////////////////////////////////////////////////////////////
+void TMDMData::Clear() {
+  // Energy
+  fMDM_X_DetectorNbr.clear();
+  fMDM_Xpos.clear();
+  // Time
+  fMDM_Y_DetectorNbr.clear();
+  fMDM_Ypos.clear();
+}
+
+
+
+//////////////////////////////////////////////////////////////////////
+void TMDMData::Dump() const {
+  // This method is very useful for debuging and worth the dev.
+  cout << "XXXXXXXXXXXXXXXXXXXXXXXX New Event [TMDMData::Dump()] XXXXXXXXXXXXXXXXX" << endl;
+
+  // X - position
+  size_t mysize = fMDM_X_DetectorNbr.size();
+  cout << "MDM_X_Mult: " << mysize << endl;
+ 
+  for (size_t i = 0 ; i < mysize ; i++){
+    cout << "DetNbr: " << fMDM_X_DetectorNbr[i]
+         << " X position: " << fMDM_Xpos[i];
+  }
+  
+  // Y - position
+  mysize = fMDM_Y_DetectorNbr.size();
+  cout << "MDM_Y_Mult: " << mysize << endl;
+ 
+  for (size_t i = 0 ; i < mysize ; i++){
+    cout << "DetNbr: " << fMDM_Y_DetectorNbr[i]
+         << " Y position: " << fMDM_Ypos[i];
+  }
+}
diff --git a/NPLib/Detectors/MDM/TMDMData.h b/NPLib/Detectors/MDM/TMDMData.h
new file mode 100644
index 0000000000000000000000000000000000000000..3facd11ce0894a9d915a6705cae7a9aea681f19e
--- /dev/null
+++ b/NPLib/Detectors/MDM/TMDMData.h
@@ -0,0 +1,103 @@
+#ifndef __MDMDATA__
+#define __MDMDATA__
+/*****************************************************************************
+ * Copyright (C) 2009-2017   this file is part of the NPTool Project       *
+ *                                                                           *
+ * For the licensing terms see $NPTOOL/Licence/NPTool_Licence                *
+ * For the list of contributors see $NPTOOL/Licence/Contributors             *
+ *****************************************************************************/
+
+/*****************************************************************************
+ * Original Author: Greg Christian  contact address: gchristian@tamu.edu                        *
+ *                                                                           *
+ * Creation Date  : October 2017                                           *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class hold MDM Raw data                                    *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *   
+ *                                                                           *
+ *****************************************************************************/
+
+// STL
+#include <vector>
+using namespace std;
+
+// ROOT
+#include "TObject.h"
+
+class TMDMData : public TObject {
+  //////////////////////////////////////////////////////////////
+  // data members are hold into vectors in order 
+  // to allow multiplicity treatment
+  private: 
+    // X - position
+    vector<UShort_t>   fMDM_X_DetectorNbr;
+    vector<Double_t>   fMDM_Xpos;
+
+    // Y - position
+    vector<UShort_t>   fMDM_Y_DetectorNbr;
+    vector<Double_t>   fMDM_Ypos;
+
+
+  //////////////////////////////////////////////////////////////
+  // Constructor and destructor
+  public: 
+    TMDMData();
+    ~TMDMData();
+    
+
+  //////////////////////////////////////////////////////////////
+  // Inherited from TObject and overriden to avoid warnings
+  public:
+    void Clear();
+    void Clear(const Option_t*) {};
+    void Dump() const;
+
+
+  //////////////////////////////////////////////////////////////
+  // Getters and Setters
+  // Prefer inline declaration to avoid unnecessary called of 
+  // frequently used methods
+  // add //! to avoid ROOT creating dictionnary for the methods
+  public:
+    //////////////////////    SETTERS    ////////////////////////
+    // X - position
+    inline void SetXpos(const UShort_t& DetNbr,const Double_t& x){
+      fMDM_X_DetectorNbr.push_back(DetNbr);
+      fMDM_Xpos.push_back(x);
+    };//!
+
+    // Y - position
+    inline void SetYpos(const UShort_t& DetNbr,const Double_t& y){
+      fMDM_Y_DetectorNbr.push_back(DetNbr);
+      fMDM_Ypos.push_back(y);
+    };//!
+
+
+    //////////////////////    GETTERS    ////////////////////////
+    // X - position
+    inline UShort_t GetMultX() const
+      {return fMDM_X_DetectorNbr.size();}
+    inline UShort_t GetX_DetectorNbr(const unsigned int &i) const 
+      {return fMDM_X_DetectorNbr[i];}//!
+    inline Double_t Get_Xpos(const unsigned int &i) const 
+      {return fMDM_Xpos[i];}//!
+
+		// Y - position
+    inline UShort_t GetMultY() const
+      {return fMDM_Y_DetectorNbr.size();}
+    inline UShort_t GetY_DetectorNbr(const unsigned int &i) const 
+      {return fMDM_Y_DetectorNbr[i];}//!
+    inline Double_t Get_Ypos(const unsigned int &i) const 
+      {return fMDM_Ypos[i];}//!
+
+  //////////////////////////////////////////////////////////////
+  // Required for ROOT dictionnary
+  ClassDef(TMDMData,1)  // MDMData structure
+};
+
+#endif
diff --git a/NPLib/Detectors/MDM/TMDMPhysics.cxx b/NPLib/Detectors/MDM/TMDMPhysics.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..7a7497757b04dff3badfa2e00554db0d99c07c56
--- /dev/null
+++ b/NPLib/Detectors/MDM/TMDMPhysics.cxx
@@ -0,0 +1,347 @@
+/*****************************************************************************
+ * Copyright (C) 2009-2017   this file is part of the NPTool Project       *
+ *                                                                           *
+ * For the licensing terms see $NPTOOL/Licence/NPTool_Licence                *
+ * For the list of contributors see $NPTOOL/Licence/Contributors             *
+ *****************************************************************************/
+
+/*****************************************************************************
+ * Original Author: Greg Christian  contact address: gchristian@tamu.edu                        *
+ *                                                                           *
+ * Creation Date  : October 2017                                           *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class hold MDM Treated  data                               *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *   
+ *                                                                           *
+ *****************************************************************************/
+
+#include "TMDMPhysics.h"
+
+//   STL
+#include <sstream>
+#include <iostream>
+#include <cmath>
+#include <stdlib.h>
+#include <limits>
+using namespace std;
+
+//   NPL
+#include "RootInput.h"
+#include "RootOutput.h"
+#include "NPDetectorFactory.h"
+#include "NPOptionManager.h"
+
+//   ROOT
+#include "TChain.h"
+
+ClassImp(TMDMPhysics)
+
+
+///////////////////////////////////////////////////////////////////////////
+TMDMPhysics::TMDMPhysics()
+   : m_EventData(new TMDMData),
+     m_PreTreatedData(new TMDMData),
+     m_EventPhysics(this),
+     m_Spectra(0),
+     m_X_Threshold(1000000), // junk value
+     m_Y_Threshold(1000000), // junk value
+     m_NumberOfDetectors(0) {
+}
+
+///////////////////////////////////////////////////////////////////////////
+/// A usefull method to bundle all operation to add a detector
+void TMDMPhysics::AddDetector(TVector3 , string ){
+  // In That simple case nothing is done
+  // Typically for more complex detector one would calculate the relevant 
+  // positions (stripped silicon) or angles (gamma array)
+  m_NumberOfDetectors++;
+} 
+
+///////////////////////////////////////////////////////////////////////////
+void TMDMPhysics::AddDetector(double R, double Theta, double Phi, string shape){
+  // Compute the TVector3 corresponding
+  TVector3 Pos(R*sin(Theta)*cos(Phi),R*sin(Theta)*sin(Phi),R*cos(Theta));
+  // Call the cartesian method
+  AddDetector(Pos,shape);
+} 
+  
+///////////////////////////////////////////////////////////////////////////
+void TMDMPhysics::BuildSimplePhysicalEvent() {
+  BuildPhysicalEvent();
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TMDMPhysics::BuildPhysicalEvent() {
+  // apply thresholds and calibration
+  PreTreat();
+
+  // match energy and time together
+  UInt_t mysizeX = m_PreTreatedData->GetMultX();
+  UInt_t mysizeY = m_PreTreatedData->GetMultY();
+  for (UShort_t ix = 0; ix < mysizeX ; ix++) {
+    for (UShort_t iy = 0; iy < mysizeY ; iy++) {
+      if (m_PreTreatedData->GetX_DetectorNbr(ix) == m_PreTreatedData->GetY_DetectorNbr(iy)) {
+        DetectorNumber.push_back(m_PreTreatedData->GetX_DetectorNbr(ix));
+        Xpos.push_back(m_PreTreatedData->Get_Xpos(ix));
+        Ypos.push_back(m_PreTreatedData->Get_Ypos(iy));
+      }
+    }
+  }
+}
+
+///////////////////////////////////////////////////////////////////////////
+void TMDMPhysics::PreTreat() {
+  // This method typically applies thresholds and calibrations
+  // Might test for disabled channels for more complex detector
+
+  // clear pre-treated object
+  ClearPreTreatedData();
+
+  // instantiate CalibrationManager
+  static CalibrationManager* Cal = CalibrationManager::getInstance();
+
+  // X - position
+  UInt_t mysize = m_EventData->GetMultX();
+  for (UShort_t i = 0; i < mysize ; ++i) {
+    if (m_EventData->Get_Xpos(i) < m_X_Threshold) {
+      Double_t Xpos = Cal->ApplyCalibration("MDM/XPOS"+NPL::itoa(m_EventData->GetX_DetectorNbr(i)),m_EventData->Get_Xpos(i));
+      if (true) {
+        m_PreTreatedData->SetXpos(m_EventData->GetX_DetectorNbr(i), Xpos);
+      }
+    }
+  }
+
+	// Y - position
+  mysize = m_EventData->GetMultY();
+  for (UShort_t i = 0; i < mysize ; ++i) {
+    if (m_EventData->Get_Ypos(i) < m_Y_Threshold) {
+      Double_t Ypos = Cal->ApplyCalibration("MDM/YPOS"+NPL::itoa(m_EventData->GetY_DetectorNbr(i)),m_EventData->Get_Ypos(i));
+      if (true) {
+        m_PreTreatedData->SetYpos(m_EventData->GetY_DetectorNbr(i), Ypos);
+      }
+    }
+  }
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+ void TMDMPhysics::ReadAnalysisConfig() {
+  bool ReadingStatus = false;
+
+  // path to file
+  string FileName = "./configs/ConfigMDM.dat";
+
+  // open analysis config file
+  ifstream AnalysisConfigFile;
+  AnalysisConfigFile.open(FileName.c_str());
+
+  if (!AnalysisConfigFile.is_open()) {
+    cout << " No ConfigMDM.dat found: Default parameter loaded for Analayis " << FileName << endl;
+    return;
+  }
+  cout << " Loading user parameter for Analysis from ConfigMDM.dat " << endl;
+
+  // Save it in a TAsciiFile
+  TAsciiFile* asciiConfig = RootOutput::getInstance()->GetAsciiFileAnalysisConfig();
+  asciiConfig->AppendLine("%%% ConfigMDM.dat %%%");
+  asciiConfig->Append(FileName.c_str());
+  asciiConfig->AppendLine("");
+  // read analysis config file
+  string LineBuffer,DataBuffer,whatToDo;
+  while (!AnalysisConfigFile.eof()) {
+    // Pick-up next line
+    getline(AnalysisConfigFile, LineBuffer);
+
+    // search for "header"
+    string name = "ConfigMDM";
+    if (LineBuffer.compare(0, name.length(), name) == 0) 
+      ReadingStatus = true;
+
+    // loop on tokens and data
+    while (ReadingStatus ) {
+      whatToDo="";
+      AnalysisConfigFile >> whatToDo;
+
+      // Search for comment symbol (%)
+      if (whatToDo.compare(0, 1, "%") == 0) {
+        AnalysisConfigFile.ignore(numeric_limits<streamsize>::max(), '\n' );
+      }
+
+      else if (whatToDo=="X_THRESHOLD") {
+        AnalysisConfigFile >> DataBuffer;
+        m_X_Threshold = atof(DataBuffer.c_str());
+        cout << whatToDo << " " << m_X_Threshold << endl;
+      }
+
+      else if (whatToDo=="Y_THRESHOLD") {
+        AnalysisConfigFile >> DataBuffer;
+        m_Y_Threshold = atof(DataBuffer.c_str());
+        cout << whatToDo << " " << m_Y_Threshold << endl;
+      }
+
+      else {
+        ReadingStatus = false;
+      }
+    }
+  }
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TMDMPhysics::Clear() {
+  DetectorNumber.clear();
+  Xpos.clear();
+  Ypos.clear();
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TMDMPhysics::ReadConfiguration(NPL::InputParser parser) {
+  vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("MDM");
+  if(NPOptionManager::getInstance()->GetVerboseLevel())
+    cout << "//// " << blocks.size() << " detectors found " << endl; 
+
+  vector<string> cart = {"POS","Shape"};
+  vector<string> sphe = {"R","Theta","Phi","Shape"};
+
+  for(UInt_t i = 0 ; i < blocks.size() ; i++){
+    if(blocks[i]->HasTokenList(cart)){
+      if(NPOptionManager::getInstance()->GetVerboseLevel())
+        cout << endl << "////  MDM " << i+1 <<  endl;
+    
+      TVector3 Pos = blocks[i]->GetTVector3("POS","mm");
+      string Shape = blocks[i]->GetString("Shape");
+      AddDetector(Pos,Shape);
+    }
+    else if(blocks[i]->HasTokenList(sphe)){
+      if(NPOptionManager::getInstance()->GetVerboseLevel())
+        cout << endl << "////  MDM " << i+1 <<  endl;
+      double R = blocks[i]->GetDouble("R","mm");
+      double Theta = blocks[i]->GetDouble("Theta","deg");
+      double Phi = blocks[i]->GetDouble("Phi","deg");
+      string Shape = blocks[i]->GetString("Shape");
+      AddDetector(R,Theta,Phi,Shape);
+    }
+    else{
+      cout << "ERROR: check your input file formatting " << endl;
+      exit(1);
+    }
+  }
+}
+
+///////////////////////////////////////////////////////////////////////////
+void TMDMPhysics::InitSpectra() {
+  m_Spectra = new TMDMSpectra(m_NumberOfDetectors);
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TMDMPhysics::FillSpectra() {
+  m_Spectra -> FillRawSpectra(m_EventData);
+  m_Spectra -> FillPreTreatedSpectra(m_PreTreatedData);
+  m_Spectra -> FillPhysicsSpectra(m_EventPhysics);
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TMDMPhysics::CheckSpectra() {
+  m_Spectra->CheckSpectra();
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TMDMPhysics::ClearSpectra() {
+  // To be done
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+map< string , TH1*> TMDMPhysics::GetSpectra() {
+  if(m_Spectra)
+    return m_Spectra->GetMapHisto();
+  else{
+    map< string , TH1*> empty;
+    return empty;
+  }
+}
+
+///////////////////////////////////////////////////////////////////////////
+void TMDMPhysics::WriteSpectra() {
+  m_Spectra->WriteSpectra();
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TMDMPhysics::AddParameterToCalibrationManager() {
+  CalibrationManager* Cal = CalibrationManager::getInstance();
+  for (int i = 0; i < m_NumberOfDetectors; ++i) {
+    Cal->AddParameter("MDM", "D"+ NPL::itoa(i+1)+"_ENERGY","MDM_D"+ NPL::itoa(i+1)+"_ENERGY");
+    Cal->AddParameter("MDM", "D"+ NPL::itoa(i+1)+"_TIME","MDM_D"+ NPL::itoa(i+1)+"_TIME");
+  }
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TMDMPhysics::InitializeRootInputRaw() {
+  TChain* inputChain = RootInput::getInstance()->GetChain();
+  inputChain->SetBranchStatus("MDM",  true );
+  inputChain->SetBranchAddress("MDM", &m_EventData );
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TMDMPhysics::InitializeRootInputPhysics() {
+  TChain* inputChain = RootInput::getInstance()->GetChain();
+  inputChain->SetBranchAddress("MDM", &m_EventPhysics);
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TMDMPhysics::InitializeRootOutput() {
+  TTree* outputTree = RootOutput::getInstance()->GetTree();
+  outputTree->Branch("MDM", "TMDMPhysics", &m_EventPhysics);
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+//            Construct Method to be pass to the DetectorFactory              //
+////////////////////////////////////////////////////////////////////////////////
+NPL::VDetector* TMDMPhysics::Construct() {
+  return (NPL::VDetector*) new TMDMPhysics();
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+//            Registering the construct method to the factory                 //
+////////////////////////////////////////////////////////////////////////////////
+extern "C"{
+class proxy_MDM{
+  public:
+    proxy_MDM(){
+      NPL::DetectorFactory::getInstance()->AddToken("MDM","MDM");
+      NPL::DetectorFactory::getInstance()->AddDetector("MDM",TMDMPhysics::Construct);
+    }
+};
+
+proxy_MDM p_MDM;
+}
+
diff --git a/NPLib/Detectors/MDM/TMDMPhysics.h b/NPLib/Detectors/MDM/TMDMPhysics.h
new file mode 100644
index 0000000000000000000000000000000000000000..a4eb6556d55b5b3ea25ff39b157e136cf724378d
--- /dev/null
+++ b/NPLib/Detectors/MDM/TMDMPhysics.h
@@ -0,0 +1,180 @@
+#ifndef TMDMPHYSICS_H
+#define TMDMPHYSICS_H
+/*****************************************************************************
+ * Copyright (C) 2009-2017   this file is part of the NPTool Project       *
+ *                                                                           *
+ * For the licensing terms see $NPTOOL/Licence/NPTool_Licence                *
+ * For the list of contributors see $NPTOOL/Licence/Contributors             *
+ *****************************************************************************/
+
+/*****************************************************************************
+ * Original Author: Greg Christian  contact address: gchristian@tamu.edu                        *
+ *                                                                           *
+ * Creation Date  : October 2017                                           *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class hold MDM Treated data                                *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *   
+ *                                                                           *
+ *****************************************************************************/
+
+// C++ headers 
+#include <vector>
+#include <map>
+#include <string>
+using namespace std;
+
+// ROOT headers
+#include "TObject.h"
+#include "TH1.h"
+#include "TVector3.h"
+// NPTool headers
+#include "TMDMData.h"
+#include "TMDMSpectra.h"
+#include "NPCalibrationManager.h"
+#include "NPVDetector.h"
+#include "NPInputParser.h"
+// forward declaration
+class TMDMSpectra;
+
+
+
+class TMDMPhysics : public TObject, public NPL::VDetector {
+  //////////////////////////////////////////////////////////////
+  // constructor and destructor
+  public:
+    TMDMPhysics();
+    ~TMDMPhysics() {};
+
+
+  //////////////////////////////////////////////////////////////
+  // Inherited from TObject and overriden to avoid warnings
+  public: 
+    void Clear();   
+    void Clear(const Option_t*) {};
+
+
+  //////////////////////////////////////////////////////////////
+  // data obtained after BuildPhysicalEvent() and stored in
+  // output ROOT file
+  public:
+    vector<int>      DetectorNumber;
+    vector<double>   Xpos;
+    vector<double>   Ypos;
+
+  /// A usefull method to bundle all operation to add a detector
+  void AddDetector(TVector3 POS, string shape); 
+  void AddDetector(double R, double Theta, double Phi, string shape); 
+  
+  //////////////////////////////////////////////////////////////
+  // methods inherited from the VDetector ABC class
+  public:
+    // read stream from ConfigFile to pick-up detector parameters
+    void ReadConfiguration(NPL::InputParser);
+
+    // add parameters to the CalibrationManger
+    void AddParameterToCalibrationManager();
+
+    // method called event by event, aiming at extracting the 
+    // physical information from detector
+    void BuildPhysicalEvent();
+
+    // same as BuildPhysicalEvent() method but with a simpler
+    // treatment
+    void BuildSimplePhysicalEvent();
+
+    // same as above but for online analysis
+    void BuildOnlinePhysicalEvent()  {BuildPhysicalEvent();};
+
+    // activate raw data object and branches from input TChain
+    // in this method mother branches (Detector) AND daughter leaves 
+    // (fDetector_parameter) have to be activated
+    void InitializeRootInputRaw();
+
+    // activate physics data object and branches from input TChain
+    // in this method mother branches (Detector) AND daughter leaves 
+    // (fDetector_parameter) have to be activated
+    void InitializeRootInputPhysics();
+
+    // create branches of output ROOT file
+    void InitializeRootOutput();
+
+    // clear the raw and physical data objects event by event
+    void ClearEventPhysics() {Clear();}      
+    void ClearEventData()    {m_EventData->Clear();}   
+
+    // methods related to the TMDMSpectra class
+    // instantiate the TMDMSpectra class and 
+    // declare list of histograms
+    void InitSpectra();
+
+    // fill the spectra
+    void FillSpectra();
+
+    // used for Online mainly, sanity check for histograms and 
+    // change their color if issues are found, for example
+    void CheckSpectra();
+
+    // used for Online only, clear all the spectra
+    void ClearSpectra();
+
+    // write spectra to ROOT output file
+    void WriteSpectra();
+
+
+  //////////////////////////////////////////////////////////////
+  // specific methods to MDM array
+  public:
+    // remove bad channels, calibrate the data and apply thresholds
+    void PreTreat();
+
+    // clear the pre-treated object
+    void ClearPreTreatedData()   {m_PreTreatedData->Clear();}
+
+    // read the user configuration file. If no file is found, load standard one
+    void ReadAnalysisConfig();
+
+    // give and external TMDMData object to TMDMPhysics. 
+    // needed for online analysis for example
+    void SetRawDataPointer(TMDMData* rawDataPointer) {m_EventData = rawDataPointer;}
+    
+  // objects are not written in the TTree
+  private:
+    TMDMData*         m_EventData;        //!
+    TMDMData*         m_PreTreatedData;   //!
+    TMDMPhysics*      m_EventPhysics;     //!
+
+  // getters for raw and pre-treated data object
+  public:
+    TMDMData* GetRawData()        const {return m_EventData;}
+    TMDMData* GetPreTreatedData() const {return m_PreTreatedData;}
+
+  // parameters used in the analysis
+  private:
+    // thresholds
+    double m_X_Threshold;     //!
+    double m_Y_Threshold;     //!
+
+  // number of detectors
+  private:
+    int m_NumberOfDetectors;  //!
+
+  // spectra class
+  private:
+    TMDMSpectra* m_Spectra; // !
+
+  // spectra getter
+  public:
+    map<string, TH1*>   GetSpectra(); 
+
+  // Static constructor to be passed to the Detector Factory
+  public:
+    static NPL::VDetector* Construct();
+
+    ClassDef(TMDMPhysics,1)  // MDMPhysics structure
+};
+#endif
diff --git a/NPLib/Detectors/MDM/TMDMSpectra.cxx b/NPLib/Detectors/MDM/TMDMSpectra.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..c7b9da01c8ca5ab4cfd448452b2b3f30b97e651c
--- /dev/null
+++ b/NPLib/Detectors/MDM/TMDMSpectra.cxx
@@ -0,0 +1,180 @@
+/*****************************************************************************
+ * Copyright (C) 2009-2017   this file is part of the NPTool Project       *
+ *                                                                           *
+ * For the licensing terms see $NPTOOL/Licence/NPTool_Licence                *
+ * For the list of contributors see $NPTOOL/Licence/Contributors             *
+ *****************************************************************************/
+
+/*****************************************************************************
+ * Original Author: Greg Christian  contact address: gchristian@tamu.edu                        *
+ *                                                                           *
+ * Creation Date  : October 2017                                           *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class hold MDM Spectra                                     *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *   
+ *                                                                           *
+ *****************************************************************************/
+
+// class header 
+#include "TMDMSpectra.h"
+
+// STL
+#include <iostream>  
+#include <string>
+using namespace std;
+
+// NPTool header
+#include "NPOptionManager.h"
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+TMDMSpectra::TMDMSpectra() 
+   : fNumberOfDetectors(0) {
+  SetName("MDM");
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+TMDMSpectra::TMDMSpectra(unsigned int NumberOfDetectors) {
+  if(NPOptionManager::getInstance()->GetVerboseLevel()>0)
+    cout << "************************************************" << endl
+      << "TMDMSpectra : Initalizing control spectra for " 
+      << NumberOfDetectors << " Detectors" << endl
+      << "************************************************" << endl ;
+  SetName("MDM");
+  fNumberOfDetectors = NumberOfDetectors;
+
+  InitRawSpectra();
+  InitPreTreatedSpectra();
+  InitPhysicsSpectra();
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+TMDMSpectra::~TMDMSpectra() {
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+void TMDMSpectra::InitRawSpectra() {
+  static string name;
+  for (unsigned int i = 0; i < fNumberOfDetectors; i++) { // loop on number of detectors
+    // Energy 
+    name = "MDM"+NPL::itoa(i+1)+"_ENERGY_RAW";
+    AddHisto1D(name, name, 4096, 0, 16384, "MDM/RAW");
+    // Time 
+    name = "MDM"+NPL::itoa(i+1)+"_TIME_RAW";
+    AddHisto1D(name, name, 4096, 0, 16384, "MDM/RAW");
+  } // end loop on number of detectors
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+void TMDMSpectra::InitPreTreatedSpectra() {
+  static string name;
+  for (unsigned int i = 0; i < fNumberOfDetectors; i++) { // loop on number of detectors
+    // Energy 
+    name = "MDM"+NPL::itoa(i+1)+"_ENERGY_CAL";
+    AddHisto1D(name, name, 500, 0, 25, "MDM/CAL");
+    // Time
+    name = "MDM"+NPL::itoa(i+1)+"_TIME_CAL";
+    AddHisto1D(name, name, 500, 0, 25, "MDM/CAL");
+
+  
+  }  // end loop on number of detectors
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+void TMDMSpectra::InitPhysicsSpectra() {
+  static string name;
+  // Kinematic Plot 
+  name = "MDM_ENERGY_TIME";
+  AddHisto2D(name, name, 500, 0, 500, 500, 0, 50, "MDM/PHY");
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+void TMDMSpectra::FillRawSpectra(TMDMData* RawData) {
+# if 0
+  static string name;
+  static string family;
+
+  // Energy 
+  unsigned int sizeE = RawData->GetMultEnergy();
+  for (unsigned int i = 0; i < sizeE; i++) {
+    name = "MDM"+NPL::itoa(RawData->GetE_DetectorNbr(i))+"_ENERGY_RAW";
+    family = "MDM/RAW";
+
+    FillSpectra(family,name,RawData->Get_Energy(i));
+  }
+
+  // Time
+  unsigned int sizeT = RawData->GetMultTime();
+  for (unsigned int i = 0; i < sizeT; i++) {
+    name = "MDM"+NPL::itoa(RawData->GetT_DetectorNbr(i))+"_TIME_RAW";
+    family = "MDM/RAW";
+
+    FillSpectra(family,name,RawData->Get_Time(i));
+  }
+#endif
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+void TMDMSpectra::FillPreTreatedSpectra(TMDMData* PreTreatedData) {
+#if 0
+  static string name;
+  static string family;
+  
+  // Energy 
+  unsigned int sizeE = PreTreatedData->GetMultEnergy();
+  for (unsigned int i = 0; i < sizeE; i++) {
+    name = "MDM"+NPL::itoa(PreTreatedData->GetE_DetectorNbr(i))+"_ENERGY_CAL";
+    family = "MDM/CAL";
+
+    FillSpectra(family,name,PreTreatedData->Get_Energy(i));
+  }
+
+  // Time
+  unsigned int sizeT = PreTreatedData->GetMultTime();
+  for (unsigned int i = 0; i < sizeT; i++) {
+    name = "MDM"+NPL::itoa(PreTreatedData->GetT_DetectorNbr(i))+"_TIME_CAL";
+    family = "MDM/CAL";
+
+    FillSpectra(family,name,PreTreatedData->Get_Time(i));
+  }
+#endif
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+void TMDMSpectra::FillPhysicsSpectra(TMDMPhysics* Physics) {
+#if 0
+  static string name;
+  static string family;
+  family= "MDM/PHY";
+
+  // Energy vs time
+  unsigned int sizeE = Physics->Energy.size();
+  for(unsigned int i = 0 ; i < sizeE ; i++){
+    name = "MDM_ENERGY_TIME";
+    FillSpectra(family,name,Physics->Energy[i],Physics->Time[i]);
+  }
+#endif
+}
+
diff --git a/NPLib/Detectors/MDM/TMDMSpectra.h b/NPLib/Detectors/MDM/TMDMSpectra.h
new file mode 100644
index 0000000000000000000000000000000000000000..d35be14ceca0c5b4863fb3a8a74b7563bb9f48f3
--- /dev/null
+++ b/NPLib/Detectors/MDM/TMDMSpectra.h
@@ -0,0 +1,62 @@
+#ifndef TMDMSPECTRA_H
+#define TMDMSPECTRA_H
+/*****************************************************************************
+ * Copyright (C) 2009-2017   this file is part of the NPTool Project       *
+ *                                                                           *
+ * For the licensing terms see $NPTOOL/Licence/NPTool_Licence                *
+ * For the list of contributors see $NPTOOL/Licence/Contributors             *
+ *****************************************************************************/
+
+/*****************************************************************************
+ * Original Author: Greg Christian  contact address: gchristian@tamu.edu                        *
+ *                                                                           *
+ * Creation Date  : October 2017                                           *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class hold MDM Spectra                                     *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *   
+ *                                                                           *
+ *****************************************************************************/
+
+// NPLib headers
+#include "NPVSpectra.h"
+#include "TMDMData.h"
+#include "TMDMPhysics.h"
+
+// Forward Declaration
+class TMDMPhysics;
+
+
+class TMDMSpectra : public VSpectra {
+  //////////////////////////////////////////////////////////////
+  // constructor and destructor
+  public:
+    TMDMSpectra();
+    TMDMSpectra(unsigned int NumberOfDetectors);
+    ~TMDMSpectra();
+
+  //////////////////////////////////////////////////////////////
+  // Initialization methods
+  private:
+    void InitRawSpectra();
+    void InitPreTreatedSpectra();
+    void InitPhysicsSpectra();
+
+  //////////////////////////////////////////////////////////////
+  // Filling methods
+  public:
+    void FillRawSpectra(TMDMData*);
+    void FillPreTreatedSpectra(TMDMData*);
+    void FillPhysicsSpectra(TMDMPhysics*);
+
+  //////////////////////////////////////////////////////////////
+  // Detector parameters 
+  private:
+    unsigned int fNumberOfDetectors;
+};
+
+#endif
diff --git a/NPSimulation/Detectors/MDM/CMakeLists.txt b/NPSimulation/Detectors/MDM/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..610bab41c3af66a53814f9a7dada28a96d49e72c
--- /dev/null
+++ b/NPSimulation/Detectors/MDM/CMakeLists.txt
@@ -0,0 +1,9 @@
+enable_language(Fortran)
+set (CMAKE_Fortran_FLAGS "-finit-local-zero -falign-commons -fno-automatic")
+add_library(NPSMDM SHARED  MDM.cc MDMTrace.cpp Rayin.cpp RAYTKIN1.F)
+#add_custom_command(TARGET NPSMDM PRE_BUILD COMMAND gfortran ARGS -c -finit-local-zero -falign-commons -fno-automatic RAYTKIN1.F)
+target_link_libraries(NPSMDM NPSCore ${ROOT_LIBRARIES} ${Geant4_LIBRARIES} ${NPLib_LIBRARIES} -lNPMDM)
+
+# # FORTRAN SETUP
+# set (CMAKE_Fortran_COMPILER "gfortran")
+# set (CMAKE_Fortran_FLAGS "-finit-local-zero -falign-commons -fno-automatic")
diff --git a/NPSimulation/Detectors/MDM/MDM.cc b/NPSimulation/Detectors/MDM/MDM.cc
new file mode 100644
index 0000000000000000000000000000000000000000..db5d7b4fdb41819a3c6142b4d813055a1a0a79fb
--- /dev/null
+++ b/NPSimulation/Detectors/MDM/MDM.cc
@@ -0,0 +1,271 @@
+/*****************************************************************************
+ * Copyright (C) 2009-2017   this file is part of the NPTool Project         *
+ *                                                                           *
+ * For the licensing terms see $NPTOOL/Licence/NPTool_Licence                *
+ * For the list of contributors see $NPTOOL/Licence/Contributors             *
+ *****************************************************************************/
+
+/*****************************************************************************
+ * Original Author: Greg Christian  contact address: gchristian@tamu.edu     *
+ *                                                                           *
+ * Creation Date  : October 2017                                             *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class describe  MDM simulation                                      *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *
+ *****************************************************************************/
+
+// C++ headers
+#include <sstream>
+#include <cmath>
+#include <limits>
+//G4 Geometry object
+#include "G4Tubs.hh"
+#include "G4Box.hh"
+
+//G4 sensitive
+#include "G4SDManager.hh"
+#include "G4MultiFunctionalDetector.hh"
+
+//G4 various object
+#include "G4Material.hh"
+#include "G4Transform3D.hh"
+#include "G4PVPlacement.hh"
+#include "G4VisAttributes.hh"
+#include "G4Colour.hh"
+
+// NPTool header
+#include "MDM.hh"
+#include "MDMScorer.hh"
+#include "RootOutput.h"
+#include "MaterialManager.hh"
+#include "NPSDetectorFactory.hh"
+#include "NPOptionManager.h"
+#include "NPSHitsMap.hh"
+
+// ROOT
+#include "TSystem.h"
+
+// CLHEP header
+#include "CLHEP/Random/RandGauss.h"
+
+#include "Rayin.h"
+#include "MDMTrace.h"
+
+using namespace std;
+using namespace CLHEP;
+
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+namespace MDM_NS{
+  // Energy and time Resolution
+  const double Width = 200*mm ;
+  const double Thickness = Width;
+  const string Material = "BC400";
+}
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+// MDM Specific Method
+MDM::MDM(){
+  m_Event = new TMDMData() ;
+  m_MDMScorer = 0;
+  m_SquareDetector = 0;
+  m_Angle = 0;
+  m_Field = 0;
+  m_Rayin = 0;
+}
+
+MDM::~MDM(){
+  if(m_Rayin) { delete m_Rayin; m_Rayin = 0; }
+}
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+void MDM::AddDetector(double angle, double field, const string& rayin){
+  m_Angle = angle;
+  m_Field = field;
+  m_Rayin_file = rayin;
+  
+  m_Rayin = new Rayin(m_Rayin_file, false);
+  m_Trace = MDMTrace::Instance();
+
+  m_Trace->SetMDMAngle(angle/mrad);  // mrad
+  m_Trace->SetMDMDipoleField(field/gauss); // gauss
+
+  cout << "MDM::AddDetector :: Angle [mrad], Angle [deg], Field [G], Rayin File :: " 
+       << angle/mrad << ", " << angle/deg << ", " << field/gauss << ", " << m_Rayin_file << "\n";
+}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+G4LogicalVolume* MDM::BuildSquareDetector(){
+  if(!m_SquareDetector){
+    G4Box* box = new G4Box("MDM_Box",MDM_NS::Width*0.5,
+			   MDM_NS::Width*0.5,MDM_NS::Thickness*0.5);
+
+    G4Material* DetectorMaterial = MaterialManager::getInstance()->GetMaterialFromLibrary(MDM_NS::Material);
+    m_SquareDetector = new G4LogicalVolume(box,DetectorMaterial,"logic_MDM_Box",0,0,0);
+    m_SquareDetector->SetVisAttributes(m_VisSquare);
+    m_SquareDetector->SetSensitiveDetector(m_MDMScorer);
+  }
+  return m_SquareDetector;
+}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+// Virtual Method of NPS::VDetector class
+
+// Read stream at Configfile to pick-up parameters of detector (Position,...)
+// Called in DetecorConstruction::ReadDetextorConfiguration Method
+void MDM::ReadConfiguration(NPL::InputParser parser){
+  vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("MDM");
+  if(NPOptionManager::getInstance()->GetVerboseLevel())
+    cout << "//// " << blocks.size() << " detectors found " << endl; 
+
+  vector<string> sphe = {"Angle","Field","Rayin"};
+
+  for(unsigned int i = 0 ; i < blocks.size() ; i++){
+    if(blocks[i]->HasTokenList(sphe)){
+      if(NPOptionManager::getInstance()->GetVerboseLevel())
+        cout << endl << "////  MDM " << i+1 <<  endl;
+      double Angle = blocks[i]->GetDouble("Angle","deg");
+      double Field = blocks[i]->GetDouble("Field","gauss");
+      string Rayin = blocks[i]->GetString("Rayin");
+      AddDetector(Angle, Field, Rayin);
+    }
+    else{
+      cout << "ERROR: check your input file formatting " << endl;
+      exit(1);
+    }
+  }
+}
+
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+
+// Construct detector and inialise sensitive part.
+// Called After DetecorConstruction::AddDetector Method
+void MDM::ConstructDetector(G4LogicalVolume* world){
+  G4double wX = 0;
+  G4double wY = 0;
+  G4double wZ = 1e-6*m;
+  G4ThreeVector Det_pos = G4ThreeVector(wX, wY, wZ) ;
+
+  new G4PVPlacement(0, Det_pos, BuildSquareDetector(), 
+		    "MDM0_Spectrometer", world, false, 0);
+}
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+// Add Detector branch to the EventTree.
+// Called After DetecorConstruction::AddDetector Method
+void MDM::InitializeRootOutput(){
+  RootOutput *pAnalysis = RootOutput::getInstance();
+  TTree *pTree = pAnalysis->GetTree();
+  if(!pTree->FindBranch("MDM")){
+    pTree->Branch("MDM", "TMDMData", &m_Event) ;
+  }
+  pTree->SetBranchAddress("MDM", &m_Event) ;
+}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+// Read sensitive part and fill the Root tree.
+// Called at in the EventAction::EndOfEventAvtion
+void MDM::ReadSensitive(const G4Event* event){
+  m_Event->Clear();
+
+  G4int ID = G4SDManager::GetSDMpointer()->GetCollectionID("MDMScorer/ScorerMDM");
+  NPS::HitsMap<MDMScorer::Infos>* Hits =
+    static_cast<NPS::HitsMap<MDMScorer::Infos>*> (event->GetHCofThisEvent()->GetHC(ID));
+
+  size_t indx = 0;
+  for(auto& Iter : *(Hits->GetMap())) {
+    // Read energy, position, momentum
+    double Ekin              = Iter.second->Edep;  // MeV
+    double Mass              = Iter.second->Mass;  // MeV/c^2
+    double Charge            = Iter.second->Charge;// e
+    const G4ThreeVector& Pos = Iter.second->Pos;   // mm
+    const G4ThreeVector& Mom = Iter.second->Mom;   // rad
+		
+    // Calculate dispersive & non-dispersive angles
+    double thetaX = atan(Mom.x() / Mom.z());
+    double thetaY = atan(Mom.y() / Mom.z());
+
+    std::cout << "Particle: " << indx << ", (x,y,z | theta ,phi, theta x, theta y | ekin) = [cm | deg | MeV]\n\t" <<
+      Pos.x()/cm << ", " << Pos.y()/cm << ", " << Pos.z()/cm << " | " <<
+      Mom.theta()/deg << ", " << Mom.phi()/deg << ", " <<
+      thetaX/deg << ", " << thetaY/deg << " | " <<
+      Ekin/MeV << "\n";
+    std::cout << "\tMass, Charge: " << Mass/amu_c2 << ", " << Charge << "\n";
+
+    // Send Through MDM
+    m_Trace->SetScatteredMass(Mass/amu_c2);
+    m_Trace->SetScatteredCharge(Charge);
+    m_Trace->SetScatteredAngle(thetaX/deg, thetaY/deg);
+    m_Trace->SetScatteredEnergy(Ekin/MeV);
+    m_Trace->SetBeamPosition(Pos.x()/cm, Pos.y()/cm, Pos.z()/cm);
+    m_Trace->SendRay();
+
+    // Read wire1 position, angle
+    double x[4],y[4],a,b;
+    m_Trace->GetOxfordWirePositions(a,x[0],x[1],x[2],x[3],b,y[0],y[1],y[2],y[3]);
+
+    // Set X, Y positions in TMDMData class
+    std::cout << "FINAL:: [" << indx << "] ";
+    for(int i=0; i< 4; ++i) {
+      std::cout << "x["<<i<<"]="<<x[i] << "\t" << "y["<<i<<"]="<<y[i] <<"\t";
+      m_Event->SetXpos(i, x[i]);
+      m_Event->SetYpos(i, y[i]);
+    }
+    std::cout << "a="<<a << "\t" << "b="<<b << "\n";
+  
+    ++indx;
+  }
+
+  Hits->clear() ;
+}
+
+  //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+  ////////////////////////////////////////////////////////////////   
+  void MDM::InitializeScorers() { 
+    // This check is necessary in case the geometry is reloaded
+    bool already_exist = false; 
+    m_MDMScorer = CheckScorer("MDMScorer",already_exist) ;
+
+    if(already_exist) { return ; }
+
+    G4VPrimitiveScorer* ScorerMDM =
+      new MDMScorer("ScorerMDM", "MDM", 0);
+
+    //and register it to the multifunctionnal detector
+    m_MDMScorer->RegisterPrimitive(ScorerMDM);
+
+    G4SDManager::GetSDMpointer()->AddNewDetector(m_MDMScorer) ;
+  }
+
+  //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+  //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+  //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+  ////////////////////////////////////////////////////////////////////////////////
+  //            Construct Method to be pass to the DetectorFactory              //
+  ////////////////////////////////////////////////////////////////////////////////
+  NPS::VDetector* MDM::Construct(){
+    return  (NPS::VDetector*) new MDM();
+  }
+
+  //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+  ////////////////////////////////////////////////////////////////////////////////
+  //            Registering the construct method to the factory                 //
+  ////////////////////////////////////////////////////////////////////////////////
+  extern"C" {
+    class proxy_nps_MDM{
+    public:
+      proxy_nps_MDM(){
+	NPS::DetectorFactory::getInstance()->AddToken("MDM","MDM");
+	NPS::DetectorFactory::getInstance()->AddDetector("MDM",MDM::Construct);
+      }
+    };
+
+    proxy_nps_MDM p_nps_MDM;
+  }
diff --git a/NPSimulation/Detectors/MDM/MDM.hh b/NPSimulation/Detectors/MDM/MDM.hh
new file mode 100644
index 0000000000000000000000000000000000000000..1ae2ad62e840fa57d14b9094a8a570a24a6fc379
--- /dev/null
+++ b/NPSimulation/Detectors/MDM/MDM.hh
@@ -0,0 +1,109 @@
+#ifndef MDM_h
+#define MDM_h 1
+/*****************************************************************************
+ * Copyright (C) 2009-2017   this file is part of the NPTool Project         *
+ *                                                                           *
+ * For the licensing terms see $NPTOOL/Licence/NPTool_Licence                *
+ * For the list of contributors see $NPTOOL/Licence/Contributors             *
+ *****************************************************************************/
+
+/*****************************************************************************
+ * Original Author: Greg Christian  contact address: gchristian@tamu.edu                        *
+ *                                                                           *
+ * Creation Date  : October 2017                                             *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class describe  MDM simulation                                      *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *
+ *****************************************************************************/
+
+// G4 headers
+#include "G4ThreeVector.hh"
+#include "G4RotationMatrix.hh"
+#include "G4LogicalVolume.hh"
+#include "G4MultiFunctionalDetector.hh"
+
+// NPTool header
+#include "NPSVDetector.hh"
+#include "TMDMData.h"
+#include "NPInputParser.h"
+
+class Rayin;
+class MDMTrace;
+
+class MDM : public NPS::VDetector{
+  ////////////////////////////////////////////////////
+  /////// Default Constructor and Destructor /////////
+  ////////////////////////////////////////////////////
+public:
+  MDM() ;
+  virtual ~MDM() ;
+
+  ////////////////////////////////////////////////////
+  /////// Specific Function of this Class ///////////
+  ////////////////////////////////////////////////////
+public:
+  void AddDetector(double angle /*deg*/, double field /*Gauss*/, const std::string& rayin);
+
+
+  G4LogicalVolume* BuildSquareDetector();
+  
+private:
+  G4LogicalVolume* m_SquareDetector;
+    
+  ////////////////////////////////////////////////////
+  //////  Inherite from NPS::VDetector class /////////
+  ////////////////////////////////////////////////////
+public:
+  // Read stream at Configfile to pick-up parameters of detector (Position,...)
+  // Called in DetecorConstruction::ReadDetextorConfiguration Method
+  void ReadConfiguration(NPL::InputParser) ;
+
+  // Construct detector and inialise sensitive part.
+  // Called After DetecorConstruction::AddDetector Method
+  void ConstructDetector(G4LogicalVolume* world) ;
+
+  // Add Detector branch to the EventTree.
+  // Called After DetecorConstruction::AddDetector Method
+  void InitializeRootOutput() ;
+
+  // Read sensitive part and fill the Root tree.
+  // Called at in the EventAction::EndOfEventAvtion
+  void ReadSensitive(const G4Event* event) ;
+
+public:   // Scorer
+  //   Initialize all Scorer used by the MUST2Array
+  void InitializeScorers() ;
+
+  //   Associated Scorer
+  G4MultiFunctionalDetector* m_MDMScorer ;
+  ////////////////////////////////////////////////////
+  ///////////Event class to store Data////////////////
+  ////////////////////////////////////////////////////
+private:
+  TMDMData* m_Event ;
+
+  ////////////////////////////////////////////////////
+  ///////////////Private intern Data//////////////////
+  ////////////////////////////////////////////////////
+private: // Geometry
+  // Detector Coordinate 
+  double  m_Angle;
+  double  m_Field;
+  std::string m_Rayin_file;
+
+  MDMTrace* m_Trace;
+  Rayin* m_Rayin;
+
+  G4VisAttributes* m_VisSquare;
+	
+  // Needed for dynamic loading of the library
+public:
+  static NPS::VDetector* Construct();
+};
+#endif
+
diff --git a/NPSimulation/Detectors/MDM/MDMTrace.cpp b/NPSimulation/Detectors/MDM/MDMTrace.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..60d34503cee9a2c22824e588ce7ba62c119ba317
--- /dev/null
+++ b/NPSimulation/Detectors/MDM/MDMTrace.cpp
@@ -0,0 +1,279 @@
+#include "MDMTrace.h"
+#include <iostream>
+#include <math.h>
+#include <stdio.h>
+
+extern "C" {
+  void raytrace_(int*);
+
+  extern struct {
+    double DATA[200][75];
+    double ITITLE[200];
+  } blck0_;
+
+  extern struct {
+    double XI[1000];
+    double YI[1000];
+    double ZI[1000];
+    double VXI[1000];
+    double VYI[1000];
+    double VZI[1000];
+    double DELP[1000];
+  } blck1_;
+
+  extern struct {
+    double XO[1000];
+    double YO[1000];
+    double ZO[1000];
+    double VXO[1000];
+    double VYO[1000];
+    double VZO[1000];
+    double RTL[1000];
+    double RLL[1000];
+  } blck2_;
+
+  extern struct {
+    double ENERGY;
+    double VEL;
+    double PMASS;
+    double Q0;
+  } blck4_;
+
+  extern struct {
+    double THTSPEC;
+    double TRGT1;
+    double AM[4];
+    double QVALUE;
+    double EEXC;
+    double THETACAL[10];
+    double EKINE;
+  } kineblck_;
+}
+
+MDMTrace* MDMTrace::instance_ = 0;
+double MDMTrace::jeffParams_[6] = {-0.51927,0.038638,0.028404,-0.022797,-0.019275,0.755583};
+double MDMTrace::oxfordWireSpacing_[3] = {15.1,16.3,16.3};
+
+MDMTrace* MDMTrace::Instance() {
+  if(!instance_) {
+    instance_ = new MDMTrace;
+    int flag = 0;
+    raytrace_(&flag);
+    kineblck_.TRGT1 = 0.;
+    instance_->beamEnergy_ = 0;
+    instance_->scatteredEnergy_ = 0;
+    instance_->beamPositions_[0] = 0.;
+    instance_->beamPositions_[1] = 0.;
+    instance_->beamPositions_[2] = 0.;
+
+  }
+  return instance_;
+}
+
+void MDMTrace::SetBeamEnergy(double energy) {
+  beamEnergy_ = energy;
+}
+
+double MDMTrace::GetBeamEnergy() const {
+  return beamEnergy_;
+}
+
+void MDMTrace::SetMDMAngle(double angle) {
+  kineblck_.THTSPEC = angle;
+}
+
+double MDMTrace::GetMDMAngle() const {
+  return kineblck_.THTSPEC;
+}
+
+void MDMTrace::SetMDMBRho(double bRho) {
+  double field = bRho/160.*1000;
+  SetMDMDipoleField(field);
+}
+
+void MDMTrace::SetMDMDipoleField(double field) {
+  double hallProbe = field/1.034;
+  double multipoleHallProbe = hallProbe*0.71;
+  std::cout << "CONFIRM: Hall probe for dipole should be set to " << hallProbe << std::endl;
+  std::cout << "CONFIRM: Hall probe for multipole should be set to " << multipoleHallProbe << std::endl;
+  double BQR = -1.*multipoleHallProbe*1e-4*jeffParams_[5];
+  double BHR = BQR*jeffParams_[1]/jeffParams_[0];
+  double BOR = BQR*jeffParams_[2]/jeffParams_[0];
+  double BDR = BQR*jeffParams_[3]/jeffParams_[0];
+  double BDDR = BQR*jeffParams_[4]/jeffParams_[0];
+
+  blck0_.DATA[4][14] = field*1.e-4;
+  blck0_.DATA[3][13]=BQR;
+  blck0_.DATA[3][14]=BHR;
+  blck0_.DATA[3][15]=BOR;
+  blck0_.DATA[3][16]=BDR;
+  blck0_.DATA[3][17]=BDDR;
+}
+
+double MDMTrace::GetMDMDipoleField() const {
+  return blck0_.DATA[4][14]*1.e4;
+}
+
+void MDMTrace::SetScatteredAngle(double angle) { // degrees
+  kineblck_.THETACAL[0] = angle;
+  scatteredAngles_[0] = angle;
+  scatteredAngles_[1] = 0.;
+}
+
+void MDMTrace::SetScatteredAngle(double xAngle,double yAngle) { // degrees
+  kineblck_.THETACAL[0] = xAngle;
+  scatteredAngles_[0] = xAngle;
+  scatteredAngles_[1] = yAngle;
+}
+
+void MDMTrace::SetBeamPosition(double x, double y, double z) { // cm
+  beamPositions_[0] = x;
+  beamPositions_[1] = y;
+  beamPositions_[2] = z;
+}
+
+double MDMTrace::GetScatteredAngle() const {
+  return kineblck_.THETACAL[0];
+}
+
+void MDMTrace::SetQValue(double qValue) {
+  kineblck_.QVALUE =qValue;
+}
+
+double MDMTrace::GetQValue() const {
+  return kineblck_.QVALUE;
+}
+
+void MDMTrace::SetResidualEnergy(double energy) {
+  kineblck_.EEXC = energy;
+}
+
+double MDMTrace::GetResidualEnergy() const {
+  return kineblck_.EEXC;
+}
+
+void MDMTrace::SetScatteredEnergy(double energy) {
+  scatteredEnergy_ = energy;
+}
+
+double MDMTrace::GetScatteredEnergy() const {
+  return scatteredEnergy_;
+}
+
+void MDMTrace::SetTargetMass(double mass) {
+  kineblck_.AM[1] = mass;
+}
+
+double MDMTrace::GetTargetMass() const {
+  return kineblck_.AM[1];
+}
+
+void MDMTrace::SetProjectileMass(double mass) {
+  kineblck_.AM[0] = mass;
+}
+
+double MDMTrace::GetProjectileMass() const {
+  return kineblck_.AM[0];
+}
+
+void MDMTrace::SetScatteredMass(double mass) {
+  blck4_.PMASS = mass;
+}
+
+double MDMTrace::GetScatteredMass() const {
+  return blck4_.PMASS;
+}
+
+void MDMTrace::SetScatteredCharge(double charge) {
+  blck4_.Q0 = charge;
+}
+
+double MDMTrace::GetScatteredCharge() const {
+  return blck4_.Q0;
+}
+
+double MDMTrace::GetEnergyAfterKinematics() const {
+  return kineblck_.EKINE*(1.+blck1_.DELP[0]/100.);
+}
+
+void MDMTrace::SendRayWithKinematics() {
+  int flag = 1;
+  blck4_.ENERGY = beamEnergy_;
+  raytrace_(&flag);
+}
+
+void MDMTrace::SendRay() {
+  int flag = 2;
+  blck4_.ENERGY = scatteredEnergy_;
+  blck1_.XI[0]=beamPositions_[0];
+  blck1_.YI[0]=beamPositions_[1];
+  blck1_.ZI[0]=beamPositions_[2];
+  blck1_.VXI[0]=17.453*(scatteredAngles_[0]-kineblck_.THTSPEC);
+  blck1_.VYI[0]=17.453*(scatteredAngles_[1]);
+  blck1_.VZI[0]=0.;
+  blck1_.DELP[0]=0.;
+  raytrace_(&flag);
+}
+
+void MDMTrace::GetPositionAngleFirstWire(double& pos, double& ang) const {
+  pos  = blck2_.XO[0];
+  ang  = blck2_.VXO[0]/1000.*180./3.14159;
+}
+
+void MDMTrace::GetPositionAngleFirstWire(double& posX, double& posY, double& angX, double& angY) const {
+  posX  = blck2_.XO[0];
+  posY  = blck2_.YO[0];
+  angX  = blck2_.VXO[0]/1000.*180./3.14159;
+  angY  = blck2_.VYO[0]/1000.*180./3.14159;
+}
+
+void MDMTrace::GetOxfordWirePositions(double& x1,double& x2,double& x3,double& x4) {
+  double oxfordWire1Pos = blck2_.XO[0];
+  double oxfordWire1Ang = blck2_.VXO[0];
+  double tanAngle = tan(1e-3*oxfordWire1Ang);
+
+  x1 = oxfordWire1Pos;
+  x2 = oxfordWire1Pos+tanAngle*oxfordWireSpacing_[0];
+  x3 = oxfordWire1Pos+tanAngle*(oxfordWireSpacing_[0]+oxfordWireSpacing_[1]);
+  x4 = oxfordWire1Pos+tanAngle*(oxfordWireSpacing_[0]+oxfordWireSpacing_[1]+oxfordWireSpacing_[2]);
+}
+
+void MDMTrace::GetOxfordWirePositions(double& a1,double& x1,double& x2,double& x3,double& x4) {
+  double oxfordWire1Pos = blck2_.XO[0];
+  double oxfordWire1Ang = blck2_.VXO[0];
+  double tanAngle = tan(1e-3*oxfordWire1Ang);
+
+  a1 = oxfordWire1Ang;
+
+  x1 = oxfordWire1Pos;
+  x2 = oxfordWire1Pos+tanAngle*oxfordWireSpacing_[0];
+  x3 = oxfordWire1Pos+tanAngle*(oxfordWireSpacing_[0]+oxfordWireSpacing_[1]);
+  x4 = oxfordWire1Pos+tanAngle*(oxfordWireSpacing_[0]+oxfordWireSpacing_[1]+oxfordWireSpacing_[2]);
+} 
+
+void MDMTrace::GetOxfordWirePositions(double& a1,double& x1,double& x2,double& x3,double& x4,
+				      double& b1,double& y1,double& y2,double& y3,double& y4) {
+  double oxfordWire1PosX = blck2_.XO[0];
+  double oxfordWire1AngX = blck2_.VXO[0]; // mrad
+  double tanAngleX = tan(1e-3*oxfordWire1AngX);
+
+  double oxfordWire1PosY = blck2_.YO[0];
+  double oxfordWire1AngY = blck2_.VYO[0]; // mrad
+  double tanAngleY = tan(1e-3*oxfordWire1AngY);
+
+  // x - plane //
+  a1 = oxfordWire1AngX; // mrad
+
+  x1 = oxfordWire1PosX;
+  x2 = oxfordWire1PosX+tanAngleX*oxfordWireSpacing_[0];
+  x3 = oxfordWire1PosX+tanAngleX*(oxfordWireSpacing_[0]+oxfordWireSpacing_[1]);
+  x4 = oxfordWire1PosX+tanAngleX*(oxfordWireSpacing_[0]+oxfordWireSpacing_[1]+oxfordWireSpacing_[2]);
+
+  // y - plane //
+  b1 = oxfordWire1AngY; // mrad
+
+  y1 = oxfordWire1PosY;
+  y2 = oxfordWire1PosY+tanAngleY*oxfordWireSpacing_[0];
+  y3 = oxfordWire1PosY+tanAngleY*(oxfordWireSpacing_[0]+oxfordWireSpacing_[1]);
+  y4 = oxfordWire1PosY+tanAngleY*(oxfordWireSpacing_[0]+oxfordWireSpacing_[1]+oxfordWireSpacing_[2]);
+} 
diff --git a/NPSimulation/Detectors/MDM/MDMTrace.h b/NPSimulation/Detectors/MDM/MDMTrace.h
new file mode 100644
index 0000000000000000000000000000000000000000..27ab2112e699905127682b994122d85d0344070f
--- /dev/null
+++ b/NPSimulation/Detectors/MDM/MDMTrace.h
@@ -0,0 +1,52 @@
+#ifndef MDMTRACE_H
+#define MDMTRACE_H
+
+class MDMTrace {
+ public:
+  static MDMTrace* Instance();
+  void SetBeamEnergy(double);
+  double GetBeamEnergy() const;
+  void SetMDMAngle(double);
+  double GetMDMAngle() const;
+  void SetMDMBRho(double);
+  void SetMDMDipoleField(double);
+  double GetMDMDipoleField() const;
+  void SetScatteredAngle(double);
+  void SetScatteredAngle(double,double);
+  double GetScatteredAngle() const;
+  void SetScatteredEnergy(double);
+  double GetScatteredEnergy() const;
+  void SetQValue(double);
+  double GetQValue() const;
+  void SetResidualEnergy(double);
+  double GetResidualEnergy() const;
+  void SetTargetMass(double);
+  double GetTargetMass() const;
+  void SetProjectileMass(double);	       
+  double GetProjectileMass() const;	       
+  void SetScatteredMass(double);
+  double GetScatteredMass() const;
+  void SetScatteredCharge(double);
+  void SetBeamPosition(double,double,double);
+  double GetScatteredCharge() const;
+  double GetEnergyAfterKinematics() const;
+  void SendRayWithKinematics();
+  void SendRay();
+  void GetPositionAngleFirstWire(double&,double&) const;
+  void GetPositionAngleFirstWire(double&,double&,double&,double&) const;
+  void GetOxfordWirePositions(double&,double&,double&,double&);
+  void GetOxfordWirePositions(double&,double&,double&,double&,double&);
+  void GetOxfordWirePositions(double&,double&,double&,double&,double&,
+			      double&,double&,double&,double&,double&);
+ private:
+  MDMTrace() {};
+  static MDMTrace* instance_;
+  static double jeffParams_[6];
+  static double oxfordWireSpacing_[3];
+  double beamEnergy_;
+  double scatteredEnergy_;
+  double scatteredAngles_[2];
+  double beamPositions_[3];
+};
+
+#endif
diff --git a/NPSimulation/Detectors/MDM/RAYTKIN1.F b/NPSimulation/Detectors/MDM/RAYTKIN1.F
new file mode 100644
index 0000000000000000000000000000000000000000..9fe03208345c30fee5dfd295674c3700080219d4
--- /dev/null
+++ b/NPSimulation/Detectors/MDM/RAYTKIN1.F
@@ -0,0 +1,5993 @@
+C****
+C**** RAY TRACE  -  MIT VERSION 1984   (11/25/84) dy MOD 3/16/93
+C****     add K=(1/p)dpdtheta to random rays 8/25/93  
+C****     add kinematics program  3/7/96
+C****  fix bug in random-kine (dele) 6/3/98, fix 2nd ray 6/4/98
+C**** DR. STANLEY KOWALSKI
+C**** MASS INST OF TECH
+C**** BLDG 26-427
+C**** CAMBRIDGE MASS 02139
+C**** PH 617+253-4288
+C****
+      SUBROUTINE raytrace(NCTL)
+      IMPLICIT REAL*8(A-H,O-Z)
+      REAL*8   K
+      LOGICAL LPLT   	
+c	character*24 ctemp
+
+C%%%% REAL*4 DAET, TYME
+      COMMON  /BLCK00/  LPLT
+      COMMON  /BLCK 0/  DATA , ITITLE
+      COMMON  /BLCK 1/  XI, YI, ZI, VXI, VYI, VZI, DELP
+      COMMON  /BLCK 2/  XO, YO, ZO, VXO, VYO, VZO, RTL(1000), RLL(1000)
+      COMMON  /BLCK 4/  ENERGY, VEL, PMASS, Q0
+      COMMON  /BLCK 5/  XA, YA, ZA, VXA, VYA, VZA
+      COMMON  /BLCK 6/  NP, JFOCAL
+      COMMON  /BLCK 7/ NCODE
+      COMMON  /BLCK10/  BX, BY, BZ, K, TC, DTC
+      COMMON  /BLCK11/  EX, EY, EZ, QMC, IVEC
+      COMMON  /DY1/ BDIPOLE
+      COMMON  /kineblck/ THTSPEC,TRGT1,AM,QVALUE,EEXC,THETACAL,EKINE
+
+c
+C
+C** xkine=K=(1/p)dp/dtheta
+C** added by DY for spectrometer calculations 8/25/93
+C
+      COMMON  /BLCK15/TMIN,PMIN,XMAX,TMAX,YMAX,PMAX,DMAX,xkine
+C
+C%%%% DIMENSION DAET(3), TYME(2)
+C*IBM DIMENSION DAET(5), TYME(2)
+      DIMENSION XO(1000),YO(1000),ZO(1000),VXO(1000),VYO(1000),VZO(1000)
+      DIMENSION XI(1000),YI(1000),ZI(1000),VXI(1000),VYI(1000),
+     1    VZI(1000), DELP(1000)
+      DIMENSION NWORD(15),DATA(75,200),IDATA(200),NTITLE(20),ITITLE(200)
+      DIMENSION TC(6), DTC(6), R(6,6), T2(5,6,6)
+      dimension am(4),theta(3),engy(3),rat(2),thetacal(10)
+      DATA NWORD/4HSENT, 4HDIPO, 4HQUAD, 4HHEXA, 4HOCTA, 4HDECA, 4HEDIP,
+     1   4HVELS, 4HPOLE, 4HMULT, 4HSHRT, 4HDRIF, 4HCOLL, 4HSOLE, 4HLENS/
+      DATA C /3.D10/
+C%%%% DATA TYME/4H    ,4H    /
+      DATA NT1, NT2 /4H RT8,4H2.0 /
+C****
+C****
+  100 FORMAT( 8F10.5 )
+  101 FORMAT( 20A4 )
+  102 FORMAT(10I5)
+  103 FORMAT(///10X,' KEY WORD DOES NOT MATCH STORED LIST - NWD=',A4)
+  104 FORMAT(//10X,' GO TO STATEMENT IN MAIN FELL THROUGH - I= ',I5,/)
+  105 FORMAT( 1H1, 10X, 20A4  )
+  106 FORMAT( 1H1 )
+  107 FORMAT( 5F10.5/ 5F10.5/3F10.5/4F10.5/ 4F10.5/ 6F10.5/ 6F10.5/
+     1        6F10.5/ 4F10.5/ 7F10.5/ 7F10.5                           )
+  108 FORMAT('1',62X, 'RAY ', I4, //  30X, 'ENERGY=',F8.3,' MEV ', 7X,
+     1   'PMOM=', F8.3, ' MEV/C', 6X, 'VELC=', 1PD11.3, ' CM/SEC'    /
+     2   30X, 'DELE/E=', 0PF8.3, ' (PC)', 5X, 'DELP/P=', F8.3,
+     3   ' (PC) ', 4X, 'DELV/V=', F7.3, '     (PC)'        /)
+  109 FORMAT( 3F10.5/ 5F10.5/ 4F10.5/ 6F10.5/ 6F10.5                   )
+  111 FORMAT( 2F10.5/ 6F10.5/ 2F10.5/ 6F10.5/ 3F10.5 )
+  112 FORMAT( 3F10.5/ 4F10.5/ 5F10.5/ 4F10.5/ 6F10.5/ 6F10.5 / 8F10.5 )
+  113 FORMAT( A4, 16X, A4  )
+  114 FORMAT( 1F10.5 / 5F10.5 / 2F10.5  )
+  115 FORMAT( 4F10.5/ 5F10.5/ 2F10.5/ 4F10.5/ 4F10.5/ 4F10.5/ 6F10.5/
+     1   6F10.5/ 6F10.5/ 6F10.5   )
+  116 FORMAT( /10X, '  PARTICLE ENERGY =', F10.4,  '  MEV'      /
+     1         10X, 'PARTICLE MOMENTUM =', F10.4,  '  MEV/C'    /
+     2         10X, 'PARTICLE VELOCITY =',1PD14.4, '  CM/SEC'  /
+     3         10X, '             MASS =',0PF10.4, '  AMU'     /
+     4         10X, '           CHARGE =', F10.4,  '  EQ'           )
+C%%%% 117   FORMAT( 10X, 3A4, 1X, 2A4, I12, ' CPU.SEC'   )
+C*IBM 117   FORMAT( 10X, 3A4, 1X, 2A4, 2A4 )
+  118   FORMAT(4F10.5/5F10.5/F10.5/4F10.5/4F10.5/6F10.5/6F10.5)
+  119   FORMAT( /// '  MAXIMUM NUMBER OF BEAM ELEMENTS EXCEEDED  ' /// )
+C****
+C%%%% CALL DATE(DAET)
+C%%%% CALL TIME(TYME)
+C*IBM CALL WHEN(DAET)
+C**** CALL ERRSET( NUMBER, CONT, COUNT, TYPE, LOG, MAXLIN     )
+C%%%% CALL ERRSET( 63, .TRUE., .FALSE., .FALSE., .FALSE., 2048)
+C%%%% CALL ERRSET( 72, .TRUE., .FALSE., .FALSE., .TRUE.,  2560)
+C%%%% CALL ERRSET( 74, .TRUE., .FALSE., .FALSE., .TRUE.,  2560)
+C%%%% CALL ERRSET( 88, .TRUE., .FALSE., .FALSE., .TRUE.,  2560)
+C%%%% CALL ERRSET( 89, .TRUE., .FALSE., .FALSE., .TRUE.,  2560)
+C*IBM CALL ERRSET( 207, 256, 1 )
+C*IBM CALL ERRSET( 208, 256, 1 )
+C*IBM CALL ERRSET( 209, 256, 1 )
+C*IBM CALL ERRSET( 210, 256, 1 )
+C****
+c      open(unit=6,file='output.dat',status='unknown')
+      open(unit=5,file='rayin.dat',status='unknown')		
+C****
+      IF(NCTL.EQ.1 .OR. NCTL.EQ.2) THEN
+        EMASS = PMASS*931.48
+        ETOT = EMASS + ENERGY
+        VEL = ( DSQRT( ( 2.*EMASS + ENERGY)*ENERGY) / ETOT ) * C
+        VEL0 = VEL
+        EN0 = ENERGY
+        PMOM0 = DSQRT( (2.*EMASS + EN0)*EN0)
+        IF(NCTL.EQ.1) GOTO 66
+        IF(NCTL.EQ.2) GOTO 52
+      ENDIF
+    5 LPLT = .FALSE.
+      IVEC = 0
+      LNEN = 0
+      NMAX = 200
+      DO 1  I=1,NMAX
+      IDATA(I)= 0
+      DO 1  J=1,75
+      DATA(J,I) = 0.
+    1 CONTINUE
+      READ ( 5,101,END=99) NTITLE
+      NTITLE(19) = NT1
+      NTITLE(20) = NT2
+      READ (5,*)NR, IP, NSKIP, JFOCAL, JMTRX, JNR, NPLT
+      READ (5,100) ENERGY, DEN, XNEN, PMASS, Q0
+      IF( NPLT .NE. 0 ) LPLT = .TRUE.
+      IF( NR .GT. 1000) NR=1000
+      IF( Q0 .EQ. 0. )  Q0 = 1.
+      EMASS = PMASS*931.48
+      QMC = EMASS/(9.D10*Q0)
+      ETOT = EMASS + ENERGY
+      VEL = ( DSQRT( ( 2.*EMASS + ENERGY)*ENERGY) / ETOT ) * C
+      VEL0 = VEL
+      EN0 = ENERGY
+      PMOM0 = DSQRT( (2.*EMASS + EN0)*EN0)
+      NEN = XNEN
+      IF( NEN  .EQ.  0 ) NEN = 1
+      NO = 1
+    2 IF( NO .LE. NMAX ) GO TO 6
+C      WRITE(6,119)
+      CALL EXIT
+    6 READ (5,113) NWD, ITITLE(NO)
+      DO 3  I=1,15
+      IF( NWD  .EQ. NWORD(I) ) GO TO 4
+    3 CONTINUE
+C      WRITE(6,103) NWD
+c   99 CALL EXIT
+   99 RETURN  
+    4 GO TO( 11, 12, 13, 13, 13, 13, 17, 18, 19, 20,21,22,23,24,25), I
+C****
+C****
+C****
+C****
+C      WRITE(6, 104)  I
+      CALL EXIT
+C****
+C**** DIPOLE  LENS           TYPE = 2
+C****
+   12 IDATA(NO) = 2
+      READ (5,107) ( DATA( J,NO ) , J=1,5 ), ( DATA( J,NO ), J=11,22 ),
+     1          ( DATA( J,NO ) , J=25,64)
+      BDIPOLE=DATA(15,NO)
+      NO = NO + 1
+      GO TO 2
+C****
+C**** PURE MULTIPOLES
+C**** QUADRUPOLE LENS        TYPE = 3
+C**** HEXAPOLE  LENS         TYPE = 4
+C**** OCTAPOLE  LENS         TYPE = 5
+C**** DECAPOLE  LENS         TYPE = 6
+C****
+   13 IDATA(NO) = I
+      READ (5,109)( DATA( J,NO ) , J=1,3 ), ( DATA( J,NO ), J=10,30 )
+      NO = NO + 1
+      GO TO 2
+C****
+C****   ELECTROSTATIC DEFLECTOR  TYPE=7
+C****
+   17 IDATA(NO) = 7
+      READ(5,118) (DATA(J, NO), J=1, 4), (DATA(J, NO), J=11,20),
+     1              (DATA(J, NO), J=25,40)
+        NO = NO + 1
+        GO TO 2
+C****
+C**** VELOCITY SELECTOR      TYPE = 8
+C****
+   18 IDATA(NO) = 8
+      READ (5,115) ( DATA(J,NO),J=1,4), (DATA(J,NO), J=7,11 ),
+     1             ( DATA(J,NO),J=12,13),(DATA(J,NO),J=16,51)
+      NO = NO + 1
+      GO TO 2
+C****
+C**** MULTIPOLE (POLES)      TYPE =  9
+C****
+   19 IDATA(NO) = 9
+      READ (5,112) ( DATA( J,NO ) , J=1,3 ), ( DATA( J,NO ), J=10,34 ),
+     1             ( DATA( J,NO ) , J=35,42)
+      NO = NO + 1
+      GO TO 2
+C****
+C**** MULTIPOLE LENS         TYPE = 10
+C****
+   20 IDATA(NO) = 10
+      READ (5,111) ( DATA( J,NO ) , J=1,2 ), ( DATA( J,NO ), J=10,17 ),
+     1          ( DATA( J,NO ) , J=20,28 )
+      NO = NO + 1
+      GO TO 2
+C****
+C**** SHIFT AND ROTATE       TYPE = 11
+C****
+   21 IDATA(NO) = 11
+      READ (5,100) ( DATA( J,NO ) , J=1,6 )
+      NO = NO + 1
+      GO TO 2
+C****
+C**** DRIFT                  TYPE = 12
+C****
+   22 IDATA(NO) = 12
+      READ (5,100) ( DATA( J,NO ) , J=1,1 )
+      NO = NO + 1
+      GO TO 2
+C****
+C**** COLLIMATOR             TYPE = 13
+C****
+   23 IDATA(NO) = 13
+      READ(5,100)  (DATA(J,NO),J=1,5)
+      NO = NO+1
+      GO TO 2
+C****
+C**** SOLENOID               TYPE = 14
+C****
+   24 IDATA(NO) = 14
+      READ (5,114) (DATA(J,NO),J=1,1), ( DATA(J,NO), J=10,16)
+      NO = NO+1
+      GO TO 2
+C****
+C**** LENS                   TYPE = 15
+C****
+   25 IDATA(NO) = 15
+      READ (5,100) (DATA(J,NO), J=1,9  )
+      NO = NO+1
+      GO TO 2
+C****
+C**** SYSTEM END             TYPE = 1
+C****
+   11 IDATA(NO) = 1
+C****
+C**** STANDARD RAYS AUTOMATIC SET-UP
+C**** IF( NR .GT. JNR ) APPEND ADDITIONAL RAYS FROM INPUT
+C****
+      RETURN
+      IF (JNR.EQ.0) GO TO 66
+C
+C** xkine=K=(1/p)dp/dtheta
+C** added by DY for spectrometer calculations 8/25/93
+C
+      READ (5,100) TMIN,PMIN,XMAX,TMAX,YMAX,PMAX,DMAX,xkine
+      CALL RAYS(JNR)
+      IF( JNR .GE. NR ) GO TO 52
+      JNRP = JNR+1
+C**********************************************************************
+C**********************************************************************
+      if(jmtrx.eq.1) then
+      read(5,100) xmax1,tmax1,ymax1,pmax1,dmax1
+         open (unit=10,file='RANDOM.NUM',
+     1    status='unknown')
+         do 4900 j=jnrp,nr
+         read(10,100) xi(j),vxi(j),yi(j),vyi(j),zi(i),vzi(i),delp(j)
+         xi(j)=(xi(j)-0.5)*xmax1
+         vxi(j)=(vxi(j)-0.5)*tmax1
+         yi(j)=(yi(j)-0.5)*ymax1
+         vyi(j)=(vyi(j)-0.5)*pmax1
+         zi(j)=0
+         vzi(j)=0
+         delp(j)=(delp(j)-0.5)*dmax1
+C
+C** add correlation of theta and energy for spectrometer
+C
+         delp(j)=delp(j)-xkine*vxi(j)*0.2
+C
+ 4900    continue
+      endif
+      close(unit=10)
+      if(jmtrx.eq.1) go to 52
+C**********************************************************************
+C***************************************************************  TMC *
+C****  Random rays with kinematics and angle offset              
+C**********************************************************************
+C***** toff1 is angle relative to central ray  *************
+      if(jmtrx.eq.2) then
+      read(5,100) xmax1,tmax1,ymax1,pmax1,dmax1
+         open (unit=10,file='RANDOM.NUM',
+     1    status='unknown')
+         do 4910 j=jnrp,nr
+         read(10,100) xi(j),vxi(j),yi(j),vyi(j),zi(i),vzi(i),delp(j)
+         xi(j)=(xi(j)-0.5)*xmax1
+         vxi(j)=(vxi(j)-0.5)*tmax1
+         yi(j)=(yi(j)-0.5)*ymax1
+         vyi(j)=(vyi(j)-0.5)*pmax1
+         zi(j)=0
+         vzi(j)=0
+         delp(j)=(delp(j)-0.5)*dmax1
+4910     continue
+C
+C** 
+C
+C
+      read (5,100) THTSPEC,THTSCAT,AM(1),AM(2),QVALUE,EEXC
+        ENGY(1)=QVALUE-EEXC 
+        ENGY(2)=ENERGY
+        AM(3)=PMASS
+        THETA(1)=THTSPEC 
+        CALL KINE (AM,THETA,ENGY,RAT,PATR,KB)
+        ENERGY=ENGY(3) 
+        ETOT = EMASS + ENERGY
+        VEL = ( DSQRT( ( 2.*EMASS + ENERGY)*ENERGY) / ETOT ) * C
+        VEL0 = VEL
+        EN0 = ENERGY
+        PMOM0 = DSQRT( (2.*EMASS + EN0)*EN0)
+        THTSPEC=THTSPEC*17.45329
+        THTSCAT=THTSCAT*17.45329
+        DO 4915 J=2,NR
+C****   DO 4915 J=JNRP,NR   ** THIS WAS CHANGED SO 2ND RAY HAS PROPER KINEMATICS
+C****                          to get focal plane position.  
+        VXI(J)=VXI(J)-THTSPEC+THTSCAT 
+        THETA(1)= SQRT((THTSCAT+VXI(J))**2+VYI(J)**2)
+        THETA(1)=THETA(1)/17.45329 
+        CALL KINE (AM,THETA,ENGY,RAT,PATR,KB)
+        DELE=100*(ENGY(3)-ENERGY)/(ENERGY)    
+        DELP(J)=DELP(J)+DELE
+ 4915   continue
+      endif
+      close(unit=10)
+      if(jmtrx.eq.2) go to 52
+C**********************************************************************
+C***************************************************************  TMC *
+      DO 49 J=JNRP,NR
+   49 READ(5,100,END=60) XI(J),VXI(J),YI(J),VYI(J),ZI(J),VZI(J),
+     1                    DELP(J)
+      GO TO 52
+C****
+C**** INPUT RAYS
+C****
+   66 IF (JMTRX.NE.3) GO TO 4940 
+C*   added 3/6/96 DHY to use KINE to get ray energies 
+c       read (5,100) THTSPEC,TRGT1,AM(1),AM(2),QVALUE,EEXC,FNANG
+C       write (6,100) THTSPEC,TRGT1,AM(1),AM(2),QVALUE,EEXC,FNANG
+C	read (*,*)
+        FNANG=1
+        EBEAM=ENERGY
+        ENGY(1)=QVALUE-EEXC 
+        ENGY(2)=EBEAM-TRGT1
+        AM(3)=PMASS
+        THETA(1)=THTSPEC 
+c 	write (6,100)am(1),am(2),
+c     1 		engy(1),engy(2),engy(3),pmass
+        CALL KINE (AM,THETA,ENGY,RAT,PATR,KB)
+C	write (6,1001) am(1),am(2),engy(1),engy(2),engy(3),pmass
+C	read (*,*)
+1001    format (' after kine', 6F10.4)
+        ENERGY=ENGY(3) 
+        ETOT = EMASS + ENERGY
+        VEL = ( DSQRT( ( 2.*EMASS + ENERGY)*ENERGY) / ETOT ) * C
+        VEL0 = VEL
+        EN0 = ENERGY
+        EKINE = ENERGY
+        PMOM0 = DSQRT( (2.*EMASS + EN0)*EN0)
+        NANG=FNANG
+        NCASE=NR/FNANG
+C        READ (5,4945) (THETACAL(J),J=1,NANG)
+C	write (*,*) nr,(thetacal(j),j=1,NANG)
+ 4945  format (10F7.3)
+      DO 4952 JJ=1,NCASE
+      JN=JJ*NANG-NANG+1
+      DO 4950 J=JN,JN+NANG-1
+      XI(J)=0.
+      YI(J)=0.
+      VYI(J)=0.
+      ZI(J)=0.
+      VZI(J)=0.
+      THETA(1)=THETACAL(J-JN+1)
+c 	write (6,100) am(1),am(2),engy(1),engy(2),engy(3)
+        CALL KINE (AM,THETA,ENGY,RAT,PATR,KB)
+c 	write (6,1001)am(1),am(2),engy(1),engy(2),engy(3)
+        DELP(J)=100*(ENGY(3)-ENERGY)/(ENERGY)   
+        VXI(J)=THETACAL(J-JN+1)-THTSPEC
+        VXI(J)=VXI(J)*17.45329 
+ 4950 CONTINUE         
+c	write (*,*) ' after 4950'
+c       read (5,100) THTSPEC,TRGT2,AM(1),AM(2),QVALUE,EEXC
+C       write (6,100) THTSPEC,TRGT2,AM(1),AM(2),QVALUE,EEXC
+C	read (*,*)
+        ENGY(1)=QVALUE-EEXC 
+        ENGY(2)=EBEAM-TRGT2
+ 4952  CONTINUE        
+      GO TO 52
+C  ***********
+C  *********** end of addition to use KINE to get RAY entries
+C  *******************
+ 4940 DO 56  J=1,NR
+      READ(5,100,END=60 )XI(J),VXI(J),YI(J),VYI(J),ZI(J),VZI(J),DELP(J)
+   56 CONTINUE
+      GO TO 52
+   60 NR = J-1
+   52 DO 53 JEN=1,NEN
+C****
+C****
+C****
+      NP = IP
+      IF( (NP .LE. 100)  .OR.  (NP .GE. 200)  ) GO TO 65
+      IF( JEN   .EQ.   (NEN/2+1)  )  NP = IP-100
+   65 CONTINUE
+      IF( (NP .GT. 100)  .AND.  (JEN .NE. 1) )  GO TO 55
+c      WRITE(6, 105) NTITLE
+C%%%% WRITE(6, 117) DAET, TYME
+c%%%%
+c     call dtime
+c	ctemp=ctime(time())	 
+c	write(6,*) ctemp
+
+c%%%%
+c      WRITE(6, 116) EN0, PMOM0, VEL0, PMASS, Q0
+      DO 54  NO = 1,200
+      ITYPE = IDATA(NO)
+      IF( ITYPE .EQ. 1 ) GO TO 55
+   54 CALL PRNT( ITYPE, NO )
+   55 CONTINUE
+C**** IF( ( NP .GT. 100) .AND. (JEN .EQ. 1 ) ) WRITE(6, 106)
+      DO 57  J=1,NR
+c%%%  ibm pc statements %%%%%%%%%%%%%%
+c      write(0,5710) j
+ 5710 format (i5)
+c%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+      ENERGY = (1.+DELP(J)/100. ) *EN0
+      ETOT = EMASS + ENERGY
+      VEL = ( DSQRT( (2.*EMASS + ENERGY) *ENERGY) /ETOT)*C
+      PMOM =  DSQRT( (2.*EMASS + ENERGY) *ENERGY)
+      K = (Q0/ETOT)*9.D10
+C****
+      T = 0.
+      NUM = 0
+      XA = XI(J)
+      YA = YI(J)
+      ZA = ZI(J)
+      VXA =VEL*DSIN( VXI(J)/1000. ) * DCOS( VYI(J)/1000. )
+      VYA =VEL*DSIN( VYI(J)/1000. )
+      VZA =VEL*DCOS( VXI(J)/1000. ) * DCOS( VYI(J)/1000. )
+      XDVEL = (VEL-VEL0)*100./VEL0
+      DELTP = (PMOM-PMOM0)*100./PMOM0
+c      IF( NP .LE. 100) WRITE(6,108)J,ENERGY,PMOM,VEL,DELP(J),DELTP,XDVEL
+      DO 50 NO =1,200
+      ITYPE = IDATA(NO )
+      GO TO( 31,32,33,33,33,33,37,38,39,40,41,42,46,44,45)      ,ITYPE
+      CALL EXIT
+C****
+C****
+   32 CALL DIPOLE ( NO, NP, T, TP ,NUM )
+      GO TO 51
+   33 NCODE = ITYPE-2
+      CALL MULTPL ( NO, NP, T, TP ,NUM )
+      GO TO 51
+   37 IVEC = 1
+      CALL EDIPL(NO, NP, T, TP, NUM)
+      IVEC = 0
+      GO TO 51
+   38 IVEC = 1
+      CALL VELS   ( NO, NP, T, TP ,NUM )
+      IVEC = 0
+      GO TO 51
+   39 CALL POLES  ( NO, NP, T, TP ,NUM )
+      GO TO 51
+   40 CALL MULT   ( NO, NP, T, TP ,NUM )
+      GO TO 51
+   41 CALL SHROT  ( NO, NP, T, TP ,NUM )
+      GO TO 50
+   42 CALL DRIFT  ( NO, NP, T, TP ,NUM )
+      GO TO 50
+   44 CALL SOLND  ( NO, NP, T, TP ,NUM )
+      GO TO 51
+   45 CALL LENS   ( NO, NP, T, TP ,NUM )
+      GO TO 50
+   46 CALL COLL   ( NO,  J, IFLAG      )
+      IF( IFLAG .NE. 0 ) GO TO 57
+      GO TO 50
+   51 XA = TC(1)
+      YA = TC(2)
+      ZA = TC(3)
+      VXA= TC(4)
+      VYA= TC(5)
+      VZA= TC(6)
+   50 CONTINUE
+   31 CONTINUE
+      CALL OPTIC( J, JFOCAL, NP, T, TP )
+      IF (LPLT ) CALL PLTOUT ( JEN, J, NUM )
+   57 CONTINUE
+      ENERGY = EN0
+      VEL = VEL0
+      IF( NP .GT. 100 ) GO TO 59
+C      WRITE(6, 105) NTITLE
+C%%%% WRITE(6, 117) DAET,TYME
+C%%%%
+C%%%% call dtime
+c%%%%
+C      WRITE(6, 116) EN0, PMOM0, VEL0, PMASS, Q0
+      DO 58 NO =1,200
+      ITYPE = IDATA(NO )
+      IF ( ITYPE  .EQ.  1 ) GO TO 59
+   58 CALL PRNT( ITYPE, NO )
+   59 CONTINUE
+      IF( NSKIP .NE. 0 ) GO TO 61
+      IF( NR  .GE.  46  )  GO TO 62
+      IF( NR  .GE.  14  )  GO TO 63
+      IF( NR  .GE.   6  )  GO TO 64
+      GO TO 61
+   62 CALL MATRIX(R,T2)
+      GO TO 61
+   63 CONTINUE
+c   63 WRITE(6, 105) NTITLE
+C%%%% ICPU = ITCPU( )/100
+C%%%% WRITE(6, 117) DAET, TYME, ICPU
+C%%%%
+C%%%% call dtime
+C%%%%
+      CALL MTRX1( 0, JEN, NR, ENERGY  )
+      LNEN = 1
+      GO TO 61
+   64 CONTINUE
+c   64 WRITE(6, 105) NTITLE
+C%%%% ICPU = ITCPU( )/100
+C%%%% WRITE(6, 117) DAET, TYME, ICPU
+C%%%%
+C%%%% call dtime
+C%%%%
+      CALL MTRX1( 1, JEN, NR, ENERGY )
+      LNEN = 1
+   61 CALL PRNT1 ( NR )
+      EN0 = EN0 + DEN
+      ENERGY = EN0
+      ETOT = EMASS + EN0
+      VEL0 = ( DSQRT( ( 2.*EMASS + EN0)*EN0 ) /ETOT)*C
+      PMOM0 = DSQRT( (2.*EMASS + EN0)*EN0)
+   53 CONTINUE
+c      IF(  (LNEN .EQ. 0 )  .OR.   (NEN .EQ. 1 )  )  GO TO 5
+      IF(  (LNEN .EQ. 0 )  .OR.   (NEN .EQ. 1 )  ) THEN
+      close(5) 
+      RETURN
+      ENDIF
+c      WRITE(6, 105) NTITLE
+C**** CALL TIME(TYME)
+C%%%% ICPU = ITCPU( )/100
+C%%%% WRITE(6, 117) DAET, TYME, ICPU
+C%%%%
+C%%%% call dtime
+C%%%%
+C*IBM CALL WHEN(DAET)
+      CALL MPRNT( NEN )
+c      WRITE(6, 106)
+      GO TO 5
+      END
+
+
+      SUBROUTINE MATRIX( R, T2  )
+C****
+C****
+C****
+      IMPLICIT REAL*8(A-H,O-Z)
+      COMMON  /BLCK 1/  XI, YI, ZI, VXI, VYI, VZI, DELP
+      COMMON  /BLCK 2/  XO, YO, ZO, VXO, VYO, VZO,RTL(1000),RLL(1000)
+      DIMENSION XI(1000),YI(1000),ZI(1000),VXI(1000),VYI(1000),
+     1        VZI(1000),DELP(1000)
+      DIMENSION XO(1000),YO(1000),ZO(1000),VXO(1000),VYO(1000),VZO(1000)
+      DIMENSION  R(6,6) , T2(5,6,6), TT(5,6,6)
+      DO 21  I1= 1,6
+      DO 21  I2= 1,6
+      R(I1,I2) = 0.
+      DO 21 I3= 1,5
+   21 T2(I3,I1,I2) = 0.
+C****
+C****
+C**** CALCULATE COEFFICIENTS
+C****
+      R(1,1) =  ( XO(3) -  XO(4) ) / ( XI(3) -  XI(4) )
+      R(1,2) =  ( XO(5) -  XO(6) ) / (VXI(5) - VXI(6) )
+      R(1,3) =  ( XO(7) -  XO(8) ) / ( YI(7) -  YI(8) )
+      R(1,4) =  ( XO(9) -  XO(10)) / (VYI(9) - VYI(10))
+      R(1,6) =  ( XO(11)-  XO(12) )/ (DELP(11) - DELP(12) )
+      R(2,1) =  (VXO(3) - VXO(4) ) / ( XI(3) -  XI(4) )
+      R(2,2) =  (VXO(5) - VXO(6) ) / (VXI(5) - VXI(6) )
+      R(2,3) =  (VXO(7) - VXO(8) ) / ( YI(7) -  YI(8) )
+      R(2,4) =  (VXO(9) - VXO(10)) / (VYI(9) - VYI(10))
+      R(2,6) =  (VXO(11)- VXO(12) )/ (DELP(11) - DELP(12) )
+      R(3,1) =  ( YO(3) -  YO(4) ) / ( XI(3) -  XI(4) )
+      R(3,2) =  ( YO(5) -  YO(6) ) / (VXI(5) - VXI(6) )
+      R(3,3) =  ( YO(7) -  YO(8) ) / ( YI(7) -  YI(8) )
+      R(3,4) =  ( YO(9) -  YO(10)) / (VYI(9) - VYI(10))
+      R(3,6) =  ( YO(11)-  YO(12) )/ (DELP(11) - DELP(12) )
+      R(4,1) =  (VYO(3) - VYO(4) ) / ( XI(3) -  XI(4) )
+      R(4,2) =  (VYO(5) - VYO(6) ) / (VXI(5) - VXI(6) )
+      R(4,3) =  (VYO(7) - VYO(8) ) / ( YI(7) -  YI(8) )
+      R(4,4) =  (VYO(9) - VYO(10)) / (VYI(9) - VYI(10))
+      R(4,6) =  (VYO(11)- VYO(12) )/ (DELP(11) - DELP(12) )
+      R( 5,5 )  =  1.
+      R( 6,6 )  =  1.
+      R(5,1) =  (RTL(3) - RTL(4) ) / ( XI(3) -  XI(4) )
+      R(5,2) =  (RTL(5) - RTL(6) ) / (VXI(5) - VXI(6) )
+      R(5,6) =  (RTL(11)- RTL(12) )/ (DELP(11) - DELP(12) )
+C****
+C****
+      T2(1,1,1)= ( XO(3) + XO(4) ) /(2.*XI(3)**2 )
+      T2(1,2,2)= ( XO(5) + XO(6) ) /(2.*VXI(5)**2)
+      T2(1,3,3)= ( XO(7) + XO(8) ) /(2.*YI(7)**2 )
+      T2(1,4,4)= ( XO(9) + XO(10) ) /(2.*VYI(9)**2 )
+      T2(1,6,6)= ( XO(11) + XO(12) ) /(2.*DELP(11)**2 )
+      T2(1,1,2)= ( XO(13)+XO(14)-2.*T2(1,1,1)*XI(13)**2-2.*T2(1,2,2)*
+     1   VXI(13)**2 ) /(2.*XI(13)*VXI(13) )
+      T2(1,1,6)= ( XO(15) + XO(16) -2.*T2(1,1,1)*XI(15)**2 -
+     1  2.*T2(1,6,6)*DELP(15)**2 ) /(2.*XI(15)*DELP(15) )
+      T2(1,2,6)= ( XO(17) + XO(18) -2.*T2(1,2,2)*VXI(17)**2 -
+     1  2.*T2(1,6,6)*DELP(17)**2 ) /(2.*VXI(17)*DELP(17) )
+      T2(1,3,4)= ( XO(19)- XO(20) ) /(2.*YI(19)*VYI(19) )
+      T2(2,1,1)= (VXO(3) +VXO(4) ) /(2.*XI(3)**2 )
+      T2(2,2,2)= (VXO(5) +VXO(6) ) /(2.*VXI(5)**2)
+      T2(2,3,3)= (VXO(7) +VXO(8) ) /(2.*YI(7)**2 )
+      T2(2,4,4)= (VXO(9) +VXO(10) ) /(2.*VYI(9)**2 )
+      T2(2,6,6)= (VXO(11) +VXO(12) ) /(2.*DELP(11)**2 )
+      T2(2,1,2)=(VXO(13)+VXO(14)-2.*T2(2,1,1)*XI(13)**2-2.*T2(2,2,2)*
+     1   VXI(13)**2 ) /(2.*XI(13)*VXI(13) )
+      T2(2,1,6)= (VXO(15) +VXO(16) -2.*T2(2,1,1)*XI(15)**2 -
+     1  2.*T2(2,6,6)*DELP(15)**2 ) /(2.*XI(15)*DELP(15) )
+      T2(2,2,6)= (VXO(17) +VXO(18) -2.*T2(2,2,2)*VXI(17)**2 -
+     1  2.*T2(2,6,6)*DELP(17)**2 ) /(2.*VXI(17)*DELP(17) )
+      T2(2,3,4)= (VXO(19)-VXO(20) ) /(2.*YI(19)*VYI(19) )
+      T2(3,1,3)= ( YO(21) - YO(22) ) /(2.*XI(21)*YI(21) )
+      T2(3,1,4)= ( YO(23) - YO(24) ) /(2.*XI(23)*VYI(23) )
+      T2(3,2,3)= ( YO(25) - YO(26) ) /(2. *VXI(25)*YI(25) )
+      T2(3,2,4)= ( YO(27) - YO(28) ) /(2.*VXI(27)*VYI(27) )
+      T2(3,3,6)= ( YO(29) - YO(30) ) /(2.*YI(29)*DELP(29) )
+      T2(3,4,6)= ( YO(31) - YO(32) ) /(2.*VYI(31)*DELP(31)  )
+      T2(4,1,3)= (VYO(21) -VYO(22) ) /(2.*XI(21)*YI(21) )
+      T2(4,1,4)= (VYO(23) -VYO(24) ) /(2.*XI(23)*VYI(23) )
+      T2(4,2,3)= (VYO(25) -VYO(26) ) /(2. *VXI(25)*YI(25) )
+      T2(4,2,4)= (VYO(27) -VYO(28) ) /(2.*VXI(27)*VYI(27) )
+      T2(4,3,6)= (VYO(29) -VYO(30) ) /(2.*YI(29)*DELP(29) )
+      T2(4,4,6)= (VYO(31) -VYO(32) ) /(2.*VYI(31)*DELP(31)  )
+C****
+C**** PATH LENGTH TERMS
+C****
+      T2(5,1,1) = ( RTL(3) + RTL(4) - 2*RTL(1) ) /( 2* XI(3)**2 )
+      T2(5,2,2) = ( RTL(5) + RTL(6) - 2*RTL(1) ) /( 2*VXI(5)**2 )
+      T2(5,3,3) = ( RTL(7) + RTL(8) - 2*RTL(1) ) /( 2* YI(7)**2 )
+      T2(5,4,4) = ( RTL(9) + RTL(10)- 2*RTL(1) ) /( 2*VYI(9)**2 )
+      T2(5,6,6) = ( RTL(11)+ RTL(12)- 2*RTL(1) ) /( 2*DELP(11)**2 )
+      T2(5,1,2) = ( RTL(13)+ RTL(14)- 2*RTL(1) - 2*T2(5,1,1)* XI(13)**2-
+     1            2*T2(5,2,2)*VXI(13)**2 ) / ( 2* XI(13)*VXI(13) )
+      T2(5,1,6) = ( RTL(15)+ RTL(16)- 2*RTL(1) - 2*T2(5,1,1)* XI(15)**2-
+     1            2*T2(5,6,6)*DELP(15)**2) / ( 2* XI(15)*DELP(15))
+      T2(5,2,6) = ( RTL(17)+ RTL(18)- 2*RTL(1) - 2*T2(5,2,2)*VXI(17)**2-
+     1            2*T2(5,6,6)*DELP(17)**2) / ( 2*VXI(17)*DELP(17))
+      T2(5,3,4) = ( RTL(19)- RTL(20)           ) /( 2* YI(19)*VYI(19) )
+C****
+C****
+c      write (6, 22)  ( ( R(IR, IJ), IJ=1,6), IR=1,6)
+   22 FORMAT(1H1, / 51X, 15H *TRANSFORM* 1  ,  / 6(25X, 6F10.5/)  )
+c      write (6, 120)
+  120 FORMAT(   /46X, 25H  *2ND ORDER TRANSFORM*           )
+      DO 24 I1= 1,5
+      DO 25 I2= 1,6
+c      write (6, 121) ( I1,I3,I2, T2(I1,I3,I2), I3=1,I2 )
+  121 FORMAT( 6(I4,I2,I1, 1PE11.3)  )
+   25 CONTINUE
+c      write (6, 122)
+  122 FORMAT( 1H  )
+   24 CONTINUE
+      XTTT=((XO(33)- XO(34) )/2. - R(1,2)*VXI(33) )/VXI(33)**3
+      XTPP  = (XO(27) - XO(28) + XO(6) -XO(5))/(2.*VXI(27)*VYI(27)**2)
+      XXTT  = (XO(37) - XO(36) + XO(35)-XO(38)- 2.*(XO( 3) - XO( 4) ) )/
+     1   (4.*XI(35) * VXI(35)**2 )
+      XXXT  = (XO(35) - XO(37) + XO(36)-XO(38)- 2.*(XO(33) - XO(34) ) )/
+     1   (4.*XI(35)**2*VXI(35))
+      XTTD  = (XO(39) - XO(40) + XO(41)-XO(42)- 2.*(XO(11) - XO(12) ) )/
+     1   (4.*VXI(39)**2*DELP(39))
+      XTDD  = (XO(39) - XO(41) + XO(40)-XO(42)- 2.*(XO(33) - XO(34) ) )/
+     1   (4.*VXI(39)*DELP(39)**2)
+      XXPP  = (XO(23) - XO(24) + XO( 4)-XO( 3))/(2.*XI(23)*VYI(23)**2  )
+      XPPD  = (XO(31) - XO(32) + XO(12)-XO(11))/(2.*VYI(31)**2*DELP(31))
+      XTTTT=((XO(33)+XO(34) )/2. - T2(1,2,2)*VXI(33)**2)/ VXI(33)**4
+      XTTPP = (XO(27) - XO( 5) + XO(28)-XO( 6) - 2.*XO( 9) ) /
+     1   ( 2.*VXI(27)**2*VYI(27)**2 )
+      XPPDD = (XO(31) - XO(11) + XO(32)-XO(12) - 2.*XO( 9) ) /
+     1   ( 2.*VYI(31)**2 * DELP(31)**2 )
+      XPPPP =(XO(43) -T2(1,4,4)*VYI(43)**2) / VYI(43)**4
+      ZDDD = ( (RTL(45) - RTL(46) )/2. - R(5,6)*DELP(45) )/DELP(45)**3
+      ZDDDD = ( (RTL(45)+RTL(46)-2*RTL(1) )/2. -T2(5,6,6)*DELP(45)**2)/
+     1   DELP(45)**4
+      XDDD = (( XO(45)- XO(46))/2. - R(1,6)*DELP(45) ) / DELP(45)**3
+      XDDDD= (( XO(45)+ XO(46))/2. - T2(1,6,6)*DELP(45)**2 )/DELP(45)**4
+      TDDD = ((VXO(45)-VXO(46))/2. - R(2,6)*DELP(45) ) / DELP(45)**3
+      TDDDD= ((VXO(45)+VXO(46))/2. - T2(2,6,6)*DELP(45)**2 )/DELP(45)**4
+c      write (6, 26) XTTT, XTPP, XXTT, XXXT, XTTD, XTDD, XXPP, XPPD,
+c     1   XTTTT, XTTPP, XPPDD, XPPPP,
+c     2   XDDD, XDDDD, TDDD, TDDDD,      ZDDD, ZDDDD
+   26 FORMAT('1',/15X, 'X/THETA**3       =',1PE11.3   /
+     1            15X, 'X/THETA.PHI**2   =',1PE11.3   /
+     2            15X, 'X/X.THETA**2     =',1PE11.3   /
+     3            15X, 'X/X**2.THETA     =',1PE11.3   /
+     4            15X, 'X/THETA**2.DELTA =',1PE11.3   /
+     5            15X, 'X/THETA.DELTA**2 =',1PE11.3   /
+     6            15X, 'X/X.PHI**2       =',1PE11.3   /
+     7            15X, 'X/PHI**2.DELTA   =',1PE11.3   //
+     8            15X, 'X/THETA**4       =',1PE11.3   /
+     9            15X, 'X/THETA**2.PHI**2=',1PE11.3   /
+     A            15X, 'X/PHI**2.DELTA**2=',1PE11.3   /
+     B            15X, 'X/PHI**4         =',1PE11.3   //
+     C            15X, 'X/DELTA*3        =',1PE11.3   /
+     D            15X, 'X/DELTA*4        =',1PE11.3   /
+     E            15X, 'THETA/DELTA*3    =',1PE11.3   /
+     F            15X, 'THETA/DELTA*4    =',1PE11.3   /
+     H            15X, 'Z/DELTA*3        =',1PE11.3   /
+     I            15X, 'Z/DELTA*4        =',1PE11.3   )
+C
+C***********************************************************************
+C THE NEXT LINE TURNS OFF EXTRA FOCAL PLANE CALC'S
+        RETURN
+C***********************************************************************
+      DO 1  I1=1,5
+      DO 1  I2=1,6
+      DO 1  I3=1,6
+    1 TT(I1,I2,I3) = T2(I1,I2,I3)
+      DO 2 I=1,12
+      PSI =  5. * FLOAT(I)
+      TPSI = .001*DTAN( PSI/57.29578 )
+      TT(1,1,1) = T2(1,1,1) + R(2,1) * R(1,1) * TPSI
+      TT(1,1,2) = T2(1,1,2) + ( R(2,1)*R(1,2) + R(2,2)*R(1,1) ) * TPSI
+      TT(1,2,2) = T2(1,2,2) + R(2,2) * R(1,2) * TPSI
+      TT(1,1,6) = T2(1,1,6) + ( R(2,1)*R(1,6) + R(2,6)*R(1,1) ) * TPSI
+      TT(1,2,6) = T2(1,2,6) + ( R(2,2)*R(1,6) + R(2,6)*R(1,2) ) * TPSI
+      TT(1,6,6) = T2(1,6,6) + R(2,6) * R(1,6) * TPSI
+      TT(3,1,3) = T2(3,1,3) + R(1,1) * R(4,3) * TPSI
+      TT(3,1,4) = T2(3,1,4) + R(1,1) * R(4,4) * TPSI
+      TT(3,2,3) = T2(3,2,3) + R(1,2) * R(4,3) * TPSI
+      TT(3,2,4) = T2(3,2,4) + R(1,2) * R(4,4) * TPSI
+      TT(3,3,6) = T2(3,3,6) + R(1,6) * R(4,3) * TPSI
+      TT(3,4,6) = T2(3,4,6) + R(1,6) * R(4,4) * TPSI
+      CTTT=XTTT+ ( R(1,2)*T2(2,2,2) + R(2,2)*T2(1,2,2) ) * TPSI
+      CTPP=XTPP+ ( R(1,2)*T2(2,4,4) + R(2,2)*T2(1,4,4) ) * TPSI
+      CXTT=XXTT+ ( R(1,1)*T2(2,2,2) + R(1,2)*T2(2,1,2) +
+     1             R(2,1)*T2(1,2,2) + R(2,2)*T2(1,1,2) ) * TPSI
+      CXXT=XXXT+ ( R(1,1)*T2(2,1,2) + R(1,2)*T2(2,1,1) +
+     1             R(2,1)*T2(1,1,2) + R(2,2)*T2(1,1,1) ) * TPSI
+      CTTD=XTTD+ ( R(1,2)*T2(2,2,6) + R(1,6)*T2(2,2,2) +
+     1             R(2,2)*T2(1,2,6) + R(2,6)*T2(1,2,2) ) * TPSI
+      CTDD=XTDD+ ( R(1,2)*T2(2,6,6) + R(1,6)*T2(2,2,6) +
+     1             R(2,2)*T2(1,6,6) + R(2,6)*T2(1,2,6) ) * TPSI
+      CXPP=XXPP+ ( R(1,1)*T2(2,4,4) + R(2,1)*T2(1,4,4) ) * TPSI
+      CPPD=XPPD+ ( R(1,6)*T2(2,4,4) + R(2,2)*T2(1,4,4) ) * TPSI
+c      write (6, 27) PSI
+   27 FORMAT(1H1, 35X,'FOCAL PLANE TILT ANGLE= ',F07.2, '   DEGREES '  )
+c      write (6, 28)  ( ( R(IR, IJ), IJ=1,6), IR=1,6)
+   28 FORMAT(     / 51X, 15H *TRANSFORM* 1  ,  / 6(25X, 6F10.5/)  )
+c      write (6, 120)
+      DO 29 I1= 1,5
+      DO 30 I2= 1,6
+c      write (6, 121) ( I1,I3,I2, TT(I1,I3,I2), I3=1,I2 )
+   30 CONTINUE
+c      write (6, 122)
+   29 CONTINUE
+c      write (6, 26) CTTT, CTPP, CXTT, CXXT, CTTD, CTDD, CXPP, CPPD,
+c     1   XTTTT, XTTPP, XPPDD, XPPPP,
+c     2   XDDD, XDDDD, TDDD, TDDDD,      ZDDD, ZDDDD
+    2 CONTINUE
+      RETURN
+      END
+
+
+
+      SUBROUTINE  MLTT ( BFLD, Z, X, Y )
+C****
+C****
+C****
+C****
+      IMPLICIT REAL*8(A-H,O-Z)
+      REAL*8  K, L
+      COMMON  /BLCK10/  BX, BY, BZ, K, TC, DTC
+      COMMON  /BLK100/  W, L, D, DG, S, BF, BT
+      COMMON  /BLK101/  C0, C1, C2, C3, C4, C5, C6, C7, C8
+      DIMENSION TC(6), DTC(6)
+      U = 2.*X/W
+      S = 2.*Z/L
+      DL2 = (L/D)**2
+      W1 = C0 + C1*U + C2*U*U + C3*U**3 + C4*U**4 + C5*U**5
+      W2 = 1. + C7*( S**4 + DL2*C8*S**8 ) / ( 1. + DL2*C8 )
+      BFLD = BF*W1 / W2
+      RETURN
+      END
+
+
+      SUBROUTINE MTRX1( M, JEN, NR, ENERGY  )
+C****
+C****
+C**** M=0  14 RAYS ARE USED TO EVALUATE THE ABERRATION COEFFICIENTS FOR
+C**** A POINT SOURCE OBJECT THROUGH 4'TH ORDER
+C**** M=1   6 RAYS ARE USED TO EVALUATE THE ABERRATION COEFFICIENTS FOR
+C**** A POINT SOURCE OBJECT THROUGH 4'TH ORDER; MIDPLANE ONLY
+C****
+C****
+      IMPLICIT REAL*8(A-H,O-Z)
+      REAL*8 KT, LP
+      character*8 L(2,50), LX(2,12)
+      LOGICAL LPLT
+      COMMON  /BLCK00/ LPLT
+      COMMON  /BLCK 1/ XI, YI, ZI, VXI, VYI, VZI, DELP
+      COMMON  /BLCK 2/ XO, YO, ZO, VXO, VYO, VZO,RTL(1000),RLL(1000)
+      COMMON /BLCK 3/ XOR,  YOR,  ZOR , TH0, PH0, TL1
+      DIMENSION XI(1000),YI(1000),ZI(1000),VXI(1000),VYI(1000), 
+     1     VZI(1000),DELP(1000)
+      DIMENSION XO(1000),YO(1000),ZO(1000),VXO(1000),VYO(1000),VZO(1000)
+      DIMENSION CXX(12,10), IX(12), CD(6,4),   LFACT(50), C(50,10)
+      DIMENSION DXX(21,10), DXY(21,10)
+      DATA IX/ 1,2,5,7,11,13,19,22,29,32,35,36  /
+      DATA LFACT / 1,0,1,0,2*4,2*3,4,3,2*7,2*6,2*7,2*6,3*10,3*9,
+     1   2*10,2*9,3*13,12,4,7,4,7,14*0   /
+      DATA  L  / 'X/TH    ','       =','T/TH    ','       =',
+     1           'Y/PH    ','       =','P/PH    ','       =',
+     2           'X/TH**2 ','       =','X/PH**2 ','       =',
+     3           'T/TH**2 ','       =','T/PH**2 ','       =',
+     4           'Y/TH*PH ','       =','P/TH*PH ','       =',
+     5           'X/TH**3 ','       =','X/TH*PH*','*2     =',
+     6           'T/TH**3 ','       =','T/TH*PH*','*2     =',
+     7           'Y/PH**3 ','       =','Y/TH**2*','PH     =',
+     8           'P/PH**3 ','       =','P/TH**2*','PH     =',
+     9           'X/TH**4 ','       =','X/TH**2*','PH**2  =',
+     A           'X/PH**4 ','       =','T/TH**4 ','       =',
+     B           'T/TH**2*','PH**2  =','T/PH**4 ','       =',
+     C           'Y/TH**3*','PH     =','Y/TH*PH*','*3     =',
+     D           'P/TH**3*','PH     =','P/TH*PH*','*3     =',
+     E           'X/TH**5 ','       =','X/TH**3*','PH**2  =',
+     F           'X/TH*PH*','*4     =','T/TH**5 ','       =',
+     G           'X/PH**2(','TRUNC.)=','X/TH*PH*','*2(TR.)=',
+     H           'X/T**2 (','TRUNC.)=','X/T**3 (','TRUNC.)=',
+     i            28*'        '/
+      DATA  LX / 'ENERGY(M','EV)    =','XOR (CM)','       =',
+     1           'YOR (CM)','       =','ZOR (CM)','       =',
+     2           'TH  (MR)','       =','PHI (MR)','       =',
+     3           ']XMAX](C','M)     =','2]YMAX](','CM)    =',
+     4           ']X-WAIST','](CM)  =','X(X-WAIS','T)     =',
+     5           'Z(X-WAIS','T)     =','LENGTH(C','M)     ='  /
+C****
+      MM=M
+C****
+      I   = JEN
+      IF( I   .GT. 10 ) I   = 10
+C****
+C****
+      XMIN = XO(1)
+      XMAX = XO(1)
+      YMAX = DABS(YO(1))
+      DO 4 J=2,NR
+      IF( XO(J) .GT. XMAX )  XMAX = XO(J)
+      IF( XO(J) .LT. XMIN )  XMIN = XO(J)
+      IF( DABS(YO(J) ) .GT. YMAX ) YMAX = DABS(YO(J))
+    4 CONTINUE
+      CXX(1,I  ) = ENERGY
+      CXX(2,I  ) = XOR
+      CXX(3,I  ) = YOR
+      CXX(4,I  ) = ZOR
+      CXX(5,I  )=TH0
+      CXX(6,I  )=PH0
+      CXX(7,I  ) = DABS(XMAX-XMIN)
+      CXX(8,I  ) = 2.*YMAX
+C****
+C****   CALCULATE BEAM WIDTH AT TEN EQUALLY SPACED (5MM)
+C****   DISTANCES EACH SIDE OF ZOR
+C****
+      DO 20 JJ=1,21
+      XMIN = XO(1) + 0.00050 * VXO(1) * (JJ-11)
+      XMAX = XMIN
+      DO 21 J = 2, 6
+      XJJ = XO(J) + 0.00050 *VXO(J) * (JJ-11)
+      IF (XJJ.GT.XMAX) XMAX = XJJ
+      IF (XJJ.LT.XMIN) XMIN = XJJ
+   21 CONTINUE
+      DXX(JJ,I) = DABS( XMAX - XMIN)
+      DXY(JJ,I) = 0.
+      IF (NR.LE.6) GOTO 20
+      DO 22 J=7,NR
+      XJJ = XO(J) + 0.00050* VXO(J) * (JJ-11)
+      IF ( XJJ.GT.XMAX ) XMAX = XJJ
+      IF ( XJJ.LT.XMIN ) XMIN = XJJ
+   22 CONTINUE
+      DXY(JJ,I) = DABS( XMAX - XMIN)
+   20 CONTINUE
+C****
+C**** CALCULATE POSITION OF MINIMUM BEAM WIDTH
+C**** WITHIN 10.0 CM OF ZOR
+      XMX = 1.0D20
+      DO 25  JJ=1, 101
+      XMIN = XO(1) + 0.00020 * VXO(1) * (JJ-51)
+      XMAX = XMIN
+      DO 26  J=2,NR
+      XJJ = XO(J) + 0.00020 * VXO(J) * (JJ-51)
+      IF ( XJJ.GT.XMAX ) XMAX = XJJ
+      IF ( XJJ.LT.XMIN ) XMIN = XJJ
+   26 CONTINUE
+      DXMAX = DABS( XMAX - XMIN )
+      IF ( DXMAX.GE.XMX ) GO TO 25
+      XMX = DXMAX
+      ZMX = 0.20 * (JJ - 51)
+   25 CONTINUE
+      IF ( DABS( ZMX ).GT.9.9 ) ZMX = 1.0D20
+      CXX( 9, I) = XMX
+      CXX(10, I) = .001*TH0*ZMX + XOR
+      CXX(11, I) = ZMX+ZOR
+      CXX(12, I) = TL1
+C****
+C****
+      IF( VXI(2) .EQ. 0. )  VXI(2) = 1.D-30
+      IF( VXI(3) .EQ. 0. )  VXI(3) = 1.D-30
+      KT = VXI(5)/VXI(3)
+      DTH = VXI(3)
+      TMAX = VXI(5)
+      PMAX = VYI(12)
+      XT=XO(2)/VXI(2)
+      TT=(KT**3*(VXO(3)-VXO(4))- VXO(5)+VXO(6))/(2.* (KT**3-KT)*DTH)
+      XTT = ( KT**4*(XO(3) + XO(4)) - (XO(5)+XO(6) )) /
+     1   (2.*(KT**4-KT**2) *DTH*DTH)
+      TTT = ( KT**4*(VXO(3)+VXO(4)) -(VXO(5)+VXO(6))) /
+     1   (2.*(KT**4-KT**2) *DTH*DTH)
+      XTTT  = ( KT**5 * ( XO(3) - XO(4) - 2.*XT*DTH ) -
+     1 ( XO(5) - XO(6) -2.*KT*XT*DTH) ) / (2.*(KT**5 - KT**3) *DTH**3 )
+      TTTT  = (-KT    * (VXO(3) -VXO(4)) + (VXO(5) -VXO(6) )  ) /
+     1   (2.*(KT**3 - KT   ) *DTH**3 )
+      XTTTT = ( (XO(5)+XO(6))-KT*KT*(XO(3)+XO(4) ) ) /
+     1   (2.*(KT**4 - KT*KT)*DTH**4 )
+      TTTTT =((VXO(5)+VXO(6))-KT*KT*(VXO(3)+VXO(4))) /
+     1   (2.*(KT**4 - KT*KT)*DTH**4 )
+      XTTTTT= ( XO(5) - XO(6) - 2.*KT*XT*DTH - KT**3*( XO(3) - XO(4) -
+     1   2.*XT*DTH) ) / ( 2.*(KT**5 - KT**3) *DTH**5 )
+      TTTTTT= 0.
+C****
+C****
+      C( 1,I)      = XT*10.
+      C( 2,I)      = TT
+      C( 5,I)      = XTT*10.**4
+      C( 7,I)      = TTT*10.**3
+      C(11,I)      = XTTT*10.**7
+      C(13,I)      = TTTT*10.**6
+      C(19,I)      = XTTTT*10.**10
+      C(22,I)      = TTTTT*10.**09
+      C(29,I)      = XTTTTT*10.**13
+      C(32,I)      = TTTTTT*10.**12
+      C(35,I)      = (XTT + XTTTT*TMAX*TMAX)*10.**4
+      C(36,I)      = (XTTT+XTTTTT*TMAX*TMAX)*10.**7
+C****
+C****
+      IF( M .NE. 0 ) GO TO 1
+      LP = VYI(12)/VYI(7)
+      DPH = VYI(7)
+      XPP   = (LP**4*XO(7) - XO(12)) /((LP**4 - LP*LP)*DPH*DPH )
+      TPP   = (LP**4*VXO(7)-VXO(12)) /((LP**4 - LP*LP)*DPH*DPH )
+      XPPPP = (XO(12)-LP*LP*XO(7) ) /((LP**4-LP*LP)*DPH**4)
+      TPPPP =(VXO(12)-LP*LP*VXO(7)) /((LP**4-LP*LP)*DPH**4)
+      XTPP  = (LP**4*( XO(8) - XO(9)) - ( XO(13) - XO(14)) - (LP**4-1.)*
+     1   ( XO(3) - XO(4)) -(( XO(10) - XO(11)) - KT*( XO(8) - XO(9) ) -
+     2   ( XO(5) - XO(6) ) + KT*( XO(3) - XO(4) ) ) *
+     3   ( ( LP**4 - LP*LP) / (KT**3-KT) ))/(2.*(LP**4-LP*LP)*
+     4   DTH*DPH*DPH )
+      TTPP  = 0.
+      XTTPP = ( ( XO(8)+XO(9) ) - ( XO(3)+XO(4) ) - 2.*XO(7)) /
+     1   (2.*DTH*DTH*DPH*DPH)
+      TTTPP = ( (VXO(8)+VXO(9)) - (VXO(3)+VXO(4)) -2.*VXO(7)) /
+     1   (2.*DTH*DTH*DPH*DPH)
+      YP    = ( LP**3 * YO(7) - YO(12) ) / ( (LP**3 - LP)*DPH )
+      PP    = ( LP**3 *VYO(7) -VYO(12) ) / ( (LP**3 - LP)*DPH )
+      YPPP  = (YO(12) - LP*YO(7)) /((LP**3-LP)*DPH**3 )
+      PPPP  =(VYO(12) -LP*VYO(7)) /((LP**3-LP)*DPH**3 )
+      YTTP  = ( YO(8) + YO(9) - 2.*YO(7) ) / (2.*DTH*DTH*DPH )
+      PTTP  = (VYO(8) +VYO(9) - 2.*VYO(7)) / (2.*DTH*DTH*DPH )
+      YTPPP = ( YO(13) - LP*YO(8) - YO(12) + LP*YO(7) ) /
+     1   ((LP**3 - LP)*DTH*DPH**3 )
+      PTPPP = (VYO(13) - LP*VYO(8)-VYO(12) + LP*VYO(7)) /
+     1   ((LP**3 - LP)*DTH*DPH**3 )
+      YTTTP = ( YO(10) - YO(11) -KT*(YO(8)-YO(9) ) ) /
+     1   (2.*(KT**3-KT) * DTH**3*DPH )
+      PTTTP = (VYO(10) -VYO(11) -KT*(VYO(8)-VYO(9))) /
+     1   (2.*(KT**3-KT) * DTH**3*DPH )
+      YTP   = ( (YO(10)-YO(11) -KT**3*(YO(8)-YO(9) ) ) /(2.*(KT-KT**3))-
+     1   YTPPP*DTH*DPH**3 ) /(DTH*DPH)
+      PTP   = ((VYO(10)-VYO(11)-KT**3*(VYO(8)-VYO(9))) /(2.*(KT-KT**3))-
+     1   PTPPP*DTH*DPH**3 ) /(DTH*DPH)
+      XTTTPP= ( XO(10) - XO(11) - KT*( XO(8) - XO(9)) - ( XO(5) - XO(6))
+     1   +KT*( XO(3) - XO(4) ) ) / (2.*(KT**3-KT) * DTH**3*DPH*DPH )
+      TTTTPP= 0.
+      XTPPPP= ( XO(13) - XO(14) - LP*LP*( XO(8) - XO(9)) + (LP*LP-1.) *
+     1   ( XO(3) - XO(4) ) ) / (2.*(LP**4-LP*LP) * DTH*DPH**4 )
+      TTPPPP= 0.
+      C( 3,I)      = YP*10.
+      C( 4,I)      = PP
+      C( 6,I)      = XPP*10.**4
+      C( 8,I)      = TPP*10.**3
+      C( 9,I)      = YTP*10.**4
+      C(10,I)      = PTP*10.**3
+      C(12,I)      = XTPP*10.**7
+      C(14,I)      = TTPP*10.**6
+      C(15,I)      = YPPP*10.**7
+      C(16,I)      = YTTP*10.**7
+      C(17,I)      = PPPP*10.**6
+      C(18,I)      = PTTP*10.**6
+      C(20,I)      = XTTPP*10.**10
+      C(21,I)      = XPPPP*10.**10
+      C(23,I)      = TTTPP*10.**09
+      C(24,I)      = TPPPP*10.**09
+      C(25,I)      = YTTTP*10.**10
+      C(26,I)      = YTPPP*10.**10
+      C(27,I)      = PTTTP*10.**09
+      C(28,I)      = PTPPP*10.**09
+      C(30,I)      = XTTTPP*10.**13
+      C(31,I)      = XTPPPP*10.**13
+      C(33,I)      = (XPP + XPPPP*PMAX*PMAX)*10.**4
+      C(34,I)      = (XTPP + XTTTPP*TMAX*TMAX +XTPPPP*PMAX*PMAX)*10.**7
+C****
+C****
+   13 FORMAT( 2I5 )
+   14 FORMAT(   )
+   15 FORMAT( //  , 8( 15X, 2A8,  F9.4 /  ) /,3( 15X, 2A8, F8.3/))
+   16 FORMAT(    15X, 2A8, 1PE12.3, 0PF15.4   )
+c      write (6, 15) ( ( LX(J,K),J=1,2),  CXX(K,I), K=1,12)
+      DO 2 JJ=1,36
+      COEF = C(JJ,I)/ 10.**LFACT(JJ)
+c      IF((JJ.EQ.5).OR.(JJ.EQ.11).OR.(JJ.EQ.19).OR.(JJ.EQ.29))
+c     1 write(6,14)
+c****
+    2 CONTINUE
+c    2 write (6, 16) (L(J,JJ), J=1,2), COEF, C(JJ,I)
+      GO TO 23
+C****
+C****
+    1 CONTINUE
+c      write (6, 15) (( LX(J,K),J=1,2),  CXX(K,I), K=1,12)
+      DO 3 JJ=1,12
+      K = IX(JJ)
+      COEF = C(K,I)/10.**LFACT(K)
+    3 CONTINUE
+c    3 write (6, 16) ( L(J,K),J=1,2), COEF, C(K,I)
+C****
+C****   PRINT OUT BEAM WIDTH
+C****
+   23 CONTINUE
+C**     write (6, 29)
+C**     DO 24 JJ=1, 21
+C**     DZ = 0.50 * (JJ-11)
+C**     write (6, 30) DZ, DXX(JJ,I), DXY(JJ,I)
+C**24   CONTINUE
+C**29   FORMAT ('1', 3X, 'IMAGE SIZE ]XMAX](CM)', //2X, 'DZ (CM)',
+C**  1  2X, '  1-6  ', 2X, '  1-NR')
+C**30   FORMAT (F8.2, 2F9.3)
+      RETURN
+C****
+C****
+      ENTRY MPRNT( NEN )
+C****
+      IF( LPLT) WRITE(2,13) NEN, MM
+   18 FORMAT(   4X, 2A8, 10F11.3      )
+      IF( NEN .GT. 10 )  NEN = 10
+c      write (6, 14)
+      DO 8 K=1,8
+      IF( LPLT ) WRITE(2,18)(LX(J,K),J=1,2),(CXX(K,I),I=1,NEN)
+    8 CONTINUE
+c    8 write (6, 18)   ( LX(J,K),J=1,2),(CXX(K,I),I=1,NEN)
+c      write (6, 14 )
+C****
+      IF(MM .NE. 0 )  GO TO 5
+      DO 7 K=1,36
+c      IF( (K.EQ.5).OR.(K.EQ.11).OR.(K.EQ.19).OR.(K.EQ.29))
+c     1 write(6,14)
+      IF( LPLT ) WRITE(2,18) (L(J,K),J=1,2),(C(K,I),I=1,NEN )
+    7 CONTINUE
+c    7 write (6, 18) ( L(J,K),J=1,2),(C(K,I),I=1,NEN )
+      GO TO 19
+    5 DO 6 JJ=1,12
+      K = IX(JJ)
+      IF( LPLT ) WRITE(2,18) ( L(J,K),J=1,2), ( C(K,I), I=1,NEN)
+    6 CONTINUE
+c    6 write (6, 18) ( L(J,K),J=1,2),(C(K,I), I=1,NEN )
+C****
+C**** CHROMATIC ABERRATION COEFFICIENTS
+C**** CALCULATED ONLY FOR CASE OF NEN= 5 ENERGIES
+C****
+   19 CONTINUE
+      IF( NEN .NE. 5 ) RETURN
+      DEL = CXX(1,4)/CXX(1,3) - 1.
+      DO 9 I=1,6
+      IF( I .EQ. 1 ) K=2
+      IF( I .EQ. 2 ) GO TO 10
+      IF( I .EQ. 3 ) K=5
+      IF( I .EQ. 4 ) K=11
+      IF( I .EQ. 5 ) K=19
+      IF( I .EQ. 6 ) K=29
+      IF( I .GT. 2 ) GO TO 11
+      X1 =(CXX(K,1) - CXX(K,3))/100.
+      X2 =(CXX(K,2) - CXX(K,3))/100.
+      X4 =(CXX(K,4) - CXX(K,3))/100.
+      X5 =(CXX(K,5) - CXX(K,3))/100.
+      GO TO 12
+   11 X1 = C(K,1) - C(K,3)
+      X2 = C(K,2) - C(K,3)
+      X4 = C(K,4) - C(K,3)
+      X5 = C(K,5) - C(K,3)
+   12 CD(I,1) = (8. *(X4-X2) - (X5-X1) )/(12.  *DEL)
+      CD(I,2) = (16.* (X4+X2) - (X5+X1) )/(24.  *DEL*DEL)
+      CD(I,3) = ( (X5-X1) - 2.*(X4-X2) )/(12.  *DEL**3)
+      CD(I,4) = ( (X5+X1) - 4.*(X4+X2) )/(24.  *DEL**4)
+      GO TO 9
+   10 Z1 =(CXX(4,1) - CXX(4,3))/100.
+      Z2 =(CXX(4,2) - CXX(4,3))/100.
+      Z4 =(CXX(4,4) - CXX(4,3))/100.
+      Z5 =(CXX(4,5) - CXX(4,3))/100.
+      TPSI = (8.* (Z4-Z2) - (Z5-Z1) ) / (8.* (X4-X2) - (X5-X1) )
+      PSI = 57.29578D0 * DATAN(TPSI)
+      DZ1 = Z1 - X1*TPSI
+      DZ2 = Z2 - X2*TPSI
+      DZ4 = Z4 - X4*TPSI
+      DZ5 = Z5 - X5*TPSI
+      CD(I,1) = -C(2,3)*( 8.*(DZ4-DZ2) - (DZ5-DZ1) )/(12.  *DEL)
+      CD(I,2) = -C(2,3)*( 16.*(DZ4+DZ2) - (DZ5+DZ1) )/(24.  *DEL*DEL)
+      CD(I,3) = -C(2,3)*( (DZ5-DZ1) - 2.*(DZ4-DZ2) )/(12.  *DEL**3)
+      CD(I,4) = -C(2,3)*( (DZ5+DZ1) - 4.*(DZ4+DZ2) )/(24.  *DEL**4)
+    9 CONTINUE
+c      write (6, 14)
+c      write (6, 17) PSI, (I,I=1,4), ( (CD(K,I),I=1,4), K=1,6 )
+      IF( LPLT ) WRITE(2,17) PSI, (I,I=1,4), ( ( CD(K,I),I=1,4), K=1,6 )
+   17 FORMAT(4X,'PSI            =', F11.3,/4X,'N              =',4(I7,
+     1  4X),/4X,'X/D**N         =',4F11.3,/4X,'X/T*D**N       =',4F11.3,
+     2      /4X,'X/T**2*D**N    =',4X,1P4E11.3,
+     3      /4X,'X/T**3*D**N    =',4X,1P4E11.3,
+     4      /4X,'X/T**4*D**N    =',4X,1P4E11.3,
+     5      /4X,'X/T**5*D**N    =',4X,1P4E11.3             )
+      RETURN
+      END
+
+      SUBROUTINE MULT   ( NO, NP, T, TP ,NUM )
+C****
+C****
+C**** MULTIPOLE     RAY TRACING BY NUMERICAL INTEGRATION OF DIFFERENTIAL
+C**** EQUATIONS OF MOTION.
+C     T = TIME
+C     TC(1) TO TC(6) =  ( X, Y, Z, VX, VY, VZ )
+C     DTC(1) TO DTC(6) = ( VX, VY, VZ, VXDOT, VYDOT, VZDOT )
+C****
+C****
+      IMPLICIT REAL*8(A-H,O-Z)
+      REAL*8  LF, K, L
+      COMMON  /BLCK 0/  DATA , ITITLE
+      COMMON  /BLCK 4/  ENERGY, VEL, PMASS, Q0
+      COMMON  /BLCK 5/  XA, YA, ZA, VXA, VYA, VZA
+      COMMON  /BLCK10/  BX, BY, BZ, K, TC, DTC
+      COMMON  /BLK100/  W, L, D, DG, S, BF, BT
+      COMMON  /BLK101/  C0, C1, C2, C3, C4, C5, C6, C7, C8
+      DIMENSION DATA(  75,200 ), ITITLE(200)
+      DIMENSION TC(6), DTC(6), DS(6), ES(6)
+      EXTERNAL BMULT
+C**** DATA  C/ 3.D10/
+C****
+      LF   = DATA(  1,NO )
+      DG   = DATA(  2,NO )
+      A    = DATA( 10,NO )
+      B    = DATA( 11,NO )
+      L    = DATA( 12,NO )
+      W    = DATA( 13,NO )
+      D    = DATA( 14,NO )
+      BF   = DATA( 15,NO )
+      Z1   = DATA( 16,NO )
+      Z2   = DATA( 17,NO )
+      C0   = DATA( 20,NO )
+      C1   = DATA( 21,NO )
+      C2   = DATA( 22,NO )
+      C3   = DATA( 23,NO )
+      C4   = DATA( 24,NO )
+      C5   = DATA( 25,NO )
+      C6   = DATA( 26,NO )
+      C7   = DATA( 27,NO )
+      C8   = DATA( 28,NO )
+      DTF = LF/VEL
+      BX = 0.
+      BY = 0.
+      BZ = 0.
+      BT = 0.
+      S = 0.
+C****
+      IF( NP  .GT. 100 ) GO TO 5
+c      write (6, 100) ITITLE(NO)
+  100 FORMAT(  ' MULTIPOLE  ****  ', A4,'  *************************'/)
+c      write (6, 101)
+  101 FORMAT( 8H    T CM ,18X, 4HX CM , 7X, 2HBX, 8X, 4HY CM , 7X, 2HBY,
+     1   8X, 4HZ CM, 7X, 2HBZ, 8X, 6HVELZ/C , 6X, 8HTHETA MR , 5X,
+     2   6HPHI MR , 6X, 1HB             )
+      CALL PRNT2 ( T,S,XA   ,YA   ,ZA   ,BX,BY,BZ,BT,VXA  ,VYA  ,VZA   )
+c      write (6, 103)
+  103 FORMAT(   '0COORDINATE TRANSFORMATION TO CENTERED AXIS SYSTEM ' )
+  109 FORMAT(   '0COORDINATE TRANSFORMATION TO D AXIS SYSTEM '       )
+C**** TRANSFORM FROM INITIAL ENTRANCE COORDINATES TO VFB COORD.
+C****
+    5 TC(1) =  XA
+      TC(2) = YA
+      TC(3) = ZA - (A+L/2.)
+      TC(4) =  VXA
+      TC(5) =  VYA
+      TC(6) =  VZA
+      CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 2
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+C****
+C**** TRANSLATE PARTICLE TO START OF FIRST FRINGE FIELD
+C****
+      TDT = ( Z1 - TC(3)  ) /DABS( TC(6) )
+C****
+      TC(1) = TC(1) + TDT * TC(4)
+      TC(2) = TC(2) + TDT * TC(5)
+      TC(3) = TC(3) + TDT * TC(6)
+      T = T + TDT
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 2
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+C****
+c      IF( NP  .LE. 100) write (6, 104)
+  104 FORMAT( 24H0MULTIPOLE FIELD REGION  )
+      CALL FNMIRK( 6, T, DTF ,TC, DTC, DS, ES, BMULT, 0    )
+      NSTEP = 0
+    6 CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      DO 7 I = 1, NP
+      CALL FNMIRK( 6, T, DTF ,TC, DTC, DS, ES, BMULT, 1    )
+      NSTEP = NSTEP + 1
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 2
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+      IF (NSTEP  .GT.  200)  GO TO 99
+      IF( Z2  .LE. TC(3) ) GO TO 8
+    7 CONTINUE
+      GO TO 6
+    8 CONTINUE
+      XDTF  =-( TC(3) - Z2  ) /DABS( TC(6) )
+      CALL FNMIRK( 6, T,XDTF ,TC, DTC, DS, ES,BMULT,  0    )
+      CALL FNMIRK( 6, T,XDTF ,TC, DTC, DS, ES,BMULT,  1    )
+      CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 2
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+c      IF( NP  .LE. 100) write (6, 105) NSTEP
+  105 FORMAT( 10H   NSTEPS= ,I5 )
+C****
+C**** TRANSFORM TO OUTPUT SYSTEM COORD.
+C****
+      TC(3) = TC(3) - (B+L/2.)
+c      IF( NP  .LE. 100) write (6, 109)
+      CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+C****
+C**** TRANSLATE PARTICLE TO OUT SYSTEM COORD.
+C****
+      TDT = -TC(3) /DABS( TC(6) )
+      TC(1) = TC(1) + TDT * TC(4)
+      TC(2) = TC(2) + TDT * TC(5)
+      TC(3) = TC(3) + TDT * TC(6)
+      T = T + TDT
+      TP = T * VEL
+      BX = 0.
+      BY = 0.
+      BZ = 0.
+      BT = 0.
+      S  = 0.
+      VXF    = 1000. *DATAN2( TC(4), TC(6)  )
+      VYF    = 1000. *DASIN ( TC(5)/ VEL    )
+      VZF    = TC(6) / VEL
+c      IF(NP.LE.100) write (6,115) TP,TC(1),TC(2),TC(3),VZF,VXF,VYF
+  115 FORMAT( F10.4, 10X, F10.3, 11X, F10.3, 11X, F10.3, 11X,
+     1   F13.5, F13.2, F11.2                   )
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 3
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+C****
+C**** CALCULATE INTERCEPTS IN SYSTEM D
+C****
+C****
+C****
+      Z0X = -TC(1)/ ( TC(4) / TC(6)    + 1.E-10 )
+      Z0Y = -TC(2)/ ( TC(5) / TC(6)    + 1.E-10 )
+c      IF(NP.LE.100) write (6,111) VXF, VYF, Z0X, Z0Y
+  111 FORMAT( / ' INTERSECTIONS WITH VER. AND HOR. PLANES '          ,
+     X       /15X, 5H  XP=,F10.4, 10H MR    YP=,F10.4, 3H MR  /
+     1        15X, 5H Z0X=,F10.2, 10H CM   Z0Y=,F10.2, 3H CM  /        )
+      RETURN
+   99 CALL PRNT4(NO, IN)
+      RETURN
+      END
+
+
+      SUBROUTINE MULTPL ( NO, NP, T, TP ,NUM )
+C****
+C****
+C**** QUADRUPOLE    RAY TRACING BY NUMERICAL INTEGRATION OF DIFFERENTIAL
+C**** EQUATIONS OF MOTION.
+C     T = TIME
+C     TC(1) TO TC(6) =  ( X, Y, Z, VX, VY, VZ )
+C     DTC(1) TO DTC(6) = ( VX, VY, VZ, VXDOT, VYDOT, VZDOT )
+C****
+C****
+      IMPLICIT REAL*8(A-H,O-Z)
+      REAL*8  LF1, LF2, LU1, K, L
+      COMMON  /BLCK 0/  DATA , ITITLE
+      COMMON  /BLCK 4/  ENERGY, VEL, PMASS, Q0
+      COMMON  /BLCK 5/  XA, YA, ZA, VXA, VYA, VZA
+      COMMON  /BLCK 7/ NCODE
+      COMMON  /BLCK10/  BX, BY, BZ, K, TC, DTC
+      COMMON  /BLCK50/  D,BGRAD, S, BT
+      COMMON  /BLCK51/  C0, C1, C2, C3, C4, C5
+      COMMON  /BLCK52/  IN
+      DIMENSION DATA(  75,200 ), ITITLE(200)
+      DIMENSION TC(6), DTC(6), DS(6), ES(6)
+      EXTERNAL  BFLD
+C**** DATA  C/ 3.D10/
+C****
+      LF1  = DATA(  1,NO )
+      LU1  = DATA(  2,NO )
+      LF2  = DATA(  3,NO )
+      A    = DATA( 10,NO )
+      B    = DATA( 11,NO )
+      L    = DATA( 12,NO )
+      RAD  = DATA( 13,NO )
+      BF   = DATA( 14,NO )
+      Z11  = DATA( 15,NO )
+      Z12  = DATA( 16,NO )
+      Z21  = DATA( 17,NO )
+      Z22  = DATA( 18,NO )
+      DTF1= LF1/ VEL
+      DTF2= LF2/ VEL
+      DTU = LU1/ VEL
+      D = 2. * RAD
+      BGRAD = (-1)**NCODE * BF/RAD**NCODE
+      BX = 0.
+      BY = 0.
+      BZ = 0.
+      BT = 0.
+      S = 0.
+C****
+      IF( NP  .GT. 100 ) GO TO 5
+  201 FORMAT(  ' QUADRUPOLE  ****  ', A4, '  ***********************'/)
+  202 FORMAT(  ' HEXAPOLE    ****  ', A4, '  ***********************'/)
+  203 FORMAT(  ' OCTAPOLE    ****  ', A4, '  ***********************'/)
+  204 FORMAT(  ' DECAPOLE    ****  ', A4, '  ***********************'/)
+      GO TO ( 21, 22, 23, 24 ) , NCODE
+   21 CONTINUE
+c   21 write (6, 201) ITITLE(NO)
+      GO TO 25
+   22 CONTINUE
+c   22 write (6, 202) ITITLE(NO)
+      GO TO 25
+   23 CONTINUE
+c   23 write (6, 203) ITITLE(NO)
+      GO TO 25
+   24 CONTINUE
+c   24 write (6, 204) ITITLE(NO)
+   25 CONTINUE
+c   25 write (6, 101)
+  101 FORMAT( 8H    T CM ,18X, 4HX CM , 7X, 2HBX, 8X, 4HY CM , 7X, 2HBY,
+     1   8X, 4HZ CM, 7X, 2HBZ, 8X, 6HVELZ/C , 6X, 8HTHETA MR , 5X,
+     2   6HPHI MR , 6X, 1HB             )
+      CALL PRNT2 ( T,S,XA   ,YA   ,ZA   ,BX,BY,BZ,BT,VXA  ,VYA  ,VZA   )
+c      write (6, 103)
+  103 FORMAT(   '0COORDINATE TRANSFORMATION TO B AXIS SYSTEM '       )
+  109 FORMAT(   '0COORDINATE TRANSFORMATION TO D AXIS SYSTEM '       )
+C**** TRANSFORM FROM INITIAL ENTRANCE COORDINATES TO VFB COORD.
+C****
+    5 TC(1) = -XA
+      TC(2) = YA
+      TC(3) = A - ZA
+      TC(4) = -VXA
+      TC(5) = VYA
+      TC(6) = -VZA
+      CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 2
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+C****
+C**** TRANSLATE PARTICLE TO START OF FIRST FRINGE FIELD
+C****
+      TDT = ( TC(3) - Z11 ) /DABS( TC(6) )
+C****
+      TC(1) = TC(1) + TDT * TC(4)
+      TC(2) = TC(2) + TDT * TC(5)
+      TC(3) = TC(3) + TDT * TC(6)
+      T = T + TDT
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 2
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+C****
+C**** IN DESIGNATES FIELD REGIONS FOR QUADRUPOLE
+C****
+      IN = 1
+      C0   = DATA( 19,NO )
+      C1   = DATA( 20,NO )
+      C2   = DATA( 21,NO )
+      C3   = DATA( 22,NO )
+      C4   = DATA( 23,NO )
+      C5   = DATA( 24,NO )
+c      IF( NP  .LE. 100) write (6, 104)
+  104 FORMAT( 22H0FRINGING FIELD REGION    )
+      CALL FNMIRK( 6, T, DTF1,TC, DTC, DS, ES, BFLD , 0    )
+      NSTEP = 0
+    6 CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      DO 7 I = 1, NP
+      CALL FNMIRK( 6, T, DTF1,TC, DTC, DS, ES, BFLD , 1    )
+      NSTEP = NSTEP + 1
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 2
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+      IF (NSTEP  .GT.  200)  GO TO 99
+      IF( Z12 .GE. TC(3) ) GO TO 8
+    7 CONTINUE
+      GO TO 6
+    8 CONTINUE
+      XDTF1 =-( Z12 - TC(3) ) /DABS( TC(6) )
+      CALL FNMIRK( 6, T,XDTF1,TC, DTC, DS, ES,BFLD ,  0    )
+      CALL FNMIRK( 6, T,XDTF1,TC, DTC, DS, ES,BFLD ,  1    )
+      CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 2
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+c      IF( NP  .LE. 100) write (6, 105) NSTEP
+  105 FORMAT( 10H   NSTEPS=  ,I5 )
+C***
+C***  UNIFORM FIELD REGION
+C**** TRANSFORM TO SECOND VFB COORD SYSTEM
+C***
+      BGRAD = (-1)**NCODE *  BGRAD
+      TC(1) = -TC(1)
+      TC(3) = -TC(3) - L
+      TC(4) = -TC(4)
+      TC(6) = -TC(6)
+C****
+C****
+C**** UNIFORM FIELD INTEGRATION REGION
+C****
+C****
+      IN = 2
+c      IF( NP  .LE. 100) write (6, 106)
+  106 FORMAT(   '0UNIFORM FIELD REGION IN C AXIS SYSTEM '  )
+      IF( TC(3)  .LT.  Z21 ) GO TO 15
+C****
+C**** THIS SECTION CORRECTS FOR MAGNETS WHOSE FRINGING FIELDS INTERSECT
+C****
+c      IF( NP  .LE. 100) write (6, 102)
+  102 FORMAT( / '   INTEGRATE BACKWARDS    '  )
+      CALL FNMIRK( 6, T,-DTU ,TC, DTC, DS, ES, BFLD,  0    )
+      NSTEP = 0
+   16 CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      DO 17  I =1, NP
+      CALL FNMIRK( 6, T,-DTU, TC, DTC, DS, ES, BFLD,  1    )
+      NSTEP = NSTEP + 1
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 3
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+      IF (NSTEP  .GT.  200)  GO TO 99
+      IF( TC(3)  .LE.  Z21 )  GO TO 18
+   17 CONTINUE
+      GO TO 16
+   18 CONTINUE
+      XDTU  = ( Z21 - TC(3) ) /DABS( TC(6) )
+      CALL FNMIRK( 6, T,XDTU ,TC, DTC, DS, ES, BFLD,  0    )
+      CALL FNMIRK( 6, T,XDTU ,TC, DTC, DS, ES, BFLD,  1    )
+      CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 3
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+c      IF( NP  .LE. 100) write (6, 105) NSTEP
+c      IF( NP  .LE. 100) write (6, 107)
+  107 FORMAT( / )
+C%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+C%%%%
+      IF(TC(3).GE.Z21) GO TO 11
+      GO TO 9
+C%%%% GO TO 19    ...   REMOVED IN FAVOR OF ABOVE TWO STATEMENTS  T.M.C.
+C%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+C****
+C****
+   15 CONTINUE
+      CALL FNMIRK( 6, T, DTU ,TC, DTC, DS, ES, BFLD , 0    )
+      NSTEP = 0
+    9 CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      DO 10  I =1, NP
+      CALL FNMIRK( 6, T, DTU ,TC, DTC, DS, ES, BFLD , 1    )
+      NSTEP = NSTEP + 1
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 3
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+      IF (NSTEP  .GT.  200)  GO TO 99
+   19 CONTINUE
+      IF( TC(3)  .GE.  Z21 )  GO TO 11
+   10 CONTINUE
+      GO TO 9
+   11 CONTINUE
+      XDTU  = ( Z21 - TC(3) ) /DABS( TC(6) )
+      CALL FNMIRK( 6, T,XDTU ,TC, DTC, DS, ES,BFLD ,  0    )
+      CALL FNMIRK( 6, T,XDTU ,TC, DTC, DS, ES,BFLD ,  1    )
+      CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 3
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+c      IF( NP  .LE. 100) write (6, 105) NSTEP
+C***
+C***
+C**** SETUP FOR SECOND FRINGE FIELD AND INTEGRATION
+C****
+C****
+      C0   = DATA( 25,NO )
+      C1   = DATA( 26,NO )
+      C2   = DATA( 27,NO )
+      C3   = DATA( 28,NO )
+      C4   = DATA( 29,NO )
+      C5   = DATA( 30,NO )
+      IN = 3
+c      IF( NP  .LE. 100) write (6, 104)
+      CALL FNMIRK( 6, T, DTF2,TC, DTC, DS, ES, BFLD , 0    )
+      NSTEP = 0
+   12 CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      DO 13  I =1, NP
+      CALL FNMIRK( 6, T, DTF2,TC, DTC, DS, ES, BFLD , 1    )
+      NSTEP = NSTEP + 1
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 3
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+      IF (NSTEP  .GT.  200)  GO TO 99
+      IF( TC(3) .GE. Z22 )  GO TO 14
+   13 CONTINUE
+      GO TO 12
+   14 CONTINUE
+      XDTF2 = ( Z22 - TC(3) ) / TC(6)
+      CALL FNMIRK( 6, T,XDTF2,TC, DTC, DS, ES, BFLD , 0    )
+      CALL FNMIRK( 6, T,XDTF2,TC, DTC, DS, ES, BFLD , 1    )
+      CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 3
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+c      IF( NP  .LE. 100) write (6, 105) NSTEP
+C****
+C**** TRANSFORM TO OUTPUT SYSTEM COORD.
+C****
+      TC(3) = TC(3) - B
+c      IF( NP  .LE. 100) write (6, 109)
+      CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+C****
+C**** TRANSLATE PARTICLE TO OUT SYSTEM COORD.
+C****
+      TDT = -TC(3) /DABS( TC(6) )
+      TC(1) = TC(1) + TDT * TC(4)
+      TC(2) = TC(2) + TDT * TC(5)
+      TC(3) = TC(3) + TDT * TC(6)
+      T = T + TDT
+      TP = T * VEL
+      BX = 0.
+      BY = 0.
+      BZ = 0.
+      BT = 0.
+      S  = 0.
+      VXF    = 1000. *DATAN2( TC(4), TC(6)  )
+      VYF    = 1000. *DASIN ( TC(5)/ VEL    )
+      VZF    = TC(6) / VEL
+c      IF(NP.LE.100) write (6, 115)TP,TC(1),TC(2),TC(3),VZF,VXF,VYF
+  115 FORMAT( F10.4, 10X, F10.3, 11X, F10.3, 11X, F10.3, 11X,
+     1   F13.5, F13.2, F11.2                   )
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 4
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+C****
+C**** CALCULATE INTERCEPTS IN SYSTEM D
+C****
+C****
+C****
+      Z0X = -TC(1)/ ( TC(4) / TC(6)    + 1.E-10 )
+      Z0Y = -TC(2)/ ( TC(5) / TC(6)    + 1.E-10 )
+c      IF( NP  .LE. 100) write (6, 111) VXF, VYF, Z0X, Z0Y
+  111 FORMAT( / ' INTERSECTIONS WITH VER. AND HOR. PLANES '          ,
+     X       /15X, 5H  XP=,F10.4, 10H MR    YP=,F10.4, 3H MR  /
+     1        15X, 5H Z0X=,F10.2, 10H CM   Z0Y=,F10.2, 3H CM  /        )
+      RETURN
+   99 CALL PRNT4 (NO, IN)
+      RETURN
+      END
+
+
+      SUBROUTINE BDIP
+C****
+C****
+C**** MTYP=1  :    UNIFORM FIELD STANDARD APPROXIMATION
+C**** MTYP=2  :    UNIFORM FIELD MODIFIED ITERATIVE PROCEDURE
+C**** MTYP=3  :    NONUNIFORM FIELD STANDARD APPROXIMATION
+C**** MTYP=4  :    NONUNIFORM FIELD  B=BF/(1+N*DR/R)
+C**** MTYP=5  :    UNIFORM FIELD, CIRCULAR POLE OPTION
+C**** MTYP=6  :    PRETZEL MAGNET
+C****
+C**** THE RELATIONSHIP BETWEEN B0, ......... B12 AND B(I,J) RELATIVE TO
+C**** AXES (Z,X) IS GIVEN BY
+C****
+C****
+C****
+C**** B0  = B( 0, 0 )
+C**** B1  = B( 1, 0 )
+C**** B2  = B( 2, 0 )
+C**** B3  = B( 1, 1 )
+C**** B4  = B( 1,-1 )
+C**** B5  = B( 0, 1 )
+C**** B6  = B( 0, 2 )
+C**** B7  = B( 0,-1 )
+C**** B8  = B( 0,-2 )
+C**** B9  = B(-1, 0 )
+C**** B10 = B(-2, 0 )
+C**** B11 = B(-1, 1 )
+C**** B12 = B(-1,-1 )
+C****
+C****
+      IMPLICIT REAL*8(A-H,O-Z)
+      REAL*8  NDX, K
+      COMMON  /BLCK10/  BX, BY, BZ, K, TC, DTC
+      COMMON  /BLCK20/  NDX,BET1,GAMA,DELT,CSC
+      COMMON  /BLCK21/  RCA,DELS,BR,S2,S3,S4,S5,S6,S7,S8,SCOR
+      COMMON  /BLCK22/  D, DG, S, BF, BT
+      COMMON  /BLCK23/  C0, C1, C2, C3, C4, C5
+      COMMON  /BLCK24/  RB, XC, ZC
+      COMMON  /BLCK25/  IN, MTYP
+      DIMENSION TC(6), DTC(6)
+      DIMENSION XX(11), ZZ(11), DD(11)
+      DATA PI2   / 1.570796325D0       /
+      DATA PI4   / .7853981625D0       /
+      DATA RT2   /  1.41421356D0       /
+C****
+C****
+      GO TO ( 10,10,6,6,10,21 )     ,MTYP
+      CALL EXIT
+      RETURN
+    6 CALL NDIP
+      RETURN
+   21 CALL BPRETZ
+      RETURN
+C****
+C**** MTYP = 1 , 2, 5
+C**** UNIFORM FIELD MAGNETS
+C****
+   10 CONTINUE
+      GO TO( 2, 1, 2, 4 ) , IN
+    7 CONTINUE
+c    7 write(6,8) IN
+    8 FORMAT(  35H0 ERROR -GO TO -  IN BFUN   IN=        ,I5  )
+    1 BX = 0.
+      BY = BF
+      BZ = 0.
+      BT = BF
+      RETURN
+    2 X = TC(1)
+      Y = TC(2)
+      Z = TC(3)
+      IF( MTYP .NE. 2 ) GO TO 9
+C****
+C**** MTYP=2  :    UNIFORM FIELD MODIFIED ITERATIVE PROCEDURE
+C****
+      XP = X
+      XP2 = XP*XP
+      XP3 = XP2*XP
+      XP4 = XP3 * XP
+      ZP = -(S2*XP2 + S3*XP3 + S4*XP4 + S5*XP4*XP + S6*XP4*XP2 +
+     1       S7*XP4*XP3 + S8*XP4*XP4 )
+      AZ = (Z-ZP)/5.D0
+      DO 11 I=1,11
+      XP    = X + AZ*(I-6)
+      XP2 = XP*XP
+      XP3 = XP2*XP
+      XP4 = XP3*XP
+      ZP = -(S2*XP2 + S3*XP3 + S4*XP4 + S5*XP4*XP + S6*XP4*XP2 +
+     1       S7*XP4*XP3 + S8*XP4*XP4 )
+      XXP = X-XP
+      ZZP = Z-ZP
+      XX(I) = XP
+      ZZ(I) = ZP
+      DD(I) = ( XXP*XXP + ZZP*ZZP )
+   11 CONTINUE
+C****
+C**** SEARCH FOR SHORTEST OF THE 11 DISTANCES
+C****
+      XP = XX(1)
+      ZP = ZZ(1)
+      DP = DD(1)
+      DO 12 I=2,11
+      IF( DD(I) .GE. DP ) GO TO 12
+      XP = XX(I)
+      ZP = ZZ(I)
+      DP = DD(I)
+   12 CONTINUE
+C****
+C****  DIVIDE INTERVAL AND REPEAT FOR MORE EXACT
+C****  SHORTEST DISTANCE.
+C****
+      AZ = AZ/5.D0
+      X1 = XP
+      DO 13 I=1,11
+      XP    = X1+ AZ*(I-6)
+      XP2 = XP*XP
+      XP3 = XP2*XP
+      XP4 = XP3*XP
+      ZP = -(S2*XP2 + S3*XP3 + S4*XP4 + S5*XP4*XP + S6*XP4*XP2 +
+     1       S7*XP4*XP3 + S8*XP4*XP4 )
+      XXP = X-XP
+      ZZP = Z-ZP
+      XX(I) = XP
+      ZZ(I) = ZP
+      DD(I) = ( XXP*XXP + ZZP*ZZP )
+   13 CONTINUE
+C****
+C**** SEARCH FOR SHORTEST OF THE 11 DISTANCES
+C****
+      XP = XX(1)
+      ZP = ZZ(1)
+      DP = DD(1)
+      DO 15 I=2,11
+      IF( DD(I) .GE. DP ) GO TO 15
+      XP = XX(I)
+      ZP = ZZ(I)
+      DP = DD(I)
+   15 CONTINUE
+C****
+C**** ITERATION LOOP FOR MORE EXACT SHORTEST DISTANCE
+C****
+C*    ZSIGN = Z-ZP
+C*    XP2 = XP*XP
+C*    XP3 = XP2*XP
+C*    XP4 = XP3*XP
+C*    DO 13 I=1,3
+C****
+C**** SLOPE OF CURVE AT XP, ZP
+C****
+C*    DZDXC = -(2.*S2*XP + 3.*S3*XP2+ 4.*S4*XP3 + 5.*S5*XP4 +
+C*   1   6.*S6*XP4*XP + 7.*S7*XP4*XP2 + 8.*S8*XP4*XP3 )
+C****
+C**** NEXT APPROXIMATION TO CLOSEST POINT IS
+C****
+C*    XP = ( DZDXC*(Z-ZP)  +  DZDXC*DZDXC*XP + X ) / (1.+DZDXC*DZDXC)
+C*    IF( I  .EQ.  1 )  XP = (3.*XP +  X ) / 4.
+C*    XP2 = XP*XP
+C*    XP3 = XP2*XP
+C*    XP4 = XP3*XP
+C*    ZP = -( S2*XP2 + S3*XP3 + S4*XP4 + S5*XP4*XP + S6*XP4*XP2 +
+C*   1   S7*XP4*XP3 + S8*XP4*XP4 )
+C* 13 CONTINUE
+C*    XXP = X-XP
+C*    ZZP = Z-ZP
+C****
+C****
+      ZSIGN = Z-ZP
+      XP2 = XP*XP
+      XP3 = XP2*XP
+      XP4 = XP3*XP
+      S = DSIGN( 1.D0,ZSIGN) * DSQRT(DP)                 / D + DELS
+      SCON = S
+C****
+C**** TRIM CORRECTION FOR EFFECTIVE EDGE CURVATURE
+C****
+      DZDXC = -(2.*S2*XP + 3.*S3*XP2+ 4.*S4*XP3 + 5.*S5*XP4 +
+     1   6.*S6*XP4*XP + 7.*S7*XP4*XP2 + 8.*S8*XP4*XP3 )
+      DZDXC2= -(2.*S2+6.*S3*XP +12.*S4*XP2 +20.*S5*XP3 +30.*S6*XP4 +
+     1         42.*S7*XP4*XP +56.*S8*XP4*XP2 )
+      RCR = DZDXC2 / DSQRT( 1.D0 + DZDXC*DZDXC ) **3
+      S = S + SCOR*D*RCR
+      S0 = S
+      CALL BDPP( B0, Z, X, Y )
+      IF( Y .NE. 0. ) GO TO 14
+      BX = 0.
+      BY = B0
+      BZ = 0.
+      BT = B0
+      RETURN
+   14 GD = DG/D
+      DELTA = DATAN(DZDXC)
+      SCON = (1.D0 + SCON*D*RCR) *GD*DG*RCR/2.D0
+      DCS = DCOS( DELTA         )
+      S = S0-  SCON*( 1.D0 - DCS*DCS ) +      GD*DCS
+      CALL BDPP( B1 , Z, X, Y )
+      S =S0-4.*SCON*( 1.D0 - DCS*DCS ) +   2.*GD*DCS
+      CALL BDPP( B2 , Z, X, Y )
+      S = S0-  SCON*( 1.D0 - DCS*DCS ) -      GD*DCS
+      CALL BDPP( B9 , Z, X, Y )
+      S =S0-4.*SCON*( 1.D0 - DCS*DCS ) -   2.*GD*DCS
+      CALL BDPP( B10, Z, X, Y )
+      DCS = DCOS( DELTA + PI4   )
+      S =S0-2.*SCON*( 1.D0 - DCS*DCS ) +  RT2*GD*DCS
+      CALL BDPP( B3 , Z, X, Y )
+      S =S0-2.*SCON*( 1.D0 - DCS*DCS ) -  RT2*GD*DCS
+      CALL BDPP( B12, Z, X, Y )
+      DCS = DCOS( DELTA - PI4   )
+      S =S0-2.*SCON*( 1.D0 - DCS*DCS ) +  RT2*GD*DCS
+      CALL BDPP( B4 , Z, X, Y )
+      S =S0-2.*SCON*( 1.D0 - DCS*DCS ) -  RT2*GD*DCS
+      CALL BDPP( B11, Z, X, Y )
+      DCS = DCOS( DELTA + PI2   )
+      S = S0-  SCON*( 1.D0 - DCS*DCS ) +      GD*DCS
+      CALL BDPP( B5 , Z, X, Y )
+      S =S0-4.*SCON*( 1.D0 - DCS*DCS ) +   2.*GD*DCS
+      CALL BDPP( B6 , Z, X, Y )
+      S = S0-  SCON*( 1.D0 - DCS*DCS ) -      GD*DCS
+      CALL BDPP( B7 , Z, X, Y )
+      S =S0-4.*SCON*( 1.D0 - DCS*DCS ) -   2.*GD*DCS
+      CALL BDPP( B8 , Z, X, Y )
+      GO TO 5
+    9 CALL BDPP ( B0, Z, X, Y )
+      S0 = S
+      IF( Y .NE. 0. )   GO TO 3
+      BX = 0.
+      BY = B0
+      BZ = 0.
+      BT = B0
+      RETURN
+    3 CALL BDPP ( B1 , Z + DG, X , Y )
+      CALL BDPP ( B2 , Z + 2.*DG, X , Y )
+      CALL BDPP ( B3 , Z + DG, X + DG , Y )
+      CALL BDPP ( B4 , Z + DG, X - DG , Y )
+      CALL BDPP ( B5 , Z , X + DG , Y )
+      CALL BDPP ( B6 , Z , X + 2.*DG , Y )
+      CALL BDPP ( B7 , Z , X - DG , Y )
+      CALL BDPP ( B8 , Z , X - 2.*DG , Y )
+      CALL BDPP ( B9 , Z - DG, X , Y )
+      CALL BDPP ( B10, Z - 2.*DG, X , Y )
+      CALL BDPP ( B11, Z - DG, X + DG , Y )
+      CALL BDPP ( B12, Z - DG, X - DG , Y )
+    5 CONTINUE
+      S = S0
+      YG1 = Y/DG
+      YG2 = YG1**2
+      YG3 = YG1**3
+      YG4 = YG1**4
+      BX = YG1 * ( (B5-B7)*2./3. - (B6-B8)/12. )  +
+     1     YG3*( (B5-B7)/6. - (B6-B8)/12. -
+     2     (B3 + B11 - B4 - B12 - 2.*B5 + 2.*B7 ) / 12. )
+      BY = B0 - YG2*( ( B1 + B9 + B5 + B7 - 4.*B0 ) *2./3. -
+     1     ( B2 + B10 + B6 + B8 - 4.*B0 ) / 24. ) +
+     2     YG4* (-( B1 + B9 + B5 + B7 - 4.*B0 ) / 6. +
+     3     ( B2 + B10 + B6 + B8 - 4.*B0 ) / 24. +
+     4     ( B3 + B11 + B4 + B12 - 2.*B1 - 2.*B9 -
+     5     2.*B5 - 2.*B7 + 4.*B0 ) / 12. )
+      BZ = YG1*( (B1 - B9 ) *2./3. - ( B2 - B10 ) /12. ) +
+     1     YG3*( ( B1 - B9 ) / 6. - ( B2 - B10 ) / 12. -
+     2     ( B3 + B4 - B11 - B12 - 2.*B1 + 2.*B9 ) / 12.  )
+      BT = DSQRT(BX*BX + BY*BY + BZ*BZ)
+      RETURN
+    4 BX = 0.
+      BY = BR
+      BZ = 0.
+      BT = BR
+      RETURN
+      END
+
+
+      SUBROUTINE  BDPP ( BFLD, Z, X, Y )
+C****
+C****
+C****
+C**** MTYP=1  :    UNIFORM FIELD STANDARD APPROXIMATION
+C**** MTYP=2  :    UNIFORM FIELD MODIFIED ITERATIVE PROCEDURE
+C****              MORE ACCURATE 3'RD AND HIGHER ORDER CURVATURES
+C**** MTYP=5  :    UNIFORM FIELD, CIRCULAR POLE OPTION
+C****
+C****
+      IMPLICIT REAL*8(A-H,O-Z)
+      REAL*8  NDX, K
+      COMMON  /BLCK10/  BX, BY, BZ, K, TC, DTC
+      COMMON  /BLCK20/  NDX,BET1,GAMA,DELT,CSC
+      COMMON  /BLCK21/  RCA,DELS,BR,S2,S3,S4,S5,S6,S7,S8,SCOR
+      COMMON  /BLCK22/  D, DG, S, BF, BT
+      COMMON  /BLCK23/  C0, C1, C2, C3, C4, C5
+      COMMON  /BLCK24/  RB, XC, ZC
+      COMMON  /BLCK25/  IN, MTYP
+      DIMENSION TC(6), DTC(6)
+C****
+      GO TO (10,13,6,6,11 ) ,MTYP
+    6 CALL EXIT
+      RETURN
+C****
+C**** MTYP=1  :    UNIFORM FIELD STANDARD APPROXIMATION
+C****
+   10 X2=X*X
+      X3=X*X2
+      X4=X*X3
+      S = (    Z   +S2*X2 + S3*X3 + S4*X4 + S5*X*X4 + S6*X2*X4 +
+     1   S7*X3*X4 + S8*X4*X4  ) / D + DELS
+      GO TO 13
+C****
+C**** MTYP=5  :    UNIFORM FIELD, CIRCULAR POLE OPTION
+C****
+   11 IF( DABS(RCA)  .GE. 1.D-08  ) GO TO 12
+      S = Z/D + DELS
+      GO TO 13
+   12 A = 1./RCA
+      S = ( DSIGN(1.D0,A) * DSQRT( (Z+A)**2 + X*X ) - A ) / D + DELS
+   13 CS=C0+S*(C1+S*(C2+S*(C3+S*(C4+S*C5))))
+      IF( DABS(CS)  .GT.  70.  )  CS =DSIGN( 70.D0 ,CS  )
+      E=DEXP(CS)
+      P0 = 1.0 + E
+      DB=BF-BR
+      BFLD=BR + DB/P0
+C****
+C**** write (6, 100) X, Y, Z,  DR, S, BFLD
+C*100 FORMAT( 1P6D15.4 )
+C****
+      RETURN
+      END
+
+
+      SUBROUTINE BEFN (F,Z,X,Y,DR,IBEX)
+C****
+C****
+C****    CALCULATES S, THEN DETERMINES B (OR E) FIELD.
+C****
+C****
+C****
+C**** IBEX = 0   MAGNETIC FIELD COMPONENTS
+C****      = 1   ELECTRIC FIELD COMPONENTS
+C****
+      IMPLICIT  REAL*8 (A-H,O-Z)
+      REAL*8 NDX
+      COMMON /BLCK71/  CB0,CB1,CB2,CB3,CB4,CB5
+      COMMON /BLCK72/  CE0,CE1,CE2,CE3,CE4,CE5
+      COMMON /BLCK73/  IN,NFLAG
+      COMMON /BLCK74/  BF,EF,S,DG
+      COMMON /BLCK75/  BC2,BC4,EC2,EC4
+      COMMON /BLCK76/  DB,DE,WB,WE
+      COMMON /BLCK77/  RB,NDX
+C****
+      IF (IBEX .NE. 0 ) GO TO 10
+C****
+C**** MAGNETIC FIELD COMPONENTS
+C****
+      F1 = BF
+      D = DB
+      C02 = BC2
+      C04 = BC4
+      W2 = WB*WB
+      C0 = CB0
+      C1 = CB1
+      C2 = CB2
+      C3 = CB3
+      C4 = CB4
+      C5 = CB5
+      GO TO 20
+C****
+C**** ELECTRIC FIELD COMPONENTS
+C****
+   10 F1 = EF
+      IF( IN .EQ. 1 ) F1 = -EF
+      D = DE
+      C02 = EC2
+      C04 = EC4
+      W2 = WE*WE
+      C0 = CE0
+      C1 = CE1
+      C2 = CE2
+      C3 = CE3
+      C4 = CE4
+      C5 = CE5
+   20 ZD1 = Z/D
+      ZD2 = C02*ZD1*X*X/W2
+      W4 = W2*W2
+      ZD3 = C04*(X**4)/W4
+      S = ZD1+ZD2+ZD3
+      CS = C0+S*(C1+S*(C2+S*(C3+S*(C4+S*C5))))
+      IF ( DABS(CS) .GT. 70. ) CS = DSIGN ( 70.D0,CS )
+      E = DEXP(CS)
+      P0 = 1.0+E
+      F = F1/P0
+      IF( IBEX  .EQ.  1) RETURN
+      IF( NFLAG .EQ.  1) F=F*(1.D0 - (F/F1)*NDX*DR/RB)
+      RETURN
+      END
+
+
+      SUBROUTINE BEVC
+C****
+C****  CALCULATES B AND E FIELDS
+C****
+C****
+C****
+C**** NFLAG = 0      UNIFORM FIELD MAGNETIC DIPOLE
+C****       = 1  NON-UNIFORM FIELD MAGNETIC DIPOLE
+      IMPLICIT     REAL*8 (A-H,O-Z)
+      REAL*8 K,NDX
+      COMMON /BLCK10/  BX, BY, BZ, K, TC, DTC
+      COMMON /BLCK11/  EX, EY, EZ, QMC, IVEC
+      COMMON /BLCK71/  CB0,CB1,CB2,CB3,CB4,CB5
+      COMMON /BLCK72/  CE0,CE1,CE2,CE3,CE4,CE5
+      COMMON /BLCK73/  IN,NFLAG
+      COMMON /BLCK74/  BF,EF,S,DG
+      COMMON /BLCK77/  RB,NDX
+      DIMENSION TC(6),DTC(6),BEF(3)
+C****
+      GO TO (2,1,2) , IN
+c      write (6,  100) IN
+  100 FORMAT (  35H0 ERROR -GO TO -  IN BFUN   IN=     ,I5 )
+C****
+C**** UNIFORM FIELD REGION
+C****
+    1 BX = 0.
+      BY = BF
+      BZ = 0.
+      EX = EF
+      EY = 0.
+      EZ = 0.
+      IF( NFLAG .EQ. 0 ) RETURN
+      X = TC(1)
+      Y = TC(2)
+      Z = TC(3)
+      DR =X
+      RP = X+RB
+      IF( RP .LE. 0. ) RP = 1.D-20
+      DRR1 = DR/RB
+      IF( Y .NE. 0. )  GO TO 14
+C****
+C**** MID-PLANE UNIFORM FIELD REGION
+C****
+      BY = BF* ( 1. - NDX*DRR1 )
+      RETURN
+C****
+C**** NON MID-PLANE UNIFORM FIELD REGION
+C****
+   14 YR1 = Y/RB
+      YR2 = YR1*YR1
+      YR3 = YR2*YR1
+      YR4 = YR3*YR1
+      RR1 = RB/RP
+      RR2 = RR1*RR1
+      RR3 = RR2*RR1
+      BX  = BF*( -NDX*YR1 - (NDX*RR2 )*YR3/6. )
+      BY  = BF* ( 1.-NDX*DRR1+.5*YR2*NDX*RR1 - YR4*NDX*RR3/24. )
+      RETURN
+C****
+C**** FRINGE FIELD REGIONS:  FIND B AND E FIELDS
+C****
+    2 X = TC(1)
+      Y = TC(2)
+      Z = TC(3)
+      IF ( Y .EQ. 0. ) GO TO 3
+C****
+C**** MAGNETIC: NON-MIDPLANE REGION
+C****
+      CALL BEY( BEF,Z,X,Y,0 )
+      BX = BEF(1)
+      BY = BEF(2)
+      BZ = BEF(3)
+      GO TO 4
+C****
+C**** MAGNETIC:     MIDPLANE REGION
+C****
+    3 CONTINUE
+      IF( NFLAG .EQ. 0 ) GO TO 6
+      SINE = -1.
+      IF( IN .EQ. 3 ) SINE=1.
+      DR = X*SINE
+    6 CALL BEFN(B0,Z,X,Y,DR,0)
+      BX = 0.
+      BY = B0
+      BZ = 0.
+C****
+C**** NOW FIND E FIELD
+C****
+    4 IF ( X .EQ. 0 ) GO TO 5
+C****
+C**** ELECTRIC: NON-MIDPLANE REGION
+C****
+      CALL BEY( BEF,Z,Y,X,1 )
+      EX = BEF(2)
+      EY = BEF(1)
+      EZ = BEF(3)
+      RETURN
+C****
+C**** ELECTRIC:     MIDPLANE REGION
+C****
+    5 CALL BEFN ( B1,Z,Y,X,0.0d0,1 )
+      EX = B1
+      EY = 0.
+      EZ = 0.
+      RETURN
+      END
+
+      SUBROUTINE BEY (BEF,Z,X,Y,IBEX )
+C****
+C**** CALCULATE B OR E FIELD OFF THE MEDIAN PLANE
+C****
+C****
+C****
+C**** IBEX = 0   MAGNETIC FIELD COMPONENTS
+C****      = 1   ELECTRIC FIELD COMPONENTS
+C****
+      IMPLICIT  REAL*8 (A-H,O-Z)
+      REAL*8 NDX
+      COMMON /BLCK73/  IN,NFLAG
+      COMMON /BLCK74/  BF,EF,S,DG
+      COMMON /BLCK77/  RB,NDX
+      DIMENSION BEF(3)
+C****
+C****
+C**** NON MID-PLANE FRINGING FIELD REGION
+C****
+      IF( IBEX  .EQ. 1 ) GO TO 1
+      IF( NFLAG .EQ. 0 ) GO TO 1
+      SINE = -1.
+      IF( IN .EQ. 3 ) SINE=1.
+      DR0  = X*SINE
+      DR1  = SINE* X
+      DR2  = DR1
+      DR9  = DR1
+      DR10 = DR1
+      DR3  = SINE* ( X + DG )
+      DR5  = DR3
+      DR11 = DR3
+      DR4  = SINE*( X - DG )
+      DR7  = DR4
+      DR12 = DR4
+      DR6  = SINE* ( X + 2.*DG )
+      DR8  = SINE* ( X - 2.*DG )
+C****
+C****
+C****
+    1 CALL BEFN(F0,Z,X,Y,       DR0, IBEX )
+      CALL BEFN(F1,Z+DG,X,Y,    DR1, IBEX )
+      CALL BEFN(F2,Z+2.*DG,X,Y, DR2, IBEX )
+      CALL BEFN(F3,Z+DG,X+DG,Y, DR3, IBEX )
+      CALL BEFN(F4,Z+DG,X-DG,Y, DR4, IBEX )
+      CALL BEFN(F5,Z   ,X+DG,Y, DR5, IBEX )
+      CALL BEFN(F6,Z,X+2.*DG,Y, DR6, IBEX )
+      CALL BEFN(F7,Z,X-DG,Y,    DR7, IBEX )
+      CALL BEFN(F8,Z,X-2.*DG,Y, DR8, IBEX )
+      CALL BEFN(F9,Z-DG,X,Y,    DR9, IBEX )
+      CALL BEFN(F10,Z-2.*DG,X,Y,DR10,IBEX )
+      CALL BEFN(F11,Z-DG,X+DG,Y,DR11,IBEX )
+      CALL BEFN(F12,Z-DG,X-DG,Y,DR12,IBEX )
+C****
+      YG1 = Y/DG
+      YG2 = YG1**2
+      YG3 = YG1**3
+      YG4 = YG1**4
+C****
+      BEF(1) = YG1 * ( (F5-F7)*2./3. - (F6-F8)/12. ) +
+     1         YG3 * ( (F5-F7)/6. - (F6-F8)/12. -
+     2         ( F3 + F11 - F4 - F12 - 2.*F5 + 2.*F7 )/12. )
+      BEF(2) = F0 - YG2*( (F1 + F9 + F5 + F7 - 4.*F0) * 2./3. -
+     1         ( F2 + F10 + F6 + F8 - 4.*F0 )/24. ) +
+     2         YG4 * (-( F1 + F9 + F5 + F7 - 4.*F0 )/6. +
+     3         ( F2 + F10 +      F6 + F8 - 4.*F0 )/24. +
+     4         ( F3 + F11 + F4 + F12 - 2.*F1 - 2.*F9 -
+     5         2.*F5 - 2.*F7 + 4.*F0 )/12. )
+      BEF(3) = YG1 * ( (F1 - F9)*2./3. - (F2 - F10)/12. ) +
+     1         YG3 * ( (F1 - F9)/6. - (F2 - F10)/12. -
+     2         (F3 + F4 - F11 - F12 - 2.*F1 + 2.*F9)/12. )
+      RETURN
+      END
+
+
+      SUBROUTINE BFLD
+C****
+C**** CALCULATION OF FIELD COMPONENTS FOR EACH PURE MULTIPOLE
+C****
+      IMPLICIT REAL*8(A-H,O-Z)
+      REAL*8 K
+      COMMON  /BLCK 7/ NCODE
+      COMMON  /BLCK10/  BX, BY, BZ, K, TC, DTC
+      COMMON  /BLCK50/  D, GRAD, S, BT
+      COMMON  /BLCK51/  C0, C1, C2, C3, C4, C5
+      COMMON  /BLCK52/  IN
+      DIMENSION TC(6), DTC(6)
+      X = TC(1)
+      Y = TC(2)
+      Z = TC(3)
+      GO TO ( 11, 12, 13, 14 ) , NCODE
+C****
+C**** QUADRUPOLE
+C****
+   11 CONTINUE
+      GO TO ( 2, 1, 2 ) , IN
+c      write (6, 3) IN
+    3 FORMAT( '  ERROR IN BQUAD  IN= ',I5 ///)
+      CALL EXIT
+    1 BX = GRAD*Y
+      BY = GRAD*X
+      BZ = 0.
+      BT =   DSQRT( BX*BX + BY*BY )
+      RETURN
+    2 S = Z/D
+      CS = C0 + C1*S + C2*S**2 + C3*S**3 + C4*S**4 + C5*S**5
+      CSP = C1 + 2.*C2*S + 3.*C3*S**2 + 4.*C4*S**3 + 5.*C5*S**4
+      CSPP = 2.*C2 + 6.*C3*S + 12.*C4*S**2 + 20.*C5*S**3
+      IF( DABS(CS) .GT. 70. )  CS = DSIGN(70.D0, CS )
+      E = DEXP(CS)
+      RE = 1./(1. + E)
+      CB1 = GRAD*RE
+      CB2 = CB1*E*RE*( CSP**2 + CSPP - 2.*E*RE*CSP**2 )/(12.*D*D )
+      BX = CB1*Y + CB2*( 3.*X*X + Y*Y ) * Y
+      BY = CB1*X + CB2*( 3.*Y*Y + X*X ) * X
+      BZ = -CB1*E*CSP*RE*X*Y / D
+      BT =   DSQRT( BX*BX + BY*BY + BZ*BZ )
+      RETURN
+C****
+C**** HEXAPOLE
+C****
+   12 BA2 = GRAD
+      GO TO ( 22, 21, 22 ) , IN
+c      write (6, 23) IN
+   23 FORMAT( '  ERROR IN BHEX   IN= ',I5 ///)
+      CALL EXIT
+   21 BX = 2.*BA2*X*Y
+      BY = BA2*( X*X - Y*Y )
+      BZ = 0.
+      BT =   DSQRT( BX*BX + BY*BY )
+      RETURN
+   22 S = Z/D
+      IF( S .LT. 0. ) GO TO 21
+      BX = 0.
+      BY = 0.
+      BZ = 0.
+      BT = 0.
+      RETURN
+C****
+C**** OCTAPOLE
+C****
+   13 BA3 = GRAD
+      GO TO ( 32, 31, 32 ) , IN
+c      write (6, 33) IN
+   33 FORMAT( '  ERROR IN BOCT   IN= ',I5 ///)
+      CALL EXIT
+   31 BX = BA3*( 3.*X*X*Y - Y**3 )
+      BY = BA3*( X**3 - 3.*X*Y*Y )
+      BZ = 0.
+      BT =   DSQRT( BX*BX + BY*BY )
+      RETURN
+   32 S = Z/D
+      IF( S .LT. 0. ) GO TO 31
+      BX = 0.
+      BY = 0.
+      BZ = 0.
+      BT = 0.
+      RETURN
+C****
+C**** DECAPOLE
+   14 BA4 = GRAD
+      GO TO ( 42, 41, 42 ) , IN
+c      write (6, 43) IN
+   43 FORMAT( '  ERROR IN BDEC   IN= ',I5 ///)
+      CALL EXIT
+   41 BX = 4.D0*BA4*( X**3 *Y - X*(Y**3) )
+      BY = BA4*( X**4 - 6.D0* X*X*Y*Y + Y**4  )
+      BZ = 0.
+      BT =   DSQRT( BX*BX + BY*BY )
+      RETURN
+   42 S = Z/D
+      IF( S .LT. 0. ) GO TO 41
+      BX = 0.
+      BY = 0.
+      BZ = 0.
+      BT = 0.
+      RETURN
+      END
+
+
+      SUBROUTINE BMULT
+C****
+C****
+C**** THE RELATIONSHIP BETWEEN B0, ......... B12 AND B(I,J) RELATIVE TO
+C**** AXES (Z,X) IS GIVEN BY
+C****
+C****
+C****
+C**** B0  = B( 0, 0 )
+C**** B1  = B( 1, 0 )
+C**** B2  = B( 2, 0 )
+C**** B3  = B( 1, 1 )
+C**** B4  = B( 1,-1 )
+C**** B5  = B( 0, 1 )
+C**** B6  = B( 0, 2 )
+C**** B7  = B( 0,-1 )
+C**** B8  = B( 0,-2 )
+C**** B9  = B(-1, 0 )
+C**** B10 = B(-2, 0 )
+C**** B11 = B(-1, 1 )
+C**** B12 = B(-1,-1 )
+C****
+C****
+      IMPLICIT REAL*8(A-H,O-Z)
+      REAL*8  K, L
+      COMMON  /BLCK10/  BX, BY, BZ, K, TC, DTC
+      COMMON  /BLK100/  W, L, D, DG, S, BF, BT
+      COMMON  /BLK101/  C0, C1, C2, C3, C4, C5, C6, C7, C8
+      DIMENSION TC(6), DTC(6)
+      X = TC(1)
+      Y = TC(2)
+      Z = TC(3)
+      CALL MLTT ( B0, Z, X, Y )
+      CALL MLTT ( B1 , Z + DG, X , Y )
+      CALL MLTT ( B2 , Z + 2.*DG, X , Y )
+      CALL MLTT ( B3 , Z + DG, X + DG , Y )
+      CALL MLTT ( B4 , Z + DG, X - DG , Y )
+      CALL MLTT ( B5 , Z , X + DG , Y )
+      CALL MLTT ( B6 , Z , X + 2.*DG , Y )
+      CALL MLTT ( B7 , Z , X - DG , Y )
+      CALL MLTT ( B8 , Z , X - 2.*DG , Y )
+      CALL MLTT ( B9 , Z - DG, X , Y )
+      CALL MLTT ( B10, Z - 2.*DG, X , Y )
+      CALL MLTT ( B11, Z - DG, X + DG , Y )
+      CALL MLTT ( B12, Z - DG, X - DG , Y )
+      YG1 = Y/DG
+      YG2 = YG1**2
+      YG3 = YG1**3
+      YG4 = YG1**4
+      BX = YG1 * ( (B5-B7)*2./3. - (B6-B8)/12. )  +
+     1     YG3*( (B5-B7)/6. - (B6-B8)/12. -
+     2     (B3 + B11 - B4 - B12 - 2.*B5 + 2.*B7 ) / 12. )
+      BY = B0 - YG2*( ( B1 + B9 + B5 + B7 - 4.*B0 ) *2./3. -
+     1     ( B2 + B10 + B6 + B8 - 4.*B0 ) / 24. ) +
+     2     YG4* (-( B1 + B9 + B5 + B7 - 4.*B0 ) / 6. +
+     3     ( B2 + B10 + B6 + B8 - 4.*B0 ) / 24. +
+     4     ( B3 + B11 + B4 + B12 - 2.*B1 - 2.*B9 -
+     5     2.*B5 - 2.*B7 + 4.*B0 ) / 12. )
+      BZ = YG1*( (B1 - B9 ) *2./3. - ( B2 - B10 ) /12. ) +
+     1     YG3*( ( B1 - B9 ) / 6. - ( B2 - B10 ) / 12. -
+     2     ( B3 + B4 - B11 - B12 - 2.*B1 + 2.*B9 ) / 12.  )
+      BT  =DSQRT(BX*BX + BY*BY + BZ*BZ)
+      RETURN
+      END
+
+
+      SUBROUTINE BPLS ( IGP, D, S, RE, G1, G2, G3, G4, G5, G6 )
+C****
+C****
+C****
+      IMPLICIT REAL*8 (A-H,O-Z)
+C****
+C****
+      COMMON  /BLCK91/  C0, C1, C2, C3, C4, C5
+C****
+C****
+      S2 = S*S
+      S3 = S2*S
+      S4 = S2*S2
+      S5 = S4*S
+      CS = C0 + C1*S + C2*S2 + C3*S3 + C4*S4 + C5*S5
+      CP1 =(C1 + 2.*C2*S + 3.*C3*S2 + 4.*C4*S3 + 5.*C5*S4) / D
+      CP2 = (2.*C2 + 6.*C3*S + 12.*C4*S2 + 20.*C5*S3  ) / (D*D)
+      CP3 = ( 6.*C3 + 24.*C4*S + 60.*C5*S2 ) / (D**3)
+      CP4 = ( 24.*C4 + 120.*C5*S ) / (D**4)
+C****
+      CP5 = 120.*C5/(D**5)
+C****
+C****
+C****
+      IF( DABS(CS) .GT. 70. )  CS = DSIGN(70.D0, CS )
+      E = DEXP(CS)
+      RE = 1./(1. + E)
+      ERE = E*RE
+      ERE1= ERE*RE
+      ERE2= ERE*ERE1
+      ERE3= ERE*ERE2
+      ERE4= ERE*ERE3
+C****
+      ERE5= ERE*ERE4
+      ERE6= ERE*ERE5
+C****
+C****
+      CP12 = CP1*CP1
+      CP13 = CP1*CP12
+      CP14 = CP12*CP12
+      CP22 = CP2*CP2
+C****
+      CP15 = CP12*CP13
+      CP16 = CP13*CP13
+      CP23 = CP2*CP22
+      CP32 = CP3*CP3
+C****
+C****
+      IF( IGP .EQ. 6 ) RETURN
+      G1 = -CP1*ERE1
+C****
+C****
+      IF( IGP .EQ. 5 ) RETURN
+      IF( IGP .EQ. 4 ) GO TO 1
+      G2 =-( CP2+CP12   )*ERE1    + 2.*CP12 * ERE2
+      G3 =-(CP3 + 3.*CP1*CP2 + CP13  ) * ERE1      +
+     1   6.*(CP1*CP2 + CP13)*ERE2 - 6.*CP13*ERE3
+C****
+C****
+      IF( IGP .EQ. 3 ) RETURN
+1     G4 = -(CP4 + 4.*CP1*CP3 + 3.*CP22 + 6.*CP12*CP2 + CP14)*ERE1  +
+     1   (8.*CP1*CP3 + 36.*CP12*CP2 + 6.*CP22 + 14.*CP14)*ERE2    -
+     2   36.*(CP12*CP2 + CP14)*ERE3       + 24.*CP14*ERE4
+C****
+C****
+      IF( IGP .NE. 2 ) RETURN
+      G5 = (-CP5 - 5.*CP1*CP14 - 10.*CP2*CP3 - 10.*CP12*CP3 -
+     1     15.*CP1*CP22 - 10.*CP13*CP2 - CP15)*ERE1 +
+     2     (10.*CP1*CP4 +20.*CP2*CP3 +60.*CP12*CP3 + 90.*CP1*CP22 +
+     3     140.*CP13*CP2 +30.*CP15)*ERE2 + (-60.*CP12*CP3 -
+     4     90.*CP1*CP22 - 360.*CP13*CP2 - 150.*CP15)*ERE3 +
+     5     (240.*CP13*CP2 +240.*CP15)*ERE4 + (-120.*CP15)*ERE5
+      G6 = (-6.*CP1*CP5 - 15.*CP2*CP4 - 15.*CP12*CP4 - 10.*CP32 -
+     1     60.*CP1*CP2*CP3 - 20.*CP13*CP3 - 15.*CP23 - 45.*CP12*CP22 -
+     2     15.*CP14*CP2 - CP16)*ERE1 + (12.*CP1*CP5 + 30.*CP2*CP4 +
+     3     90.*CP12*CP4 +20.*CP32 + 360.*CP1*CP2*CP3 +280.*CP13*CP3 +
+     4     90.*CP23 + 630.*CP12*CP22 + 450.*CP14*CP2 + 62.*CP16)*ERE2 +
+     5     (-90.*CP12*CP4 - 360.*CP1*CP2*CP3 -720.*CP13*CP3 -90.*CP23 -
+     6     1620.*CP12*CP22 -2250.*CP14*CP2 - 540.*CP16)*ERE3 +
+     7     (480.*CP13*CP3 + 1080.*CP12*CP22 + 3600.*CP14*CP2 +
+     8     1560.*CP16)*ERE4 + (-1800.*CP14*CP2 - 1800.*CP16)*ERE5 +
+     9     720.*CP16*ERE6
+C****
+      RETURN
+      END
+
+
+      SUBROUTINE BPOLES
+C****
+C**** CALCULATION OF MULTIPOLE(POLES) FIELD COMPONENTS
+C****
+C****
+C****
+C**** 2 - QUADRUPOLE  (GRAD1)
+C**** 3 - HEXAPOLE    (GRAD2)
+C**** 4 - OCTAPOLE    (GRAD3)
+C**** 5 - DECAPOLE    (GRAD4)
+C**** 6 - DODECAPOLE  (GRAD5)
+C****
+C****
+      IMPLICIT REAL*8(A-H,O-Z)
+      REAL*8 K
+      COMMON  /BLCK10/  BX, BY, BZ, K, TC, DTC
+      COMMON  /BLCK90/  D, S, BT, GRAD1,GRAD2,GRAD3,GRAD4,GRAD5
+      COMMON  /BLCK91/  C0, C1, C2, C3, C4, C5
+      COMMON  /BLCK92/  IN
+      COMMON  /BLCK93/  DH, DO, DD, DDD, DSH, DSO, DSD, DSDD
+      DIMENSION TC(6), DTC(6)
+      X = TC(1)
+      Y = TC(2)
+      Z = TC(3)
+      X2 = X*X
+      X3 = X2*X
+      X4 = X3*X
+      X5 = X4*X
+      X6 = X5*X
+      X7 = X6*X
+      Y2 = Y*Y
+      Y3 = Y2*Y
+      Y4 = Y3*Y
+      Y5 = Y4*Y
+      Y6 = Y5*Y
+      Y7 = Y6*Y
+      GO TO ( 2, 1, 2 ) , IN
+c      write(6,3) IN
+    3 FORMAT( '  ERROR IN BPOLES IN= ',I5,///)
+      CALL EXIT
+    1 CONTINUE
+      B2X = GRAD1*Y
+      B2Y = GRAD1*X
+      B3X = GRAD2*2.*X*Y
+      B3Y = GRAD2*(X2-Y2)
+      B4X = GRAD3*(3.*X2*Y-Y3)
+      B4Y = GRAD3*(X3-3.*X*Y2)
+      B5X = GRAD4*4.*(X3*Y-X*Y3)
+      B5Y = GRAD4*(X4-6.*X2*Y2+Y4)
+      B6X = GRAD5*(5.*X4*Y-10.*X2*Y3+Y5)
+      B6Y = GRAD5*(X5-10.*X3*Y2+5.*X*Y4)
+      BX = B2X + B3X + B4X + B5X + B6X
+      BY = B2Y + B3Y + B4Y + B5Y + B6Y
+      BZ = 0.
+      BT =   DSQRT( BX*BX + BY*BY )
+      RETURN
+C****
+C****
+C****
+    2 S = Z/D
+      CALL BPLS( 2, D, S, RE, G1, G2, G3, G4, G5, G6 )
+      B2X = GRAD1*( RE*Y - (G2/12.)*(3.*X2*Y + Y3) +
+     1   (G4/384.)*(5.*X4*Y + 6.*X2*Y3 + Y5 ) -
+     2   (G6/23040.)*(7.*X6*Y + 15.*X4*Y3 + 9.*X2*Y5 + Y7)  )
+      B2Y = GRAD1*( RE*X - (G2/12.)*(X3 + 3.*X*Y2) +
+     1   (G4/384.)*(X5 + 6.*X3*Y2 + 5.*X*Y4 ) -
+     2   (G6/23040.)*(X7 + 9.*X5*Y2 + 15.*X3*Y4 + 7.*X*Y6) )
+      B2Z = GRAD1*( G1*X*Y - (G3/12.)*(X3*Y + X*Y3 ) +
+     1   (G5/384.)*(X5*Y +2.*X3*Y3 + X*Y5)  )
+C****
+C****
+      SS = Z/DH  + DSH
+      CALL BPLS( 3, DH, SS, RE, G1, G2, G3, G4, G5, G6 )
+      B3X = GRAD2*( RE*2.*X*Y - (G2/48.)*(12.*X3*Y + 4.*X*Y3 ) )
+      B3Y = GRAD2*( RE*(X2-Y2) - (G2/48.)*(3.*X4 + 6.*X2*Y2 - 5.*Y4 ) )
+      B3Z = GRAD2*( G1*(X2*Y - Y3/3.) - (G3/48.)*(3.*X4*Y+2.*X2*Y3-Y5))
+C****
+C****
+      SS = Z/DO  + DSO
+      CALL BPLS( 4, DO, SS, RE, G1, G2, G3, G4, G5, G6 )
+      B4X = GRAD3*( RE*(3.*X2*Y - Y3) - (G4/80.)*(20.*X4*Y - 4.*Y5 ) )
+      B4Y = GRAD3*( RE*(X3 - 3.*X*Y2) - (G4/80.)*(4.*X5-20.*X*Y4 ) )
+      B4Z = GRAD3*G1*(X3*Y - X*Y3 )
+C****
+C****
+      SS = Z/DD  + DSD
+      CALL BPLS( 5, DD, SS, RE, G1, G2, G3, G4, G5, G6 )
+      B5X = GRAD4*RE*(4.*X3*Y - 4.*X*Y3)
+      B5Y = GRAD4*RE*(X4 - 6.*X2*Y2 + Y4 )
+      B5Z = GRAD4*G1*(X4*Y - 2.*X2*Y3 + Y5/5. )
+C****
+C****
+      SS = Z/DDD + DSDD
+      CALL BPLS( 6, DDD,SS, RE, G1, G2, G3, G4, G5, G6 )
+      B6X = GRAD5*RE*(5.*X4*Y - 10.*X2*Y3 + Y5 )
+      B6Y = GRAD5*RE*(X5 - 10.*X3*Y2 + 5.*X*Y4 )
+      B6Z = 0.
+C****
+C****
+      BX = B2X + B3X + B4X + B5X + B6X
+      BY = B2Y + B3Y + B4Y + B5Y + B6Y
+      BZ = B2Z + B3Z + B4Z + B5Z + B6Z
+      BT =   DSQRT( BX*BX + BY*BY + BZ*BZ )
+      RETURN
+      END
+
+
+      SUBROUTINE BPRETZ
+C****
+C****
+C**** MTYP=6
+C****
+C****
+C**** PRETZEL MAGNET FIELD COMPONENTS
+C**** DG = SMALL NEGATIVE NUMBER
+C****
+C****
+      IMPLICIT REAL*8(A-H,O-Z)
+      REAL*8  NDX, K
+      COMMON  /BLCK10/  BX, BY, BZ, K, TC, DTC
+      COMMON  /BLCK20/  NDX,BET1,GAMA,DELT,CSC
+      COMMON  /BLCK21/  RCA,DELS,BR,S2,S3,S4,S5,S6,S7,S8,SCOR
+      COMMON  /BLCK22/  D, DG, S, BF, BT
+      COMMON  /BLCK23/  C0, C1, C2, C3, C4, C5
+      COMMON  /BLCK24/  RB, XC, ZC
+      COMMON  /BLCK25/  IN, MTYP
+      DIMENSION TC(6), DTC(6)
+C****
+C****
+      G1 = BF/D
+      Y = TC(2)
+      Z = TC(3)
+      IF( Z .LE. DG ) GO TO 1
+      BX = 0.
+      BY = 0.
+      BZ = 0.
+      RETURN
+    1 BY0 = G1*DABS(Z)**NDX
+      BY1 = BY0*NDX/Z
+      BY2 = BY1*(NDX-1.)/Z
+      BY3 = BY2*(NDX-2.)/Z
+      BY4 = BY3*(NDX-3.)/Z
+      BX = 0.
+      BY = BY0 - Y*Y*BY2/2. + Y**4*BY4/24.
+      BZ = Y*BY1 - Y**3*BY3/6.
+      BT = DSQRT(BX*BX + BY*BY + BZ*BZ)
+      RETURN
+      END
+
+
+      SUBROUTINE BSOL
+C****
+C****
+C**** ROUTINE VALID FOR FIELDS OUTSIDE CENTRAL ZONE OF ELEMENTAL
+C**** SOLENOID
+C**** BF    = FIELD AT CENTER OF INFINITE SOLENOID; CURR. DEN. (NI/M)
+C**** M.W.GARRETTT  JOURNAL OF APP. PHYS. 34,(1963),P2567
+C****
+C****
+      IMPLICIT REAL*8(A-H,O-Z)
+      REAL*8 K
+      DIMENSION  TC(6), DTC(6)
+      COMMON  /BLCK10/  BX, BY, BZ, K, TC, DTC
+      COMMON  /BLCK30/  BF ,      AL, RAD
+      COMMON  /BLCK31/  S, BT
+      COMMON  /BLCK32/  IN
+C****
+C****
+      DATA PI4/12.566370616D0 /
+C****
+C****
+C****
+      X = TC(1)
+      Y = TC(2)
+      Z = TC(3)
+      R =DSQRT( X **2 + Y**2 )
+      IF( R  .LT.  (RAD/1.D4)  )  GO TO 5
+      RADR = RAD+R
+      AAPR = 4.D0*RAD/RADR
+      AAMR = (RAD-R)/(2.D0*RAD)
+      RCSQ = 4.D0*RAD*R/(RADR*RADR)
+C****
+C**** SOLENOID LEFT  HAND SOURCE
+C****
+      ZZ = -(AL+Z)
+      R1SQ = RADR*RADR  + ZZ*ZZ
+      R1 = DSQRT(R1SQ)
+      RKSQ = 4.D0*RAD*R/R1SQ
+      CALL FB01AD(RKSQ,       VKS, VES )
+      CALL FB03AD(RCSQ, RKSQ, P )
+      BZS1 = AAPR*ZZ*(VKS+AAMR*(P-VKS) ) /R1
+      BRS1 = R1*(2.D0*(VKS-VES) - RKSQ*VKS)
+C****
+C**** SOLENOID RIGHT HAND SOURCE
+C****
+      ZZ = AL-Z
+      R1SQ = RADR*RADR  + ZZ*ZZ
+      R1 = DSQRT(R1SQ)
+      RKSQ = 4.D0*RAD*R/R1SQ
+      CALL FB01AD(RKSQ,       VKS, VES )
+      CALL FB03AD(RCSQ, RKSQ, P )
+      BZS2 = AAPR*ZZ*(VKS+AAMR*(P-VKS) ) /R1
+      BRS2 = R1*(2.D0*(VKS-VES) - RKSQ*VKS)
+      BZ = BF*( BZS2-BZS1 )/PI4
+      BR = BF*( BRS2-BRS1 )/(R*PI4)
+      BX = BR * X /R
+      BY = BR *  Y/R
+      BT =DSQRT( BX**2 + BY**2 + BZ**2 )
+      RETURN
+    5 CONTINUE
+C****
+C****
+C****
+      COSA = (AL-Z) / DSQRT( RAD*RAD + (AL-Z)**2  )
+      COSB =-(AL+Z) / DSQRT( RAD*RAD + (AL+Z)**2  )
+      BX = 0.
+      BY = 0.
+      BZ = BF*(COSA-COSB)/2.D0
+      BT = DABS(BZ)
+      RETURN
+      END
+
+
+      SUBROUTINE COLL ( NO, J, IFLAG  )
+C****
+C****
+C**** TEST AND SET FLAG IF RAY EXCEEDS RECTANGULAR OR ELLIPTICAL
+C**** COLLIMATOR CUT-OFF DIMENSIONS
+C****
+C****
+      IMPLICIT REAL*8(A-H,O-Z)
+      COMMON  /BLCK 0/  DATA , ITITLE
+      COMMON  /BLCK 2/  XO, YO, ZO, VXO, VYO, VZO,RTL(1000),RLL(1000)
+      COMMON  /BLCK 5/  XA, YA, ZA, VXA, VYA, VZA
+      DIMENSION XO(1000),YO(1000),ZO(1000),VXO(1000),VYO(1000),VZO(1000)
+      DIMENSION DATA(75,200),ITITLE(200)
+C****
+C****
+  100 FORMAT( // 5X, 'RAY=', I5, 5X, 'ELEMENT=', I3,
+     1   '   STOPPED - EXCEEDS RECTANGULAR COLLIMATOR DIMENSIONS ' // )
+  101 FORMAT( // 5X, 'RAY=', I5, 5X, 'ELEMENT=', I3,
+     1   '   STOPPED - EXCEEDS ELLIPTICAL  COLLIMATOR DIMENSIONS ' // )
+C****
+C****
+      IFLAG = 0
+      ICOLL = DATA(1,NO)
+      XCEN  = DATA(2,NO)
+      YCEN  = DATA(3,NO)
+      XMAX  = DATA(4,NO)
+      YMAX  = DATA(5,NO)
+      IF ( ICOLL .NE. 0 ) GO TO 1
+      IF ( (DABS(XA-XCEN) .GT. XMAX) .OR. (DABS(YA-YCEN) .GT. YMAX) )
+     1      GO TO 2
+      RETURN
+    2 CONTINUE
+c    2 write (6, 100) J, NO
+      GO TO 3
+    1 XC = (XA-XCEN)/XMAX
+      YC = (YA-YCEN)/YMAX
+      IF ( (XC*XC+YC*YC) .GT. 1. ) GO TO 4
+      RETURN
+    4 CONTINUE
+c    4 write (6, 101) J, NO
+    3 XO(J)  = 1.D10
+      YO(J)  = 1.D10
+      VXO(J) = 0.
+      VYO(J) = 0.
+      IFLAG  = 1
+      RETURN
+      END
+
+      SUBROUTINE  DERIV( BFUN )
+C****
+C****
+C****
+      IMPLICIT REAL*8(A-H,O-Z)
+      REAL*8  K
+      COMMON  /BLCK 4/  ENERGY, VEL, PMASS, Q0
+      COMMON  /BLCK10/  BX, BY, BZ, K, TC, DTC
+      COMMON  /BLCK11/  EX, EY, EZ, QMC, IVEC
+      DIMENSION TC(6), DTC(6)
+      DATA  C /3.D10 /
+C****
+C****
+      CALL BFUN
+      DTC(1) = TC(4)
+      DTC(2) = TC(5)
+      DTC(3) = TC(6)
+      IF( IVEC .NE. 0 )  GO TO 4
+      DTC(4) = K * ( TC(5) * BZ - TC(6) * BY )
+      DTC(5) = K * ( TC(6) * BX - TC(4) * BZ )
+      DTC(6) = K * ( TC(4) * BY - TC(5) * BX )
+      RETURN
+    4 VEL = DSQRT( TC(4)**2 + TC(5)**2 + TC(6)**2 )
+C****
+C**** SK 12/02/83
+C**** GAMMA CORRECTION FOR HIGH ENERGY ELECTRONS
+C**** NOT EXACT
+C****
+      GAMMA = 1.D0 + ENERGY/(PMASS*931.48D0)
+      IF( GAMMA .LT. 100. ) GAMMA = 1./DSQRT( 1.-VEL*VEL/(C*C) )
+C****
+C****
+      K = 1./(QMC*GAMMA)
+      AK = K/(9.D13)
+      ETERM = (EX*TC(4)+EY*TC(5)+EZ*TC(6) )*AK
+      DTC(4) = K*( TC(5)*BZ - TC(6)*BY + EX*1.D7 ) - TC(4)*ETERM
+      DTC(5) = K*( TC(6)*BX - TC(4)*BZ + EY*1.D7 ) - TC(5)*ETERM
+      DTC(6) = K*( TC(4)*BY - TC(5)*BX + EZ*1.D7 ) - TC(6)*ETERM
+      RETURN
+      END
+
+
+      SUBROUTINE DIPOLE ( NO, NP, T, TP ,NUM )
+C****
+C****
+C**** SINGLE MAGNET RAY TRACING BY NUMERICAL INTEGRATION OF DIFFERENTIAL
+C**** EQUATIONS OF MOTION.
+C     T = TIME
+C     TC(1) TO TC(6) =  ( X, Y, Z, VX, VY, VZ )
+C     DTC(1) TO DTC(6) = ( VX, VY, VZ, VXDOT, VYDOT, VZDOT )
+C****
+C****
+      IMPLICIT REAL*8(A-H,O-Z)
+      REAL*8  LF1, LF2, LU1, K, NDX
+      EXTERNAL BDIP
+      COMMON  /BLCK 0/  DATA , ITITLE
+      COMMON  /BLCK 4/  ENERGY, VEL, PMASS, Q0
+      COMMON  /BLCK 5/  XA, YA, ZA, VXA, VYA, VZA
+      COMMON  /BLCK10/  BX, BY, BZ, K, TC, DTC
+      COMMON  /BLCK20/  NDX,BET1,GAMA,DELT,CSC
+      COMMON  /BLCK21/  RCA,DELS,BR,S2,S3,S4,S5,S6,S7,S8,SCOR
+      COMMON  /BLCK22/  D, DG, S, BF, BT
+      COMMON  /BLCK23/  C0, C1, C2, C3, C4, C5
+      COMMON  /BLCK24/  RB, XC, ZC
+      COMMON  /BLCK25/  IN, MTYP
+      DIMENSION DATA(  75,200 ) ,ITITLE(200)
+      DIMENSION TC(6), DTC(6), DS(6), ES(6)
+C**** DATA  C/ 3.D10/
+C****
+      LF1  = DATA(  1,NO )
+      LU1  = DATA(  2,NO )
+      LF2  = DATA(  3,NO )
+      DG   = DATA(  4,NO )
+      MTYP = DATA(  5,NO )
+      A    = DATA( 11,NO )
+      B    = DATA( 12,NO )
+      D    = DATA( 13,NO )
+      RB   = DATA( 14,NO )
+      BF   = DATA( 15,NO )
+      PHI  = DATA( 16,NO )
+      ALPHA= DATA( 17,NO )
+      BETA = DATA( 18,NO )
+      NDX  = DATA( 19,NO )
+      BET1 = DATA( 20,NO )
+      GAMA = DATA( 21,NO )
+      DELT = DATA( 22,NO )
+      Z11  = DATA( 25,NO )
+      Z12  = DATA( 26,NO )
+      Z21  = DATA( 27,NO )
+      Z22  = DATA( 28,NO )
+      BR1  = DATA( 41,NO )
+      BR2  = DATA( 42,NO )
+      XCR1 = DATA( 43,NO )
+      XCR2 = DATA( 44,NO )
+      IF( MTYP .EQ. 0  )  MTYP = 1
+      DTF1= LF1/ VEL
+      DTF2= LF2/ VEL
+      DTU = LU1/ VEL
+      BX = 0.
+      BY = 0.
+      BZ = 0.
+      BT = 0.
+      S = 0.
+      BR = BR1
+      IF( NP  .GT. 100 ) GO TO 5
+c      write (6, 100) ITITLE(NO)
+  100 FORMAT(  ' DIPOLE  ****  ', A4,'  ****************************'/)
+c      write (6, 101)
+  101 FORMAT( 8H    T CM ,18X, 4HX CM , 7X, 2HBX, 8X, 4HY CM , 7X, 2HBY,
+     1   8X, 4HZ CM, 7X, 2HBZ, 8X, 6HVELZ/C , 6X, 8HTHETA MR , 5X,
+     2   6HPHI MR , 6X, 1HB             )
+      CALL PRNT2 ( T,S,XA   ,YA   ,ZA   ,BX,BY,BZ,BT,VXA  ,VYA  ,VZA   )
+c      write (6, 103)
+  103 FORMAT(   '0COORDINATE TRANSFORMATION TO B AXIS SYSTEM '       )
+  109 FORMAT(   '0COORDINATE TRANSFORMATION TO D AXIS SYSTEM '       )
+C**** TRANSFORM FROM INITIAL ENTRANCE COORDINATES TO VFB COORD.
+C****
+    5 COSA =DCOS( ALPHA/57.29578)
+      SINA =DSIN( ALPHA/57.29578)
+      TC(1) = ( A-ZA ) * SINA - ( XA + XCR1 ) * COSA
+      TC(2) = YA
+      TC(3) = ( A-ZA ) * COSA + ( XA + XCR1 ) * SINA
+      TC(4) = -VZA * SINA - VXA * COSA
+      TC(5) = VYA
+      TC(6) = -VZA * COSA + VXA * SINA
+      CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 2
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+C****
+C**** TRANSLATE PARTICLE TO START OF FIRST FRINGE FIELD
+C****
+C****
+      IF(  BR1  .EQ.  0. ) GO TO 20
+      IN = 4
+      XDTF1 = DTF1
+      IF(  Z11  .GT.  TC(3) )  XDTF1 = -DTF1
+c      IF( NP  .LE. 100) write (6, 108)
+  108 FORMAT(/ ' CONSTANT FIELD CORRECTION IN FRINGE FIELD REGION    ' )
+      NSTEP = 0
+      CALL FNMIRK( 6, T,XDTF1,TC, DTC, DS, ES, BDIP,  0    )
+   21 CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      DO 22  I=1,NP
+      CALL FNMIRK( 6, T,XDTF1,TC, DTC, DS, ES, BDIP,  1    )
+      NSTEP = NSTEP + 1
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 2
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+      IF (NSTEP  .GT.  200)  GO TO 99
+      IF(  XDTF1  .LT.  0. )  GO TO 23
+      IF(  Z11  .GE.  TC(3) )  GO TO 24
+      GO TO 22
+   23 IF(  Z11  .LE.  TC(3) )  GO TO 24
+   22 CONTINUE
+      GO TO 21
+   24 DO 2 I=1,2
+      XDTF1 = (TC(3) - Z11) / DABS(TC(6))
+      CALL FNMIRK( 6, T,XDTF1,TC, DTC, DS, ES, BDIP,  0    )
+    2 CALL FNMIRK( 6, T,XDTF1,TC, DTC, DS, ES, BDIP,  1    )
+      CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 2
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+c      IF( NP  .LE. 100) write (6, 105) NSTEP
+C****
+C****
+C****
+   20 TDT = ( TC(3) - Z11 ) /DABS( TC(6) )
+      TC(1) = TC(1) + TDT * TC(4)
+      TC(2) = TC(2) + TDT * TC(5)
+      TC(3) = TC(3) + TDT * TC(6)
+      T = T + TDT
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 2
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+C****
+C**** IN DESIGNATES MAGNET REGIONS FOR BFUN
+C****
+      IN = 1
+      XC= RB*DCOS( ALPHA/ 57.29578 )
+      ZC=-RB*DSIN( ALPHA/ 57.29578 )
+C****
+      C0   = DATA( 29,NO )
+      C1   = DATA( 30,NO )
+      C2   = DATA( 31,NO )
+      C3   = DATA( 32,NO )
+      C4   = DATA( 33,NO )
+      C5   = DATA( 34,NO )
+      DELS = DATA( 45,NO )
+      RCA  = DATA( 47,NO )
+      CSC = DCOS( ALPHA/57.29578 )
+      SCOR = DATA(49,NO)
+      S2   = DATA( 51,NO ) / RB    + RCA/2.D0
+      S3   = DATA( 52,NO ) / RB**2
+      S4   = DATA( 53,NO ) / RB**3 + RCA**3/8.D0
+      S5   = DATA( 54,NO ) / RB**4
+      S6   = DATA( 55,NO ) / RB**5 + RCA**5/16.D0
+      S7   = DATA( 56,NO ) / RB**6
+      S8   = DATA( 57,NO ) / RB**7 + RCA**7/25.6D0
+c      IF( NP  .LE. 100) write (6, 104)
+  104 FORMAT( 22H0FRINGING FIELD REGION    )
+      CALL FNMIRK( 6, T, DTF1,TC, DTC, DS, ES, BDIP,  0    )
+      NSTEP = 0
+    6 CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      DO 7 I = 1, NP
+      CALL FNMIRK( 6, T, DTF1,TC, DTC, DS, ES, BDIP,  1    )
+      NSTEP = NSTEP + 1
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 2
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+      IF (NSTEP  .GT.  200)  GO TO 99
+      IF( Z12 .GE. TC(3) ) GO TO 8
+    7 CONTINUE
+      GO TO 6
+    8 CONTINUE
+      XDTF1 =-( Z12 - TC(3) ) /DABS( TC(6) )
+      CALL FNMIRK( 6, T,XDTF1,TC, DTC, DS, ES, BDIP,  0    )
+      CALL FNMIRK( 6, T,XDTF1,TC, DTC, DS, ES, BDIP,  1    )
+      CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 2
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+c      IF( NP  .LE. 100) write (6, 105) NSTEP
+  105 FORMAT( 10H   NSTEPS= ,I5 )
+C***
+C***  UNIFORM FIELD REGION
+C**** TRANSFORM TO SECOND VFB COORD SYSTEM
+C***
+      COPAB =DCOS( (PHI-ALPHA-BETA)/57.29578)
+      SIPAB =DSIN( (PHI-ALPHA-BETA)/57.29578)
+      COSPB =DCOS( (PHI/2.-BETA)/57.29578 )
+      SINPB =DSIN( (PHI/2.-BETA)/57.29578 )
+      SIP2 =DSIN( (PHI/2.)/57.29578 )
+      XT = TC(1)
+      ZT = TC(3)
+      VXT = TC(4)
+      VZT = TC(6)
+      TC(3) = - ZT  *COPAB +  XT  *SIPAB -2.*RB*SIP2*COSPB
+      TC(1) = - ZT  *SIPAB -  XT  *COPAB -2.*RB*SIP2*SINPB
+      TC(6) = - VZT *COPAB +  VXT *SIPAB
+      TC(4) = - VZT *SIPAB -  VXT *COPAB
+C****
+C****
+C**** UNIFORM FIELD INTEGRATION REGION
+C****
+C****
+      IN = 2
+      XC=-RB*DCOS( BETA / 57.29578 )
+      ZC=-RB*DSIN( BETA / 57.29578 )
+c      IF( NP  .LE. 100) write (6, 106)
+  106 FORMAT(   '0UNIFORM FIELD REGION IN C AXIS SYSTEM '  )
+      IF( TC(3)  .LT.  Z21 ) GO TO 15
+C****
+C**** THIS SECTION CORRECTS FOR MAGNETS WHOSE FRINGING FIELDS INTERSECT
+C****
+c      IF( NP  .LE. 100) write (6, 102)
+  102 FORMAT( / '   INTEGRATE BACKWARDS    '  )
+      CALL FNMIRK( 6, T,-DTU ,TC, DTC, DS, ES, BDIP,  0    )
+      NSTEP = 0
+   16 CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      DO 17  I =1, NP
+      CALL FNMIRK( 6, T,-DTU, TC, DTC, DS, ES, BDIP,  1    )
+      NSTEP = NSTEP + 1
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 3
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+      IF (NSTEP  .GT.  200)  GO TO 99
+      IF( TC(3)  .LE.  Z21 )  GO TO 18
+   17 CONTINUE
+      GO TO 16
+   18 CONTINUE
+      XDTU  = ( Z21 - TC(3) ) /DABS( TC(6) )
+      CALL FNMIRK( 6, T,XDTU ,TC, DTC, DS, ES, BDIP,  0    )
+      CALL FNMIRK( 6, T,XDTU ,TC, DTC, DS, ES, BDIP,  1    )
+      CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 3
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+c      IF( NP  .LE. 100) write (6, 105) NSTEP
+c      IF( NP  .LE. 100) write (6, 107)
+  107 FORMAT( / )
+      GO TO 19
+C****
+C****
+   15 CONTINUE
+      CALL FNMIRK( 6, T, DTU ,TC, DTC, DS, ES, BDIP,  0    )
+      NSTEP = 0
+    9 CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      DO 10  I =1, NP
+      CALL FNMIRK( 6, T, DTU, TC, DTC, DS, ES, BDIP,  1    )
+      NSTEP = NSTEP + 1
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 3
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+      IF (NSTEP  .GT.  200)  GO TO 99
+      IF( TC(3)  .GE.  Z21 )  GO TO 11
+   10 CONTINUE
+      GO TO 9
+   11 CONTINUE
+      XDTU  = ( Z21 - TC(3) ) /DABS( TC(6) )
+      CALL FNMIRK( 6, T,XDTU ,TC, DTC, DS, ES, BDIP,  0    )
+      CALL FNMIRK( 6, T,XDTU ,TC, DTC, DS, ES, BDIP,  1    )
+      CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 3
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+c      IF( NP  .LE. 100) write (6, 105) NSTEP
+   19 CONTINUE
+C***
+C***
+C**** SETUP FOR SECOND FRINGE FIELD AND INTEGRATION
+C****
+C****
+      BR   = BR2
+      C0   = DATA( 35,NO )
+      C1   = DATA( 36,NO )
+      C2   = DATA( 37,NO )
+      C3   = DATA( 38,NO )
+      C4   = DATA( 39,NO )
+      C5   = DATA( 40,NO )
+      DELS = DATA( 46,NO )
+      RCA  = DATA( 48,NO )
+      SCOR = DATA(50,NO)
+      CSC = DCOS( BETA /57.29578 )
+      S2   = DATA( 58,NO ) / RB    + RCA/2.D0
+      S3   = DATA( 59,NO ) / RB**2
+      S4   = DATA( 60,NO ) / RB**3 + RCA**3/8.D0
+      S5   = DATA( 61,NO ) / RB**4
+      S6   = DATA( 62,NO ) / RB**5 + RCA**5/16.D0
+      S7   = DATA( 63,NO ) / RB**6
+      S8   = DATA( 64,NO ) / RB**7 + RCA**7/25.6D0
+      IN = 3
+c      IF( NP  .LE. 100) write (6, 104)
+      CALL FNMIRK( 6, T, DTF2,TC, DTC, DS, ES, BDIP,  0    )
+      NSTEP = 0
+   12 CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      DO 13  I =1, NP
+      CALL FNMIRK( 6, T, DTF2,TC, DTC, DS, ES, BDIP,  1    )
+      NSTEP = NSTEP + 1
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 3
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+      IF (NSTEP  .GT.  200)  GO TO 99
+      IF( TC(3) .GE. Z22 )  GO TO 14
+   13 CONTINUE
+      GO TO 12
+   14 CONTINUE
+      XDTF2 = ( Z22 - TC(3) ) /DABS( TC(6) )
+      CALL FNMIRK( 6, T,XDTF2,TC, DTC, DS, ES, BDIP,  0    )
+      CALL FNMIRK( 6, T,XDTF2,TC, DTC, DS, ES, BDIP,  1    )
+      CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 3
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+c      IF( NP  .LE. 100) write (6, 105) NSTEP
+C****
+C**** TRANSFORM TO OUTPUT SYSTEM COORD.
+C****
+      COSB =DCOS( BETA/57.29578 )
+      SINB =DSIN( BETA/57.29578 )
+      XT = TC(1)
+      ZT = TC(3)
+      VXT = TC(4)
+      VZT = TC(6)
+      TC(3) = ZT*COSB - XT*SINB - B
+      TC(1) = ZT*SINB + XT*COSB - XCR2
+      TC(6) = VZT*COSB - VXT*SINB
+      TC(4) = VZT*SINB + VXT*COSB
+c      IF( NP  .LE. 100) write (6, 109)
+      CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+C****
+C**** TRANSLATE PARTICLE TO OUT SYSTEM COORD.
+C****
+      IF(  BR2  .EQ.  0. ) GO TO 30
+      IN = 4
+      XDTF2 = DTF2
+      IF( TC(3)  .GT. 0. ) XDTF2 = -DTF2
+c      IF( NP  .LE. 100) write (6, 108)
+      NSTEP = 0
+      CALL FNMIRK( 6, T,XDTF2,TC, DTC, DS, ES, BDIP,  0    )
+   31 CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      DO 32  I=1,NP
+      CALL FNMIRK( 6, T,XDTF2,TC, DTC, DS, ES, BDIP,  1    )
+      NSTEP = NSTEP + 1
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 4
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+      IF (NSTEP  .GT.  200)  GO TO 99
+      IF( XDTF2  .LT. 0. ) GO TO 33
+      IF( TC(3)  .GE. 0. ) GO TO 34
+      GO TO 32
+   33 IF( TC(3)  .LE. 0. ) GO TO 34
+   32 CONTINUE
+      GO TO 31
+   34 DO 3 I=1,2
+      XDTF2 = -TC(3) / DABS(TC(6))
+      CALL FNMIRK( 6, T,XDTF2,TC, DTC, DS, ES, BDIP,  0    )
+    3 CALL FNMIRK( 6, T,XDTF2,TC, DTC, DS, ES, BDIP,  1    )
+      CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 4
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+c      IF( NP  .LE. 100) write (6, 105) NSTEP
+C****
+C****
+C****
+   30 TDT = -TC(3) /DABS( TC(6) )
+      TC(1) = TC(1) + TDT * TC(4)
+      TC(2) = TC(2) + TDT * TC(5)
+      TC(3) = TC(3) + TDT * TC(6)
+      T = T + TDT
+      TP = T * VEL
+      BX = 0.
+      BY = 0.
+      BZ = 0.
+      BT = 0.
+      S  = 0.
+      VXF    = 1000. *DATAN2( TC(4), TC(6)  )
+      VYF    = 1000. *DASIN ( TC(5)/ VEL    )
+      VZF    = TC(6) / VEL
+c      IF(NP.LE.100) write (6,115)TP,TC(1),TC(2),TC(3),VZF,VXF,VYF
+  115 FORMAT( F10.4, 10X, F10.3, 11X, F10.3, 11X, F10.3, 11X,
+     1   F13.5, F13.2, F11.2                   )
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 4
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+C****
+C**** CALCULATE INTERCEPTS IN SYSTEM D
+C****
+      Z0X = -TC(1)/ ( TC(4) / TC(6)    + 1.E-10 )
+      Z0Y = -TC(2)/ ( TC(5) / TC(6)    + 1.E-10 )
+c      IF( NP .LE. 100) write (6, 111) VXF, VYF, Z0X, Z0Y
+  111 FORMAT( / ' INTERSECTIONS WITH VER. AND HOR. PLANES '          ,
+     X       /15X, 5H  XP=,F10.4, 10H MR    YP=,F10.4, 3H MR   /
+     1        15X, 5H Z0X=,F10.2, 10H CM   Z0Y=,F10.2, 3H CM   /       )
+      RETURN
+   99 CALL PRNT4(NO, IN)
+      RETURN
+      END
+
+
+      SUBROUTINE  DRIFT( NO,  NP,T, TP ,NUM )
+C****
+C****
+C**** Z-AXIS DRIFT ROUTINE
+C****
+C****
+      IMPLICIT REAL*8(A-H,O-Z)
+      COMMON  /BLCK 0/  DATA , ITITLE
+      COMMON  /BLCK 4/  ENERGY, VEL, PMASS, Q0
+      COMMON  /BLCK 5/  XA, YA, ZA, VXA, VYA, VZA
+      DIMENSION DATA(  75,200 ), ITITLE(200)
+C**** DATA  C/ 3.D10/
+  100 FORMAT( /  '   Z-AXIS DRIFT  ****  ', A4, '****************',//
+     1'      T CM', 18X, 'X CM', 7X, 'Y CM', 7X, 'Z CM' , '      VELZ/C'
+     2   , '    THETA MR      PHI MR'  /  )
+  103 FORMAT( F10.4, 11X, 3F11.3, F12.5, 2F12.3  )
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 1
+      CALL PLT2 ( NUM, NO, NBR, TPAR )
+c      IF( NP  .LE. 100) write (6, 100) ITITLE(NO)
+      VXP = 1000. *DATAN2( VXA,VZA )
+      VYP = 1000. *DASIN ( VYA/VEL )
+      VZP =  VZA  / VEL
+      TP = T*VEL
+c      IF( NP  .LE. 100) write (6, 103) TP, XA, YA, ZA, VZP, VXP, VYP
+      TDT =(DATA(1,NO) - ZA) / DABS(VZA)
+      T = T + TDT
+      TP = T*VEL
+      XA = XA + TDT*VXA
+      YA = YA + TDT*VYA
+      ZA = 0.
+c      IF( NP  .LE. 100) write (6, 103) TP, XA, YA, ZA, VZP, VXP, VYP
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 2
+      CALL PLT2 ( NUM, NO, NBR, TPAR )
+      RETURN
+      END
+C
+C         SUBROUTINE DTIME
+C         INTEGER *2 H,MI,S,Y,MO,D,X
+C         CHARACTER COL,PNT,SL
+C         DATA COL/':'/,PNT/'.'/,SL/'/'/
+C         CALL GETTIM(H,MI,S,X)
+C         CALL GETDAT(Y,MO,D)
+C         WRITE (6,100) H,COL,MI,COL,S,PNT,X,MO,SL,D,SL,Y
+C 100     FORMAT(5X,I2,A1,I2,A1,I2,A1,I2,5X,I2,A1,I2,A1,I4)
+C         RETURN
+C         END
+
+
+      SUBROUTINE EDIP
+C****
+C****   CALCULATES E-FIELD COMPONENTS FOR A CYLINDRICAL
+C****   ELECTROSTATIC DEFLECTOR
+C****
+      IMPLICIT REAL*8 (A-H, O-Z)
+      REAL*8 K
+      COMMON  /BLCK10/  BX, BY, BZ, K, TC, DTC
+      COMMON  /BLCK11/  EX, EY, EZ, QMC, IVEC
+      COMMON  /BLCK20/ EC2, EC4, WE, WC
+      COMMON  /BLCK22/  D, DG, S, EF, ET
+      COMMON  /BLCK23/  C0, C1, C2, C3, C4, C5
+      COMMON  /BLCK24/  RB, XC, ZC
+      COMMON  /BLCK25/  IN, MTYP
+      DIMENSION TC(6), DTC(6)
+C****
+C****
+      X = TC(1)
+      Y = TC(2)
+      Z = TC(3)
+      DX = X - XC
+      DZ = Z
+      RP2 = DX * DX + Z * Z
+      RP = DSQRT(RP2)
+      GO TO (1, 2, 3) , IN
+  100 FORMAT( ' ERROR -GO TO-  IN EDIP IN = ', I5)
+c      write (6, 100) IN
+C****
+C**** UNIFORM FIELD REGION
+C****
+2     EX = - EF * RB * DX / RP2
+      EY = 0.
+      EZ = - EF * RB * Z / RP2
+      ET = DSQRT(EX * EX + EZ * EZ)
+      RETURN
+C****
+C**** FRINGE FIELD REGION
+C****
+1     CONTINUE
+3     CONTINUE
+      ZP1 = DZ + DG
+      ZP2 = DZ + 2. * DG
+      ZM1 = DZ - DG
+      ZM2 = DZ - 2. * DG
+      DRP1 = DSQRT( DX * DX + ZP1 * ZP1 )
+      DRP2 = DSQRT( DX * DX + ZP2 * ZP2 )
+      DRM1 = DSQRT( DX * DX + ZM1 * ZM1 )
+      DRM2 = DSQRT( DX * DX + ZM2 * ZM2 )
+      CALL EDPP (F0,   Z  ,  X, Y      , RP   )
+      S0 = S
+      CALL EDPP (F1,  ZP1 ,  X, Y      , DRP1 )
+      CALL EDPP (F2,  ZP2 ,  X, Y      , DRP2 )
+      CALL EDPP (F3,  ZP1 ,  X, Y+DG   , DRP1 )
+      CALL EDPP (F4,  ZP1 ,  X, Y-DG   , DRP1 )
+      CALL EDPP (F5,   Z  ,  X, Y+DG   , RP   )
+      CALL EDPP (F6,   Z  ,  X, Y+2.*DG, RP   )
+      CALL EDPP (F7,   Z  ,  X, Y-DG   , RP   )
+      CALL EDPP (F8,   Z  ,  X, Y-2.*DG, RP   )
+      CALL EDPP (F9,  ZM1 ,  X, Y      , DRM1 )
+      CALL EDPP (F10, ZM2 ,  X, Y      , DRM2 )
+      CALL EDPP (F11, ZM1 ,  X, Y+DG   , DRM1 )
+      CALL EDPP (F12, ZM1 ,  X, Y-DG   , DRM1 )
+      S = S0
+      XG1 = X/DG
+      XG2 = XG1*XG1
+      XG3 = XG2*XG1
+      XG4 = XG3*XG1
+C****
+      EY = XG1 * ( (F5-F7)*2./3. - (F6-F8)/12. ) +
+     1         XG3 * ( (F5-F7)/6. - (F6-F8)/12. -
+     2         ( F3 + F11 - F4 - F12 - 2.*F5 + 2.*F7 )/12. )
+      EX = F0 - XG2*( (F1 + F9 + F5 + F7 - 4.*F0) * 2./3. -
+     1         ( F2 + F10 + F6 + F8 - 4.*F0 )/24. ) +
+     2         XG4 * (-( F1 + F9 + F5 + F7 - 4.*F0 )/6. +
+     3         ( F2 + F10 +      F6 + F8 - 4.*F0 )/24. +
+     4         ( F3 + F11 + F4 + F12 - 2.*F1 - 2.*F9 -
+     5         2.*F5 - 2.*F7 + 4.*F0 )/12. )
+      EZ = XG1 * ( (F1 - F9)*2./3. - (F2 - F10)/12. ) +
+     1         XG3 * ( (F1 - F9)/6. - (F2 - F10)/12. -
+     2         (F3 + F4 - F11 - F12 - 2.*F1 + 2.*F9)/12. )
+      ET = DSQRT( EX * EX + EY * EY + EZ * EZ)
+      RETURN
+      END
+
+
+      SUBROUTINE EDIPL( NO, NP, T, TP ,NUM )
+C****
+C****
+C**** SINGLE MAGNET RAY TRACING BY NUMERICAL INTEGRATION OF DIFFERENTIAL
+C**** EQUATIONS OF MOTION.
+C     T = TIME
+C     TC(1) TO TC(6) =  ( X, Y, Z, VX, VY, VZ )
+C     DTC(1) TO DTC(6) = ( VX, VY, VZ, VXDOT, VYDOT, VZDOT )
+C****
+C****
+      IMPLICIT REAL*8(A-H,O-Z)
+      REAL*8  LF1, LF2, LU1, K
+      EXTERNAL EDIP
+      COMMON  /BLCK 0/  DATA , ITITLE
+      COMMON  /BLCK 4/  ENERGY, VEL, PMASS, Q0
+      COMMON  /BLCK 5/  XA, YA, ZA, VXA, VYA, VZA
+      COMMON  /BLCK10/  BX, BY, BZ, K, TC, DTC
+      COMMON  /BLCK11/  EX, EY, EZ, QMC, IVEC
+      COMMON  /BLCK20/ EC2, EC4, WE, WC
+      COMMON  /BLCK22/  D, DG, S, EF, ET
+      COMMON  /BLCK23/  C0, C1, C2, C3, C4, C5
+      COMMON  /BLCK24/  RB, XC, ZC
+      COMMON  /BLCK25/  IN, MTYP
+      DIMENSION DATA(  75,200 ) ,ITITLE(200)
+      DIMENSION TC(6), DTC(6), DS(6), ES(6)
+C**** DATA  C/ 3.D10/
+C****
+      LF1  = DATA(  1,NO )
+      LU1  = DATA(  2,NO )
+      LF2  = DATA(  3,NO )
+      DG   = DATA(  4,NO )
+      A    = DATA( 11,NO )
+      B    = DATA( 12,NO )
+      D    = DATA( 13,NO )
+      RB   = DATA( 14,NO )
+      EF   = DATA( 15,NO )
+      PHI  = DATA( 16,NO )
+      EC2  = DATA( 17,NO )
+      EC4  = DATA( 18,NO )
+      WE   = DATA( 19,NO )
+      WC   = DATA( 20,NO )
+      Z11  = DATA( 25,NO )
+      Z12  = DATA( 26,NO )
+      Z21  = DATA( 27,NO )
+      Z22  = DATA( 28,NO )
+      DTF1= LF1/ VEL
+      DTF2= LF2/ VEL
+      DTU = LU1/ VEL
+      IF (WE .EQ. 0.) WE = 1000. * RB
+      BX = 0.
+      BY = 0.
+      BZ = 0.
+      EX = 0.
+      EY = 0.
+      EZ = 0.
+      ET = 0.
+      S = 0.
+      IF( NP  .GT. 100 ) GO TO 5
+c      write (6,100) ITITLE(NO)
+  100 FORMAT(  ' E.S.-DIPOLE ****', A4,'  ***************************'/)
+c      write(6,101)
+  101 FORMAT( 8H    T CM ,18X, 4HX CM , 7X, 2HEX, 8X, 4HY CM , 7X, 2HEY,
+     1   8X, 4HZ CM, 7X, 2HEZ, 8X, 6HVELZ/C , 6X, 8HTHETA MR , 5X,
+     2   6HPHI MR , 6X, 1HE             )
+      CALL PRNT5 ( T,S,XA   ,YA   ,ZA   ,EX,EY,EZ,ET,VXA  ,VYA  ,VZA   )
+c      write(6,103)
+  103 FORMAT(   '0COORDINATE TRANSFORMATION TO B AXIS SYSTEM '       )
+  109 FORMAT(   '0COORDINATE TRANSFORMATION TO D AXIS SYSTEM '       )
+C**** TRANSFORM FROM INITIAL ENTRANCE COORDINATES TO EFB COORD.
+C****
+    5 CONTINUE
+      TC(1) =  -  XA
+      TC(2) = YA
+      TC(3) = ( A-ZA )
+      TC(4) = - VXA
+      TC(5) = VYA
+      TC(6) = -VZA
+      CALL PRNT5 ( T,S,TC(1),TC(2),TC(3),EX,EY,EZ,ET,TC(4),TC(5),TC(6) )
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 2
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+C****
+C****
+C****
+   20 TDT = ( TC(3) - Z11 ) /DABS( TC(6) )
+      TC(1) = TC(1) + TDT * TC(4)
+      TC(2) = TC(2) + TDT * TC(5)
+      TC(3) = TC(3) + TDT * TC(6)
+      T = T + TDT
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 2
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+C****
+C**** IN DESIGNATES MAGNET REGIONS FOR BFUN
+C****
+      IN = 1
+      XC = RB
+      ZC = 0.0
+C****
+      C0   = DATA( 29,NO )
+      C1   = DATA( 30,NO )
+      C2   = DATA( 31,NO )
+      C3   = DATA( 32,NO )
+      C4   = DATA( 33,NO )
+      C5   = DATA( 34,NO )
+c      IF( NP  .LE. 100) write(6,104)
+  104 FORMAT( 22H0FRINGING FIELD REGION    )
+      CALL FNMIRK( 6, T, DTF1,TC, DTC, DS, ES, EDIP,  0    )
+      NSTEP = 0
+    6 CALL PRNT5 ( T,S,TC(1),TC(2),TC(3),EX,EY,EZ,ET,TC(4),TC(5),TC(6) )
+      DO 7 I = 1, NP
+      CALL FNMIRK( 6, T, DTF1,TC, DTC, DS, ES, EDIP,  1    )
+      NSTEP = NSTEP + 1
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 2
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+        IF (NSTEP  .GT.  200)  GO TO 99
+      IF( Z12 .GE. TC(3) ) GO TO 8
+    7 CONTINUE
+      GO TO 6
+    8 CONTINUE
+      XDTF1 =-( Z12 - TC(3) ) /DABS( TC(6) )
+      CALL FNMIRK( 6, T,XDTF1,TC, DTC, DS, ES, EDIP,  0    )
+      CALL FNMIRK( 6, T,XDTF1,TC, DTC, DS, ES, EDIP,  1    )
+      CALL PRNT5 ( T,S,TC(1),TC(2),TC(3),EX,EY,EZ,ET,TC(4),TC(5),TC(6) )
+      NUM = NUM + 1
+      TPAR = T*VEL
+      NBR = 2
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+c      IF( NP  .LE. 100) write(6,105) NSTEP
+  105 FORMAT( 10H   NSTEPS=,I5 )
+C***
+C***  UNIFORM FIELD REGION
+C**** TRANSFORM TO SECOND EFB COORD SYSTEM
+C***
+      COPAB =DCOS( (PHI)/57.29578)
+      SIPAB =DSIN( (PHI)/57.29578)
+      COSPB =DCOS( (PHI/2.)/57.29578 )
+      SINPB =DSIN( (PHI/2.)/57.29578 )
+      SIP2 =DSIN( (PHI/2.)/57.29578 )
+      XT = TC(1)
+      ZT = TC(3)
+      VXT = TC(4)
+      VZT = TC(6)
+      TC(3) = - ZT  *COPAB +  XT  *SIPAB -2.*RB*SIP2*COSPB
+      TC(1) = - ZT  *SIPAB -  XT  *COPAB -2.*RB*SIP2*SINPB
+      TC(6) = - VZT *COPAB +  VXT *SIPAB
+      TC(4) = - VZT *SIPAB -  VXT *COPAB
+C****
+C****
+C**** UNIFORM FIELD INTEGRATION REGION
+C****
+C****
+      IN = 2
+      XC = -RB
+      ZC = 0.0
+c      IF( NP  .LE. 100) write(6,106)
+  106 FORMAT(   '0UNIFORM FIELD REGION IN C AXIS SYSTEM '  )
+      IF( TC(3)  .LT.  Z21 ) GO TO 15
+C****
+C**** THIS SECTION CORRECTS FOR MAGNETS WHOSE FRINGING FIELDS INTERSECT
+C****
+c      IF( NP  .LE. 100) write(6,102)
+  102 FORMAT( / '   INTEGRATE BACKWARDS    '  )
+      CALL FNMIRK( 6, T,-DTU ,TC, DTC, DS, ES, EDIP,  0    )
+      NSTEP = 0
+   16 CALL PRNT5 ( T,S,TC(1),TC(2),TC(3),EX,EY,EZ,ET,TC(4),TC(5),TC(6) )
+      DO 17  I =1, NP
+      CALL FNMIRK( 6, T,-DTU, TC, DTC, DS, ES, EDIP,  1    )
+      NSTEP = NSTEP + 1
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 3
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+      IF (NSTEP  .GT.  200)  GO TO 99
+      IF( TC(3)  .LE.  Z21 )  GO TO 18
+   17 CONTINUE
+      GO TO 16
+   18 CONTINUE
+      XDTU  = ( Z21 - TC(3) ) /DABS( TC(6) )
+      CALL FNMIRK( 6, T,XDTU ,TC, DTC, DS, ES, EDIP,  0    )
+      CALL FNMIRK( 6, T,XDTU ,TC, DTC, DS, ES, EDIP,  1    )
+      CALL PRNT5 ( T,S,TC(1),TC(2),TC(3),EX,EY,EZ,ET,TC(4),TC(5),TC(6) )
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 3
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+c      IF( NP  .LE. 100) write(6,105) NSTEP
+c      IF( NP  .LE. 100) write(6,107)
+  107 FORMAT( / )
+      GO TO 19
+C****
+C****
+   15 CONTINUE
+      CALL FNMIRK( 6, T, DTU ,TC, DTC, DS, ES, EDIP,  0    )
+      NSTEP = 0
+    9 CALL PRNT5 ( T,S,TC(1),TC(2),TC(3),EX,EY,EZ,ET,TC(4),TC(5),TC(6) )
+      DO 10  I =1, NP
+      CALL FNMIRK( 6, T, DTU, TC, DTC, DS, ES, EDIP,  1    )
+      NSTEP = NSTEP + 1
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 3
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+      IF (NSTEP  .GT.  200)  GO TO 99
+      IF( TC(3)  .GE.  Z21 )  GO TO 11
+   10 CONTINUE
+      GO TO 9
+   11 CONTINUE
+      XDTU  = ( Z21 - TC(3) ) /DABS( TC(6) )
+      CALL FNMIRK( 6, T,XDTU ,TC, DTC, DS, ES, EDIP,  0    )
+      CALL FNMIRK( 6, T,XDTU ,TC, DTC, DS, ES, EDIP,  1    )
+      CALL PRNT5 ( T,S,TC(1),TC(2),TC(3),EX,EY,EZ,ET,TC(4),TC(5),TC(6) )
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 3
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+c      IF( NP  .LE. 100) write(6,105) NSTEP
+   19 CONTINUE
+C***
+C***
+C**** SETUP FOR SECOND FRINGE FIELD AND INTEGRATION
+C****
+C****
+      C0   = DATA( 35,NO )
+      C1   = DATA( 36,NO )
+      C2   = DATA( 37,NO )
+      C3   = DATA( 38,NO )
+      C4   = DATA( 39,NO )
+      C5   = DATA( 40,NO )
+      IN = 3
+c      IF( NP  .LE. 100) write(6,104)
+      CALL FNMIRK( 6, T, DTF2,TC, DTC, DS, ES, EDIP,  0    )
+      NSTEP = 0
+   12 CALL PRNT5 ( T,S,TC(1),TC(2),TC(3),EX,EY,EZ,ET,TC(4),TC(5),TC(6) )
+      DO 13  I =1, NP
+      CALL FNMIRK( 6, T, DTF2,TC, DTC, DS, ES, EDIP,  1    )
+      NSTEP = NSTEP + 1
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 3
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+      IF (NSTEP  .GT.  200)  GO TO 99
+      IF( TC(3) .GE. Z22 )  GO TO 14
+   13 CONTINUE
+      GO TO 12
+   14 CONTINUE
+      XDTF2 = ( Z22 - TC(3) ) /DABS( TC(6) )
+      CALL FNMIRK( 6, T,XDTF2,TC, DTC, DS, ES, EDIP,  0    )
+      CALL FNMIRK( 6, T,XDTF2,TC, DTC, DS, ES, EDIP,  1    )
+      CALL PRNT5 ( T,S,TC(1),TC(2),TC(3),EX,EY,EZ,ET,TC(4),TC(5),TC(6) )
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 3
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+c      IF( NP  .LE. 100) write(6,105) NSTEP
+C****
+C**** TRANSFORM TO OUTPUT SYSTEM COORD.
+C****
+      XT = TC(1)
+      ZT = TC(3)
+      VXT = TC(4)
+      VZT = TC(6)
+      TC(3) = ZT - B
+      TC(1) = XT
+      TC(6) = VZT
+      TC(4) = VXT
+c      IF( NP  .LE. 100) write(6,109)
+      CALL PRNT5 ( T,S,TC(1),TC(2),TC(3),EX,EY,EZ,ET,TC(4),TC(5),TC(6) )
+C****
+C**** TRANSLATE PARTICLE TO OUT SYSTEM COORD.
+C****
+C****
+C****
+C****
+   30 TDT = -TC(3) /DABS( TC(6) )
+      TC(1) = TC(1) + TDT * TC(4)
+      TC(2) = TC(2) + TDT * TC(5)
+      TC(3) = TC(3) + TDT * TC(6)
+      T = T + TDT
+      TP = T * VEL
+      EX = 0.
+      EY = 0.
+      EZ = 0.
+      ET = 0.
+      S  = 0.
+      VXF    = 1000. *DATAN2( TC(4), TC(6)  )
+      VYF    = 1000. *DASIN ( TC(5)/ VEL    )
+      VZF    = TC(6) / VEL
+c      IF( NP.LE.100) write(6,115) TP,TC(1),TC(2),TC(3),VZF,VXF,VYF
+  115 FORMAT( F10.4, 10X, F10.3, 11X, F10.3, 11X, F10.3, 11X,
+     1   F13.5, F13.2, F11.2                   )
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 4
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+C****
+C**** CALCULATE INTERCEPTS IN SYSTEM D
+C****
+      Z0X = -TC(1)/ ( TC(4) / TC(6)    + 1.E-10 )
+      Z0Y = -TC(2)/ ( TC(5) / TC(6)    + 1.E-10 )
+c      IF( NP  .LE. 100) write(6,111) VXF, VYF, Z0X, Z0Y
+  111 FORMAT( / ' INTERSECTIONS WITH VER. AND HOR. PLANES '          ,
+     X       /15X, 5H  XP=,F10.4, 10H MR    YP=,F10.4, 3H MR   /
+     1        15X, 5H Z0X=,F10.2, 10H CM   Z0Y=,F10.2, 3H CM   /     )
+      RETURN
+   99 CALL PRNT4(NO, IN)
+      RETURN
+      END
+
+
+      SUBROUTINE EDPP( EFLD, Z, X, Y, DRP )
+C****
+C**** CALCULATE S; DETERMINE E-FIELD IN FRINGE REGIONS
+C****
+      IMPLICIT REAL*8(A-H,O-Z)
+      REAL*8 K
+      COMMON  /BLCK20/ EC2, EC4, WE, WC
+      COMMON  /BLCK22/  D, DG, S, EF, ET
+      COMMON  /BLCK23/  C0, C1, C2, C3, C4, C5
+      COMMON  /BLCK24/  RB, XC, ZC
+      COMMON  /BLCK25/  IN, MTYP
+      FEF = -EF
+      IF ( IN .EQ. 1 ) FEF = +EF
+      W2 = WE * WE
+      ZD1 = Z / D
+      ZD2 = EC2 * ZD1 * Y * Y / W2
+      W4 = W2 * W2
+      ZD3 = EC4 * (Y**4) / W4
+      S = ZD1 + ZD2 + ZD3
+      CS = C0 + S * (C1 + S * (C2 + (S * (C3 + S * (C4 +S * C5)))))
+      IF (DABS(CS) .GT. 70.) CS = DSIGN(70.D0, CS)
+      E = DEXP(CS)
+      P0 = 1.0 + E
+      EFLD = (FEF / P0) * (RB / DRP)
+      RETURN
+      END
+        SUBROUTINE EXIT
+c       CALL DTIME
+c	    ctemp=ctime(time())
+c		write(6,*)ctemp
+        STOP
+        END
+
+
+      SUBROUTINE FB01AD(C,  VK,VE)
+      IMPLICIT REAL*8(A-H,O-Z)
+      DATA XLG/1.0D300/
+C**NON-IBM......REAL * 8 XLG/'7FFFFFFFFFFFFFFF'X/
+      D=1D0-C
+      IF(D .GT. 0D0)E=-DLOG(D)
+C**** HARWELL VERSION OF FB01AD
+      IF(C .GE. 1D0)GO TO 2
+      VE=E*((((((((((
+     A     3.18591956555015718D-5*D  +.989833284622538479D-3)*D
+     B    +.643214658643830177D-2)*D +.16804023346363385D-1)*D
+     C    +.261450147003138789D-1)*D +.334789436657616262D-1)*D
+     D    +.427178905473830956D-1)*D +.585936612555314917D-1)*D
+     E    +.937499997212031407D-1)*D +.249999999999901772D0)*D)
+     F    +(((((((((
+     G     .149466217571813268D-3*D  +.246850333046072273D-2)*D
+     H    +.863844217360407443D-2)*D+.107706350398664555D-1)*D
+     I    +.782040406095955417D-2)*D +.759509342255943228D-2)*D
+     J    +.115695957452954022D-1)*D +.218318116761304816D-1)*D
+     K    +.568051945675591566D-1)*D +.443147180560889526D0)*D
+     L    +1D0
+C****
+C**** ROUTINE MODIFIED TO CALCULATE VK AND VE ALWAYS
+C****
+C****
+      VK=E*((((((((((
+     A     .297002809665556121D-4*D   +.921554634963249846D-3)*D
+     B    +.597390429915542916D-2)*D  +.155309416319772039D-1)*D
+     C    +.239319133231107901D-1)*D  +.301248490128989303D-1)*D
+     D    +.373777397586236041D-1)*D  +.48828041906862398D-1)*D
+     E    +.703124997390383521D-1)*D  +.124999999999908081D0)*D
+     F    +.5D0)+(((((((((
+     G     .139308785700664673D-3*D   +.229663489839695869D-2)*D
+     H    +.800300398064998537D-2)*D  +.984892932217689377D-2)*D
+     I    +.684790928262450512D-2)*D  +.617962744605331761D-2)*D
+     J    +.878980187455506468D-2)*D  +.149380135326871652D-1)*D
+     K    +.308851462713051899D-1)*D  +.965735902808562554D-1)*D
+     L    +1.38629436111989062D0
+      RETURN
+    2 VE=1D0
+      VK=XLG
+      RETURN
+      END
+
+
+      SUBROUTINE FB02AD(CAYSQ,SINP,COSP,E,F)
+C
+      IMPLICITREAL*8(A-H,O-Z)
+      PHI=DATAN(SINP/COSP)
+      IF(CAYSQ*SINP*SINP-0.5D0)1,1,5
+    1 H=1.0D0
+      A=PHI
+      N=0
+      SIG1=0.D0
+      SIG2=0.D0
+      SIN2=SINP*SINP
+      TERM=SINP*COSP*0.5D0
+      CRIT=PHI
+    2 N=N+1
+      RECIP=1.0D0/N
+      FACT=(N-.5D0)*RECIP
+      H1=H
+      H=FACT*CAYSQ*H
+      A=FACT*A-TERM*RECIP
+      TERM=TERM*SIN2
+      CRIT=CRIT*SIN2
+      DEL1=H*A
+      DEL2=-.5D0*RECIP*CAYSQ*H1*A
+      SIG1=SIG1+DEL1
+      SIG2=SIG2+DEL2
+      IF(DABS(DEL1)-4.0D-16)4,3,3
+   3  IF(DABS(CRIT)-DABS(A))4,2,2
+    4 F=PHI+SIG1
+      E=PHI+SIG2
+      GO TO 8
+    5 CFI=1.D0
+      CFJ=1.D0
+      CFL=0.D0
+      CFM=0.D0
+      CFN=0.D0
+      SIG1=0.D0
+      SIG2=0.D0
+      SIG3=0.D0
+      SIG4=0.D0
+      N=0
+      FACT1=1.0D0-CAYSQ*SINP*SINP
+      FACTOR=.5D0*COSP*DSQRT(CAYSQ/FACT1)
+      FACTRO=FACTOR+FACTOR
+      CAYDSQ=1.0D0-CAYSQ
+    6 N=N+1
+      RECIP=1.0D0/N
+      FACTN=RECIP*(N-.5D0)
+      FACTM=(N+.5D0)/(N+1.0D0)
+      FACTOR=FACTOR*FACT1
+      CFI1=CFI
+      CFJ1=CFJ
+      CFI=CFI*FACTN
+      CFJ=CFJ*FACTN*FACTN*CAYDSQ
+      CFL=CFL+.5D0/(N*(N-.5D0))
+      CFM=(CFM-FACTOR*RECIP*CFI)*FACTM*FACTM*CAYDSQ
+      CFN=(CFN-FACTOR*RECIP*CFI1)*FACTN*FACTM*CAYDSQ
+      DEL1=CFM-CFJ*CFL
+      DEL2=CFN-(FACTN*CFL-.25D0*RECIP*RECIP)*CAYDSQ     *CFJ1
+      DEL3=CFJ
+      DEL4=FACTM*CFJ
+      SIG1=SIG1+DEL1
+      SIG2=SIG2+DEL2
+      SIG3=SIG3+DEL3
+      SIG4=SIG4+DEL4
+      IF(DABS (DEL1)-4.0D-16)7,6,6
+    7 CAYMOD=DSQRT(CAYSQ)
+      FLOG1=DLOG(4.0D0/(DSQRT(FACT1)+CAYMOD*COSP))
+      T1=(1.0D0+SIG3)*FLOG1+FACTRO*DLOG(.5D0+.5D0*CAYMOD*DABS (SINP))
+      T2=(.5D0+SIG4)*CAYDSQ*FLOG1+1.0D0-FACTRO*(1.0D0-CAYMOD*DABS(SINP))
+      F=T1+SIG1
+      E=T2+SIG2
+    8 RETURN
+      END
+
+
+      SUBROUTINE FB03AD( GN,CACA,P )
+C====== 23/03/72 LAST LIBRARY UPDATE
+      IMPLICITREAL*8(A-H,O-Z)
+      IF(GN)1,2,2
+    1 IF(CACA)3,3,4
+    3 P=1.5707963268/DSQRT(1.D0-GN)
+      RETURN
+    4 STH=DSQRT(-GN/(CACA-GN))
+      CTH=DSQRT(1.D0-STH*STH)
+      CADA=1.D0-CACA
+      CALLFB01AD(CACA,     CAPK,CAPE)
+      CALLFB02AD(CADA,STH,CTH,E,F)
+      BR=CAPE*F-CAPK*(F-E)
+      P=CAPK*CTH*CTH+STH*BR/DSQRT(1.D0-GN)
+      RETURN
+    2 IF(GN-CACA)10,30,20
+   10 STH=DSQRT(GN/CACA)
+      CTH=DSQRT(1.D0-STH*STH)
+      CALLFB01AD(CACA,     CAPK,CAPE)
+      CALLFB02AD(CACA,STH,CTH,E,F)
+      BR=CAPK*E-CAPE*F
+      P=CAPK+BR*STH/(CTH*DSQRT(1.D0-GN))
+      RETURN
+   30 CALLFB01AD(CACA,     CAPK,CAPE)
+      P=CAPE/(1.D0-CACA)
+      RETURN
+   20 CADA=1.D0-CACA
+      PI=3.1415926536
+      STH=DSQRT((1.D0-GN)/CADA)
+      CTH=DSQRT(1.D0-STH*STH)
+      CALLFB01AD(CACA,     CAPK,CAPE)
+      CALLFB02AD(CADA,STH,CTH,E,F)
+      BR=PI/2.+CAPK*(F-E)-CAPE*F
+      P=CAPK+BR*DSQRT(GN)/(CADA*STH*CTH)
+      RETURN
+      END
+      SUBROUTINE FNMIRK(N,X,H,Y,DY,D,E,BFUN,  NDEX)
+      IMPLICIT REAL*8(A-H,O-Z)
+      EXTERNAL BFUN
+      DIMENSION Y(1),DY(1),D(1),E(1)
+      IF( NDEX.NE.0) GO TO 20
+      DO 10 I=1,N
+      D(I)=Y(I)
+   10 CONTINUE
+      CALL DERIV ( BFUN )
+      HALFH=0.5*H
+      RETURN
+   20 DO 30 I=1,N
+      T=HALFH*DY(I)
+      Y(I)=D(I)+T
+      E(I)=T
+   30 CONTINUE
+      XZERO=X
+      X=X+HALFH
+      CALL DERIV ( BFUN )
+      DO 40 I=1,N
+      T=HALFH*DY(I)
+      Y(I)=D(I)+T
+      E(I)=E(I)+2.0*T
+   40 CONTINUE
+      CALL DERIV ( BFUN )
+      DO 50 I=1,N
+      T=H*DY(I)
+      Y(I)=D(I)+T
+      E(I)=E(I)+T
+   50 CONTINUE
+      X=XZERO+H
+      CALL DERIV ( BFUN )
+      DO 60 I=1,N
+      Y(I)=D(I)+(E(I)+HALFH*DY(I))*.333333333
+      D(I)=Y(I)
+   60 CONTINUE
+      CALL DERIV ( BFUN )
+      RETURN
+      END
+C
+
+
+C*IBM FUNCTION DASIN(X)
+C****
+C**** ROUTINE TO PASS CALL TO IBM DOUBLE PRECISION ARC-SINE
+C****
+C*IBM IMPLICIT REAL*8(A-H,O-Z)
+C*IBM DASIN = DARSIN(X)
+C*IBM RETURN
+C*IBM END
+
+
+      SUBROUTINE  LENS ( NO,  NP,T, TP ,NUM )
+C****
+C****
+C**** THIN LENS ROUTINE
+C****
+C****
+      IMPLICIT REAL*8(A-H,O-Z)
+      COMMON  /BLCK 0/  DATA , ITITLE
+      COMMON  /BLCK 4/  ENERGY, VEL, PMASS, Q0
+      COMMON  /BLCK 5/  XA, YA, ZA, VXA, VYA, VZA
+      DIMENSION DATA(  75,200 ), ITITLE(200)
+C**** DATA  C/ 3.D10/
+C****
+  100 FORMAT( /  '   THIN LENS     ****  ', A4, '****************',//
+     1'      T CM', 18X, 'X CM', 7X, 'Y CM', 7X, 'Z CM' , '      VELZ/C'
+     2   , '    THETA MR      PHI MR'  /  )
+  103 FORMAT( F10.4, 11X, 3F11.3, F12.5, 2F12.3  )
+C****
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 1
+      CALL PLT2 ( NUM, NO, NBR, TPAR )
+c      IF( NP  .LE. 100) write (6, 100) ITITLE(NO)
+      VXP = 1000. *DATAN2( VXA,VZA )
+      VYP = 1000. *DASIN ( VYA/VEL )
+      VZP =  VZA  / VEL
+      TP = T*VEL
+c      IF( NP  .LE. 100) write (6, 103) TP, XA, YA, ZA, VZP, VXP, VYP
+      XXA = XA
+      YYA = YA
+      CS = DATA(9,NO)
+      XA =XXA*DATA(1,NO) + VXP*DATA(2,NO)
+      VXP =XXA*DATA(3,NO) + VXP*DATA(4,NO) -
+     1     CS*DATA(3,NO)**4 * ( XXA*XXA + YYA*YYA )*XXA/10**9
+      YA =YYA*DATA(5,NO) + VYP*DATA(6,NO)
+      VYP =YYA*DATA(7,NO) + VYP*DATA(8,NO) -
+     1     CS*DATA(7,NO)**4 * ( XXA*XXA + YYA*YYA )*YYA/10**9
+      VXA = VEL*DSIN( VXP/1000.D0 )
+      VYA = VEL*DSIN( VYP/1000.D0 )
+      VZA = DSQRT(VEL*VEL -VXA*VXA-VYA*VYA)
+      VZP = VZA/VEL
+c      IF( NP  .LE. 100) write (6, 103) TP, XA, YA, ZA, VZP, VXP, VYP
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 2
+      CALL PLT2 ( NUM, NO, NBR, TPAR )
+      RETURN
+      END
+
+
+      SUBROUTINE NDIP
+C****
+C****
+C**** MTYP = 3 OR 4
+C**** THIS VERSION OF BFUN IS MAINLY FOR NONUNIFORM FIELD MAGNETS
+C**** THE CENTRAL FIELD REGION IS REPRESENTED TO 3'RD ORDER ON-AND-
+C**** OFF THE MIDPLANE BY ANALYTIC EXPRESSIONS. SEE SLAC NO. 75
+C**** FRINGE FIELD REGIONS REPRESENTED BY FERMI TYPE FALL-OFF
+C**** ALONG WITH RADIAL FALL-OFF
+C**** COMPONENTS OF 'B' IN FRINGE REGION EVALUATED BY NUMERICAL METHODS
+C****
+C****
+C**** THE RELATIONSHIP BETWEEN B0, ......... B12 AND B(I,J) RELATIVE TO
+C**** AXES (Z,X) IS GIVEN BY
+C****
+C****
+C**** B0  = B( 0, 0 )
+C**** B1  = B( 1, 0 )
+C**** B2  = B( 2, 0 )
+C**** B3  = B( 1, 1 )
+C**** B4  = B( 1,-1 )
+C**** B5  = B( 0, 1 )
+C**** B6  = B( 0, 2 )
+C**** B7  = B( 0,-1 )
+C**** B8  = B( 0,-2 )
+C**** B9  = B(-1, 0 )
+C**** B10 = B(-2, 0 )
+C**** B11 = B(-1, 1 )
+C**** B12 = B(-1,-1 )
+C****
+C****
+      IMPLICIT REAL*8(A-H,O-Z)
+      REAL*8  NDX, K
+      COMMON  /BLCK10/  BX, BY, BZ, K, TC, DTC
+      COMMON  /BLCK20/  NDX,BET1,GAMA,DELT,CSC
+      COMMON  /BLCK21/  RCA,DELS,BR,S2,S3,S4,S5,S6,S7,S8,SCOR
+      COMMON  /BLCK22/  D, DG, S, BF, BT
+      COMMON  /BLCK23/  C0, C1, C2, C3, C4, C5
+      COMMON  /BLCK24/  RB, XC, ZC
+      COMMON  /BLCK25/  IN, MTYP
+      DIMENSION TC(6), DTC(6)
+      X = TC(1)
+      Y = TC(2)
+      Z = TC(3)
+      DX = X - XC
+      DZ = Z - ZC
+      RP =DSQRT( DX**2 + DZ**2 )
+      DR = RP - RB
+      GO TO ( 1, 2, 3, 14 ), IN
+    7 CONTINUE
+c    7 write (6, 8) IN, MTYP
+      CALL EXIT
+    8 FORMAT (    '0 ERROR -GO TO -  IN BFUN   IN=', I3, '   MTYP=',I4 )
+    2 DRR1 = DR/RB
+      DRR2 = DRR1*DRR1
+      DRR3 = DRR2*DRR1
+      DRR4 = DRR3*DRR1
+      IF( Y .NE. 0. )  GO TO 4
+C****
+C**** MID-PLANE UNIFORM FIELD REGION
+C****
+      BX = 0.
+      BY = 0.
+      IF( MTYP .EQ. 3) BY=
+     1     BF* ( 1. - NDX*DRR1 + BET1*DRR2 + GAMA*DRR3 + DELT*DRR4 )
+      IF( MTYP .EQ. 4) BY= BF/ (1. + NDX*DRR1 )
+      BZ = 0.
+      BT = BY
+      RETURN
+C****
+C**** NON MID-PLANE UNIFORM FIELD REGION
+C****
+    4 YR1 = Y/RB
+      YR2 = YR1*YR1
+      YR3 = YR2*YR1
+      YR4 = YR3*YR1
+      RR1 = RB/RP
+      RR2 = RR1*RR1
+      RR3 = RR2*RR1
+      IF( MTYP .EQ. 3 ) GO TO 11
+      IF( MTYP .EQ. 4 ) GO TO 12
+      GO TO 7
+C****
+C**** MTYP = 3
+C****
+   11 BRR = BF*( ( -NDX + 2.*BET1*DRR1 + 3.*GAMA*DRR2 + 4.*DELT*DRR3 )
+     1   *YR1 - (NDX*RR2 + 2.*BET1*RR1*(1.-RR1*DRR1) +
+     2   3.*GAMA*( 2. + 2.*RR1*DRR1 - RR2*DRR2 ) +
+     3   4.*DELT*( 6.*DRR1 + 3.*RR1*DRR2 - RR2*DRR3 ))*YR3/6. )
+      BY = BF* ( 1. - NDX*DRR1 + BET1*DRR2 + GAMA*DRR3 + DELT*DRR4 -
+     1   .5*YR2*( -NDX*RR1 + 2.*BET1*( 1. + RR1*DRR1) +
+     2   3.*GAMA*DRR1*( 2. + RR1*DRR1) + 4.*DELT*DRR2*(3. + RR1*DRR1) )
+     3   + YR4*( -NDX*RR3 + 2.*BET1*( RR3*DRR1 - RR2) +
+     4   3.*GAMA*( 4.*RR1 - 2.*RR2*DRR1 + RR3*DRR2 ) +
+     5   4.*DELT*( 6. + 12.*RR1*DRR1 - 3.*RR2*DRR2 + RR3*DRR3 ) )/24. )
+      GO TO 13
+C****
+C**** MTYP = 4
+C****
+   12 DNR1 = 1. + NDX*DRR1
+      DNR2 = DNR1*DNR1
+      DNR3 = DNR2*DNR1
+      DNR4 = DNR3*DNR1
+      DNR5 = DNR4*DNR1
+      BRR = BF*NDX*( -YR1/DNR2 + YR3*( 6.*NDX*NDX/DNR4 -
+     1   2.*NDX*RR1/DNR3 - RR2/DNR2 ) /6.  )
+      BY = BF*( 1./DNR1 + .5*YR2*NDX*( -2.*NDX/DNR3 + RR1/DNR2) +
+     2   YR4*NDX*( 24.*NDX**3 /DNR5 - 12.*NDX*NDX*RR1/DNR4 -
+     3   2.*NDX*RR2/DNR3 - RR3/DNR2 ) /24.  )
+C****
+C****
+   13 BX = BRR*DX/RP
+      BZ = BRR*DZ/RP
+      BT  =DSQRT(BX*BX + BY*BY + BZ*BZ)
+      RETURN
+C****
+C****
+    1 SINE = -1.
+      GO TO 5
+    3 SINE = 1.
+    5 IF( Z  .GT. 0. ) DR = X * SINE*CSC
+      CALL NDPP( B0, Z, X, Y, DR      )
+      IF( Y  .NE. 0. )  GO TO 6
+C****
+C**** MID-PLANE FRINGING FIELD REGION
+C****
+      BX = 0.
+      BY = B0
+      BZ = 0.
+      BT   = B0
+      RETURN
+C****
+C**** NON MID-PLANE FRINGING FIELD REGION
+C****
+    6 IF( Z .GT. 0. )  GO TO 9
+      DR1  =       (DSQRT( DX**2 + (DZ+DG)**2 ) - RB )
+      DR2  =       (DSQRT( DX**2 + (DZ+2.*DG)**2 ) - RB )
+      DR3  =       (DSQRT( (DX+DG)**2 + (DZ+DG)**2 )  - RB )
+      DR4  =       (DSQRT( (DX-DG)**2 + (DZ+DG)**2 )  - RB )
+      DR5  =       (DSQRT( (DX+DG)**2 + DZ**2 ) - RB )
+      DR6  =       (DSQRT( (DX+ 2.*DG)**2 + DZ**2 ) - RB )
+      DR7  =       (DSQRT( (DX-DG)**2 + DZ**2 ) - RB )
+      DR8  =       (DSQRT( (DX- 2.*DG)**2 + DZ**2 ) - RB )
+      DR9  =       (DSQRT( DX**2 + (DZ-DG)**2 ) - RB )
+      DR10 =       (DSQRT( DX**2 + (DZ-2.*DG)**2 ) - RB )
+      DR11 =       (DSQRT( (DX+DG)**2 + (DZ-DG)**2 )  - RB )
+      DR12 =       (DSQRT( (DX-DG)**2 + (DZ-DG)**2 )  - RB )
+      GO TO 10
+    9 DR1  = SINE* X*CSC
+      DR2  = DR1
+      DR9  = DR1
+      DR10 = DR1
+      DR3  = SINE* ( X + DG )*CSC
+      DR5  = DR3
+      DR11 = DR3
+      DR4  = SINE*( X - DG )*CSC
+      DR7  = DR4
+      DR12 = DR4
+      DR6  = SINE* ( X + 2.*DG )*CSC
+      DR8  = SINE* ( X - 2.*DG )*CSC
+C****
+C****
+   10 CALL NDPP ( B1 , Z + DG, X , Y , DR1 )
+      CALL NDPP ( B2 , Z + 2.*DG, X , Y , DR2 )
+      CALL NDPP ( B3 , Z + DG, X + DG , Y , DR3 )
+      CALL NDPP ( B4 , Z + DG, X - DG , Y , DR4 )
+      CALL NDPP ( B5 , Z , X + DG , Y, DR5 )
+      CALL NDPP ( B6 , Z , X + 2.*DG , Y , DR6 )
+      CALL NDPP ( B7 , Z , X - DG , Y, DR7 )
+      CALL NDPP ( B8 , Z , X - 2.*DG , Y , DR8 )
+      CALL NDPP ( B9 , Z - DG, X , Y , DR9 )
+      CALL NDPP ( B10, Z - 2.*DG, X, Y, DR10 )
+      CALL NDPP ( B11, Z - DG, X + DG , Y , DR11 )
+      CALL NDPP ( B12, Z - DG, X - DG , Y , DR12 )
+      YG1 = Y/DG
+      YG2 = YG1**2
+      YG3 = YG1**3
+      YG4 = YG1**4
+      BX = YG1 * ( (B5-B7)*2./3. - (B6-B8)/12. )  +
+     1     YG3*( (B5-B7)/6. - (B6-B8)/12. -
+     2     (B3 + B11 - B4 - B12 - 2.*B5 + 2.*B7 ) / 12. )
+      BY = B0 - YG2*( ( B1 + B9 + B5 + B7 - 4.*B0 ) *2./3. -
+     1     ( B2 + B10 + B6 + B8 - 4.*B0 ) / 24. ) +
+     2     YG4* (-( B1 + B9 + B5 + B7 - 4.*B0 ) / 6. +
+     3     ( B2 + B10 + B6 + B8 - 4.*B0 ) / 24. +
+     4     ( B3 + B11 + B4 + B12 - 2.*B1 - 2.*B9 -
+     5     2.*B5 - 2.*B7 + 4.*B0 ) / 12. )
+      BZ = YG1*( (B1 - B9 ) *2./3. - ( B2 - B10 ) /12. ) +
+     1     YG3*( ( B1 - B9 ) / 6. - ( B2 - B10 ) / 12. -
+     2     ( B3 + B4 - B11 - B12 - 2.*B1 + 2.*B9 ) / 12.  )
+      BT  =DSQRT(BX*BX + BY*BY + BZ*BZ)
+      RETURN
+   14 BX = 0.
+      BY = BR
+      BZ = 0.
+      BT = BR
+      RETURN
+      END
+
+
+      SUBROUTINE  NDPP ( BFLD, Z, X, Y , DR )
+C****
+C****
+C****
+C****
+      IMPLICIT REAL*8(A-H,O-Z)
+      REAL*8  NDX, K
+      COMMON  /BLCK10/  BX, BY, BZ, K, TC, DTC
+      COMMON  /BLCK20/  NDX,BET1,GAMA,DELT,CSC
+      COMMON  /BLCK21/  RCA,DELS,BR,S2,S3,S4,S5,S6,S7,S8,SCOR
+      COMMON  /BLCK22/  D, DG, S, BF, BT
+      COMMON  /BLCK23/  C0, C1, C2, C3, C4, C5
+      COMMON  /BLCK24/  RB, XC, ZC
+      COMMON  /BLCK25/  IN, MTYP
+      DIMENSION TC(6), DTC(6)
+      DRR1 = DR/RB
+      DRR2 = DRR1*DRR1
+      DRR3 = DRR2*DRR1
+      DRR4 = DRR3*DRR1
+C****
+C**** MTYP    :                  MODIFIED ITERATIVE PROCEDURE
+C****
+      XP = X
+      XP2 = XP*XP
+      XP3 = XP2*XP
+      XP4 = XP3 * XP
+      ZP = -(S2*XP2 + S3*XP3 + S4*XP4 + S5*XP4*XP + S6*XP4*XP2 +
+     1       S7*XP4*XP3 + S8*XP4*XP4 )
+      AZ = (Z-ZP)/10.D0
+      AZMAX = DSQRT(  X*X + Z*Z  )
+      IF( AZ  .GT.  AZMAX  )  AZ = AZMAX
+      ZSIGN = Z-ZP
+      RINV4 = 0.
+      DO 11 I=1,21
+      XP   = X + AZ*(I-11)
+      XP2 = XP*XP
+      XP3 = XP2*XP
+      XP4 = XP3*XP
+      ZP = -(S2*XP2 + S3*XP3 + S4*XP4 + S5*XP4*XP + S6*XP4*XP2 +
+     1       S7*XP4*XP3 + S8*XP4*XP4 )
+      XXP = X-XP
+      ZZP = Z-ZP
+      DD =            XXP*XXP + ZZP*ZZP
+      IF( DD  .LT.  1.D-15 )  DD = 1.D-15
+      IF( DD  .GT.  1.D15  )  DD = 1.D15
+      RINV4 = RINV4 + 1.0D0 / (DD*DD )
+   11 CONTINUE
+      DP = DSQRT( 1.D0/RINV4 )
+      DP = DSQRT( DP )
+      S = 1.9023D0* DSIGN( 1.D0, ZSIGN ) * DP/D + DELS
+C****
+C**** FIRST GUESS FOR CLOSEST POINT IS
+C****
+C*    XP = X
+C*    XP2 = XP*XP
+C*    XP3 = XP2*XP
+C*    XP4 = XP3*XP
+C****
+C**** CALCULATE ZP ON CURVE FOR CORRESPONDING XP
+C****
+C*    ZP = -( S2*XP2 + S3*XP3 + S4*XP4 + S5*XP4*XP + S6*XP4*XP2 +
+C*   1   S7*XP4*XP3 + S8*XP4*XP4 )
+C*    ZSIGN = Z-ZP
+C****
+C**** SLOPE OF CURVE AT XP, ZP
+C****
+C*    DO 4 I=1,3
+C*    DZDXC = -(2.*S2*XP + 3.*S3*XP2+ 4.*S4*XP3 + 5.*S5*XP4 +
+C*   1   6.*S6*XP4*XP + 7.*S7*XP4*XP2 + 8.*S8*XP4*XP3 )
+C****
+C**** NEXT APPROXIMATION TO CLOSEST POINT IS
+C****
+C*    XP = ( DZDXC*(Z-ZP)  +  DZDXC*DZDXC*XP + X ) / (1.+DZDXC*DZDXC)
+C*    IF( I  .EQ.  1 )  XP = (3.*XP +  X ) / 4.
+C*    XP2 = XP*XP
+C*    XP3 = XP2*XP
+C*    XP4 = XP3*XP
+C*    ZP = -( S2*XP2 + S3*XP3 + S4*XP4 + S5*XP4*XP + S6*XP4*XP2 +
+C*   1   S7*XP4*XP3 + S8*XP4*XP4 )
+C*  4 CONTINUE
+C*    XXP = X-XP
+C*    ZZP = Z-ZP
+C*    S = DSIGN( 1.D0,ZSIGN) * DSQRT( XXP*XXP + ZZP*ZZP) / D + DELS
+C****
+C****
+C****
+C****
+      CS=C0+S*(C1+S*(C2+S*(C3+S*(C4+S*C5))))
+      IF( DABS(CS)  .GT.  70.  )  CS =DSIGN( 70.D0 ,CS  )
+      E=DEXP(CS)
+      P0 = 1.0 + E
+      DB=BF-BR
+      BFLD = 0.
+      IF( MTYP .EQ. 3 ) BFLD =
+     1       BR +( 1. - NDX*DRR1 + BET1*DRR2+GAMA*DRR3+DELT*DRR4)*DB/P0
+      IF( MTYP .EQ. 4 ) BFLD = BR + ( 1./(1. +NDX*DRR1) )*DB/P0
+C****
+C**** write(6,100) X, Y, Z,  DR, S, BFLD
+C*100 FORMAT( 1P6D15.4 )
+C****
+      RETURN
+      END
+      SUBROUTINE OPTIC( J, JFOCAL, NP, T, TP )
+C****
+C****
+C****
+      IMPLICIT REAL*8(A-H,O-Z)
+      COMMON  /BLCK 2/  XO, YO, ZO, VXO, VYO, VZO, RTL(1000), RLL(1000)
+      COMMON /BLCK 3/ XOR , YOR , ZOR , TH0, PH0, TL1
+      COMMON  /BLCK 4/  ENERGY, VEL, PMASS, Q0
+      COMMON  /BLCK 5/  XA, YA, ZA, VXA, VYA, VZA
+      DIMENSION XO(1000),YO(1000),ZO(1000),VXO(1000),VYO(1000),VZO(1000)
+C**** DATA  C/ 3.D10/
+C****
+C****
+  100 FORMAT( /  ' INTERSECTION POINT IN XZ-PLANE OF CENTRAL RAY AND THI
+     1S RAY '      )
+  101 FORMAT(  ' (IN D AXIS SYSTEM                 )       '         )
+  102 FORMAT(  ' (IN OPTIC AXIS SYSTEM             )        '        )
+  103 FORMAT( / ' RAY PARAMETERS AT THE FOCAL AXIS SYSTEM  '         )
+  104 FORMAT( / ' COORDINATE TRANSFORMATION TO OPTIC AXIS SYSTEM  '  )
+C****
+C****
+C****
+  105 FORMAT( / '  *****************************************************
+     1************************************************************'/  )
+c      IF( NP  .LE. 100) write (6, 105)
+      IF( J  .GT.  2  )  GO TO 19
+      IF( J  .EQ.  1 )  GO TO 15
+      IF( J  .EQ. 2)  GO TO 18
+      CALL EXIT
+   15 B1X = XA
+      B1Y = YA
+      S1X = VXA/VZA
+      S1Y = VYA/VZA
+      TT = T
+      VEL1 = VEL
+      VZA1 = VZA
+      S1XP = DATAN2( VXA,VZA )
+      COS1 =DCOS(S1XP)
+      SIN1 =DSIN(S1XP)
+      ZZZZ = 0.
+      TT1 = TT*1.0D+09
+      TL1 = TT*VEL
+      TH0 = 1000. * S1XP
+      PH0 = 1000. * DASIN (VYA/VEL)
+      GO TO 17
+   18 B2X = XA
+      B2Y = YA
+      S2X = VXA/VZA
+      S2Y = VYA/VZA
+C****
+C**** CALCULATE CENTRAL AND PARAXIAL RAY INTERCEPTS IN SYSTEM - D
+C****
+      DSX = S1X-S2X
+      IF( DSX .EQ. 0. )   DSX = 1.D-30
+      ZINT =  ( B2X-B1X) /  DSX
+      XINT = ( B2X*S1X - B1X*S2X ) /  DSX
+      YINT = S2Y*ZINT + B2Y
+      XOR  = XINT
+      YOR  = 0.
+      ZOR  = ZINT
+      IF( JFOCAL .EQ. 0 ) GO TO 14
+      XOR  = B1X
+      ZOR  = 0.
+   14 CONTINUE
+C
+C      always print intersection 
+C
+C      IF( NP  .GT. 100 ) GO TO 5
+c      write (6, 100)
+c      write (6, 101)
+c      write (6, 114) XINT, YINT, ZINT
+  114 FORMAT(  14X, 6HXXINT= , F11.4,  3H CM ,  /
+     1         14X, 6HYYINT= , F11.4,  3H CM ,  /
+     2         14X, 6HZZINT= , F11.4,  3H CM ,  /          )
+  115 FORMAT( F10.4, 10X, F10.3, 11X, F10.3, 11X, F10.3, 11X,
+     1   F13.5, F13.2, F11.2                   )
+C****
+C**** ALTERATION OF INTERCEPTS TO OPTIC AXIS SYSTEM
+C****
+    5 ZINTZ = ZINT*COS1 + (XINT-B1X) *SIN1
+      XINTX =-ZINT*SIN1 + (XINT-B1X) *COS1
+      ZZZZ = ZINTZ
+      IF( JFOCAL  .NE.  0 )  ZZZZ = 0.
+C****
+C**** FLIGHT PATH AND TIME FOR RAY-1 IN FOCAL AXIS SYSTEM
+C****
+      TT = TT + ZZZZ/DABS(VZA1)
+      TT1 = TT*1.0D+09
+      TL1 = TT*VEL1
+C
+C      always print intersection 
+C
+C      IF( NP  .GT. 100 ) GO TO 17
+c      write (6, 102)
+c      write (6, 114) XINTX, YINT, ZINTZ
+      GO TO 17
+C****
+C**** GENERAL RAY INTERCEPTS IN D-AXIS SYSTEM
+C****
+   19 BJX = XA
+      BJY = YA
+      SJX = VXA/VZA
+      SJY = VYA/VZA
+      DSX = S1X-SJX
+      IF( DSX .EQ. 0. )   DSX = 1.D-30
+      XINT1 = ( BJX*S1X - B1X*SJX ) /  DSX
+      ZINT1 = ( BJX - B1X ) /  DSX
+      YINT1 = SJY*ZINT1 + BJY
+      IF( NP  .GT. 100 ) GO TO 17
+c      write (6, 100)
+c      write (6, 101)
+c      write (6, 114) XINT1, YINT1, ZINT1
+C****
+C**** TRANSFORM SYSTEM-D TO OPTIC AXIS SYSTEM
+C**** TRANSLATE TO (B1X,0) AND ROTATE BY (S1X,0)
+C****
+   17 IF( JFOCAL .EQ. 2 ) GO TO 13
+      XT = XA
+      ZT = ZA
+      VXT = VXA
+      VZT = VZA
+      ZA    = ZT*COS1 + ( XT-B1X ) *SIN1
+      XA    =-ZT*SIN1 + ( XT-B1X ) *COS1
+      VZA   = VZT*COS1 + VXT*SIN1
+      VXA   =-VZT*SIN1 + VXT*COS1
+   13 CONTINUE
+      VXP = 1000. *DATAN2( VXA,VZA )
+      VYP = 1000. * DASIN( VYA/VEL )
+      VZP = VZA   / VEL
+      TP = T * VEL
+      IF( NP  .GT. 100 ) GO TO 16
+c      write (6, 104)
+C****
+c      write (6, 115) TP, XA,  YA,  ZA,        VZP, VXP, VYP
+   16 TDT = -ZA    /DABS( VZA   )
+      XA = XA       + TDT * VXA
+      YA = YA       + TDT * VYA
+      ZA = ZA       + TDT * VZA
+      T = T + TDT
+      VXP = 1000. *DATAN2( VXA,VZA )
+      VYP = 1000. * DASIN( VYA/VEL )
+      VZP = VZA   / VEL
+      TP = T * VEL
+C****
+C**** TRANSLATE PARTICLE TO FOCAL AXIS SYSTEM
+C****
+      XINT2= XA    + ZZZZ* VXA/VZA
+      YINT2= YA    + ZZZZ* VYA/VZA
+      ZINT2 = 0.
+C****
+C****
+      TT = T + ZZZZ/DABS(VZA)
+      TTJ = TT*1.0D+09
+      TLJ = TT*VEL
+C****
+C**** PATH LENGTHS AND TIMES RELATIVE TO RAY-1
+C****
+      TTJ1 = TTJ - TT1
+      TLJ1 = TLJ - TL1
+C****
+C****
+      XO(J) = XINT2
+      YO(J) = YINT2
+      ZO(J) = ZA
+      VXO(J) = VXP
+      VYO(J) = VYP
+      VZO(J) = VZP
+C****
+C**** SAVE TIME DIFFERENCES IN UNITS OF VELOCITY OF RAY-1
+C****
+      RTL(J) = TTJ1*VEL1*1.0D-09
+      RLL(J) = TLJ1
+      IF( NP  .GT. 100 ) RETURN
+c      write (6, 115) TP, XA,  YA,  ZA,        VZP, VXP, VYP
+c      write (6, 103)
+c      write (6, 116) XINT2,VXP, YINT2,VYP,ZINT2,TLJ,TLJ1,TTJ,TTJ1
+  116 FORMAT( / 20X, 'X=', F10.4, ' CM', 5X, 'VX=',F10.4,' MR',    /
+     1          20X, 'Y=', F10.4, ' CM', 5X, 'VY=',F10.4,' MR',    /
+     2          20X, 'Z=', F10.4, ' CM'          /
+     3          20X, 'L=', F10.4, ' CM', 5X,'DL=',F10.4, ' CM' /
+     4          20X, 'T=', F10.4, ' NS', 5X,'DT=',F10.4, ' NS' )
+c      IF( JFOCAL  .NE.  0 )  write (6, 99)
+   99 FORMAT( / '   FOCAL POS FIXED BY INPUT DATA = IMAGE DISTANCE  '/ )
+      RETURN
+      END
+
+
+      SUBROUTINE PLTOUT ( JEN, J, NUM )
+C
+C THIS ROUTINE STORES STEP-BY-STEP POSITION INFORMATION FOR EACH
+C RAY FOR USE BY PLOTTING ROUTINES.
+C
+C   MODIFIED BY E.A.S.E. TO PRODUCE ASCII OUTPUT FILE IN
+C FORMATTED FORM.  THIS ALLOWS EASIER COMPATIBILITY WITH
+C RPLOT, REGARDLESS OF WHETHER OUTPUT IS FROM SINGLE OR
+C DOUBLE PRECISION VERSION OF RAYTRACE.
+C
+      IMPLICIT REAL*8 (A-H,O-Z)
+      REAL*8 K
+      LOGICAL LPLT
+      COMMON  /BLCK00/ LPLT
+      COMMON  /BLCK 5/  XA, YA, ZA, VXA, VYA, VZA
+      COMMON  /BLCK10/  BX, BY, BZ, K, TC, DTC
+      DIMENSION TC(6), DTC(6)
+      DIMENSION GRAPH(4,512), ICOR(512,2)
+C
+      IF( NUM .GT. 512 ) NUM = 512
+      WRITE (1, 811)   JEN, J, NUM
+  811 FORMAT(1X, 3I4)
+      DO 100 I = 1, NUM
+      WRITE (1,812) GRAPH(1,I), GRAPH(2,I),
+     1GRAPH(3,I), GRAPH(4,I), ICOR(I,1), ICOR(I,2)
+  812 FORMAT(4(1X, F9.3), 2(1X, I3))
+  100 CONTINUE
+      RETURN
+C
+      ENTRY   PLT1( NUM, NO, NBR, TPAR )
+C
+      IF( .NOT. LPLT ) RETURN
+      IF( NUM .GT. 512 ) RETURN
+      GRAPH( 1,NUM) = TC(1)
+      GRAPH( 2,NUM) = TC(2)
+      GRAPH( 3,NUM) = TC(3)
+      GRAPH( 4,NUM) = TPAR
+      ICOR ( NUM,1) = NO
+      ICOR ( NUM,2) = NBR
+      RETURN
+C
+      ENTRY   PLT2( NUM, NO, NBR, TPAR )
+C
+      IF( .NOT. LPLT ) RETURN
+      IF( NUM .GT. 512 ) RETURN
+      GRAPH( 1,NUM) = XA
+      GRAPH( 2,NUM) = YA
+      GRAPH( 3,NUM) = ZA
+      GRAPH( 4,NUM) = TPAR
+      ICOR ( NUM,1) = NO
+      ICOR ( NUM,2) = NBR
+      RETURN
+      END
+
+
+      SUBROUTINE POLES  ( NO, NP, T, TP ,NUM )
+C****
+C****
+C**** MULTIPOLE     RAY TRACING BY NUMERICAL INTEGRATION OF DIFFERENTIAL
+C**** EQUATIONS OF MOTION.
+C     T = TIME
+C     TC(1) TO TC(6) =  ( X, Y, Z, VX, VY, VZ )
+C     DTC(1) TO DTC(6) = ( VX, VY, VZ, VXDOT, VYDOT, VZDOT )
+C****
+C****
+      IMPLICIT REAL*8(A-H,O-Z)
+      REAL*8  LF1, LF2, LU1, K, L
+      COMMON  /BLCK 0/  DATA , ITITLE
+      COMMON  /BLCK 4/  ENERGY, VEL, PMASS, Q0
+      COMMON  /BLCK 5/  XA, YA, ZA, VXA, VYA, VZA
+      COMMON  /BLCK10/  BX, BY, BZ, K, TC, DTC
+      COMMON  /BLCK90/  D, S, BT, GRAD1,GRAD2,GRAD3,GRAD4,GRAD5
+      COMMON  /BLCK91/  C0, C1, C2, C3, C4, C5
+      COMMON  /BLCK92/  IN
+      COMMON  /BLCK93/  DH, DO, DD, DDD, DSH, DSO, DSD, DSDD
+      DIMENSION DATA(  75,200 ), ITITLE(200)
+      DIMENSION TC(6), DTC(6), DS(6), ES(6)
+      EXTERNAL  BPOLES
+C**** DATA  C/ 3.D10/
+C****
+      LF1  = DATA(  1,NO )
+      LU1  = DATA(  2,NO )
+      LF2  = DATA(  3,NO )
+      A    = DATA( 10,NO )
+      B    = DATA( 11,NO )
+      L    = DATA( 12,NO )
+      RAD  = DATA( 13,NO )
+      BQD  = DATA( 14,NO )
+      BHX  = DATA( 15,NO )
+      BOC  = DATA( 16,NO )
+      BDC  = DATA( 17,NO )
+      BDD  = DATA( 18,NO )
+      Z11  = DATA( 19,NO )
+      Z12  = DATA( 20,NO )
+      Z21  = DATA( 21,NO )
+      Z22  = DATA( 22,NO )
+      FRH  = DATA( 35,NO )
+      FRO  = DATA( 36,NO )
+      FRD  = DATA( 37,NO )
+      FRDD = DATA( 38,NO )
+      DSH  = DATA( 39,NO )
+      DSO  = DATA( 40,NO )
+      DSD  = DATA( 41,NO )
+      DSDD = DATA( 42,NO )
+      DTF1= LF1/ VEL
+      DTF2= LF2/ VEL
+      DTU = LU1/ VEL
+      D = 2. * RAD
+      IF( FRH  .EQ. 0. ) FRH  = 1.D0
+      IF( FRO  .EQ. 0. ) FRO  = 1.D0
+      IF( FRD  .EQ. 0. ) FRD  = 1.D0
+      IF( FRDD .EQ. 0. ) FRDD = 1.D0
+      DH  = FRH *D
+      DO  = FRO *D
+      DD  = FRD *D
+      DDD = FRDD*D
+      GRAD1 = -BQD/RAD
+      GRAD2 =  BHX/RAD**2
+      GRAD3 = -BOC/RAD**3
+      GRAD4 =  BDC/RAD**4
+      GRAD5 = -BDD/RAD**5
+      BX = 0.
+      BY = 0.
+      BZ = 0.
+      BT = 0.
+      S = 0.
+C****
+      IF( NP  .GT. 100 ) GO TO 5
+c      write (6, 100) ITITLE(NO)
+  100 FORMAT(  ' MULTIPOLE(POLES)  ****  ', A4,'  ******************'/)
+C****
+c      write (6, 101)
+  101 FORMAT( 8H    T CM ,18X, 4HX CM , 7X, 2HBX, 8X, 4HY CM , 7X, 2HBY,
+     1   8X, 4HZ CM, 7X, 2HBZ, 8X, 6HVELZ/C , 6X, 8HTHETA MR , 5X,
+     2   6HPHI MR , 6X, 1HB             )
+      CALL PRNT2 ( T,S,XA   ,YA   ,ZA   ,BX,BY,BZ,BT,VXA  ,VYA  ,VZA   )
+c      write (6, 103)
+  103 FORMAT(   '0COORDINATE TRANSFORMATION TO B AXIS SYSTEM '       )
+  109 FORMAT(   '0COORDINATE TRANSFORMATION TO D AXIS SYSTEM '       )
+C**** TRANSFORM FROM INITIAL ENTRANCE COORDINATES TO VFB COORD.
+C****
+    5 TC(1) = -XA
+      TC(2) = YA
+      TC(3) = A - ZA
+      TC(4) = -VXA
+      TC(5) = VYA
+      TC(6) = -VZA
+      CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 2
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+C****
+C**** TRANSLATE PARTICLE TO START OF FIRST FRINGE FIELD
+C****
+      TDT = ( TC(3) - Z11 ) /DABS( TC(6) )
+C****
+      TC(1) = TC(1) + TDT * TC(4)
+      TC(2) = TC(2) + TDT * TC(5)
+      TC(3) = TC(3) + TDT * TC(6)
+      T = T + TDT
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 2
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+C****
+C**** IN DESIGNATES FIELD REGIONS FOR MULTIPOLE
+C****
+      IN = 1
+      C0   = DATA( 23,NO )
+      C1   = DATA( 24,NO )
+      C2   = DATA( 25,NO )
+      C3   = DATA( 26,NO )
+      C4   = DATA( 27,NO )
+      C5   = DATA( 28,NO )
+c      IF( NP  .LE. 100) write (6, 104)
+  104 FORMAT( 22H0FRINGING FIELD REGION    )
+      CALL FNMIRK( 6, T, DTF1,TC, DTC, DS, ES, BPOLES,0    )
+      NSTEP = 0
+    6 CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      DO 7 I = 1, NP
+      CALL FNMIRK( 6, T, DTF1,TC, DTC, DS, ES, BPOLES,1    )
+      NSTEP = NSTEP + 1
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 2
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+      IF (NSTEP  .GT.  200)  GO TO 99
+      IF( Z12 .GE. TC(3) ) GO TO 8
+    7 CONTINUE
+      GO TO 6
+    8 CONTINUE
+      XDTF1 =-( Z12 - TC(3) ) /DABS( TC(6) )
+      CALL FNMIRK( 6, T,XDTF1,TC, DTC, DS, ES,BPOLES, 0    )
+      CALL FNMIRK( 6, T,XDTF1,TC, DTC, DS, ES,BPOLES, 1    )
+      CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 2
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+c      IF( NP  .LE. 100) write (6, 105) NSTEP
+  105 FORMAT( 10H   NSTEPS= ,I5 )
+C***
+C***  UNIFORM FIELD REGION
+C**** TRANSFORM TO SECOND VFB COORD SYSTEM
+C***
+      GRAD1 = -GRAD1
+      GRAD2 =  GRAD2
+      GRAD3 = -GRAD3
+      GRAD4 =  GRAD4
+      GRAD5 = -GRAD5
+      TC(1) = -TC(1)
+      TC(3) = -TC(3) - L
+      TC(4) = -TC(4)
+      TC(6) = -TC(6)
+C****
+C****
+C**** UNIFORM FIELD INTEGRATION REGION
+C****
+C****
+      IN = 2
+c      IF( NP  .LE. 100) write (6, 106)
+  106 FORMAT(   '0UNIFORM FIELD REGION IN C AXIS SYSTEM '  )
+      IF( TC(3)  .LT.  Z21 ) GO TO 15
+C****
+C**** THIS SECTION CORRECTS FOR MAGNETS WHOSE FRINGING FIELDS INTERSECT
+C****
+c      IF( NP  .LE. 100) write (6, 102)
+  102 FORMAT( / '   INTEGRATE BACKWARDS    '  )
+      CALL FNMIRK( 6, T,-DTU ,TC, DTC, DS, ES,BPOLES, 0    )
+      NSTEP = 0
+   16 CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      DO 17  I =1, NP
+      CALL FNMIRK( 6, T,-DTU, TC, DTC, DS, ES,BPOLES, 1    )
+      NSTEP = NSTEP + 1
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 3
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+      IF (NSTEP  .GT.  200)  GO TO 99
+      IF( TC(3)  .LE.  Z21 )  GO TO 18
+   17 CONTINUE
+      GO TO 16
+   18 CONTINUE
+      XDTU  = ( Z21 - TC(3) ) /DABS( TC(6) )
+      CALL FNMIRK( 6, T,XDTU ,TC, DTC, DS, ES,BPOLES, 0    )
+      CALL FNMIRK( 6, T,XDTU ,TC, DTC, DS, ES,BPOLES, 1    )
+      CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 3
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+c      IF( NP  .LE. 100) write (6, 105) NSTEP
+c      IF( NP  .LE. 100) write (6, 107)
+  107 FORMAT( / )
+      GO TO 19
+C****
+C****
+   15 CONTINUE
+      CALL FNMIRK( 6, T, DTU ,TC, DTC, DS, ES, BPOLES,0    )
+      NSTEP = 0
+    9 CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      DO 10  I =1, NP
+      CALL FNMIRK( 6, T, DTU ,TC, DTC, DS, ES, BPOLES,1    )
+      NSTEP = NSTEP + 1
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 3
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+      IF (NSTEP  .GT.  200)  GO TO 99
+      IF( TC(3)  .GE.  Z21 )  GO TO 11
+   10 CONTINUE
+      GO TO 9
+   11 CONTINUE
+      XDTU  = ( Z21 - TC(3) ) /DABS( TC(6) )
+      CALL FNMIRK( 6, T,XDTU ,TC, DTC, DS, ES,BPOLES, 0    )
+      CALL FNMIRK( 6, T,XDTU ,TC, DTC, DS, ES,BPOLES, 1    )
+      CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 3
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+c      IF( NP  .LE. 100) write (6, 105) NSTEP
+   19 CONTINUE
+C***
+C***
+C**** SETUP FOR SECOND FRINGE FIELD AND INTEGRATION
+C****
+C****
+      C0   = DATA( 29,NO )
+      C1   = DATA( 30,NO )
+      C2   = DATA( 31,NO )
+      C3   = DATA( 32,NO )
+      C4   = DATA( 33,NO )
+      C5   = DATA( 34,NO )
+      IN = 3
+c      IF( NP  .LE. 100) write (6, 104)
+      CALL FNMIRK( 6, T, DTF2,TC, DTC, DS, ES, BPOLES,0    )
+      NSTEP = 0
+   12 CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      DO 13  I =1, NP
+      CALL FNMIRK( 6, T, DTF2,TC, DTC, DS, ES, BPOLES,1    )
+      NSTEP = NSTEP + 1
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 3
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+      IF (NSTEP  .GT.  200)  GO TO 99
+      IF( TC(3) .GE. Z22 )  GO TO 14
+   13 CONTINUE
+      GO TO 12
+   14 CONTINUE
+      XDTF2 = ( Z22 - TC(3) ) / TC(6)
+      CALL FNMIRK( 6, T,XDTF2,TC, DTC, DS, ES, BPOLES,0    )
+      CALL FNMIRK( 6, T,XDTF2,TC, DTC, DS, ES, BPOLES,1    )
+      CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 3
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+c      IF( NP  .LE. 100) write (6, 105) NSTEP
+C****
+C**** TRANSFORM TO OUTPUT SYSTEM COORD.
+C****
+      TC(3) = TC(3) - B
+c      IF( NP  .LE. 100) write (6, 109)
+      CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+C****
+C**** TRANSLATE PARTICLE TO OUT SYSTEM COORD.
+C****
+      TDT = -TC(3) /DABS( TC(6) )
+      TC(1) = TC(1) + TDT * TC(4)
+      TC(2) = TC(2) + TDT * TC(5)
+      TC(3) = TC(3) + TDT * TC(6)
+      T = T + TDT
+      TP = T * VEL
+      BX = 0.
+      BY = 0.
+      BZ = 0.
+      BT = 0.
+      S  = 0.
+      VXF    = 1000. *DATAN2( TC(4), TC(6)  )
+      VYF    = 1000. *DASIN ( TC(5)/ VEL    )
+      VZF    = TC(6) / VEL
+c      IF(NP.LE.100) write (6,115)TP,TC(1),TC(2),TC(3),VZF,VXF,VYF
+  115 FORMAT( F10.4, 10X, F10.3, 11X, F10.3, 11X, F10.3, 11X,
+     1   F13.5, F13.2, F11.2                   )
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 4
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+C**
+C**** CALCULATE INTERCEPTS IN SYSTEM D
+C****
+C****
+C****
+C****
+      Z0X = -TC(1)/ ( TC(4) / TC(6)    + 1.E-10 )
+      Z0Y = -TC(2)/ ( TC(5) / TC(6)    + 1.E-10 )
+c      IF( NP  .LE. 100) write (6, 111) VXF, VYF, Z0X, Z0Y
+  111 FORMAT( / ' INTERSECTIONS WITH VER. AND HOR. PLANES '          ,
+     X       /15X, 5H  XP=,F10.4, 10H MR    YP=, F10.4, 3H MR   /
+     1        15X, 5H Z0X=,F10.2, 10H CM   Z0Y= ,F10.2, 3H CM   /   )
+      RETURN
+   99 CALL PRNT4 (NO, IN)
+      RETURN
+      END
+
+
+      SUBROUTINE  PRNT( J,NO )
+C****
+C****
+      IMPLICIT REAL*8(A-H,O-Z)
+      COMMON  /BLCK 0/  DATA, ITITLE
+      COMMON  /BLCK 1/  XI, YI, ZI, VXI, VYI, VZI, DELP
+      COMMON  /BLCK 2/  XO, YO, ZO, VXO, VYO, VZO,RTL(1000),RLL(1000)
+      COMMON  /BLCK 4/  ENERGY, VEL, PMASS, Q0
+      COMMON  /BLCK 6/  NP, JFOCAL
+      COMMON  /DY1/  BDIPOLE
+      DIMENSION DATA(  75,200 ), ITITLE(200)
+      DIMENSION XO(1000),YO(1000),ZO(1000),VXO(1000),VYO(1000),VZO(1000)
+      DIMENSION XI(1000),YI(1000),ZI(1000),VXI(1000),VYI(1000),
+     1      VZI(1000),DELP(1000)
+      CHARACTER*8 LX(14)
+      CHARACTER*8 LCM
+      INTEGER ID2(52), ID3(21), ID4(43), ID5(33), ID6(17),ID7(7),ID8(26)
+      DATA ID2 / 11, 19, 29, 41, 51, 12, 20, 30, 42, 52, 13, 21, 31,
+     1   43, 53, 14, 22, 32, 44, 54, 15, 25, 33, 45, 55, 16, 26, 34,
+     2   46, 56, 17, 27, 35, 47, 57, 18, 28, 36, 48, 58, 37, 49, 59, 38,
+     3 50,60,39, 61, 40, 62, 63, 64                                  /
+      DATA ID3 / 10, 15, 19, 25, 11, 16, 20, 26, 12, 17, 21, 27, 13,
+     1   18, 22, 28, 14, 23, 29, 24, 30                              /
+      DATA ID4 /  7, 20, 28, 34,  8, 21, 29, 35,  9, 22, 30, 36, 10,
+     1   23, 31, 37, 11, 24, 32, 38, 12, 25, 33, 39, 13, 26, 40, 46,
+     2   16, 27, 41, 47, 17, 42, 48, 18, 43, 49, 19, 44, 50, 45, 51  /
+      DATA ID5 / 10, 14, 19, 23, 29, 11, 15, 20, 24, 30, 12, 16, 21,
+     1   25, 31, 13, 17, 22, 26, 32, 18, 27, 33, 28, 34, 35, 39, 36,
+     2   40, 37, 41, 38, 42  /
+      DATA ID6 / 10, 16, 20, 26, 11, 17, 21, 27, 12, 22, 28, 13, 23,
+     1   14, 24, 15, 25                                              /
+      DATA ID7 / 10, 15, 11, 16, 12, 13, 14                          /
+      DATA ID8 / 11, 16, 25, 29, 35, 12, 17, 26, 30, 36, 13, 18, 27,
+     1   31, 37, 14, 19, 28, 32, 38, 15, 20, 33, 39, 34, 40          /
+      DATA LCM / ' CM ' /
+      DATA LX/ ' ENTR FL','D STEP =',' UNIF FL','D STEP =',
+     1         ' EXIT FL','D STEP =',' DIFF/MI','D STEP =',
+     2         '        ','   RHO =','        ','  MTYP =',
+     3         '   FIELD','  STEP ='                                 /
+C****
+C****
+      GO TO ( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ), J
+c      write (6, 109) J
+  109 FORMAT(// ' GO TO FELL THROUGH IN ROUTINE PRNT  J= ',I5, ///   )
+      CALL EXIT
+C****
+    1 RETURN
+C****
+C**** COLLIMATOR DATA
+C****
+  103 FORMAT( // 20X, '*** COLLIMATOR       ***',   A4  /  )
+  104 FORMAT(
+     1   5X,'ELPS=',  F9.1, 5X,'XCEN=',  F9.4, 5X,'YCEN=',  F9.4,
+     2   5X,'XMAX=',  F9.4, 5X,'YMAX=',  F9.4                       )
+   13 CONTINUE
+c   13 write (6, 103) ITITLE(NO)
+c      write (6, 104) (DATA(I,NO),I=1,5)
+      RETURN
+C****
+C**** DIPOLE DATA
+C****
+  100 FORMAT( // 20X, '*** DIPOLE MAGNET    ***',   A4  /  )
+  101 FORMAT(
+     1   5X,'  A =',  F9.4, 5X,'NDX =',  F9.4, 5X,'C01 =',  F9.4,
+     2   5X,'BR1 =',  F9.4, 5X,'S02 =',1PE12.3,5X,       2A8,0PF8.3,A4,/
+     3   5X,'  B =',  F9.4, 5X,'BET1=',  F9.4, 5X,'C02 =',  F9.4,
+     4   5X,'BR2 =',  F9.4, 5X,'S03 =',1PE12.3,5X,       2A8,0PF8.3,A4,/
+     5   5X,'  D =',  F9.4, 5X,'GAMA=',  F9.4, 5X,'C03 =',  F9.4,
+     6   5X,'XCR1=',  F9.4, 5X,'S04 =',1PE12.3,5X,       2A8,0PF8.3,A4,/
+     7   5X,'  R =',  F9.4, 5X,'DELT=',  F9.4, 5X,'C04 =',  F9.4,
+     8   5X,'XCR2=',  F9.4, 5X,'S05 =',1PE12.3,5X,       2A8,0PF8.3,A4,/
+     9   5X,' BF =',  F9.4, 5X,'Z11 =',  F9.4, 5X,'C05 =',  F9.4,
+     A   5X,'DLS1=',  F9.4, 5X,'S06 =',1PE12.3,5X,       2A8,  I4     ,/
+     B   5X,'PHI =',0PF9.4, 5X,'Z12 =',  F9.4, 5X,'C06 =',  F9.4,
+     C   5X,'DLS2=',  F9.4, 5X,'S07 =',1PE12.3,5X,       2A8,0PF8.3,A4 )
+  102 FORMAT(
+     1   5X,'ALPH=',  F9.4,   5X,'Z21 =',  F9.4,  5X,'C11 =',  F9.4,
+     2   5X,'RAP1=',  F9.4,   5X,'S08 =',1PE12.3,/, 5X,'BETA=',0PF9.4,
+     3   5X,'Z22 =',  F9.4,   5X,'C12 =',  F9.4,  5X,'RAP2=',  F9.4,
+     4   5X,'S12 =',1PE12.3,/,43X,'C13 =',0PF9.4,
+     X                        5X,'SCR1=',  F9.4,  5X,'S13 =', 1PE12.3
+     5   ,/,43X,'C14 =',0PF9.4,   5X,'SCR2=',  F9.4,
+     Y                        5X,'S14 =',1PE12.3,/,43X,'C15 =',0PF9.4,
+     6   24X,'S15 =',1PE12.3,/,43X,'C16 =',0PF9.4,24X,'S16 =',1PE12.3
+     7  ,/,81X,'S17 =',1PE12.3,/,81X,'S18 =',1PE12.3                )
+C****
+C****
+    2 RHO = 1.D30
+      IF( DATA(15,NO) .NE. 0 )
+     1RHO = DSQRT( (2.*931.48*PMASS+ENERGY)*ENERGY)/(3.*DATA(15,NO)*Q0)
+      MTYP = DATA(5,NO)
+c      write (6, 100) ITITLE(NO)
+c      write (6,101) (DATA(ID2(I),NO),I=1,5),LX(1),LX(2),DATA(1,NO),LCM,
+c     1          (DATA(ID2(I),NO),I= 6,10),LX( 3),LX( 4),DATA(2,NO),LCM,
+c     2          (DATA(ID2(I),NO),I=11,15),LX( 5),LX( 6),DATA(3,NO),LCM,
+c     3          (DATA(ID2(I),NO),I=16,20),LX( 7),LX( 8),DATA(4,NO),LCM,
+c     4          (DATA(ID2(I),NO),I=21,25),LX(11),LX(12),MTYP      ,
+c     5          (DATA(ID2(I),NO),I=26,30),LX( 9),LX(10),RHO,       LCM
+c      write (6, 102) (DATA(ID2(I),NO),I=31,52)
+      RETURN
+C****
+C**** QUADRUPOLE, HEXAPOLE, OCTAPOLE, DECAPOLE DATA
+C****
+  200 FORMAT( // 20X, '*** QUADRUPOLE       ***',   A4  /  )
+  400 FORMAT( // 20X, '*** SEXTUPOLE        ***',   A4  /  )
+  500 FORMAT( // 20X, '*** OCTUPOLE         ***',   A4  /  )
+  600 FORMAT( // 20X, '*** DECAPOLE         ***',   A4  /  )
+  120 FORMAT(
+     1   5X,'  A =',  F9.4, 5X,'Z11 =',  F9.4, 5X,'C01 =',  F9.4,
+     2   5X,'C11 =',  F9.4, 5X, 2A8,0PF8.3,A4,/
+     3   5X,'  B =',  F9.4, 5X,'Z12 =',  F9.4, 5X,'C02 =',  F9.4,
+     4   5X,'C12 =',  F9.4, 5X, 2A8,0PF8.3,A4,/
+     5   5X,'  L =',  F9.4, 5X,'Z21 =',  F9.4, 5X,'C03 =',  F9.4,
+     6   5X,'C13 =',  F9.4, 5X, 2A8,0PF8.3,A4,/
+     7   5X,'RAD =',  F9.4, 5X,'Z22 =',  F9.4, 5X,'C04 =',  F9.4,
+     8   5X,'C14 =',  F9.4,/5X,' BF =',  F9.4,24X,'C05 =',  F9.4,
+     9   5X,'C15 =',  F9.4,/                  43X,'C06 =',  F9.4,
+     A   5X,'C16 =',  F9.4                                           )
+C****
+C****
+    3 CONTINUE
+c    3 write (6, 200) ITITLE(NO)
+      GO TO 21
+    4 CONTINUE
+c    4 write (6, 400) ITITLE(NO)
+      GO TO 21
+    5 CONTINUE
+c    5 write (6, 500) ITITLE(NO)
+      GO TO 21
+    6 CONTINUE
+c    6 write (6, 600) ITITLE(NO)
+   21 CONTINUE
+c   21 write (6,120)(DATA(ID3(I),NO),I=1,4),LX(1),LX(2),DATA(1,NO),LCM,
+c     1          (DATA(ID3(I),NO),I= 5,8 ),LX( 3),LX( 4),DATA(2,NO),LCM,
+c     2          (DATA(ID3(I),NO),I= 9,12),LX( 5),LX( 6),DATA(3,NO),LCM,
+c     3          (DATA(ID3(I),NO),I=13,21)
+      RETURN
+C****
+C**** ELECTROSTATIC DEFLECTOR DATA
+C****
+  190 FORMAT( // 20X, '*** ELECTROSTATIC DEF.***',   A4  /  )
+  191 FORMAT(
+     1   5X,'  A =',  F9.4, 5X,'PHI =',  F9.4, 5X,'Z11 =',  F9.4,
+     2   5X,'C01 =',  F9.4, 5X,'C11 =',  F9.4, 5X,       2A8,0PF8.3,A4,/
+     3   5X,'  B =',  F9.4, 5X,'EC2 =',  F9.4, 5X,'Z12 =',  F9.4,
+     4   5X,'C02 =',  F9.4, 5X,'C12 =',  F9.4, 5X,       2A8,0PF8.3,A4,/
+     5   5X,'  D =',  F9.4, 5X,'EC4 =',  F9.4, 5X,'Z21 =',  F9.4,
+     6   5X,'C03 =',  F9.4, 5X,'C13 =',  F9.4, 5X,       2A8,0PF8.3,A4,/
+     7   5X,'  R =',  F9.4, 5X,'WE  =',  F9.4, 5X,'Z22 =',  F9.4,
+     8   5X,'C04 =',  F9.4, 5X,'C14 =',  F9.4, 5X,       2A8,0PF8.3,A4,/
+     9   5X,' EF =',  F9.4, 5X,'WC  =',  F9.4,24X,'C05 =',  F9.4,
+     A   5X,'C15 =',  F9.4,                    5X,       2A8,0PF8.3,A4,/
+     B  62X,'C06 =',0PF9.4, 5X,'C16 =',  F9.4                   )
+C****
+C****
+    7 RHO = 1.D30
+      EMASS = PMASS * 931.48
+      ETOT = EMASS + ENERGY
+      VC2 = (2.*EMASS + ENERGY)*ENERGY / (ETOT*ETOT)
+      GAMMA = 1. / DSQRT(1. - VC2)
+      IF( DATA(15,NO) .NE. 0 )
+     1RHO = GAMMA * EMASS * VC2 * 1000. / (DATA(15,NO) * Q0)
+c      write (6, 190) ITITLE(NO)
+c      write (6,191)(DATA(ID8(I),NO),I=1,5),LX(1),LX(2),DATA(1,NO),LCM,
+c     1          (DATA(ID8(I),NO),I= 6,10),LX( 3),LX( 4),DATA(2,NO),LCM,
+c     2          (DATA(ID8(I),NO),I=11,15),LX( 5),LX( 6),DATA(3,NO),LCM,
+c     3          (DATA(ID8(I),NO),I=16,20),LX( 7),LX( 8),DATA(4,NO),LCM,
+c     4          (DATA(ID8(I),NO),I=21,24),LX( 9),LX(10),RHO,LCM   ,
+c     5          (DATA(ID8(I),NO),I=25,26)
+      RETURN
+C****
+C****    VELOCITY SELECTOR DATA
+C****
+  132 FORMAT( // 20X, '*** VELOCITY SELECTOR***',   A4  /  )
+  130 FORMAT(
+     1   5X,'  A =',  F9.4, 5X,'Z11 =',  F9.4, 5X,'CB00=',  F9.4,
+     2   5X,'CE00=',  F9.4, 5X, 2A8,0PF8.3,A4,/
+     3   5X,'  B =',  F9.4, 5X,'Z12 =',  F9.4, 5X,'CB01=',  F9.4,
+     4   5X,'CE01=',  F9.4, 5X, 2A8,0PF8.3,A4,/
+     5   5X,'  L =',  F9.4, 5X,'Z21 =',  F9.4, 5X,'CB02=',  F9.4,
+     6   5X,'CE02=',  F9.4, 5X, 2A8,0PF8.3,A4,/
+     7   5X,' BF =',  F9.4, 5X,'Z22 =',  F9.4, 5X,'CB03=',  F9.4,
+     8   5X,'CE03=',  F9.4, 5X, 2A8,0PF8.3,A4,/
+     9   5X,' BE =',  F9.4, 5X,'CB2 =',  F9.4, 5X,'CB04=',  F9.4,
+     A   5X,'CE04=',  F9.4, 5X, 2A8,0PF8.3,A4                        )
+  131 FORMAT(
+     1   5X,' RB =',  F9.4, 5X,'CB4 =',  F9.4, 5X,'CB05=',  F9.4,
+     2   5X,'CE05=',  F9.4,/5X,'NDX =',  F9.4, 5X,'CE2 =',  F9.4,
+     3   5X,'CB10=',  F9.4, 5X,'CE10=',  F9.4,/5X,' DB =',  F9.4,
+     4   5X,'CE4 =',  F9.4, 5X,'CB11=',  F9.4, 5X,'CE11=',  F9.4,/
+     5   5X,' DE =',  F9.4,24X,'CB12=',  F9.4, 5X,'CE12=',  F9.4,/
+     6   5X,' WB =',  F9.4,24X,'CB13=',  F9.4, 5X,'CE13=',  F9.4,/
+     7   5X,' WE =',  F9.4,24X,'CB14=',  F9.4, 5X,'CE14=',  F9.4,/
+     8  43X,'CB15=',  F9.4, 5X,'CE15=',  F9.4                        )
+C****
+C****
+    8 RHO = 1.D30
+      IF( DATA(10,NO)  .NE.  0.   )
+     1RHO = DSQRT( (2.*931.48*PMASS+ENERGY)*ENERGY)/(3.*DATA(10,NO)*Q0)
+c      write (6, 132)ITITLE(NO)
+c      write (6,130)(DATA(ID4(I),NO),I=1,4),LX(1),LX(2),DATA(1,NO),LCM,
+c     1          (DATA(ID4(I),NO),I= 5,8 ),LX( 3),LX( 4),DATA(2,NO),LCM,
+c     2          (DATA(ID4(I),NO),I= 9,12),LX( 5),LX( 6),DATA(3,NO),LCM,
+c     3          (DATA(ID4(I),NO),I=13,16),LX( 7),LX( 8),DATA(4,NO),LCM,
+c     4          (DATA(ID4(I),NO),I=17,20),LX( 9),LX(10),RHO,LCM
+c      write (6, 131) (DATA(ID4(I),NO),I=21,43)
+      RETURN
+C****
+C**** MULTIPOLE (POLES)      DATA
+C****
+  141 FORMAT( // 20X, '*** MULTIPOLES       ***',   A4  /  )
+  140 FORMAT(
+     1   5X,'  A =',  F9.4, 3X,'BQUAD =',F9.4, 5X,'Z11 =',  F9.4,
+     2   5X,'C01 =',  F9.4, 5X,'C11 =',  F9.4, 8X, 2A8,0PF8.3,A4,/
+     3   5X,'  B =',  F9.4, 3X,'BHEX  =',F9.4, 5X,'Z12 =',  F9.4,
+     4   5X,'C02 =',  F9.4, 5X,'C12 =',  F9.4, 8X, 2A8,0PF8.3,A4,/
+     5   5X,'  L =',  F9.4, 3X,'BOCT  =',F9.4, 5X,'Z21 =',  F9.4,
+     6   5X,'C03 =',  F9.4, 5X,'C13 =',  F9.4, 8X, 2A8,0PF8.3,A4,/
+     7   5X,'RAD =',  F9.4, 3X,'BDEC  =',F9.4, 5X,'Z22 =',  F9.4,
+     8   5X,'C04 =',  F9.4, 5X,'C14 =',  F9.4,/
+     9                     22X,'BDDEC =',F9.4,24X,'C05 =',  F9.4,
+     A   5X,'C15 =',  F9.4/62X,'C06 =',  F9.4, 5X,'C16 =',  F9.4
+     B                    /62X,'FRH =',  F9.4, 5X,'DSH =',  F9.4
+     C                    /62X,'FRO =',  F9.4, 5X,'DSO =',  F9.4
+     D                    /62X,'FRD =',  F9.4, 5X,'DSD =',  F9.4
+     E                    /62X,'FRDD=',  F9.4, 5X,'DSDD=',  F9.4     )
+C****
+C****
+    9 CONTINUE
+c    9 write (6, 141) ITITLE(NO)
+c      write (6,140)(DATA(ID5(I),NO),I=1,5),LX(1),LX(2),DATA(1,NO),LCM,
+c     1          (DATA(ID5(I),NO),I= 6,10),LX( 3),LX( 4),DATA(2,NO),LCM,
+c     2          (DATA(ID5(I),NO),I=11,15),LX( 5),LX( 6),DATA(3,NO),LCM,
+c     3          (DATA(ID5(I),NO),I=16,33)
+      RETURN
+C****
+C**** MULTIPOLE DATA
+C****
+  151 FORMAT( // 20X,  '***MULTIPOLE(HE)    ***',   A4  /  )
+  150 FORMAT(
+     1   5X,'  A =',  F9.4, 5X,' Z1 =',  F9.4, 5X,' C0 =',  F9.4,
+     2   5X,' C6 =',  F9.4, 5X, 2A8,0PF8.3,A4,/
+     3   5X,'  B =',  F9.4, 5X,' Z2 =',  F9.4, 5X,' C1 =',  F9.4,
+     4   5X,' C7 =',  F9.4, 5X, 2A8,0PF8.3,A4,/
+     5   5X,'  L =',  F9.4,24X,' C2 =',  F9.4, 5X,' C8 =',  F9.4/
+     6   5X,'  W =',  F9.4,24X,' C3 =',  F9.4,/
+     7   5X,'  D =',  F9.4,24X,' C4 =',  F9.4,/
+     8   5X,' BF =',  F9.4,24X,' C5 =',  F9.4                        )
+C****
+C****
+   10 CONTINUE
+c   10 write (6, 151) ITITLE(NO)
+c      write (6,150)(DATA(ID6(I),NO),I=1,4),LX(1),LX(2),DATA(1,NO),LCM,
+c     1          (DATA(ID6(I),NO),I= 5,8 ),LX( 7),LX( 8),DATA(2,NO),LCM,
+c     2          (DATA(ID6(I),NO),I= 9,17)
+      RETURN
+C****
+C**** TRANSLATE - ROTATE DATA
+C****
+  170 FORMAT( // 20X, '*** TRANSLATE-ROTATE ***',   A4  /  )
+  171 FORMAT(   5X, 5H X0 =,F9.4,        5X,5H Y0 =,F9.4,
+     1          5X, 5H Z0 =,F9.4,     /,1X,9HTHETA X =,F9.4,
+     2        1X,9HTHETA Y =,F9.4,       1X,9HTHETA Z =,F9.4 )
+C****
+C****
+   11 CONTINUE
+c   11 write (6, 170) ITITLE(NO)
+c      write (6, 171) ( DATA(I,NO) , I=1,6 )
+      RETURN
+C****
+C**** DRIFT SECTION DATA
+C****
+   12 CONTINUE
+c   12 write (6, 175) ITITLE(NO)
+c      write (6, 176) ( DATA(I,NO) , I=1,1 )
+  175 FORMAT( // 20X, '*** DRIFT            ***',   A4  /  )
+  176 FORMAT(  19X,  ' Z-DRIFT ='  , F9.4,  ' CM'        )
+      RETURN
+C****
+C**** SOLENOID DATA
+C****
+  161 FORMAT( // 20X, '*** SOLENOID         ***',   A4  /  )
+  160 FORMAT(
+     1   5X,'  A =',  F9.4, 5X,'Z11 =',  F9.4, 5X,2A8,0PF8.3,A4,/
+     2   5X,'  B =',  F9.4, 5X,'Z22 =',  F9.4,/5X,'  L =',  F9.4,/
+     3   5X,'DIA =',  F9.4,/5X,' BF =',  F9.4                        )
+C****
+C****
+   14 CONTINUE
+c   14 write (6, 161) ITITLE(NO)
+c      write (6,160)(DATA(ID7(I),NO),I=1,2),LX(13),LX(14),DATA(1,NO),
+c     1         LCM, (DATA(ID7(I),NO),I= 3, 7)
+      RETURN
+C****
+C**** LENS DATA
+C****
+  180 FORMAT( // 20X, '*** LENS             ***',   A4  /  )
+  181 FORMAT(  3X, 7H(X/X) =  ,F9.4,   6H CM/CM,
+     1        16X, 7H(X/T) =  ,F9.4,   6H CM/MR, /,
+     2         3X, 7H(T/X) =  ,F9.4,   6H MR/CM,
+     3        16X, 7H(T/T) =  ,F9.4,   6H MR/MR, /,
+     4         3X, 7H(Y/Y) =  ,F9.4,   6H CM/CM,
+     5        16X, 7H(Y/P) =  ,F9.4,   6H CM/MR, /,
+     6         3X, 7H(P/Y) =  ,F9.4,   6H MR/CM,
+     7        16X, 7H(P/P) =  ,F9.4,   6H MR/MR, //,
+     8         3X, 7H   CS =  ,F9.4,   6H CM   , /         )
+C****
+C****
+   15 CONTINUE
+c   15 write (6, 180) ITITLE(NO)
+c      write (6, 181) ( DATA(I,NO) , I=1,9 )
+      RETURN
+C****
+C****
+      ENTRY PRNT1 ( N )
+C****
+C****
+c      IF( JFOCAL .EQ. 0 ) write (6, 105)
+c      IF( JFOCAL .EQ. 1 ) write (6, 106)
+c      IF( JFOCAL .EQ. 2 ) write (6, 107)
+c      IF( JFOCAL .GT. 2 ) write (6, 108)
+c      write (6, 110)
+  105 FORMAT( 1H1, 15X, '****COORDINATES OPTIC AXIS SYSTEM****
+     1  ( ORIGIN AT RAY 1-2 INTERSECTION ) '    // )
+  106 FORMAT( 1H1, 15X, '****COORDINATES OPTIC AXIS SYSTEM****
+     1  ( ORIGIN AT ZD=0.0  ) '    // )
+  107 FORMAT( 1H1, 15X, '****COORDINATES D-AXIS SYSTEM****' // )
+  108 FORMAT( 1H1, 15X, '****COORDINATES OPTIC AXIS SYSTEM****' // )
+  110 FORMAT(
+     1   10X, 45HX     THETA     Y      PHI      ZI    DELE     ,5X,
+     2   12HXO        XS  , 11X, 12HYO        YS , 6X, 'L(CM)', 5X,
+     3   'T(NS)'                         /)
+      DO 20  I=1,N
+C****
+C**** CALCULATE TIME IN (NS)
+C****
+      TLJ1 = RTL(I)*1.0D+09 / VEL
+C      write (6, 111)  I, XI(I), VXI(I), YI(I), VYI(I), ZI(I), DELP(I),
+C     1    XO(I), VXO(I), YO(I), VYO(I), RLL(I), TLJ1
+  111 FORMAT(       I5,    6F8.2, 2X,  F10.4,   F10.4, 2X,   F10.4,
+     1     F10.4 ,   F10.3, F10.3               /)
+   20 CONTINUE
+c      open(38,file='rayout.plt',status='unknown')
+c      do 2100  i=1,n
+c      write (38, 582)  I, XI(I), VXI(I), YI(I), VYI(I), ZI(I), DELP(I),
+c     1    XO(I), VXO(I), YO(I), VYO(I), RLL(I), TLJ1, BDIPOLE
+  582 format(i3,3x,13(f10.5,1x))
+ 2100 continue
+c      write(38,583)
+  583 format(1x,'/')
+c      close(38)
+      RETURN
+C****
+C****
+      ENTRY PRNT2 ( T, S, X, Y, Z, BX, BY, BZ, BT, VX, VY, VZ          )
+C****
+      IF( NP  .GT. 100 ) RETURN
+      VXP = 1000. *DATAN2( VX ,VZ  )
+      VYP = 1000. * DASIN( VY /VEL )
+      VZP = VZ  / VEL
+      TP = T * VEL
+c      write (6, 112)TP,S,X, BX, Y, BY, Z, BZ, VZP, VXP, VYP, BT
+  112 FORMAT(2F10.4,     F10.3, F11.4, F10.3, F11.4, F10.3, F11.4,
+     1        F13.5, F13.2, F11.2, F10.4         )
+      RETURN
+C****
+      ENTRY PRNT3 (TDIST,X,Y,Z,BX,BY,BZ,EX,EY,EZ,VX,VY,VZ)
+C****
+  114 FORMAT( 2F9.3, 2F10.4,F9.3, 2F10.4,F9.3, 2F10.4,2F11.3, -9PF9.5 )
+C****
+C****
+      IF( NP  .GT. 100 ) RETURN
+      VXP = 1000. *DATAN2( VX ,VZ  )
+      VYP = 1000. * DASIN( VY /VEL )
+      VZP = VZ  / VEL
+      TP = T * VEL
+c      write (6, 114) TDIST,X,BX,EX,Y,BY,EY,Z,BZ,EZ,VXP,VYP,VEL
+      RETURN
+C****
+C****
+C****
+        ENTRY  PRNT4(NO, IN)
+C****
+115     FORMAT (///, 10X, 'MAXIMUM STEPS EXCEEDED', /10X,
+     1   'ELEMENT = ', I4, /10X, 'REGION = ', I4 ///)
+c        write (6, 115) NO, IN
+        RETURN
+C****
+C****
+      ENTRY PRNT5 ( T, S, X, Y, Z, EX, EY, EZ, ET, VX, VY, VZ          )
+C****
+      IF( NP  .GT. 100 ) RETURN
+      VXP = 1000. *DATAN2( VX ,VZ  )
+      VYP = 1000. * DASIN( VY /VEL )
+      VZP = VZ  / VEL
+      TP = T * VEL
+c      write (6, 112)TP,S,X, EX, Y, EY, Z, EZ, VZP, VXP, VYP, ET
+      RETURN
+      END
+
+
+      SUBROUTINE SHROT  ( NO, NP, T, TP ,NUM )
+C****
+C****
+C**** SUBROUTINE DOES TRANSLATIONS FIRST ALONG AXES X, Y, Z IN ORDER,
+C**** FOLLOWED BY ROTATIONS ABOUT X, Y, Z   .
+C****
+      IMPLICIT REAL*8(A-H,O-Z)
+      COMMON  /BLCK 0/  DATA , ITITLE
+      COMMON  /BLCK 4/  ENERGY, VEL, PMASS, Q0
+      COMMON  /BLCK 5/  XA, YA, ZA, VXA, VYA, VZA
+      DIMENSION DATA(  75,200 ), ITITLE(200)
+C**** DATA  C/ 3.D10/
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 1
+      CALL PLT2 ( NUM, NO, NBR, TPAR )
+      X0 = DATA( 1,NO )
+      Y0 = DATA( 2,NO )
+      Z0 = DATA( 3,NO )
+      CX = DCOS( DATA(4,NO)/57.29578 )
+      SX = DSIN( DATA(4,NO)/57.29578 )
+      CY = DCOS( DATA(5,NO)/57.29578 )
+      SY = DSIN( DATA(5,NO)/57.29578 )
+      CZ = DCOS( DATA(6,NO)/57.29578 )
+      SZ = DSIN( DATA(6,NO)/57.29578 )
+  100 FORMAT( / '   TRANSLATE-ROTATE  ****  ', A4,'  ***************'//
+     1'      T CM', 18X, 'X CM', 7X, 'Y CM', 7X, 'Z CM' , '      VELZ/C'
+     2   , '    THETA MR      PHI MR'  /  )
+  101 FORMAT( '  TRANSLATE  ' )
+  102 FORMAT( '  ROTATE  '  )
+  103 FORMAT( F10.4, 11X, 3F11.3, F12.5, 2F12.3  )
+c      IF( NP  .LE. 100) write (6, 100)
+      VXP = 1000. *DATAN2( VXA,VZA )
+      VYP = 1000. *DASIN ( VYA/VEL )
+      VZP =  VZA  / VEL
+c      IF( NP  .LE. 100) write (6, 103) TP, XA, YA, ZA, VZP, VXP, VYP
+      IF( (X0 .EQ. 0.) .AND. (Y0 .EQ. 0.) .AND. (Z0 .EQ. 0.) ) GO TO 1
+c      IF( NP  .LE. 100) write (6, 101)
+      XA = XA-X0
+      YA = YA-Y0
+      ZA = ZA-Z0
+c      IF( NP  .LE. 100) write (6, 103) TP, XA, YA, ZA, VZP, VXP, VYP
+    1 IF( DATA( 4,NO ) .EQ. 0. ) GO TO 2
+c      IF( NP  .LE. 100) write (6, 102)
+      YR =  YA*CX +  ZA*SX
+      ZR = -YA*SX +  ZA*CX
+      VYR= VYA*CX + VZA*SX
+      VZR=-VYA*SX + VZA*CX
+      YA = YR
+      ZA = ZR
+      VYA = VYR
+      VZA = VZR
+      VXP = 1000. *DATAN2( VXA,VZA )
+      VYP = 1000. *DASIN ( VYA/VEL )
+      VZP =  VZA  / VEL
+c      IF( NP  .LE. 100) write (6, 103) TP, XA, YA, ZA, VZP, VXP, VYP
+    2 IF( DATA( 5,NO ) .EQ. 0. ) GO TO 3
+c      IF( NP  .LE. 100) write (6, 102)
+      XR = -ZA*SY +  XA*CY
+      ZR =  ZA*CY +  XA*SY
+      VXR=-VZA*SY + VXA*CY
+      VZR= VZA*CY + VXA*SY
+      XA = XR
+      ZA = ZR
+      VXA = VXR
+      VZA = VZR
+      VXP = 1000. *DATAN2( VXA,VZA )
+      VYP = 1000. *DASIN ( VYA/VEL )
+      VZP =  VZA  / VEL
+c      IF( NP  .LE. 100) write (6, 103) TP, XA, YA, ZA, VZP, VXP, VYP
+    3 IF( DATA( 6,NO ) .EQ. 0. ) RETURN
+c      IF( NP  .LE. 100) write (6, 102)
+      XR =  XA*CZ +  YA*SZ
+      YR = -XA*SZ +  YA*CZ
+      VXR= VXA*CZ + VYA*SZ
+      VYR=-VXA*SZ + VYA*CZ
+      XA = XR
+      YA = YR
+      VXA = VXR
+      VYA = VYR
+      VXP = 1000. *DATAN2( VXA,VZA )
+      VYP = 1000. *DASIN ( VYA/VEL )
+c      IF( NP  .LE. 100) write (6, 103) TP, XA, YA, ZA, VZP, VXP, VYP
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 2
+      CALL PLT2 ( NUM, NO, NBR, TPAR )
+      RETURN
+      END
+
+
+      SUBROUTINE SOLND  ( NO, NP, T, TP ,NUM )
+C****
+C****
+C**** SOLENOID      RAY TRACING BY NUMERICAL INTEGRATION OF DIFFERENTIAL
+C**** EQUATIONS OF MOTION.
+C     T = TIME
+C     TC(1) TO TC(6) =  ( X, Y, Z, VX, VY, VZ )
+C     DTC(1) TO DTC(6) = ( VX, VY, VZ, VXDOT, VYDOT, VZDOT )
+C**** BF (POSITIVE) : SOLENOID FIELD IN BEAM DIRECTION
+C**** CBF - USED IN BSOL TO DISTINGUISH BETWEEN COORD. SYSTEMS
+C****
+C****
+      IMPLICIT REAL*8(A-H,O-Z)
+      REAL*8  LF           , K, L
+      COMMON  /BLCK 0/  DATA , ITITLE
+      COMMON  /BLCK 4/  ENERGY, VEL, PMASS, Q0
+      COMMON  /BLCK 5/  XA, YA, ZA, VXA, VYA, VZA
+      COMMON  /BLCK 7/ NCODE
+      COMMON  /BLCK10/  BX, BY, BZ, K, TC, DTC
+      COMMON  /BLCK30/  BF ,      AL, RAD
+      COMMON  /BLCK31/  S, BT
+      COMMON  /BLCK32/  IN
+      DIMENSION DATA(  75,200 ), ITITLE(200)
+      DIMENSION TC(6), DTC(6), DS(6), ES(6)
+      EXTERNAL  BSOL
+C**** DATA  C/ 3.D10/
+C****
+C****
+      LF   = DATA(  1,NO )
+      A    = DATA( 10,NO )
+      B    = DATA( 11,NO )
+      L    = DATA( 12,NO )
+      D    = DATA( 13,NO )
+      BF   = DATA( 14,NO )
+      Z11  = DATA( 15,NO )
+      Z22  = DATA( 16,NO )
+      DTF1= LF/VEL
+      AL  = L/2.
+      RAD = D/2.
+      BX = 0.
+      BY = 0.
+      BZ = 0.
+      BT = 0.
+      S = 0.
+C****
+C****
+      IF( NP  .GT. 100 ) GO TO 5
+  201 FORMAT(  ' SOLENOID    ****  ', A4, '  ***********************'/)
+c      write (6, 201) ITITLE(NO)
+  101 FORMAT( 8H    T CM ,18X, 4HX CM , 7X, 2HBX, 8X, 4HY CM , 7X, 2HBY,
+     1   8X, 4HZ CM, 7X, 2HBZ, 8X, 6HVELZ/C , 6X, 8HTHETA MR , 5X,
+     2   6HPHI MR , 6X, 1HB             )
+      CALL PRNT2 ( T,S,XA   ,YA   ,ZA   ,BX,BY,BZ,BT,VXA  ,VYA  ,VZA   )
+c      write (6, 101)
+c      write (6, 103)
+  103 FORMAT(   '0COORDINATE TRANSFORMATION TO CENTERED AXIS SYSTEM ' )
+  109 FORMAT(   '0COORDINATE TRANSFORMATION TO D AXIS SYSTEM '       )
+C**** TRANSFORM FROM INITIAL ENTRANCE COORDINATES TO VFB COORD.
+C****
+    5 TC(1) =  XA
+      TC(2) = YA
+      TC(3) = ZA-A-AL
+      TC(4) =  VXA
+      TC(5) = VYA
+      TC(6) =  VZA
+      CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 2
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+C****
+C**** TRANSLATE PARTICLE TO START OF FIRST FRINGE FIELD
+C****
+      TDT = (-TC(3) -Z11 -AL ) /DABS( TC(6) )
+C****
+      TC(1) = TC(1) + TDT * TC(4)
+      TC(2) = TC(2) + TDT * TC(5)
+      TC(3) = TC(3) + TDT * TC(6)
+      T = T + TDT
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 2
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+c      IF( NP  .LE. 100) write (6, 104)
+  104 FORMAT( 22H0FRINGING FIELD REGION    )
+      CALL FNMIRK( 6, T, DTF1,TC, DTC, DS, ES, BSOL , 0    )
+      NSTEP = 0
+    6 CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      DO 7 I = 1, NP
+      CALL FNMIRK( 6, T, DTF1,TC, DTC, DS, ES, BSOL , 1    )
+      NSTEP = NSTEP + 1
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 2
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+      IF (NSTEP  .GT.  200)  GO TO 99
+      IF( (Z22+AL) .LE. TC(3) ) GO TO 8
+    7 CONTINUE
+      GO TO 6
+    8 CONTINUE
+      XDTF1 =-( TC(3) -(Z22+AL)  ) / DABS( TC(6) )
+      CALL FNMIRK( 6, T,XDTF1,TC, DTC, DS, ES,BSOL ,  0    )
+      CALL FNMIRK( 6, T,XDTF1,TC, DTC, DS, ES,BSOL ,  1    )
+      CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 2
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+c      IF( NP  .LE. 100) write (6, 105) NSTEP
+  105 FORMAT( 10H   NSTEPS= , I5 )
+C****
+C**** TRANSFORM TO OUTPUT SYSTEM COORD.
+C****
+      TC(3) = TC(3) - B - AL
+c      IF( NP  .LE. 100) write (6, 109)
+      CALL PRNT2 ( T,S,TC(1),TC(2),TC(3),BX,BY,BZ,BT,TC(4),TC(5),TC(6) )
+C****
+C**** TRANSLATE PARTICLE TO OUT SYSTEM COORD.
+C****
+      TDT = -TC(3) /DABS( TC(6) )
+      TC(1) = TC(1) + TDT * TC(4)
+      TC(2) = TC(2) + TDT * TC(5)
+      TC(3) = TC(3) + TDT * TC(6)
+      T = T + TDT
+      TP = T * VEL
+      BX = 0.
+      BY = 0.
+      BZ = 0.
+      BT = 0.
+      S  = 0.
+      VXF    = 1000. *DATAN2( TC(4), TC(6)  )
+      VYF    = 1000. *DASIN ( TC(5)/ VEL    )
+      VZF    = TC(6) / VEL
+c      IF(NP.LE.100) write (6,115) TP,TC(1),TC(2),TC(3),VZF,VXF,VYF
+  115 FORMAT( F10.4, 10X, F10.3, 11X, F10.3, 11X, F10.3, 11X,
+     1   F13.5, F13.2, F11.2                   )
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 3
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+C****
+C**** CALCULATE INTERCEPTS IN SYSTEM D
+C****
+      Z0X = -TC(1)/ ( TC(4) / TC(6)    + 1.E-10 )
+      Z0Y = -TC(2)/ ( TC(5) / TC(6)    + 1.E-10 )
+c      IF(NP.LE.100) write (6,111) VXF, VYF, Z0X, Z0Y
+  111 FORMAT( / ' INTERSECTIONS WITH VER. AND HOR. PLANES '          ,
+     X       /15X, 5H  XP=,F10.4, 10H MR    YP=, F10.4, 3H MR   /
+     1        15X, 5H Z0X=,F10.2, 10H CM   Z0Y=,F10.2, 3H CM   /     )
+      RETURN
+   99 CALL PRNT4(NO, IN )
+      RETURN
+      END
+
+
+      SUBROUTINE VELS ( NO,NP,T,TP ,NUM )
+C****
+C****
+C     VELOCITY SELECTOR......ADDED JAN. 1976 BY W. R. BERNECKY
+C****
+C****
+      IMPLICIT  REAL*8 (A-H,O-Z)
+      REAL*8  K,LF1,LU1,LF2,L
+      REAL*8  NDX
+      EXTERNAL BEVC
+      COMMON /BLCK 0/  DATA, ITITLE
+      COMMON /BLCK 4/  ENERGY, VEL, PMASS, Q0
+      COMMON /BLCK 5/  XA,YA,ZA,VXA,VYA,VZA
+      COMMON /BLCK10/  BX,BY,BZ,K,TC,DTC
+      COMMON /BLCK11/  EX, EY, EZ, QMC, IVEC
+      COMMON /BLCK71/  CB0,CB1,CB2,CB3,CB4,CB5
+      COMMON /BLCK72/  CE0,CE1,CE2,CE3,CE4,CE5
+      COMMON /BLCK73/  IN,NFLAG
+      COMMON /BLCK74/  BF,EF,S,DG
+      COMMON /BLCK75/  BC2,BC4,EC2,EC4
+      COMMON /BLCK76/  DB,DE,WB,WE
+      COMMON /BLCK77/  RB,NDX
+C****
+      DIMENSION  DATA(75,200) , ITITLE(200)
+      DIMENSION  TC(6),DTC(6),DS(6),ES(6)
+C**** DATA  C/3.D10/
+C****
+      LF1=DATA( 1,NO)
+      LU1=DATA( 2,NO)
+      LF2=DATA( 3,NO)
+      DG =DATA( 4,NO)
+      A  =DATA( 7,NO)
+      B  =DATA( 8,NO)
+      L  =DATA( 9,NO)
+      BF =DATA(10,NO)
+      EF =DATA(11,NO)
+      RB =DATA(12,NO)
+      NDX=DATA(13,NO)
+      DB =DATA(16,NO)
+      DE =DATA(17,NO)
+      WB =DATA(18,NO)
+      WE =DATA(19,NO)
+      Z11=DATA(20,NO)
+      Z12=DATA(21,NO)
+      Z21=DATA(22,NO)
+      Z22=DATA(23,NO)
+      BC2=DATA(24,NO)
+      BC4=DATA(25,NO)
+      EC2=DATA(26,NO)
+      EC4=DATA(27,NO)
+      NFLAG = 0
+      IF( NDX .NE. 0. ) NFLAG=1
+      IF( RB  .EQ. 0. ) RB=1.D30
+      EX = 0.
+      EY = 0.
+      EZ = 0.
+      S  = 0.
+      BX = 0.
+      BY = 0.
+      BZ = 0.
+      IF ( NP .GT. 100 ) GO TO 5
+c      write (6, 100) ITITLE(NO)
+  100 FORMAT ('0VELOCITY SELECTOR****  ',A4,'  ******************'/ )
+c      write (6, 101)
+  101 FORMAT (8H    T CM,6X,4HX CM,5X,2HBX,8X,2HEX,8X,4HY CM,5X,2HBY,8X,
+     1       2HEY,7X,4HZ CM,6X,2HBZ,8X,2HEZ,6X,8HTHETA MR,5X,6HPHI MR,
+     2   2X, 'VEL/E9'   )
+      TDIST = T*VEL
+      CALL PRNT3( TDIST,XA,YA,ZA,BX,BY,BZ,EX,EY,EZ,VXA,VYA,VZA )
+c      write (6, 103)
+  103 FORMAT ( '0COORDINATE TRANSFORMATION TO B AXIS SYSTEM' )
+  109 FORMAT ( '0COORDINATE TRANSFORMATION TO D AXIS SYSTEM' )
+C****
+C**** TRANSFORM FROM INITIAL ENTRANCE COORDINATES
+C****
+    5 TC(1) = -XA
+      TC(2) =  YA
+      TC(3) = A-ZA
+      TC(4) = -VXA
+      TC(5) =  VYA
+      TC(6) = -VZA
+      CALL PRNT3 (TDIST,TC(1),TC(2),TC(3),BX,BY,BZ,
+     1            EX,EY,EZ,TC(4),TC(5),TC(6)  )
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 2
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+C****
+C**** TRANSLATE PARTICLE TO START OF FRINGE FIELD
+C****
+      TDT = ( TC(3)-Z11 )/DABS( TC(6) )
+      TC(1) = TC(1)+TDT*TC(4)
+      TC(2) = TC(2)+TDT*TC(5)
+      TC(3) = TC(3)+TDT*TC(6)
+      T = T+TDT
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 2
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+C****
+C**** IN DESIGNATES MAGNET REGIONS FOR BFUN
+C****
+      IN = 1
+      CB0=DATA(28,NO)
+      CB1=DATA(29,NO)
+      CB2=DATA(30,NO)
+      CB3=DATA(31,NO)
+      CB4=DATA(32,NO)
+      CB5=DATA(33,NO)
+      CE0=DATA(34,NO)
+      CE1=DATA(35,NO)
+      CE2=DATA(36,NO)
+      CE3=DATA(37,NO)
+      CE4=DATA(38,NO)
+      CE5=DATA(39,NO)
+      DTF1 = LF1/VEL
+c      IF ( NP .LE. 100 ) write (6, 104)
+  104 FORMAT ( 22H0FRINGING FIELD REGION)
+      CALL FNMIRK (6,T,DTF1,TC,DTC,DS,ES,BEVC,0 )
+      NSTEP = 0
+      TDIST = T*VEL
+    6 CONTINUE
+      CALL PRNT3 (TDIST,TC(1),TC(2),TC(3),BX,BY,BZ,
+     1            EX,EY,EZ,TC(4),TC(5),TC(6)  )
+      DO 7 I=1,NP
+      CALL FNMIRK (6,T,DTF1,TC,DTC,DS,ES,BEVC,1 )
+      NSTEP = NSTEP+1
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 2
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+      IF (NSTEP  .GT.  200)  GO TO 99
+      TDIST = TDIST + DTF1*VEL
+      IF ( Z12 .GE. TC(3) ) GO TO 8
+    7 CONTINUE
+      GO TO 6
+    8 CONTINUE
+      XDTF1 = -( Z12-TC(3) )*DABS( TC(6) )/VEL**2
+      CALL FNMIRK (6,T,XDTF1,TC,DTC,DS,ES,BEVC,0 )
+      CALL FNMIRK (6,T,XDTF1,TC,DTC,DS,ES,BEVC,1 )
+      TDIST = TDIST + XDTF1*VEL
+      CALL PRNT3 (TDIST,TC(1),TC(2),TC(3),BX,BY,BZ,
+     1            EX,EY,EZ,TC(4),TC(5),TC(6)  )
+c      IF ( NP .LE. 100 ) write (6, 105) NSTEP
+  105 FORMAT ( 10H   NSTEPS= ,I5 )
+C****
+C****    TRANSLATE TO 2ND VFB COORDINATE SYSTEM
+C****
+      TC(1) = -TC(1)
+      TC(3) = -(TC(3)+L)
+      TC(4) = -TC(4)
+      TC(6) = -TC(6)
+C****
+C**** UNIFORM FIELD REGION
+C****
+      IN = 2
+      DTU = LU1/VEL
+c      IF ( NP .LE. 100 ) write (6, 106)
+  106 FORMAT ( '0UNIFORM FIELD REGION IN C AXIS SYSTEM' )
+      CALL FNMIRK (6,T,DTU,TC,DTC,DS,ES,BEVC,0 )
+      NSTEP = 0
+    9 CONTINUE
+      CALL PRNT3 (TDIST,TC(1),TC(2),TC(3),BX,BY,BZ,
+     1            EX,EY,EZ,TC(4),TC(5),TC(6)  )
+      DO 10 I = 1,NP
+      CALL FNMIRK (6,T,DTU,TC,DTC,DS,ES,BEVC,1 )
+      NSTEP = NSTEP+1
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 3
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+      IF (NSTEP  .GT.  200)  GO TO 99
+      TDIST = TDIST + DTU*VEL
+      IF ( TC(3) .GE. Z21 ) GO TO 11
+   10 CONTINUE
+      GO TO 9
+   11 CONTINUE
+      XDTU = (Z21-TC(3) )*DABS( TC(6) )/VEL**2
+      CALL FNMIRK (6,T,XDTU,TC,DTC,DS,ES,BEVC,0)
+      CALL FNMIRK (6,T,XDTU,TC,DTC,DS,ES,BEVC,1 )
+      TDIST = TDIST + XDTU*VEL
+      CALL PRNT3 (TDIST,TC(1),TC(2),TC(3),BX,BY,BZ,
+     1            EX,EY,EZ,TC(4),TC(5),TC(6)  )
+c      IF ( NP .LE. 100 ) write (6, 105) NSTEP
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 3
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+C****
+C**** SET UP FOR SECOND FRINGE FIELD INTEGRATION
+C****
+      CB0=DATA(40,NO)
+      CB1=DATA(41,NO)
+      CB2=DATA(42,NO)
+      CB3=DATA(43,NO)
+      CB4=DATA(44,NO)
+      CB5=DATA(45,NO)
+      CE0=DATA(46,NO)
+      CE1=DATA(47,NO)
+      CE2=DATA(48,NO)
+      CE3=DATA(49,NO)
+      CE4=DATA(50,NO)
+      CE5=DATA(51,NO)
+      IN = 3
+      DTF2 = LF2/VEL
+c      IF ( NP .LE. 100 ) write (6, 104)
+      CALL FNMIRK (6,T,DTF2,TC,DTC,DS,ES,BEVC,0 )
+      NSTEP=0
+   12 CONTINUE
+      CALL PRNT3 (TDIST,TC(1),TC(2),TC(3),BX,BY,BZ,
+     1            EX,EY,EZ,TC(4),TC(5),TC(6)  )
+      DO 13  I=1,NP
+      CALL FNMIRK (6,T,DTF2,TC,DTC,DS,ES,BEVC,1 )
+      NSTEP = NSTEP+1
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 3
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+      IF (NSTEP  .GT.  200)  GO TO 99
+      TDIST = TDIST + DTF2*VEL
+      IF ( TC(3) .GE. Z22 ) GO TO 14
+   13 CONTINUE
+      GO TO 12
+   14 CONTINUE
+      XDTF2 = ( Z22-TC(3) )*TC(6)/VEL**2
+      CALL FNMIRK (6,T,XDTF2,TC,DTC,DS,ES,BEVC,0 )
+      CALL FNMIRK (6,T,XDTF2,TC,DTC,DS,ES,BEVC,1 )
+      TDIST = TDIST + XDTF2*VEL
+      CALL PRNT3 (TDIST,TC(1),TC(2),TC(3),BX,BY,BZ,
+     1            EX,EY,EZ,TC(4),TC(5),TC(6)  )
+c      IF (NP .LE. 100) write (6, 105) NSTEP
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 3
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+C****
+C**** TRANSLATE TO OUTPUT COORDINATES
+C****
+      TC(3) = TC(3)-B
+c      IF ( NP .LE. 100 ) write (6, 109)
+      CALL PRNT3 (TDIST,TC(1),TC(2),TC(3),BX,BY,BZ,
+     1            EX,EY,EZ,TC(4),TC(5),TC(6)  )
+      T = TDIST/VEL
+      TDT =-TC(3)/DABS( TC(6) )
+      TC(1) = TC(1)+TDT*TC(4)
+      TC(2) = TC(2)+TDT*TC(5)
+      TC(3) = TC(3)+TDT*TC(6)
+      T = T+TDT
+      BX = 0.
+      BY = 0.
+      BZ = 0.
+      EX = 0.
+      EY = 0.
+      EZ = 0.
+      S  = 0.
+      VXF    = 1000. *DATAN2( TC(4), TC(6)  )
+      VYF    = 1000. *DASIN ( TC(5)/ VEL    )
+      TDIST = T*VEL
+      NUM = NUM+1
+      TPAR = T*VEL
+      NBR = 4
+      CALL PLT1 ( NUM, NO, NBR, TPAR )
+      IF ( NP .GT. 100 ) GO TO 15
+      CALL PRNT3 (TDIST,TC(1),TC(2),TC(3),BX,BY,BZ,
+     1            EX,EY,EZ,TC(4),TC(5),TC(6)  )
+   15 CONTINUE
+      ZDX = -TC(1)/( TC(4)/TC(6)+1.E-10 )
+      ZDY = -TC(2)/( TC(5)/TC(6)+1.E-10 )
+c      IF (NP .LE. 100 ) write (6, 111) VXF,VYF,ZDX,ZDY
+  111 FORMAT (/'0INTERSECTIONS WITH VER. AND HOR. PLANES '
+     X       /15X,5H  XP=,F10.4,10H MR    YP=,F10.4,3H MR / ,
+     1    15X,5H Z0X=,F10.2,10H CM   Z0Y=,F10.2,3H CM   /   )
+      RETURN
+   99 CALL PRNT4(NO, IN)
+      RETURN
+      END
+
+
+      SUBROUTINE  RAYS(NR)
+C****
+      IMPLICIT REAL*8(A-H,O-Z)
+      COMMON  /BLCK 1/  XI, YI, ZI, VXI, VYI, VZI, DELP
+C
+C** xkine=K=(1/p)dp/dtheta
+C** added by DY for spectrometer calculations 8/25/93
+C
+      COMMON  /BLCK15/  TMIN, PMIN, XMAX, TMAX, YMAX, PMAX, DMAX, xkine
+C
+      DIMENSION XI(1000),YI(1000),ZI(1000),VXI(1000),VYI(1000),
+     1      VZI(1000), DELP(1000)
+  100 FORMAT (///10X, 'JNR = ', I10 ///)
+C****
+C****
+      DO 1 I=1,1000
+      XI(I)=0.
+      YI(I)=0.
+      ZI(I)=0.
+      VXI(I)=0.
+      VYI(I)=0.
+      VZI(I)=0.
+      DELP(I)=0.
+    1 CONTINUE
+      IF (TMIN.EQ.0.) TMIN=1.0
+      IF (PMIN.EQ.0.) PMIN=1.0
+      TMAX2 = TMAX/2.0
+      TMAX3 = TMAX/3.0
+      PMAX2 = PMAX/2.0
+      PMAX3 = 2.*PMAX/3.0
+      IF (NR.EQ.2) GO TO 2
+      IF (NR.EQ.6) GO TO 2
+      IF (NR.EQ.14) GO TO 2
+      IF (NR.EQ.46) GO TO 3
+c      write (6,100) NR
+      CALL EXIT
+    2 VXI(2)=TMIN
+      VYI(2)=PMIN
+      IF (NR.EQ.2) GO TO 5
+      VXI(3)=TMAX2
+      VXI(4)=-TMAX2
+      VXI(5)=TMAX
+      VXI(6)=-TMAX
+      IF (NR.EQ.6) GO TO 5
+      VYI(7)=PMAX2
+      VXI(8)=TMAX2
+      VYI(8)=PMAX2
+      VXI(9)=-TMAX2
+      VYI(9)=PMAX2
+      VXI(10)=TMAX
+      VYI(10)=PMAX2
+      VXI(11)=-TMAX
+      VYI(11)=PMAX2
+      VYI(12)=PMAX
+      VXI(13)=TMAX2
+      VYI(13)=PMAX
+      VXI(14)=-TMAX2
+      VYI(14)=PMAX
+C****
+C****
+C****
+    5 DO 4 I=1,NR
+      XI(I) = XMAX
+      YI(I) = YMAX
+    4 DELP(I) = DMAX
+C   
+C   change DELP for RAY 2 for kinematic focusing DY 8/93
+C
+      if (xkine.ne.0.0) DELP(2)=-xkine*vxi(2)*.20
+C
+      RETURN
+C****
+C****
+C****
+    3 VXI(2)=TMIN
+      VYI(2)=PMIN
+C   
+C   change DELP for RAY 2 for kinematic focusing DY 8/93
+C
+      if (xkine.ne.0.0) DELP(2)=-xkine*vxi(2)*.2
+C
+      XI(3)=XMAX
+      XI(4)=-XMAX
+      VXI(5)=TMAX3
+      VXI(6)=-TMAX3
+      YI(7)=YMAX
+      YI(8)=-YMAX
+      VYI(9)=PMAX3
+      VYI(10)=-PMAX3
+      DELP(11)=DMAX
+      DELP(12)=-DMAX
+      XI(13)=XMAX
+      VXI(13)=TMAX3
+      XI(14)=-XMAX
+      VXI(14)=-TMAX3
+      XI(15)=XMAX
+      DELP(15)=DMAX
+      XI(16)=-XMAX
+      DELP(16)=-DMAX
+      VXI(17)=TMAX3
+      DELP(17)=DMAX
+      VXI(18)=-TMAX3
+      DELP(18)=-DMAX
+      YI(19)=YMAX
+      VYI(19)=PMAX3
+      YI(20)=-YMAX
+      VYI(20)=PMAX3
+      XI(21)=XMAX
+      YI(21)=YMAX
+      XI(22)=-XMAX
+      YI(22)=YMAX
+      XI(23)=XMAX
+      VYI(23)=PMAX3
+      XI(24)=-XMAX
+      VYI(24)=PMAX3
+      VXI(25)=TMAX3
+      YI(25)=YMAX
+      YI(26)=YMAX
+      VXI(27)=TMAX3
+      VYI(27)=PMAX3
+      VXI(28)=-TMAX3
+      VYI(28)=PMAX3
+      YI(29)=YMAX
+      DELP(29)=DMAX
+      YI(30)=YMAX
+      DELP(30)=-DMAX
+      VYI(31)=PMAX3
+      DELP(31)=DMAX
+      VYI(32)=PMAX3
+      DELP(32)=-DMAX
+      VXI(33)=TMAX
+      VXI(34)=-TMAX
+      XI(35)=XMAX
+      VXI(35)=TMAX
+      XI(36)=-XMAX
+      VXI(36)=TMAX
+      XI(37)=XMAX
+      VXI(37)=-TMAX
+      XI(38)=-XMAX
+      VXI(38)=-TMAX
+      VXI(39)=TMAX
+      DELP(39)=DMAX
+      VXI(40)=TMAX
+      DELP(40)=-DMAX
+      VXI(41)=-TMAX
+      DELP(41)=DMAX
+      VXI(42)=-TMAX
+      DELP(42)=-DMAX
+      VYI(43)=PMAX
+      VXI(44)=TMAX
+      VYI(44)=PMAX
+      DELP(45)=3.*DMAX
+      DELP(46)=-3.*DMAX
+      RETURN
+      END
+C******************************
+C                             *
+C  FILE:  DATIME.F            *
+C                             *
+C******************************
+C
+C  THIS FILE CONTAINS SUBROUTINES THAT INTERFACE THE GETDAT AND GETTIM
+C   CALLS OF MICROSOFT FORTRAN, ETC., TO THE APPROPRIATE CALLS FOR
+C   THE MICROWAY NDP-FORTRAN 386 COMPILER.
+C
+C  THE CALLING SEQUENCES ARE OBVIOUS.  NOTE THAT THE SUBROUTINE
+C   ARGUMENTS ARE INT*2 TO BE COMPATIBLE WITH OTHER PC COMPILERS.
+C   THIS MAY BE A PROBLEM FOR PROGRAMS PORTED FROM THE VAX.
+C
+ 
+c******
+c        SUBROUTINE GETDAT(IYEAR,IMON,IDAY)
+c        INTEGER*2 IYEAR,IMON,IDAY
+C
+c        INTEGER*4 IMO,IDA,IYR,IDUMMY
+c        CALL DOSDAT(IMO,IDA,IYR,IDUMMY)
+c        IYEAR=IYR
+c        IMON=IMO
+c        IDAY=IDA
+c        RETURN
+c        END
+C
+C
+
+c        SUBROUTINE GETTIM(IHOUR,IMIN,ISEC,IHUND)
+c        INTEGER*2 IHOUR,IMIN,ISEC,IHUND
+c
+c        INTEGER*4 IHR,IMN,ISC,IHU
+c        CALL DOSTIM(IHR,IMN,ISC,IHU)
+c        IHOUR=IHR
+c        IMIN=IMN
+c        ISEC=ISC
+c        IHUND=IHU
+c        RETURN
+c        END
+c******
+
+
+       SUBROUTINE KINE(AM,THETA,ENGY,RAT,PCTR,KB)
+CC     THIS ROUTINE PERFORMS CALCULATIONS FOR FOUR BODY RELATIVISTIC
+CC     SCATTERING, IF THE INPUT DATA HAS NO SOLUTION, THE VALUE OF KB
+CC     ON RETURN IS ONE (1). OTHERWISE, KB = 2.
+C
+CC     INPUT.....
+CC     AM(1) TO AM(3) ARE THE MASSES (IN C12 SCALE AMU) OF THE INCIDENT 
+CC     TARGET, AND SCATTERED PARTICLES, RESPECTIVELY.
+CC     THETA(1) IS THE LAB SCATTERING ANGLE (IN DEGREES).
+CC     ENGY(1) IS THE Q-VALUE (IN MEV) OF THE REACTION
+CC     ENGY(2) IS THE BEAM ENERGY (IN MEV).
+C
+CC     OUTPUT.....
+CC     AM(4) IS THE MASS (IN C12 SCALE AMU) OF THE RESIDUAL NUCLEUS.
+CC     THETA(2) IS THE RECOIL ANGLE (IN DEGREES) OF MASS FOUR (4).
+CC     THETA (3) IS THE CENTER-OF-MOMENTUM ANGLE (IN DEGREES) OF SCATTER
+CC     ENGY(3) IS THE KINETIC ENERGY (IN MEV) OF THE SCATTERED PARTICLE.
+CC     RAT(1) IS THE KINEMATIC BROADENING (IN KEV/DEGREE) OF THE PRODUCT
+CC     RAT(2) IS THE CROSS-SECTION RATIO -- SIGC/SIGL.
+C
+CC     PCTR IS THE MOMENTUM TRANSFER
+C
+CC     PROGRAM CALCULATES SECOND SOLUTION IF AM(4) IS SET NEGATIVE
+CC     FUNCTION =1 IF NO SOLUTION AND ENGY(3) .LT. 0.0
+C
+	IMPLICIT REAL*8 (A-H,P-Z)
+C	DIMENSION EM(3)
+C	REAL*4 AM(4),THETA(3),ENGY(3),RAT(2),PCTR
+        DIMENSION AM(4), THETA(3), ENGY(3), RAT(2), EM(3)
+C
+C	WRITE (*,31) (AM(I),I=1,4),(THETA(I),I=1,3),(ENGY(I),I=1,3)
+C31	FORMAT (10F8.2)
+C	
+	KDEL = 1
+	ISOLU=0
+	IF(AM(4).LT.0.0) ISOLU=1
+	KB = 1
+        ENGY(3)=-0.001
+C	write (*,*) ' in kine am(4) ',am(1),am(2),am(3),am(4)
+ 	IF((AM(4).LT.0.0).AND.(AM( 1).LE.AM(2))) GO TO 24
+	IF((AM(1).GT.AM(2)).AND.(THETA(1).GT.90.0)) GO TO 24
+C  set theta to 0.01 for 0 deg. elastic scattering
+	IF (THETA(1) .EQ. 0.0 ) THETA(1) = 0.01
+	Q = ENGY(1)
+	TA = ENGY(2)
+	THL= .01745329*THETA(1)
+	DO 10 I=1,3
+ 10	EM(I)= 931.502*AM(I)
+  	EMI= EM(1)+EM(2)
+ 	AM(4)= (EMI-EM(3)-Q)/931.502
+C	write (*,*) ' em',em(1),em(2),em(3),emi,am(1),am(2),am(3)
+ 	COSL= COS (THL)
+  	SINL= SIN (THL)
+  	ETOT=EMI+TA
+  	PA= SQRT (TA*(2.*EM(1)+TA))
+  	BETA= PA/ETOT
+ 	GAMMA=ETOT/SQRT(EMI*EMI+2.*TA*EM(2))
+C	write (*,*) ' in kine 1.5',pa,ta,eps,beta,cosl,etot,emi
+  	EPS= BETA*COSL
+	EPSQ= EPS*EPS
+ 	OMES= 1.-EPSQ
+ 	EPSMC= EPS*EM(3)
+ 	B= (Q*(EMI-EM(3)-(Q/2.))+TA*(EM(2)-EM(3)))/ETOT
+ 	BP= B+EM(3)*EPSQ
+ 	DEL= B*B+EM(3)*(B+BP)
+C	write (*,*) ' in kine2', del
+ 	IF (DEL) 24, 12, 13
+12	KDEL = 2
+  	RAT(1)= 0.
+  	GO TO 14
+13	DEL= SQRT (DEL) 
+14	TC=(BP+(-1.)**ISOLU*EPS*DEL)/OMES
+C	write (*,*) ' in kine3',eps,del,omes,bp
+ 	 IF (TC-.001) 24,16,16
+16	KB=2
+	ENGY(3)=TC
+  	GO TO (18,20), KDEL
+18	ZZ=2.*(-1.)**ISOLU
+ 	RAT(1)=ABS((ZZ*EPS*TC+EPSMC*(2.+EPSMC/DEL)+DEL)*BETA*SINL*
+     1		17.45329/OMES)
+20	PC=SQRT(TC*(2.*EM(3)+TC))
+ 	PD=SQRT(ABS(PA*PA+PC*(PC-2.*PA*COSL)))
+C
+	TPC = PC*SINL
+C	WRITE (*,30) PC,SINL,PD,PA,TC,TPC
+C30	FORMAT (6F15.8)
+	PHI=ASIN(PC*(SINL/PD))
+ 	IF (PA-PC*COSL) 25,27,27
+25	PHI= 3.1415926-PHI
+27	CONTINUE
+	THETA(2)=PHI*57.295779
+ 	PCPX=GAMMA*(PC*COSL-BETA*(EM(3)+TC))
+ 	PCP= SQRT (PCPX*PCPX+(PC*SINL)**2)
+ 	THC= ASIN (PC*SINL/PCP)
+ 	COSC= COS (THC)
+	IF (PCPX) 26,28,28
+26 	THC= 3.1415926-THC
+ 	COSC= -COSC
+28	THETA(3)= THC*57.295779
+ 	RAT(2)= GAMMA*(1.+COSC*BETA*SQRT(1.+(EM(3)/PCP)**2))*(PCP/PC)**3
+ 	RAT(2)=ABS(RAT(2))
+ 	COSTH=COS(THC)
+ 	ECM=SQRT(EMI*EMI+2.*TA*EM(2))
+ 	ECM1=(EM(1)*EMI+TA*EM(2))/ECM
+	TCM1=ECM1-EM(1)
+	PCM1=SQRT(TCM1*(TCM1+2.*EM(1)))
+  	PCTR=0.005067*SQRT(PCM1*PCM1+PCP*(PCP-2.*PCM1*COSTH))
+24 	AM(4)=ABS(AM(4))
+	RETURN
+ 	END
diff --git a/NPSimulation/Detectors/MDM/Rayin.cpp b/NPSimulation/Detectors/MDM/Rayin.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..7484b9c1c1b9f081bed8fd010b38c38c7ee26dc5
--- /dev/null
+++ b/NPSimulation/Detectors/MDM/Rayin.cpp
@@ -0,0 +1,51 @@
+#include <cstdlib>
+#include <sstream>
+#include <fstream>
+#include <iostream>
+#include "Rayin.h"
+using namespace std;
+
+
+Rayin::Rayin(const string& filename, bool check):
+  isOwner(true)
+{
+  if(check)
+    {
+      int length;
+      {
+	ifstream test_("rayin.dat");
+	test_.seekg(0, ios::end);
+	length = test_.tellg();
+      }
+      if(length > 0) {
+	string answer;
+	cerr << "\nWARNING: The file \"rayin.dat\" already exists in the current directory. "
+	     << "Enter 'y' to remove it and replace it with a link to \"" << filename << "\" "
+	     << "OR enter 'n' to continue with the existing \"rayin.dat\" file.\n"
+	     << "Or enter 'q' to abort the program...\n";
+	while(1) {
+	  cin >> answer;
+	  if     (answer == "y" || answer == "Y") { break;                  }
+	  else if(answer == "n" || answer == "N") { isOwner = false; break; }
+	  else if(answer == "q" || answer == "Q") { exit(1);                }
+	  else {
+	    cerr << "ERROR: invalid response: \"" << answer << "\". Please enter 'y', 'n', or 'q'\n";
+	  }
+	}
+      }
+    }
+  if(isOwner) { 
+    cerr << "Creating link \"rayin.dat\" to the file \"" << filename << "\"...\n";
+    stringstream sstr;
+    sstr << "ln -fs " <<filename << " rayin.dat";
+    system(sstr.str().c_str());
+  }
+}
+
+Rayin::~Rayin()
+{
+  if(isOwner) {
+    cerr << "Removing link \"rayin.dat\"...\n";
+    system("rm -f rayin.dat");
+  }
+}
diff --git a/NPSimulation/Detectors/MDM/Rayin.h b/NPSimulation/Detectors/MDM/Rayin.h
new file mode 100644
index 0000000000000000000000000000000000000000..744606c7e0155a48f447344e394b62bf18aa71dd
--- /dev/null
+++ b/NPSimulation/Detectors/MDM/Rayin.h
@@ -0,0 +1,13 @@
+#ifndef RAYIN_HEADER
+#define RAYIN_HEADER
+#include <string>
+
+class Rayin {
+ public:
+  Rayin(const std::string& filename, bool check=true);
+  ~Rayin();
+ private:
+  bool isOwner;
+};
+
+#endif
diff --git a/NPSimulation/Scorers/CMakeLists.txt b/NPSimulation/Scorers/CMakeLists.txt
index f54c2bdbf5d8e506ce9ab80ed3998e087a52f42a..de493f8a6ad743470eff3e804a30811fe6ba532f 100644
--- a/NPSimulation/Scorers/CMakeLists.txt
+++ b/NPSimulation/Scorers/CMakeLists.txt
@@ -1,2 +1,2 @@
-add_library(NPSScorers SHARED NPSHitsMap.hh CalorimeterScorers.cc  SiliconScorers.cc PhotoDiodeScorers.cc ObsoleteGeneralScorers.cc DriftElectronScorers.cc )
+add_library(NPSScorers SHARED NPSHitsMap.hh CalorimeterScorers.cc  SiliconScorers.cc PhotoDiodeScorers.cc ObsoleteGeneralScorers.cc DriftElectronScorers.cc MDMScorer.cc )
 target_link_libraries(NPSScorers ${ROOT_LIBRARIES} ${Geant4_LIBRARIES} ${NPLib_LIBRARIES} -lNPInitialConditions -lNPInteractionCoordinates)
diff --git a/NPSimulation/Scorers/MDMScorer.cc b/NPSimulation/Scorers/MDMScorer.cc
new file mode 100644
index 0000000000000000000000000000000000000000..223f1f1b91148130660568a00a4e9695e7f8c896
--- /dev/null
+++ b/NPSimulation/Scorers/MDMScorer.cc
@@ -0,0 +1,121 @@
+/*****************************************************************************
+ * Copyright (C) 2009-2016   this file is part of the NPTool Project         *
+ *                                                                           *
+ * For the licensing terms see $NPTOOL/Licence/NPTool_Licence                *
+ * For the list of contributors see $NPTOOL/Licence/Contributors             *
+ *****************************************************************************/
+
+/*****************************************************************************
+ * Original Author: Adrien MATTA  contact address: matta@lpccaen.in2p3.fr    *
+ *                                                                           *
+ * Creation Date  : January 2009                                             *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class hold some of the General Scorer, shared by different detector.*
+ *  Those scorer could be a could basis for your own scorer                  *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ * Those Scorer use TrackID as map index. This way ones can rebuild energy   *
+ *  deposit, time of flight or position,... particle by particle for each    *
+ *  event.Because standard scorer provide by G4 don't work this way but using*
+ *  a global ID for each event you should not use those scorer with some G4  *
+ *  provided ones or being very carefull doing so.                           *
+ *****************************************************************************/
+#include "MDMScorer.hh"
+#include "G4UnitsTable.hh"
+using namespace CLHEP;
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+
+//   The following function is used in many scorer. following the Detector Volume Nomenclature
+//   DetectorNameX_SubPart_SubPart
+//   where X stand for the detector number.
+
+namespace {
+  int PickUpDetectorNumber(G4Step* aStep, std::string DetName)
+  {
+    std::string name = aStep->GetTrack()->GetVolume()->GetName();
+    std::string nbr;
+    size_t start, end;
+    
+    start = name.find(DetName) + DetName.length();
+    end   = name.find("_");
+    
+    int numberOfCharacterInDetectorNumber = (int)end - (int)start;
+    
+    for (unsigned int i = start; i < start + numberOfCharacterInDetectorNumber; i++)
+      nbr += name[i];
+    
+    return atoi(nbr.c_str());
+  } }
+
+
+MDMScorer::MDMScorer(G4String name, G4String VolumeName, G4int depth)
+  : G4VPrimitiveScorer(name, depth), HCID(-1)
+{
+  m_VolumeName = VolumeName;
+}
+
+MDMScorer::~MDMScorer()
+{
+}
+
+G4bool MDMScorer::ProcessHits(G4Step* aStep, G4TouchableHistory*)
+{
+  int DetNumber = PickUpDetectorNumber(aStep, m_VolumeName) ;
+  G4int  index  = aStep->GetTrack()->GetTrackID();
+    
+  G4double edep = aStep->GetTotalEnergyDeposit();
+  G4double M = aStep->GetPreStepPoint()->GetMass();
+  G4double Q = aStep->GetPreStepPoint()->GetCharge();
+  G4ThreeVector POS  = aStep->GetPreStepPoint()->GetPosition();
+  G4ThreeVector MOM  = aStep->GetPreStepPoint()->GetMomentumDirection();
+  
+  MDMScorer::Infos info;
+  info.Edep   = edep/MeV;
+  info.Mass   = M;
+  info.Charge = Q;
+  info.Pos    = POS;
+  info.Mom    = MOM;
+  
+  EvtMap->add(index+DetNumber, info);
+  return TRUE;
+}
+
+void MDMScorer::Initialize(G4HCofThisEvent* HCE)
+{
+  EvtMap = new NPS::HitsMap<MDMScorer::Infos>
+    (GetMultiFunctionalDetector()->GetName(), GetName());
+  if (HCID < 0) {
+    HCID = GetCollectionID(0);
+  }
+  HCE->AddHitsCollection(HCID, (G4VHitsCollection*)EvtMap);
+}
+
+void MDMScorer::EndOfEvent(G4HCofThisEvent*)
+{
+  ;
+}
+
+void MDMScorer::clear()
+{
+  EvtMap->clear();
+}
+
+void MDMScorer::DrawAll()
+{
+  ;
+}
+
+void MDMScorer::PrintAll()
+{
+  // G4cout << " MultiFunctionalDet  " << detector->GetName() << G4endl;
+  // G4cout << " PrimitiveScorer " << GetName() << G4endl;
+  // G4cout << " Number of entries " << EvtMap->entries() << G4endl;
+  // std::map<G4int, G4double*>::iterator itr = EvtMap->GetMap()->begin();
+  // for (; itr != EvtMap->GetMap()->end(); itr++) {
+  //     G4cout << "  copy no.: " << itr->first
+  //     << "  energy deposit: " << G4BestUnit(*(itr->second), "Energy")
+  //     << G4endl;
+  // }
+}
diff --git a/NPSimulation/Scorers/MDMScorer.hh b/NPSimulation/Scorers/MDMScorer.hh
new file mode 100644
index 0000000000000000000000000000000000000000..683c820b191af3258ff986a47642df761b76f29f
--- /dev/null
+++ b/NPSimulation/Scorers/MDMScorer.hh
@@ -0,0 +1,51 @@
+#ifndef MDMScorer_h
+#define MDMScorer_h 1
+#include "G4VPrimitiveScorer.hh"
+#include "G4ThreeVector.hh"
+#include "NPSHitsMap.hh"
+using namespace CLHEP;
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......         
+class MDMScorer : public G4VPrimitiveScorer
+{
+
+public: // with description
+  MDMScorer(G4String name, G4String VolumeName, G4int depth);
+  virtual ~MDMScorer();
+
+protected: // with description
+  virtual G4bool ProcessHits(G4Step*, G4TouchableHistory*);
+
+public:
+  virtual void Initialize(G4HCofThisEvent*);
+  virtual void EndOfEvent(G4HCofThisEvent*);
+  virtual void clear();
+  virtual void DrawAll();
+  virtual void PrintAll();
+
+public:
+  struct Infos {
+    double Edep;
+    double Mass;
+    double Charge;
+    G4ThreeVector Pos;
+    G4ThreeVector Mom;
+    Infos& operator+=(const Infos& rhs)
+    {
+      // Only sum edep - leave others the same
+      // (want to be same as beginning of track)
+      Edep = Edep + rhs.Edep;
+      return *this;
+    }
+  };
+  
+private:
+  G4String m_VolumeName;
+  G4int HCID;
+  NPS::HitsMap<Infos>* EvtMap;
+};       
+
+
+
+
+#endif