slicPandora/include
diff -N SimpleTrackProcessor.h
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ SimpleTrackProcessor.h 17 Mar 2010 02:13:04 -0000 1.1
@@ -0,0 +1,45 @@
+// $Id: SimpleTrackProcessor.h,v 1.1 2010/03/17 02:13:04 jeremy Exp $
+#ifndef SIMPLETRACKPROCESSOR_H
+#define SIMPLETRACKPROCESSOR_H 1
+
+// slicPandora
+#include "EventProcessor.h"
+
+// lcio
+#include "EVENT/LCEvent.h"
+
+// pandora
+#include "Api/PandoraApi.h"
+
+using EVENT::LCEvent;
+
+class SimpleTrackProcessor : public EventProcessor
+{
+
+public:
+
+ SimpleTrackProcessor()
+ : EventProcessor("SimpleTrackProcessor")
+ {;}
+
+ virtual ~SimpleTrackProcessor()
+ {;}
+
+public:
+
+ void processEvent(EVENT::LCEvent*);
+
+private:
+
+ void setupTrackStatesFromRelations(PandoraApi::Track::Parameters&, EVENT::LCEvent*);
+ void setupTrackStatesFromGenericObjects(PandoraApi::Track::Parameters& trackParameters, EVENT::LCEvent* event);
+
+private:
+
+ static std::string trackCollectionName;
+ static std::string startCollectionName;
+ static std::string ecalCollectionName;
+ static std::string endCollectionName;
+};
+
+#endif
slicPandora/include
diff -u -r1.1 -r1.2
--- DefaultProcessors.h 11 Mar 2010 19:56:48 -0000 1.1
+++ DefaultProcessors.h 17 Mar 2010 02:13:04 -0000 1.2
@@ -2,11 +2,12 @@
#define DEFAULTPROCESSORS_H 1
// slicPandora
-#include "EventMarkerProcessor.h"
-#include "SimCalorimeterHitProcessor.h"
#include "CalorimeterHitProcessor.h"
+#include "EventMarkerProcessor.h"
#include "PandoraProcessor.h"
#include "PfoProcessor.h"
#include "ResetPandoraProcessor.h"
+#include "SimCalorimeterHitProcessor.h"
+#include "SimpleTrackProcessor.h"
#endif
slicPandora/src
diff -N SimpleTrackProcessor.cpp
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ SimpleTrackProcessor.cpp 17 Mar 2010 02:13:04 -0000 1.1
@@ -0,0 +1,190 @@
+#include "SimpleTrackProcessor.h"
+
+// slicPandora
+#include "JobManager.h"
+
+// lcio
+#include "EVENT/LCCollection.h"
+#include "EVENT/Track.h"
+#include "EVENT/LCGenericObject.h"
+#include "EVENT/LCObject.h"
+#include "UTIL/LCRelationNavigator.h"
+
+// pandora
+#include "Objects/CartesianVector.h"
+#include "Api/PandoraApi.h"
+
+// stl
+#include <string>
+#include <cmath>
+
+using EVENT::LCCollection;
+using EVENT::Track;
+using EVENT::LCObjectVec;
+using EVENT::LCGenericObject;
+using UTIL::LCRelationNavigator;
+using pandora::CartesianVector;
+
+// FIXME: Name of collection containing LCIO Track objects is hard-coded to "Tracks".
+std::string SimpleTrackProcessor::trackCollectionName = "Tracks";
+
+std::string SimpleTrackProcessor::startCollectionName = trackCollectionName + "_StateAtStart";
+std::string SimpleTrackProcessor::ecalCollectionName = trackCollectionName + "_StateAtECal";
+std::string SimpleTrackProcessor::endCollectionName = trackCollectionName + "_StateAtEnd";
+
+void SimpleTrackProcessor::processEvent(EVENT::LCEvent* event)
+{
+ //std::cout << "SimpleTrackProcessor::processEvent" << std::endl;
+
+ LCCollection* trackCollection = event->getCollection(trackCollectionName);
+
+ int ntracks = trackCollection->getNumberOfElements();
+ for (int i=0; i<ntracks; i++)
+ {
+ //std::cout << "proc track #" << i << std::endl;
+
+ Track* track = dynamic_cast<Track*>(trackCollection->getElementAt(i));
+
+ PandoraApi::Track::Parameters trackParameters;
+
+ // Pointer to LCIO Track.
+ trackParameters.m_pParentAddress = track;
+
+ // Impact parameters.
+ trackParameters.m_d0 = track->getD0();
+ trackParameters.m_z0 = track->getZ0();
+
+ // Sign.
+ const float signedCurvature(track->getOmega());
+ if (0. != signedCurvature)
+ trackParameters.m_chargeSign = static_cast<int>(signedCurvature / std::fabs(signedCurvature));
+
+ // FIXME: Mass hard-coded to charged pion.
+ trackParameters.m_mass = 0.13957018;
+
+ // FIXME: Hard-coded DCA momentum parameter.
+ trackParameters.m_momentumAtDca = CartesianVector(0., 0., 0.);
+
+ // FIXME: Next three boolean parameters are hard-coded.
+ trackParameters.m_reachesECal = true;
+ trackParameters.m_canFormPfo = true;
+ trackParameters.m_canFormClusterlessPfo = false;
+
+ // Setup track states from GenericObject collections, assuming that the ordering matches that in the "Tracks" collection.
+ setupTrackStatesFromGenericObjects(trackParameters, event);
+
+ std::cout << "Track Parameters: " << std::endl;
+ std::cout << " d0 = " << trackParameters.m_d0.Get() << std::endl;
+ std::cout << " z0 = " << trackParameters.m_z0.Get() << std::endl;
+ std::cout << " mass = " << trackParameters.m_mass.Get() << std::endl;
+ std::cout << " momentumAtDca = " << trackParameters.m_momentumAtDca.Get() << std::endl;
+ std::cout << " stateAtStart = " << trackParameters.m_trackStateAtStart.Get() << std::endl;
+ std::cout << " stateAtEnd = " << trackParameters.m_trackStateAtEnd.Get() << std::endl;
+ std::cout << " stateAtECal = " << trackParameters.m_trackStateAtECal.Get() << std::endl;
+ std::cout << " reachesECal = " << trackParameters.m_reachesECal.Get() << std::endl;
+ std::cout << " canFormPfo = " << trackParameters.m_canFormPfo.Get() << std::endl;
+ std::cout << " canFormClusterlessPfo = " << trackParameters.m_canFormClusterlessPfo.Get() << std::endl;
+ std::cout << " parentAddress = " << trackParameters.m_pParentAddress.Get() << std::endl;
+
+
+ // Register object with Pandora.
+ PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraApi::Track::Create(getJobManager()->getPandora(), trackParameters));
+ }
+}
+
+void SimpleTrackProcessor::setupTrackStatesFromGenericObjects(PandoraApi::Track::Parameters& trackParameters, EVENT::LCEvent* event)
+{
+ LCCollection* startCollection = event->getCollection("StateAtStart");
+ LCCollection* ecalCollection = event->getCollection("StateAtECal");
+ LCCollection* endCollection = event->getCollection("StateAtEnd");
+
+ LCCollection* trackCollection = event->getCollection(trackCollectionName);
+ int ntracks = trackCollection->getNumberOfElements();
+ for (int i=0; i<ntracks; i++)
+ {
+ // Get the LCIO Track.
+ Track* track = dynamic_cast<Track*>(trackCollection->getElementAt(i));
+
+ // Add start state.
+ LCGenericObject* startObj = dynamic_cast<LCGenericObject*>(startCollection->getElementAt(i));
+ trackParameters.m_trackStateAtStart =
+ pandora::TrackState(startObj->getFloatVal(0),
+ startObj->getFloatVal(1),
+ startObj->getFloatVal(2),
+ startObj->getFloatVal(3),
+ startObj->getFloatVal(4),
+ startObj->getFloatVal(5));
+
+ // Add ECal state.
+ LCGenericObject* ecalObj = dynamic_cast<LCGenericObject*>(ecalCollection->getElementAt(i));
+ trackParameters.m_trackStateAtECal =
+ pandora::TrackState(ecalObj->getFloatVal(0),
+ ecalObj->getFloatVal(1),
+ ecalObj->getFloatVal(2),
+ ecalObj->getFloatVal(3),
+ ecalObj->getFloatVal(4),
+ ecalObj->getFloatVal(5));
+
+ // Add end state.
+ LCGenericObject* endObj = dynamic_cast<LCGenericObject*>(endCollection->getElementAt(i));
+ trackParameters.m_trackStateAtEnd = pandora::TrackState(endObj->getFloatVal(0),
+ endObj->getFloatVal(1),
+ endObj->getFloatVal(2),
+ endObj->getFloatVal(3),
+ endObj->getFloatVal(4),
+ endObj->getFloatVal(5));
+ }
+}
+
+/**
+ * LCRelations read from LCSim do NOT work. Don't call this! Left here for reference.
+ * FIXME: Can't read relations from LCSim into slicPandora.
+ */
+void SimpleTrackProcessor::setupTrackStatesFromRelations(PandoraApi::Track::Parameters& trackParameters, EVENT::LCEvent* event)
+{
+ // Make LCRelationNavigators for each of the three state collections.
+ LCRelationNavigator navStart((const_cast<const LCEvent*>(event))->getCollection(startCollectionName));
+ LCRelationNavigator navEcal((const_cast<const LCEvent*>(event))->getCollection(ecalCollectionName));
+ LCRelationNavigator navEnd((const_cast<const LCEvent*>(event))->getCollection(endCollectionName));
+
+ LCCollection* trackCollection = event->getCollection(trackCollectionName);
+ int ntracks = trackCollection->getNumberOfElements();
+ for (int i=0; i<ntracks; i++)
+ {
+ Track* track = dynamic_cast<Track*>(trackCollection->getElementAt(i));
+
+ // Add start state.
+ const LCObjectVec& startCollection = navStart.getRelatedToObjects(track);
+ LCGenericObject* startObj = dynamic_cast<LCGenericObject*>(startCollection.at(0));
+ trackParameters.m_trackStateAtStart =
+ pandora::TrackState(startObj->getFloatVal(0),
+ startObj->getFloatVal(1),
+ startObj->getFloatVal(2),
+ startObj->getFloatVal(3),
+ startObj->getFloatVal(4),
+ startObj->getFloatVal(5));
+
+ //std::cout << "got track state X: " << trackParameters.m_trackStateAtStart.Get().GetPosition().GetX() << std::endl;
+
+ // Add ECal state.
+ const LCObjectVec& ecalCollection = navEcal.getRelatedToObjects(track);
+ LCGenericObject* ecalObj = dynamic_cast<LCGenericObject*>(ecalCollection.at(0));
+ trackParameters.m_trackStateAtECal =
+ pandora::TrackState(ecalObj->getFloatVal(0),
+ ecalObj->getFloatVal(1),
+ ecalObj->getFloatVal(2),
+ ecalObj->getFloatVal(3),
+ ecalObj->getFloatVal(4),
+ ecalObj->getFloatVal(5));
+
+ // Add end state.
+ const LCObjectVec& endCollection = navEnd.getRelatedToObjects(track);
+ LCGenericObject* endObj = dynamic_cast<LCGenericObject*>(endCollection.at(0));
+ trackParameters.m_trackStateAtECal = pandora::TrackState(endObj->getFloatVal(0),
+ endObj->getFloatVal(1),
+ endObj->getFloatVal(2),
+ endObj->getFloatVal(3),
+ endObj->getFloatVal(4),
+ endObj->getFloatVal(5));
+ }
+}
slicPandora/tests
diff -u -r1.2 -r1.3
--- PandoraFrontend.cpp 11 Mar 2010 22:18:44 -0000 1.2
+++ PandoraFrontend.cpp 17 Mar 2010 02:13:04 -0000 1.3
@@ -1,4 +1,4 @@
-//$Id: PandoraFrontend.cpp,v 1.2 2010/03/11 22:18:44 jeremy Exp $
+//$Id: PandoraFrontend.cpp,v 1.3 2010/03/17 02:13:04 jeremy Exp $
/**
* This is a simple frontend to run slicPandora. It takes an ordered list of arguments. (See usage method.)
@@ -81,6 +81,9 @@
// Add a processor to convert LCIO CalorimeterHits to Pandora CaloHit::Parameters.
mgr->addEventProcessor(new CalorimeterHitProcessor());
+ // Add a processor to convert LCIO Tracks and their track states to Pandora Track Parameters.
+ mgr->addEventProcessor(new SimpleTrackProcessor());
+
// Add a processor to automatically run the registered Pandora algorithms.
mgr->addEventProcessor(new PandoraProcessor());