Skip to content
Snippets Groups Projects
Geant4TrackingPostAction.cpp 2.77 KiB
Newer Older
// $Id: Geant4Converter.cpp 603 2013-06-13 21:15:14Z markus.frank $
//====================================================================
//  AIDA Detector description implementation for LCD
//--------------------------------------------------------------------
//
//  Author     : M.Frank
//
//====================================================================

// Framework include files
#include "DD4hep/InstanceCount.h"
#include "DDG4/Geant4TrackingPostAction.h"
#include "DDG4/Geant4TrackHandler.h"

// Geant4 include files
#include "G4TrackingManager.hh"

#include <algorithm>

using namespace std;
using namespace DD4hep::Simulation;

struct FindString  {
  const std::string& m_name;
  FindString(const std::string& n) : m_name(n) {}
  bool operator()(const std::string& n) const  {  return m_name == n; }
  //template <class T> bool operator==(const std::pair<std::string,T>& cmp)  const
  //{  return cmp.first == m_name;  }
  //template <class T> bool operator==(const std::pair<T,std::string>& cmp)  const
  //{  return cmp.second == m_name;  }
};

/// Standard constructor
Geant4TrackingPostAction::Geant4TrackingPostAction(Geant4Context* context, const std::string& name) 
: Geant4TrackingAction(context,name) 
{
  InstanceCount::increment(this);
  declareProperty("IgnoredProcesses",m_ignoredProcs);
  declareProperty("RequiredProcesses",m_requiredProcs);
}

/// Default destructor
Geant4TrackingPostAction::~Geant4TrackingPostAction()  {
  InstanceCount::decrement(this);
}

/// Begin-of-tracking callback
void Geant4TrackingPostAction::begin(const G4Track* track)  {

  // Is the track valid? Is tracking manager valid? 
  // Does trajectory already exist?
  if( 0 == track || 0 == trackMgr() || 0 != trackMgr()->GimmeTrajectory()  ) 
    return;
  trackMgr()->SetStoreTrajectory(true);
  // create GaussTrajectory and inform Tracking Manager 
  G4VTrajectory* tr = m_context->createTrajectory(track);
  trackMgr()->SetTrajectory(tr);
}

/// End-of-tracking callback
void Geant4TrackingPostAction::end(const G4Track* tr)  {
  if ( 0 == tr )
    return;
  else if ( 0 == trackMgr() )
    return;

  Geant4TrackHandler track(tr);
  //Geant4TrackInformation* info = track.info<Geant4TrackInformation>();
  const string& proc = track.creatorProcess()->GetProcessName();
  StringV::const_iterator trIt = find_if(m_ignoredProcs.begin(),m_ignoredProcs.end(),FindString(proc));
  if ( trIt != m_ignoredProcs.end() )  {
    warning("Particles created by processes of type %s are not kept!",(*trIt).c_str());
    return;
  }
  trIt = find_if(m_requiredProcs.begin(),m_requiredProcs.end(),FindString(proc));
  if ( trIt != m_requiredProcs.end() )  {
    saveTrack(track);
    return;
  }

  if ( m_storeMarkedTracks )   {
  }


}

void Geant4TrackingPostAction::saveTrack(const G4Track* track)    {
  if ( 0 != track )  {
  }
}