Versions Compared


  • This line was added.
  • This line was removed.
  • Formatting was changed.

Table of Contents

(lots more examples if you check out the 'psana_examples' package)

Psana user examples

This page holds a few example code-snippets for use in psana analysis. The analysis is written in C++ and uses root for plotting the data. (The histogramming interface allows for swapping root with any other histogramming package of your choice... in principle. If you know a good one, go ahead and try and let us know so we can try it too!!)

If you didn't already, take a look at the Getting Started with C++ Analysis, Psana User Manual - Old and Psana Reference Manual - Old.

Note that with C++/psana (as opposed to with python/pyana), you do need two files for your source code: MyPackage/include/MyModule.h and MyPackage/src/MyModule.cpp. Also you must compile any time you change your source code.

BeamLine Data: EBeam

The bare outline... I will fill in more here.
This example shows how to create 1D and 2D histograms of data from the "BldInfo(EBeam)". The histograms gets saved automatically in a root-file, filename is the same as the xtc file name, but with extension .root, and it is stored in your current directory.

Code Block
#include "psana/Module.h"
namespace psana_examples {
class PlotBld : public Module {

  // Default constructor
  PlotBld (const std::string& name) ;

  // Destructor
  virtual ~PlotBld () ;

  /// Method which is called with event data
  virtual void beginJob(Event& evt, Env& env);
  virtual void event(Event& evt, Env& env);



  Source m_ebeamSrc;
  PSHist::H1* m_ebeamHisto;
  PSHist::H1* m_chargeHisto;
  PSHist::H2* m_xPosVsAngle;
  PSHist::H2* m_yPosVsAngle;

} // namespace psana_examples
Code Block
#include "psana_examples/PlotBld.h"
#include "MsgLogger/MsgLogger.h"
#include "psddl_psana/bld.ddl.h"
using namespace psana_examples;
namespace psana_examples {

PlotBld::PlotBld (const std::string& name)
  : Module(name)
  m_ebeamSrc = configStr("eBeamSource", "BldInfo(EBeam)");
PlotBld::~PlotBld ()

// Method which is called once at the beginning of the job
PlotBld::beginJob(Event& evt, Env& env)
  m_ebeamHisto = env.hmgr().hist1f("ebeamHisto", "ebeamL3Energy value", Axis(1000, 13000, 16000));
  m_chargeHisto = env.hmgr().hist1f("chargeHisto", "ebeamCharge value", Axis(250, 0, 0.25));
  m_xPosVsAngle = env.hmgr().hist2f("xPosVsAngle", "x position vs. angle; position []; angle [rad]",
                                    Axis(100, -0.5,0.5), // x-axis: position
                                    Axis(100,-0.5, 0.5)); // y-axis: angle
  m_yPosVsAngle = env.hmgr().hist2f("yPosVsAngle", "y position vs. angle; position []; angle [rad]",
                                    Axis(100, -0.5,0.5),  // x-axis: position
                                    Axis(100,-0.5, 0.5)); // y-axis: position
// Method which is called with event data
PlotBld::event(Event& evt, Env& env)
  // Assume this experiment has V1 version of EBeam data
  // how do you know? Try parsing xtc file with 'pyxtcreader |less'
  shared_ptr<Psana::Bld::BldDataEBeamV1> ebeam = evt.get(m_ebeamSrc);
  if (ebeam.get()) {
    m_ebeamHisto->fill( ebeam->ebeamL3Energy() );
    m_chargeHisto->fill( ebeam->ebeamCharge() );
    m_xPosVsAngle->fill( ebeam->ebeamLTUPosX(),ebeam->ebeamLTUAngX() );
    m_xPosVsAngle->fill( ebeam->ebeamLTUPosY(),ebeam->ebeamLTUAngY() );
//    WithMsgLog(name(), info, str) {
//      str << "Bld::BldDataEBeamV1:"
//          << "\n  damageMask=" << ebeam->damageMask()
//          << "\n  ebeamCharge=" << ebeam->ebeamCharge()
//          << "\n  ebeamL3Energy=" << ebeam->ebeamL3Energy()
//          << "\n  ebeamLTUPosX=" << ebeam->ebeamLTUPosX()
//          << "\n  ebeamLTUPosY=" << ebeam->ebeamLTUPosY()
//          << "\n  ebeamLTUAngX=" << ebeam->ebeamLTUAngX()
//          << "\n  ebeamLTUAngY=" << ebeam->ebeamLTUAngY()
//          << "\n  ebeamPkCurrBC2=" << ebeam->ebeamPkCurrBC2();

Displaying histograms.

To display the histograms graphically, open this root histogram file in a root session. Lauch root by typing 'root'. You can optionally
load the data file by adding it on the command line. The scripting syntax is like C++,
with some additional functionality:

Code Block
[ofte@psana0106 ana-oct]$ root e86-r0212-s00-c00.root
  *                                         *
  *        W E L C O M E  to  R O O T       *
  *                                         *
  *   Version   5.24/00      29 June 2009   *
  *                                         *
  *  You are welcome to visit our Web site  *
  *            *
  *                                         *

ROOT 5.24/00 (trunk@29257, Jun 30 2009, 09:23:51 on linuxx8664gcc)

CINT/ROOT C/C++ Interpreter version 5.17.00, Dec 21, 2008
Type ? for help. Commands must be C++ statements.
Enclose multiple statements between { }.
...using style 'Plain'
...using style 'Plain'
root [0]
Attaching file e86-r0212-s00-c00.root as _file0...
root [1]       // list the contents of the file
TFile**         e86-r0212-s00-c00.root  Created by the RootHManager
 TFile*         e86-r0212-s00-c00.root  Created by the RootHManager
  KEY: TH1F     ebeamHisto;1    ebeamL3Energy value
  KEY: TH1F     chargeHisto;1   ebeamCharge value
  KEY: TH2F     xPosVsAngle;1   x position vs. angle
  KEY: TH2F     yPosVsAngle;1   y position vs. angle
root [2] ebeamHisto->Draw()
<TCanvas::MakeDefCanvas>: created default TCanvas with name c1
root [3] TCanvas c2   // to make another plot in a new window, create a new canvas. 
root [4] xPosVsAngle->Draw() // this will be plotted onto the current canvas (last created) 
root [5] chargeHist->Draw()
Error: Symbol chargeHist is not defined in current scope  (tmpfile):1:
Error: Failed to evaluate chargeHist->Draw()
*** Interpreter error recovered ***
root [6] chargeHisto->Draw()