Skip to content
Snippets Groups Projects
Commit 125c4900 authored by Adam Edward Barton's avatar Adam Edward Barton
Browse files

Merge branch 'Multicomponent_list_to_vector' into 'master'

Change from std::list to std::vector for the MultiComponent implementation

See merge request atlas/athena!24586
parents 9363808a 0c3360e7
No related branches found
No related tags found
No related merge requests found
......@@ -9,9 +9,9 @@ begin : Friday 31st December 2004
author : atkinson, amorley
email : Anthony.Morley@cern.ch
decription : Basic definitions for a track state described by more
than one set of Track Parameters. The resulting state is
a mixture of components. Each component is described by
a ComponentParameters object which is of the type
than one set of Track Parameters. The resulting state is
a mixture of components. Each component is described by
a ComponentParameters object which is of the type
std::pair< const TrackParameters*, double>
The double describes the weighting of the component -
or its relative importance in the mixture.
......@@ -21,13 +21,13 @@ decription : Basic definitions for a track state described by more
#define TrkMultiComponentState
#include "TrkMultiComponentStateOnSurface/ComponentParameters.h"
#include <list>
#include <vector>
class MsgStream;
namespace Trk{
class MultiComponentState : public std::list<ComponentParameters>{
class MultiComponentState : public std::vector<ComponentParameters>{
public:
/** Default constructor */
......
......@@ -21,12 +21,12 @@ decription : Implementation code for MultiComponentState class
Trk::MultiComponentState::MultiComponentState()
:
std::list< Trk::ComponentParameters >()
std::vector< Trk::ComponentParameters >()
{}
Trk::MultiComponentState::MultiComponentState( const Trk::ComponentParameters& componentParameters )
:
std::list< Trk::ComponentParameters >()
std::vector< Trk::ComponentParameters >()
{
this->push_back( componentParameters );
}
......@@ -34,7 +34,9 @@ Trk::MultiComponentState::MultiComponentState( const Trk::ComponentParameters& c
Trk::MultiComponentState::~MultiComponentState()
{
Trk::MultiComponentState::const_iterator component = this->begin();
for ( ; component != this->end(); ++component ) delete component->first;
for ( ; component != this->end(); ++component ) {
delete component->first;
}
this->clear();
}
......@@ -50,7 +52,6 @@ Trk::MultiComponentState* Trk::MultiComponentState::clone() const
return clonedState;
}
Trk::MultiComponentState* Trk::MultiComponentState::cloneWithWeightScaling( double scalingFactor ) const
{
Trk::MultiComponentState* clonedState = new Trk::MultiComponentState();
......@@ -61,12 +62,14 @@ Trk::MultiComponentState* Trk::MultiComponentState::cloneWithWeightScaling( doub
clonedState->push_back( componentParameters );
}
return clonedState;
}
Trk::MultiComponentState* Trk::MultiComponentState::cloneWithScaledError( double errorScaleLocX,double errorScaleLocY, double errorScalePhi,
double errorScaleTheta,double errorScaleQoverP ) const
Trk::MultiComponentState* Trk::MultiComponentState::cloneWithScaledError( double errorScaleLocX,
double errorScaleLocY,
double errorScalePhi,
double errorScaleTheta,
double errorScaleQoverP ) const
{
Trk::MultiComponentState* stateWithScaledErrors = new Trk::MultiComponentState();
Trk::MultiComponentState::const_iterator component = this->begin();
......@@ -119,10 +122,8 @@ Trk::MultiComponentState* Trk::MultiComponentState::cloneWithScaledError( double
// Recalling of error does not change weighting
const Trk::ComponentParameters componentParameters( newTrackParameters, component->second );
// Push back new component
stateWithScaledErrors->push_back( componentParameters );
}
return stateWithScaledErrors;
......@@ -206,10 +207,8 @@ bool Trk::MultiComponentState::isMeasured() const
const AmgSymMatrix(5)* originalMatrix = component->first->covariance();
if (!originalMatrix)
isNotMeasured = true;
isNotMeasured = true;
}
return !isNotMeasured;
}
......
......@@ -14,7 +14,9 @@ decription : Implementation code for LargestWeightsMultiStateMerger cl
#include "TrkGaussianSumFilter/LargestWeightsMultiStateMerger.h"
#include "TrkGaussianSumFilter/SortingClasses.h"
Trk::LargestWeightsMultiStateMerger::LargestWeightsMultiStateMerger(const std::string& type, const std::string& name, const IInterface* parent)
Trk::LargestWeightsMultiStateMerger::LargestWeightsMultiStateMerger(const std::string& type,
const std::string& name,
const IInterface* parent)
:
AthAlgTool(type, name, parent),
m_outputlevel(0),
......@@ -100,24 +102,22 @@ const Trk::MultiComponentState* Trk::LargestWeightsMultiStateMerger::merge(const
Trk::MultiComponentState* componentsForCollapse = new Trk::MultiComponentState;
// Sort all components of unmerged state according to weight
unmergedState->sort( SortByLargerComponentWeight() );
std::sort(unmergedState->begin(),
unmergedState->end(),
SortByLargerComponentWeight() );
unsigned int numberOfComponents = 0;
Trk::MultiComponentState::const_iterator component = unmergedState->begin();
for ( ; component != unmergedState->end(); ++component, ++numberOfComponents )
{
for ( ; component != unmergedState->end(); ++component, ++numberOfComponents ){
if (numberOfComponents < m_maximumNumberOfComponents){
// Add component to state being prepared for assembly and check that it is valid
bool componentAdded = m_stateAssembler->addComponent(cache,*component);
if ( !componentAdded )
msg(MSG::WARNING) << "Component could not be added to the state in the assembler" << endmsg;
if ( !componentAdded ){
ATH_MSG_WARNING("Component could not be added to the state in the assembler");
}
}
else{
Trk::ComponentParameters clonedComponent( component->first->clone(), component->second );
componentsForCollapse->push_back( clonedComponent );
......@@ -138,11 +138,10 @@ const Trk::MultiComponentState* Trk::LargestWeightsMultiStateMerger::merge(const
delete collapsedComponent->first;
delete collapsedComponent;
if ( !componentAdded )
msg(MSG::WARNING) << "Component could not be added to the state in the assembler" << endmsg;
if ( !componentAdded ){
ATH_MSG_WARNING("Component could not be added to the state in the assembler");
}
const Trk::MultiComponentState* assembledState = m_stateAssembler->assembledState(cache,1.);
delete unmergedState;
return assembledState;
}
......@@ -66,9 +66,9 @@ void Trk::MultiComponentStateAssembler::status(const Cache& cache) const
<< "**************** End assembler status **************** \n");
}
bool Trk::MultiComponentStateAssembler::addComponent (Cache& cache, const ComponentParameters& componentParameters) const{
bool Trk::MultiComponentStateAssembler::addComponent (Cache& cache,
const ComponentParameters& componentParameters) const{
ATH_MSG_VERBOSE ( "Adding single component to mixture \n");
if ( cache.assemblyDone ){
ATH_MSG_WARNING("Trying to add state after assembly... returning false \n");
return false;
......@@ -76,9 +76,6 @@ bool Trk::MultiComponentStateAssembler::addComponent (Cache& cache, const Compo
const Trk::ComponentParameters* clonedComponentParameters =
new Trk::ComponentParameters( (componentParameters.first)->clone(), componentParameters.second);
ATH_MSG_VERBOSE("Creating multiple component state from single component. Weight of state is: "
<< componentParameters.second << "\n");
Trk::MultiComponentState* singleComponentList = new Trk::MultiComponentState(*clonedComponentParameters);
this->addComponentsList(cache,singleComponentList);
delete clonedComponentParameters;
......@@ -87,9 +84,9 @@ bool Trk::MultiComponentStateAssembler::addComponent (Cache& cache, const Compo
return true;
}
bool Trk::MultiComponentStateAssembler::addMultiState (Cache& cache, const MultiComponentState& multiComponentState) const{
bool Trk::MultiComponentStateAssembler::addMultiState (Cache& cache,
const MultiComponentState& multiComponentState) const{
ATH_MSG_VERBOSE("Adding multiple component state to mixture \n");
if (cache.assemblyDone ){
ATH_MSG_WARNING("Trying to add state after assembly... returning false \n");
return false;
......@@ -103,40 +100,35 @@ bool Trk::MultiComponentStateAssembler::addMultiState (Cache& cache, const Multi
return true;
}
bool Trk::MultiComponentStateAssembler::addInvalidComponentWeight (Cache& cache, const double invalidComponentWeight) const {
bool Trk::MultiComponentStateAssembler::addInvalidComponentWeight (Cache& cache,
const double invalidComponentWeight) const {
ATH_MSG_VERBOSE( "Adding the weight of an invalid state to the mixture \n");
cache.invalidWeightSum += invalidComponentWeight;
return true;
}
void Trk::MultiComponentStateAssembler::addComponentsList (Cache& cache, const MultiComponentState* multiComponentState) const{
void Trk::MultiComponentStateAssembler::addComponentsList (Cache& cache,
const MultiComponentState* multiComponentState) const{
ATH_MSG_VERBOSE ("Add multiple component state to exisiting mixture \n");
if ( cache.assemblyDone ){
ATH_MSG_WARNING( "Trying to add state after assembly \n");
return;
}
double sumW(0.);
Trk::MultiComponentState::const_iterator component = multiComponentState->begin();
for ( ; component != multiComponentState->end(); ++ component)
sumW += (*component).second;
cache.multiComponentState->insert(cache.multiComponentState->end(), multiComponentState->begin(), multiComponentState->end() );
cache.multiComponentState->insert(cache.multiComponentState->end(),
multiComponentState->begin(),
multiComponentState->end() );
cache.validWeightSum += sumW;
ATH_MSG_VERBOSE( "Successfully inserted state \n");
}
bool Trk::MultiComponentStateAssembler::prepareStateForAssembly (Cache& cache) const{
ATH_MSG_VERBOSE( "Preparing state for assembly \n");
// Protect against empty state
if ( !isStateValid (cache) ){
ATH_MSG_DEBUG("State is not valid... returning false \n");
......@@ -152,7 +144,7 @@ bool Trk::MultiComponentStateAssembler::prepareStateForAssembly (Cache& cache) c
}
// Check to see assembly has not already been done
if ( cache.assemblyDone ){
ATH_MSG_VERBOSE("Assembly of state already complete... returning true \n");
ATH_MSG_DEBUG("Assembly of state already complete... returning true \n");
return true;
}
......@@ -166,13 +158,13 @@ bool Trk::MultiComponentStateAssembler::prepareStateForAssembly (Cache& cache) c
}
// Sort Multi-Component State by weights
cache.multiComponentState->sort( SortByLargerComponentWeight() );
std::sort(cache.multiComponentState->begin(),
cache.multiComponentState->end(),
SortByLargerComponentWeight() );
// Set assembly flag
cache.assemblyDone = true;
ATH_MSG_VERBOSE ("State is prepared for assembly... returning true \n");
return true;
}
......@@ -208,26 +200,21 @@ Trk::MultiComponentStateAssembler::assembledState (Cache& cache, const double ne
ATH_MSG_VERBOSE( "Finalising assembly with reweighting of components \n");
if ( !prepareStateForAssembly(cache) ) {
ATH_MSG_DEBUG("Unable to prepare state for assembly... returing 0 \n");
return 0;
ATH_MSG_DEBUG("Unable to prepare state for assembly... returing nullptr \n");
return nullptr;
}
const Trk::MultiComponentState* stateAssembly = doStateAssembly(cache,newWeight);
return stateAssembly;
}
const Trk::MultiComponentState*
Trk::MultiComponentStateAssembler::doStateAssembly (Cache& cache, const double newWeight) const{
ATH_MSG_VERBOSE( "Do state assembly \n");
if ( !isStateValid(cache) ) {
ATH_MSG_VERBOSE( "Cached state is empty... returning 0 \n");
return 0;
ATH_MSG_DEBUG( "Cached state is empty... returning 0 \n");
return nullptr;
}
if (cache.validWeightSum <= 0.) {
if (!cache.multiComponentState->empty()) {
double fixedWeights = 1. / (double) cache.multiComponentState->size();
......@@ -244,7 +231,6 @@ Trk::MultiComponentStateAssembler::doStateAssembly (Cache& cache, const double n
double scalingFactor = cache.validWeightSum > 0. ? newWeight / cache.validWeightSum : 1. ;
const Trk::MultiComponentState* assembledState = cache.multiComponentState->cloneWithWeightScaling( scalingFactor );
// Reset the cashe before leaving
this->reset(cache);
......@@ -253,31 +239,30 @@ Trk::MultiComponentStateAssembler::doStateAssembly (Cache& cache, const double n
void Trk::MultiComponentStateAssembler::removeSmallWeights (Cache& cache) const{
ATH_MSG_VERBOSE("Removing small weights \n");
double totalWeight( cache.validWeightSum + cache.invalidWeightSum );
if ( totalWeight == 0. ) {
ATH_MSG_VERBOSE("Total weight of state is zero... exiting \n");
ATH_MSG_DEBUG("Total weight of state is zero... exiting \n");
return;
}
// Loop over states and remove those with insiginificant weights fractions
bool continueToRemoveComponents;
do {
continueToRemoveComponents = false;
MultiComponentState::iterator component;
for ( component = cache.multiComponentState->begin() ;
component != cache.multiComponentState->end() ;
++component ) {
if ( (*component).second / totalWeight < m_minimumFractionalWeight ) {
delete component->first;
cache.multiComponentState->erase(component);
ATH_MSG_DEBUG("State with weight " << (*component).second << " has been removed from mixture");
continueToRemoveComponents = true;
break;
} // end if
} // end for
} while ( continueToRemoveComponents );
}
//Loop over states and remove those with insiginificant weights fractions
bool continueToRemoveComponents;
do {
continueToRemoveComponents = false;
MultiComponentState::iterator component;
for ( component = cache.multiComponentState->begin() ;
component != cache.multiComponentState->end();/*Nothing*/ ) {
if ( (*component).second / totalWeight < m_minimumFractionalWeight ) {
delete component->first;
/* Get the iterator position after erase*/
component=cache.multiComponentState->erase(component);
ATH_MSG_DEBUG("State with weight " << (*component).second << " has been removed from mixture");
continueToRemoveComponents = true;
break;
} // end if
/* increment the iterator normally*/
++component;
} // end for
} while ( continueToRemoveComponents );
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment