Commit in slicPandora on MAIN
include/SimpleTrackProcessor.h+45added 1.1
       /DefaultProcessors.h+3-21.1 -> 1.2
src/SimpleTrackProcessor.cpp+190added 1.1
tests/PandoraFrontend.cpp+4-11.2 -> 1.3
+242-3
2 added + 2 modified, total 4 files
add a new processor for converting LCIO Tracks to Pandora Track Parameters; reads GenericObject collections for track states (NOT relations which are broken in LCSim somehow)

slicPandora/include
SimpleTrackProcessor.h added at 1.1
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
DefaultProcessors.h 1.1 -> 1.2
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
SimpleTrackProcessor.cpp added at 1.1
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
PandoraFrontend.cpp 1.2 -> 1.3
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());
 
CVSspam 0.2.8