1 #include <inc/lciointerface.h>
2 #include <EVENT/ReconstructedParticle.h>
3 #include <EVENT/Track.h>
4 #include <EVENT/LCCollection.h>
5 #include <EVENT/LCFloatVec.h>
6 #include <IMPL/LCCollectionVec.h>
7 #include <EVENT/LCEvent.h>
8 #include <IMPL/VertexImpl.h>
9 #include <IMPL/ParticleIDImpl.h>
10 #include <IMPL/ReconstructedParticleImpl.h>
11 #include <inc/track.h>
12 #include <inc/trackstate.h>
13 #include <inc/event.h>
14 #include <inc/vertex.h>
15 #include <util/inc/memorymanager.h>
16 #include <inc/decaychain.h>
22 using namespace vertex_lcfi;
25 namespace vertex_lcfi{
30 lcio::Track* RPTrack = *(RP->getTracks().begin());
33 H.d0()=RPTrack->getD0();
34 H.z0()=RPTrack->getZ0();
35 H.phi()=RPTrack->getPhi();
36 H.invR()=RPTrack->getOmega();
37 H.tanLambda()=RPTrack->getTanLambda();
40 Mom.x() = RP->getMomentum()[0];
41 Mom.y() = RP->getMomentum()[1];
42 Mom.z() = RP->getMomentum()[2];
47 Cov(0,0)=RPTrack->getCovMatrix()[0];
48 Cov(3,0)=RPTrack->getCovMatrix()[6];
49 Cov(3,3)=RPTrack->getCovMatrix()[9];
51 Cov(1,0)=RPTrack->getCovMatrix()[1];
52 Cov(1,1)=RPTrack->getCovMatrix()[2];
53 Cov(0,2)=RPTrack->getCovMatrix()[3];
54 Cov(1,2)=RPTrack->getCovMatrix()[4];
55 Cov(2,2)=RPTrack->getCovMatrix()[5];
56 Cov(1,3)=RPTrack->getCovMatrix()[7];
58 Cov(2,3)=RPTrack->getCovMatrix()[8];
59 Cov(0,4)=RPTrack->getCovMatrix()[10];
60 Cov(1,4)=RPTrack->getCovMatrix()[11];
61 Cov(2,4)=RPTrack->getCovMatrix()[12];
62 Cov(3,4)=RPTrack->getCovMatrix()[13];
63 Cov(4,4)=RPTrack->getCovMatrix()[14];
101 RPTrack->getSubdetectorHitNumbers(),
151 Jet* MyJet =
new Jet(MyEvent, vector<vertex_lcfi::Track*>(),RP->getEnergy(),
Vector3(RP->getMomentum()[0],RP->getMomentum()[1],RP->getMomentum()[2]),(
void*)RP);
153 MyEvent->addJet(MyJet);
156 vector<ReconstructedParticle*> LCIOJetRPs = RP->getParticles();
157 for (vector<ReconstructedParticle*>::const_iterator iRP = LCIOJetRPs.begin();iRP!=LCIOJetRPs.end();++iRP)
159 vector<lcio::Track*> RPsTracks = (*iRP)->getTracks();
160 if( ! RPsTracks.empty() ) {
163 MyJet->addTrack(MyTrack);
165 std::cout <<
"Warning lciointerface.cpp:31 RP with no Track - excluding" << std::endl;
174 lcio::VertexImpl* MyLCIOVertex =
new VertexImpl();
176 MyLCIOVertex->setChi2(MyLCFIVertex->
chi2()) ;
177 MyLCIOVertex->setProbability(MyLCFIVertex->
probability()) ;
179 EVENT::FloatVec Error;
186 MyLCIOVertex->setCovMatrix(Error);
187 MyLCIOVertex->setPrimary(MyLCFIVertex->
isPrimary());
193 Vector3 Pos(LCIOVertex->getPosition()[0],LCIOVertex->getPosition()[1],LCIOVertex->getPosition()[2]);
195 PosErr(0,0)=LCIOVertex->getCovMatrix()[0];
196 PosErr(1,0)=LCIOVertex->getCovMatrix()[1];
197 PosErr(1,1)=LCIOVertex->getCovMatrix()[2];
198 PosErr(2,0)=LCIOVertex->getCovMatrix()[3];
199 PosErr(2,1)=LCIOVertex->getCovMatrix()[4];
200 PosErr(2,2)=LCIOVertex->getCovMatrix()[5];
209 DecayChain* decayChainFromLCIORP(
Jet* LCFIJet, ReconstructedParticle* DecayChainRP)
212 map<ReconstructedParticle*,Track*> LCFITrack;
213 vector<Track*> LCFITracks = LCFIJet->
tracks();
214 for (vector<Track*>::const_iterator iTrack = LCFITracks.begin();iTrack < LCFITracks.end();++iTrack)
217 LCFITrack[(ReconstructedParticle*)(*iTrack)->trackingNum()] = *iTrack;
220 vector<lcio::Vertex*> LCIOVertices;
222 LCIOVertices.push_back(DecayChainRP->getStartVertex());
225 vector<ReconstructedParticle*> RPs = DecayChainRP->getParticles();
227 for (vector<ReconstructedParticle*>::const_iterator iRP = RPs.begin();iRP < RPs.end();++iRP)
229 lcio::Vertex* MyVertex = (*iRP)->getStartVertex();
232 vector<lcio::Vertex*>::const_iterator it = find(LCIOVertices.begin(),LCIOVertices.end(),MyVertex);
233 if (it == LCIOVertices.end())
235 LCIOVertices.push_back(MyVertex);
240 DecayChain* NewDecayChain =
new DecayChain(LCFIJet,vector<Track*>(),vector<vertex_lcfi::Vertex*>());
243 vector<vertex_lcfi::Vertex*> LCFIVertices;
244 map<lcio::Vertex*,vertex_lcfi::Vertex*> LCFIVertex;
245 for (vector<lcio::Vertex*>::const_iterator iVertex = LCIOVertices.begin();iVertex < LCIOVertices.end();++iVertex)
248 LCFIVertices.push_back(NewVertex);
249 LCFIVertex[(*iVertex)] = NewVertex;
253 for (vector<ReconstructedParticle*>::const_iterator iRP = RPs.begin();iRP < RPs.end();++iRP)
255 if (!(*iRP)->getParticles().empty())
258 map<ReconstructedParticle*,Track*>::const_iterator iLCFITrack= LCFITrack.find((*iRP)->getParticles()[0]);
259 if (iLCFITrack != LCFITrack.end())
261 if ((*iRP)->getStartVertex())
263 LCFIVertex[(*iRP)->getStartVertex()]->addTrack(LCFITrack[(*iRP)->getParticles()[0]]);
267 NewDecayChain->
addTrack(LCFITrack[(*iRP)->getParticles()[0]]);
272 return NewDecayChain;
276 ReconstructedParticle* addDecayChainToLCIOEvent(LCEvent* MyLCIOEvent,
DecayChain* MyDecayChain, std::string VertexCollectionName, std::string TrackRPCollectionName,
bool StoreTrackChiSquareds)
279 vector<std::string>::const_iterator it = find(MyLCIOEvent->getCollectionNames()->begin(),MyLCIOEvent->getCollectionNames()->end(),VertexCollectionName);
280 if (it == MyLCIOEvent->getCollectionNames()->end())
283 LCCollection* MyCollection =
new LCCollectionVec(
"Vertex");
284 MyLCIOEvent->addCollection(MyCollection,VertexCollectionName);
286 it = find(MyLCIOEvent->getCollectionNames()->begin(),MyLCIOEvent->getCollectionNames()->end(),TrackRPCollectionName);
287 if (it == MyLCIOEvent->getCollectionNames()->end())
290 LCCollection* MyCollection =
new LCCollectionVec(
"ReconstructedParticle");
291 MyLCIOEvent->addCollection(MyCollection,TrackRPCollectionName);
294 LCCollection* VertexCollection = MyLCIOEvent->getCollection(VertexCollectionName);
295 LCCollection* TrackRPCollection = MyLCIOEvent->getCollection(TrackRPCollectionName);
298 if (MyDecayChain->
vertices().empty())
313 lcio::Vertex* PrimaryVertex = 0;
314 int nVerts = VertexCollection->getNumberOfElements() ;
315 for(
int i=0; i< nVerts && !PrimaryVertex ; i++)
317 if(dynamic_cast<lcio::Vertex*>(VertexCollection->getElementAt(i))->isPrimary())
318 PrimaryVertex = dynamic_cast<lcio::Vertex*>(VertexCollection->getElementAt(i));
325 PrimaryVertex = vertexFromLCFIVertex(*(MyDecayChain->
vertices().begin()));
327 VertexCollection->addElement(PrimaryVertex);
332 map<Track*,double> ChiSquaredOf;
333 if (StoreTrackChiSquareds)
335 LCCollection* MyCollection =
new LCCollectionVec(
"LCFloatVec");
336 MyLCIOEvent->addCollection(MyCollection,TrackRPCollectionName+
"TrackChiSquareds");
339 for (vector<vertex_lcfi::Vertex*>::const_iterator iVertex = MyDecayChain->
vertices().begin();iVertex < MyDecayChain->
vertices().end();++iVertex)
341 ChiSquaredOf.insert((*iVertex)->chi2OfTracks().begin(),(*iVertex)->chi2OfTracks().end());
347 map<ReconstructedParticle*,ReconstructedParticleImpl*> NewTrackRP;
349 vector<Track*> AllTracks = MyDecayChain->
allTracks();
350 for (vector<Track*>::const_iterator iTrack = AllTracks.begin();iTrack < AllTracks.end();++iTrack)
353 ReconstructedParticleImpl* NewRP =
new ReconstructedParticleImpl();
355 ReconstructedParticle* OriginalRP = (ReconstructedParticle*)(*iTrack)->trackingNum();
357 NewRP->addParticle(OriginalRP);
358 NewTrackRP[OriginalRP] = NewRP;
359 TrackRPCollection->addElement(NewRP);
367 if (StoreTrackChiSquareds)
369 LCFloatVec* ChiSquared =
new LCFloatVec();
370 if(ChiSquaredOf.find(*iTrack) == ChiSquaredOf.end())
373 ChiSquared->push_back(-1);
377 ChiSquared->push_back(ChiSquaredOf[*iTrack]);
380 MyLCIOEvent->getCollection(TrackRPCollectionName+
"TrackChiSquareds")->addElement(ChiSquared);
386 vector<Track*> PrimaryTracks = (*MyDecayChain->
vertices().begin())->tracks();
387 for (vector<Track*>::const_iterator iTrack = PrimaryTracks.begin();iTrack < PrimaryTracks.end();++iTrack)
389 NewTrackRP[(ReconstructedParticle*)(*iTrack)->trackingNum()]->setStartVertex(PrimaryVertex);
393 vector<ReconstructedParticle*> CreatedRPs;
396 lcio::Vertex* PreviousVertex = PrimaryVertex;
399 for (vector<vertex_lcfi::Vertex*>::const_iterator iVertex = ++(MyDecayChain->
vertices().begin());iVertex < MyDecayChain->
vertices().end();++iVertex)
402 VertexImpl* NewVertex =
dynamic_cast<VertexImpl*
>(vertexFromLCFIVertex(*iVertex));
404 ReconstructedParticleImpl* NewRP =
new ReconstructedParticleImpl();
406 CreatedRPs.push_back(NewRP);
409 mom[0] = (*iVertex)->momentum().x();
410 mom[1] = (*iVertex)->momentum().y();
411 mom[2] = (*iVertex)->momentum().z();
412 NewRP->setMomentum(mom);
413 NewRP->setCharge((*iVertex)->charge());
415 NewRP->setStartVertex(PreviousVertex);
417 NewVertex->setAssociatedParticle(NewRP);
420 for (vector<Track*>::const_iterator iTrack = (*iVertex)->tracks().begin();iTrack < (*iVertex)->tracks().end();++iTrack)
422 ReconstructedParticleImpl* iRP = NewTrackRP[(ReconstructedParticle*)(*iTrack)->trackingNum()];
423 NewRP->addParticle(iRP);
424 iRP->setStartVertex(NewVertex);
427 PreviousVertex = NewVertex;
429 VertexCollection->addElement(NewVertex);
430 TrackRPCollection->addElement(NewRP);
434 ReconstructedParticleImpl* DecayChainRP =
new ReconstructedParticleImpl();
436 for (vector<Track*>::const_iterator iTrack = MyDecayChain->
allTracks().begin();iTrack < MyDecayChain->
allTracks().end();++iTrack)
438 DecayChainRP->addParticle(NewTrackRP[(ReconstructedParticle*)(*iTrack)->trackingNum()]);
442 for (vector<ReconstructedParticle*>::const_iterator iRP = CreatedRPs.begin();iRP < CreatedRPs.end();++iRP)
444 DecayChainRP->addParticle(*iRP);
446 DecayChainRP->setStartVertex(PrimaryVertex);
451 void ReconstructedParticleLCFI::removeParticle(EVENT::ReconstructedParticle* particle)
454 ReconstructedParticleVec::iterator it = find(_particles.begin(),_particles.end(),particle);
455 if (it != _particles.end())
457 _particles.erase(it);
460 void ReconstructedParticleLCFI::wipePIDs()
462 _pid = EVENT::ParticleIDVec();
465 void ReconstructedParticleLCFI::copyPIDsFrom(ReconstructedParticle* InputRP)
467 for(EVENT::ParticleIDVec::const_iterator iPID = InputRP->getParticleIDs().begin();iPID != InputRP->getParticleIDs().end();++iPID)
469 this->addParticleID(
new ParticleIDImpl(*dynamic_cast<ParticleIDImpl*>(*iPID)));
474 void ReconstructedParticleLCFI::makeWritable()
476 this->setReadOnly(
false);
void registerObject(T *pointer)
Register an object for memory management.
void addTrack(Track *Track)
Add Track.
const std::vector< Track * > & allTracks() const
All tracks contained in DecayChain.
const std::vector< Track * > & tracks() const
Tracks.
bool isPrimary() const
Is this vertex primary.
void addVertex(Vertex *Vertex)
Add Vertex.
Event * event() const
Event.
void addTrack(Track *Track)
Add Track.
const std::vector< Vertex * > & vertices() const
Vertices contained in DecayChain.
const Vector3 & position() const
Position.
double chi2() const
Chi Squared.
const SymMatrix3x3 & positionError() const
Position.
Unique Track representation.
double probability() const
Probability.