#include <KinematicTree.h>
Class describing the decay chain inside the kinematic fit. Uses the boost graph based DDD library. KinematicVertices are vertices, kinemtaic particles become nodes.
Kirill Prokofiev, April 2003 WARNING: before using any of these methods please make sure you _understand correctly_ what part of tree are you looking at now and where the pointer will be after the desiring operation.
"Left" and "Right" notation reflects the order of creating a three: from bottom to top, from left to right EXAMPLE: Bs->J/Psi Phi -> mumu KK First creating a mumu branch, fit it to J/Psi, Then adding Phi->KK and reconstructing a Bs will look like: left bottom particle: muon, top of the tree is Bs, right bottom is K.
Definition at line 36 of file KinematicTree.h.
KinematicTree::KinematicTree | ( | ) |
Constructor initializing everything and setting all values to 0
Definition at line 3 of file KinematicTree.cc.
References empt, and treeWalker.
{ empt = true; treeWalker = 0; }
KinematicTree::~KinematicTree | ( | ) | [virtual] |
void KinematicTree::addParticle | ( | RefCountedKinematicVertex | prodVtx, |
RefCountedKinematicVertex | decVtx, | ||
RefCountedKinematicParticle | part | ||
) |
Methods adding nodes and edges to the graph representation of the Kinematic Tree
Definition at line 26 of file KinematicTree.cc.
References graph< N, E >::addEdge(), empt, movePointerToTheTop(), and treeGraph.
Referenced by addTree(), and leftBranchAdd().
{ part->setTreePointer(this); treeGraph.addEdge(prodVtx,decVtx,part); empt = false; movePointerToTheTop(); prodVtx->setTreePointer(this); decVtx->setTreePointer(this); }
void KinematicTree::addTree | ( | RefCountedKinematicVertex | vtx, |
KinematicTree * | tr | ||
) |
Method adding a tree _tr_ to the vertex vtx of current tree in such a way, that vtx become a production vertex for the top particle of the _tr_. The whole contetnts of _tr_ is the rewritten to current tree. This method is purely technical and contains no mathematics. To be used by KinematicParticleVertexFitter after the corresponding fit.
Definition at line 432 of file KinematicTree.cc.
References addParticle(), currentDecayVertex(), currentParticle(), currentProductionVertex(), findDecayVertex(), leftBranchAdd(), movePointerToTheMother(), movePointerToTheNextChild(), and movePointerToTheTop().
{ //adding new tree to the existing one: bool fnd = findDecayVertex(vtx); if(!fnd) throw VertexException("KinematicTree::addTree; Current tree does not contain the vertex passed"); tr->movePointerToTheTop(); // adding the root of the tree: RefCountedKinematicParticle mP = tr->currentParticle(); RefCountedKinematicVertex dec_vertex = tr->currentDecayVertex(); addParticle(vtx,dec_vertex,mP); // adding the left branch if any leftBranchAdd(tr,dec_vertex); //now the pointer is at the left down //edge of the otherTree. //current tree pointer is where the //add operation was stoped last time. bool right = true; bool up = true; do { right = tr->movePointerToTheNextChild(); if(right) { //production vertex is already at the current tree //adding current partilce RefCountedKinematicVertex prodVertex = tr->currentProductionVertex(); RefCountedKinematicParticle cPart = tr->currentParticle(); RefCountedKinematicVertex decVertex = tr->currentDecayVertex(); addParticle(prodVertex, decVertex, cPart); //adding the rest of the branch leftBranchAdd(tr,decVertex); }else{ up = tr->movePointerToTheMother(); } }while(up); }
RefCountedKinematicVertex KinematicTree::currentDecayVertex | ( | ) | const |
Returns a current decay vertex pointer is NOT moved
Definition at line 107 of file KinematicTree.cc.
References graphwalker< N, E >::current(), isEmpty(), and treeWalker.
Referenced by addTree(), findDecayVertex(), leftBranchAdd(), leftBranchVertexSearch(), and replaceCurrentVertex().
{ if(isEmpty()) throw VertexException("KinematicTree::currentDecayVertex; tree is empty!"); return treeWalker->current().first; }
RefCountedKinematicParticle KinematicTree::currentParticle | ( | ) | const |
Returns a current particle pointer is NOT moved
Definition at line 229 of file KinematicTree.cc.
References graphwalker< N, E >::current(), isEmpty(), and treeWalker.
Referenced by addTree(), currentProductionVertex(), daughterParticles(), finalStateParticles(), findParticle(), leftBranchAdd(), leftBranchSearch(), and replaceCurrentParticle().
{ if(isEmpty()) throw VertexException("KinematicTree::currentParticle; tree is empty!"); return treeWalker->current().second; }
RefCountedKinematicVertex KinematicTree::currentProductionVertex | ( | ) | const |
Returns a current production vertex pointer is NOT moved
Definition at line 177 of file KinematicTree.cc.
References graphwalker< N, E >::current(), currentParticle(), graphwalker< N, E >::firstChild(), isEmpty(), movePointerToTheMother(), graphwalker< N, E >::nextSibling(), treeGraph, and treeWalker.
Referenced by addTree(), and motherParticle().
{ if(isEmpty()) throw VertexException("KinematicTree::currentProductionVertex; tree is empty!"); //current particle RefCountedKinematicParticle initial = currentParticle(); bool up; bool down; RefCountedKinematicVertex res; up = movePointerToTheMother(); if(up) { res = treeWalker->current().first; //pointer moved so we going back down = treeWalker->firstChild(); //_down_ variable is always TRUE here, if //the tree is valid. if(down){ if(initial == treeWalker->current().second) { return res; }else{ bool next = true; do { next = treeWalker->nextSibling(); if(treeWalker->current().second == initial) next = false; }while(next); return res; } }else{throw VertexException("KinematicTree::Navigation failed, tree invalid?");} }else { //very unprobable case. This efectively means that user is //already out of the tree. Moving back to the top delete treeWalker; treeWalker = new graphwalker<RefCountedKinematicVertex, RefCountedKinematicParticle> (treeGraph); res = treeWalker->current().first; //now pointer is a pair: fake vertex and //icoming 0 pointer to the particle //moving it to decayed particle bool move = treeWalker->firstChild(); if(!move) throw VertexException("KinematicTree::movePointerToTheTop; non consistent tree?"); return res; } }
std::vector< RefCountedKinematicParticle > KinematicTree::daughterParticles | ( | ) | const |
Returns a non-zero vector in case of success and 0 vector in case of failure Pointer is NOT moved
Definition at line 141 of file KinematicTree.cc.
References prof2calltree::back, graphwalker< N, E >::current(), currentParticle(), findParticle(), graphwalker< N, E >::firstChild(), isEmpty(), graphwalker< N, E >::nextSibling(), and treeWalker.
{ if(isEmpty()) throw VertexException("KinematicTree::daughterParticles; tree is empty!"); std::vector<RefCountedKinematicParticle> sResult; RefCountedKinematicParticle initial = currentParticle(); bool down = treeWalker->firstChild(); if(down) { sResult.push_back(treeWalker->current().second); bool sibling = true; do { sibling = treeWalker->nextSibling(); if(sibling) sResult.push_back(treeWalker->current().second); }while(sibling); } //getting the pointer back to the mother bool back = findParticle(initial); if(!back) throw VertexException("KinematicTree::daughterParticles; error occured while getting back"); return sResult; }
std::vector< RefCountedKinematicParticle > KinematicTree::finalStateParticles | ( | ) | const |
Kinematic Tree navigation methods Returns the complete vector of final state particles for the whole decay tree. Pointer is NOT moved after this operation
Definition at line 38 of file KinematicTree.cc.
References prof2calltree::back, gather_cfg::cout, currentParticle(), findParticle(), isConsistent(), isEmpty(), leftFinalParticle(), movePointerToTheMother(), movePointerToTheNextChild(), and movePointerToTheTop().
{ if(isEmpty() || !(isConsistent())) { throw VertexException("KinematicTree::finalStateParticles; tree is empty or not consistent"); }else{ RefCountedKinematicParticle initial = currentParticle(); std::vector<RefCountedKinematicParticle> rs; movePointerToTheTop(); if(!(leftFinalParticle())) { std::cout<<"top particle has no daughters, empty vector returned"<<std::endl; }else{ //now pointer is at the most left final particle rs.push_back(currentParticle()); bool next_right = true; bool up = true; do { next_right = movePointerToTheNextChild(); if(next_right) { //if there's a way to the right, //we go right and down possible leftFinalParticle(); rs.push_back(currentParticle()); }else{ //once there's no way to right anymore //trying to find a way upper up = movePointerToTheMother(); } //loop stops when we are at the top: //no way up, no way to the right }while(up); } //getting the pointer back bool back = findParticle(initial); if(!back) throw VertexException("KinematicTree::FinalStateParticles; error occured while getting back"); return rs; } }
bool KinematicTree::findDecayVertex | ( | const RefCountedKinematicVertex | vert | ) | const |
Pointer goes to the particle for which the neede vertex will be the decay one (true case) Or pointer stays at the top of teh tree if search is unsuccessfull (false case).
Definition at line 312 of file KinematicTree.cc.
References currentDecayVertex(), isConsistent(), isEmpty(), leftBranchVertexSearch(), movePointerToTheMother(), movePointerToTheNextChild(), and movePointerToTheTop().
Referenced by addTree().
{ if(isEmpty() || !(isConsistent())) { throw VertexException("KinematicTree::findParticle; tree is empty or not consistent"); }else{ bool res = false; movePointerToTheTop(); if(currentDecayVertex() == vert) { res = true; }else if(leftBranchVertexSearch(vert)){ res = true; }else{ bool up = true; bool fnd = false; do { if(movePointerToTheNextChild()) { fnd = leftBranchVertexSearch(vert); }else{ up=movePointerToTheMother(); if(currentDecayVertex() == vert) fnd = true; } }while(up && !fnd); res = fnd; } return res; } }
bool KinematicTree::findDecayVertex | ( | KinematicVertex * | vert | ) | const |
Definition at line 344 of file KinematicTree.cc.
References currentDecayVertex(), isConsistent(), isEmpty(), leftBranchVertexSearch(), movePointerToTheMother(), movePointerToTheNextChild(), and movePointerToTheTop().
{ if(isEmpty() || !(isConsistent())) { throw VertexException("KinematicTree::findParticle; tree is empty or not consistent"); }else{ bool res = false; movePointerToTheTop(); if(*currentDecayVertex() == vert) { res = true; }else if(leftBranchVertexSearch(vert)){ res = true; }else{ bool up = true; bool fnd = false; do { if(movePointerToTheNextChild()) { fnd = leftBranchVertexSearch(vert); }else{ up=movePointerToTheMother(); if(currentDecayVertex() == vert) fnd = true; } }while(up && !fnd); res = fnd; } return res; } }
bool KinematicTree::findParticle | ( | const RefCountedKinematicParticle | part | ) | const |
Pointer goes to the needed particle inside the tree if found (true). Pointer goes to the top of the tree if not found (false)
Definition at line 256 of file KinematicTree.cc.
References currentParticle(), newFWLiteAna::found, isConsistent(), isEmpty(), leftBranchSearch(), movePointerToTheMother(), movePointerToTheNextChild(), and movePointerToTheTop().
Referenced by daughterParticles(), and finalStateParticles().
{ if(isEmpty() || !(isConsistent())) { throw VertexException("KinematicTree::findParticle; tree is empty or not consistent"); }else{ bool res = false; movePointerToTheTop(); if(currentParticle() == part) { res = true; }else if(leftBranchSearch(part)){ res = true; }else{ bool found = false; bool up = true; bool next_right = false; do { // if(*(currentParticle()) == *part) found = true; next_right = movePointerToTheNextChild(); if(next_right) { found = leftBranchSearch(part); }else{ up = movePointerToTheMother(); if(currentParticle() == part) found = true; } }while(up && !found); res = found; } return res; } }
bool KinematicTree::isConsistent | ( | ) | const |
This method checks if the tree is consistent, i.e. the top vertex is only one.
Definition at line 18 of file KinematicTree.cc.
References movePointerToTheTop(), graphwalker< N, E >::nextSibling(), and treeWalker.
Referenced by finalStateParticles(), findDecayVertex(), and findParticle().
{ movePointerToTheTop(); bool des = false; if(!treeWalker->nextSibling()) des = true; return des; }
bool KinematicTree::isEmpty | ( | void | ) | const |
Access methods
Definition at line 15 of file KinematicTree.cc.
References empt.
Referenced by currentDecayVertex(), currentParticle(), currentProductionVertex(), daughterParticles(), finalStateParticles(), findDecayVertex(), findParticle(), motherParticle(), movePointerToTheFirstChild(), movePointerToTheMother(), movePointerToTheNextChild(), movePointerToTheTop(), and topParticle().
{return empt;}
bool KinematicTree::isValid | ( | void | ) | const [inline] |
void KinematicTree::leftBranchAdd | ( | KinematicTree * | otherTree, |
RefCountedKinematicVertex | vtx | ||
) | [private] |
Definition at line 396 of file KinematicTree.cc.
References addParticle(), currentDecayVertex(), currentParticle(), and movePointerToTheFirstChild().
Referenced by addTree().
{ RefCountedKinematicVertex previous_decay = otherTree->currentDecayVertex(); //children of current particle of the //other tree: in the end the whole //left branch should be added. bool next = true; do { next = otherTree->movePointerToTheFirstChild(); if(next) { RefCountedKinematicParticle par = otherTree->currentParticle(); RefCountedKinematicVertex current_decay = otherTree->currentDecayVertex(); addParticle(previous_decay, current_decay, par); previous_decay = current_decay; } }while(next); }
bool KinematicTree::leftBranchSearch | ( | RefCountedKinematicParticle | part | ) | const [private] |
Private methods to walk around the tree: Needed to collect final state or particle search.
Definition at line 292 of file KinematicTree.cc.
References currentParticle(), newFWLiteAna::found, and movePointerToTheFirstChild().
Referenced by findParticle().
{ bool found = false; bool next = true; if(currentParticle() == part) { found = true; }else{ do { next = movePointerToTheFirstChild(); if(currentParticle() == part) { found = true; } }while(next && !found); } return found; }
bool KinematicTree::leftBranchVertexSearch | ( | RefCountedKinematicVertex | vtx | ) | const [private] |
Definition at line 377 of file KinematicTree.cc.
References currentDecayVertex(), newFWLiteAna::found, and movePointerToTheFirstChild().
Referenced by findDecayVertex().
{ bool found = false; if(currentDecayVertex() == vtx) { found = true; }else{ bool next = true; bool res = false; do { next = movePointerToTheFirstChild(); if(currentDecayVertex() == vtx) res = true; }while(next && !res); found = res; } return found; }
bool KinematicTree::leftFinalParticle | ( | ) | const [private] |
Definition at line 80 of file KinematicTree.cc.
References movePointerToTheFirstChild().
Referenced by finalStateParticles().
{ bool res = false; if(movePointerToTheFirstChild()) { res = true; bool next = true; do { next = movePointerToTheFirstChild(); }while(next); }else{ res =false; } return res; }
std::pair< bool, RefCountedKinematicParticle > KinematicTree::motherParticle | ( | ) | const |
Returns _true_ and state of mother particle if successfull, _false_ and state of current particle in case of failure Pointer is NOT moved.
Definition at line 113 of file KinematicTree.cc.
References graphwalker< N, E >::current(), currentProductionVertex(), benchmark_cfg::fc, graphwalker< N, E >::firstChild(), isEmpty(), graphwalker< N, E >::nextSibling(), graphwalker< N, E >::parent(), and treeWalker.
{ if(isEmpty()) throw VertexException("KinematicTree::motherParticle; tree is empty!"); bool top = currentProductionVertex()->vertexIsValid(); RefCountedKinematicParticle cr = treeWalker->current().second; bool up = treeWalker->parent(); std::pair<bool,RefCountedKinematicParticle> res; if(up && top){ RefCountedKinematicParticle pr = treeWalker->current().second; //now putting the pointer back bool fc = treeWalker->firstChild(); if(!fc) throw VertexException("KinematicTree::motherParticle; tree is incorrect!"); if(*(treeWalker->current().second) != *cr) { do{ bool nx = treeWalker->nextSibling(); if(!nx) throw VertexException("KinematicTree::motherParticle; tree is incorrect!"); }while(*(treeWalker->current().second) != *cr); } res = std::pair<bool,RefCountedKinematicParticle>(true,pr); return res; }else{ RefCountedKinematicParticle fk; return std::pair<bool,RefCountedKinematicParticle>(false,fk); } }
bool KinematicTree::movePointerToTheFirstChild | ( | ) | const |
Pointer goes to the first child(if any) in the list
Definition at line 243 of file KinematicTree.cc.
References graphwalker< N, E >::firstChild(), isEmpty(), and treeWalker.
Referenced by leftBranchAdd(), leftBranchSearch(), leftBranchVertexSearch(), and leftFinalParticle().
{ if(isEmpty()) throw VertexException("KinematicTree::movePointerToTheFirstChild; tree is empty!"); return treeWalker->firstChild(); }
bool KinematicTree::movePointerToTheMother | ( | ) | const |
Pointer goes to the mother particle (if any) with respest to the current one
Definition at line 235 of file KinematicTree.cc.
References graphwalker< N, E >::current(), isEmpty(), graphwalker< N, E >::parent(), and treeWalker.
Referenced by addTree(), currentProductionVertex(), finalStateParticles(), findDecayVertex(), and findParticle().
{ if(isEmpty()) throw VertexException("KinematicTree::movePointerToTheMother; tree is empty!"); bool up = treeWalker->parent(); bool cr = treeWalker->current().first->vertexIsValid(); return (up && cr); }
bool KinematicTree::movePointerToTheNextChild | ( | ) | const |
Pointer goes to the next child in the list (if any)
Definition at line 249 of file KinematicTree.cc.
References isEmpty(), graphwalker< N, E >::nextSibling(), and treeWalker.
Referenced by addTree(), finalStateParticles(), findDecayVertex(), and findParticle().
{ if(isEmpty()) throw VertexException("KinematicTree::movePointerToTheNextChild; tree is empty!"); bool res = treeWalker->nextSibling(); return res; }
void KinematicTree::movePointerToTheTop | ( | ) | const |
Puts the pointer to the top (root) of the tree. The Graph walker object gets recreated inside the tree.
Definition at line 164 of file KinematicTree.cc.
References graphwalker< N, E >::firstChild(), isEmpty(), treeGraph, and treeWalker.
Referenced by addParticle(), addTree(), ConstrainedTreeBuilderT::buildRealTree(), FinalTreeBuilder::buildTree(), ConstrainedTreeBuilder::buildTree(), finalStateParticles(), findDecayVertex(), findParticle(), isConsistent(), and topParticle().
{ if(isEmpty()) throw VertexException("KinematicTree::movePointerToTheTop; tree is empty!"); delete treeWalker; treeWalker = new graphwalker<RefCountedKinematicVertex, RefCountedKinematicParticle>(treeGraph); //now pointer is a pair: fake vertex and //icoming 0 pointer to the particle //moving it to decayed particle bool move = treeWalker->firstChild(); if(!move) throw VertexException("KinematicTree::movePointerToTheTop; non consistent tree?"); }
void KinematicTree::replaceCurrentParticle | ( | RefCountedKinematicParticle | newPart | ) | const |
Methods replacing Particles and Vertices inside the tree during the refit. Methods should used by corresponding KinematicFitter classe only. Replace the current track or current (decay) vertex WARNING: replace methods are not available at this version of KinematicFitPrimitives.
Definition at line 417 of file KinematicTree.cc.
References currentParticle(), linker::replace(), graph< N, E >::replaceEdge(), and treeGraph.
Referenced by ConstrainedTreeBuilderT::buildRealTree(), FinalTreeBuilder::buildTree(), and ConstrainedTreeBuilder::buildTree().
{ RefCountedKinematicParticle cDParticle = currentParticle(); bool replace = treeGraph.replaceEdge(cDParticle,newPart); if(!replace) throw VertexException("KinematicTree::Particle To Replace not found"); }
void KinematicTree::replaceCurrentVertex | ( | RefCountedKinematicVertex | newVert | ) | const |
Replaces _decay_ vertex of the current particle with the given value
Definition at line 424 of file KinematicTree.cc.
References currentDecayVertex(), linker::replace(), graph< N, E >::replace(), and treeGraph.
{ RefCountedKinematicVertex cDVertex = currentDecayVertex(); bool replace = treeGraph.replace(cDVertex,newVert); if(! replace) throw VertexException("KinematicTree::Vertex To Replace not found"); }
RefCountedKinematicParticle KinematicTree::topParticle | ( | ) | const |
Returns the top particle of decay. Pointer is moved to the TOP of the decay tree.
Definition at line 98 of file KinematicTree.cc.
References graphwalker< N, E >::current(), isEmpty(), movePointerToTheTop(), and treeWalker.
{ if(isEmpty()) throw VertexException("KinematicTree::topParticle; tree is empty!"); //putting pointer to the top of the tree movePointerToTheTop(); return treeWalker->current().second; }
bool KinematicTree::empt [mutable, private] |
Definition at line 213 of file KinematicTree.h.
Referenced by addParticle(), isEmpty(), isValid(), and KinematicTree().
graph<RefCountedKinematicVertex,RefCountedKinematicParticle> KinematicTree::treeGraph [mutable, private] |
Definition at line 215 of file KinematicTree.h.
Referenced by addParticle(), currentProductionVertex(), movePointerToTheTop(), replaceCurrentParticle(), and replaceCurrentVertex().
graphwalker<RefCountedKinematicVertex, RefCountedKinematicParticle>* KinematicTree::treeWalker [mutable, private] |
Definition at line 216 of file KinematicTree.h.
Referenced by currentDecayVertex(), currentParticle(), currentProductionVertex(), daughterParticles(), isConsistent(), KinematicTree(), motherParticle(), movePointerToTheFirstChild(), movePointerToTheMother(), movePointerToTheNextChild(), movePointerToTheTop(), topParticle(), and ~KinematicTree().