CMS 3D CMS Logo

Public Types | Public Member Functions | Private Member Functions | Private Attributes

KalmanAlignmentMetricsCalculator Class Reference

#include <KalmanAlignmentMetricsCalculator.h>

List of all members.

Public Types

typedef std::map< Alignable
*, SingleDistancesList * > 
FullDistancesList
typedef std::map< Alignable
*, short int > 
SingleDistancesList

Public Member Functions

const std::vector< Alignable * > alignables (void) const
 Return all known alignables.
void clear (void)
 Clear stored distances.
const SingleDistancesListgetDistances (Alignable *i) const
 KalmanAlignmentMetricsCalculator (void)
unsigned int nDistances (void) const
 Number of stored distances.
short int operator() (Alignable *i, Alignable *j) const
void readDistances (std::string filename)
void setMaxDistance (short int maxDistance)
 Set maximum distance to be stored.
void updateDistances (const std::vector< Alignable * > &alignables)
 Update list of distances with a set Alignables.
void writeDistances (std::string filename)
 ~KalmanAlignmentMetricsCalculator (void)

Private Member Functions

void clearDistances (FullDistancesList &dist)
void connect (FullDistancesList &changes, SingleDistancesList *connection, Alignable *alignable, short int value)
void createBranches (TTree *tree)
void extractPropagatedDistances (FullDistancesList &changes, Alignable *alignable, SingleDistancesList *oldList, SingleDistancesList *newList)
 Extract entries from the updated lists that need to be further propagated.
void insertDistance (SingleDistancesList *distList, Alignable *j, short int value)
void insertDistance (FullDistancesList &dist, Alignable *i, Alignable *j, short int value)
void insertPropagatedDistances (FullDistancesList &propagated)
 Insert the 'propagated distances' into the lists of the remaining alignables.
void insertUpdatedDistances (FullDistancesList &updated)
 Insert changes due to the update of the lists of the current alignables.
void setBranchAddresses (TTree *tree)
void updateList (SingleDistancesList *thisList, SingleDistancesList *otherList)

Private Attributes

align::ID theAli1Id
align::StructureType theAli1ObjId
align::ID theAli2Id
align::StructureType theAli2ObjId
SingleDistancesList theDefaultReturnList
int theDist
FullDistancesList theDistances
short int theMaxDistance

Detailed Description

Calculates the metrical distances (stored as short int) for a set of Alignables. See E.Widl, R.Fr"uhwirth, W.Adam, A Kalman Filter for Track-based Alignment, CMS NOTE-2006/022 for more details.

Definition at line 17 of file KalmanAlignmentMetricsCalculator.h.


Member Typedef Documentation

Definition at line 23 of file KalmanAlignmentMetricsCalculator.h.

Definition at line 22 of file KalmanAlignmentMetricsCalculator.h.


Constructor & Destructor Documentation

KalmanAlignmentMetricsCalculator::KalmanAlignmentMetricsCalculator ( void  )

Definition at line 4 of file KalmanAlignmentMetricsCalculator.cc.

: theMaxDistance( SHRT_MAX ) {}
KalmanAlignmentMetricsCalculator::~KalmanAlignmentMetricsCalculator ( void  )

Definition at line 7 of file KalmanAlignmentMetricsCalculator.cc.

References clear().

{ clear(); }

Member Function Documentation

const std::vector< Alignable * > KalmanAlignmentMetricsCalculator::alignables ( void  ) const

Return all known alignables.

Definition at line 114 of file KalmanAlignmentMetricsCalculator.cc.

References theDistances.

Referenced by SimpleMetricsUpdator::alignables().

{
  std::vector< Alignable* > alignables;
  alignables.reserve( theDistances.size() );

  for ( FullDistancesList::const_iterator itL = theDistances.begin(); itL != theDistances.end(); ++itL )
    alignables.push_back( itL->first );

  return alignables;
}
void KalmanAlignmentMetricsCalculator::clear ( void  )

Clear stored distances.

Definition at line 108 of file KalmanAlignmentMetricsCalculator.cc.

References clearDistances(), and theDistances.

Referenced by ~KalmanAlignmentMetricsCalculator().

void KalmanAlignmentMetricsCalculator::clearDistances ( FullDistancesList dist) [private]

Definition at line 126 of file KalmanAlignmentMetricsCalculator.cc.

Referenced by clear(), and updateDistances().

{
  FullDistancesList::iterator itD;
  for ( itD = dist.begin(); itD != dist.end(); ++itD ) delete itD->second;
  dist.clear();
}
void KalmanAlignmentMetricsCalculator::connect ( FullDistancesList changes,
SingleDistancesList connection,
Alignable alignable,
short int  value 
) [private]

If the current update of the metric has connected previously unrelated parts (in a metrical sense), add this information to the table of propagated distances.

Definition at line 223 of file KalmanAlignmentMetricsCalculator.cc.

References insertDistance().

Referenced by extractPropagatedDistances().

{
  SingleDistancesList::iterator itL;
  for ( itL = connection->begin(); itL != connection->end(); ++itL )
  {
    if ( itL->first != alignable ) insertDistance( changes, alignable, itL->first, value + itL->second );
  }

}
void KalmanAlignmentMetricsCalculator::createBranches ( TTree *  tree) [private]

Definition at line 274 of file KalmanAlignmentMetricsCalculator.cc.

{

}
void KalmanAlignmentMetricsCalculator::extractPropagatedDistances ( FullDistancesList changes,
Alignable alignable,
SingleDistancesList oldList,
SingleDistancesList newList 
) [private]

Extract entries from the updated lists that need to be further propagated.

Definition at line 190 of file KalmanAlignmentMetricsCalculator.cc.

References connect(), and insertDistance().

Referenced by updateDistances().

{
  SingleDistancesList::iterator itOld;
  SingleDistancesList::iterator itNew;

  SingleDistancesList newConnections;

  // Distances-list newList has at least entries for the same indices as distances-list
  // oldList. For this reason 'newList->begin()->first <= oldList->begin()->first' and
  // hence 'itNew->first <= itOld->first' is always true in the loop below.
  for ( itOld = oldList->begin(), itNew = newList->begin(); itNew != newList->end(); ++itNew )
  {
    // No entry associated to index itNew->first present in oldList. --> This is indeed a change.
    if ( itOld == oldList->end() || itNew->first < itOld->first )
    {
      insertDistance( changes, itNew->first, alignable, itNew->second );
      newConnections[itNew->first] = itNew->second;
    // Entry associated to index itNew->first present in oldList. --> Check if it has changed.
    } else if ( itNew->first == itOld->first ) {
      if ( itNew->second != itOld->second ) insertDistance( changes, itNew->first, alignable, itNew->second );
      ++itOld;
    }
  }

  SingleDistancesList::iterator it;
  for ( it = newConnections.begin(); it != newConnections.end(); ++it )
    connect( changes, newList, it->first, it->second );
}
const KalmanAlignmentMetricsCalculator::SingleDistancesList & KalmanAlignmentMetricsCalculator::getDistances ( Alignable i) const

Return map of related Alignables (identified via Alignable*) and their distances for a distinct Alignable.

Definition at line 75 of file KalmanAlignmentMetricsCalculator.cc.

References theDefaultReturnList, and theDistances.

Referenced by SimpleMetricsUpdator::additionalAlignables(), and SimpleMetricsUpdator::additionalAlignablesWithDistances().

{
  FullDistancesList::const_iterator itD = theDistances.find( i );
  if ( itD == theDistances.end() ) return theDefaultReturnList;
  return *itD->second;
}
void KalmanAlignmentMetricsCalculator::insertDistance ( SingleDistancesList distList,
Alignable j,
short int  value 
) [private]

Definition at line 251 of file KalmanAlignmentMetricsCalculator.cc.

References j, and relativeConstraints::value.

{
  SingleDistancesList::iterator itL = distList->find( j );
  if ( itL != distList->end() ) { // Entry associated to index j found.
    if ( itL->second > value ) itL->second = value;
  } else { // No entry associated to index j found. -> Insert new entry.
    (*distList)[j] = value;
  }
}
void KalmanAlignmentMetricsCalculator::insertDistance ( FullDistancesList dist,
Alignable i,
Alignable j,
short int  value 
) [private]

Definition at line 235 of file KalmanAlignmentMetricsCalculator.cc.

References i, j, and relativeConstraints::value.

Referenced by connect(), extractPropagatedDistances(), and insertPropagatedDistances().

{
  FullDistancesList::iterator itD = dist.find( i );
  if ( itD != dist.end() ) // Found distances-list for index i.
  {
    insertDistance( itD->second, j, value );
  }
  else // No distances-list found for value i.
  {
    SingleDistancesList* newList = new SingleDistancesList;
    (*newList)[j] = value;
    dist[i] = newList;
  }
}
void KalmanAlignmentMetricsCalculator::insertPropagatedDistances ( FullDistancesList propagated) [private]

Insert the 'propagated distances' into the lists of the remaining alignables.

Definition at line 175 of file KalmanAlignmentMetricsCalculator.cc.

References insertDistance(), and theDistances.

Referenced by updateDistances().

{
  FullDistancesList::iterator itOld;
  FullDistancesList::iterator itNew;

  for ( itNew = propagated.begin(); itNew != propagated.end(); ++itNew )
  {
    itOld = theDistances.find( itNew->first );
    SingleDistancesList::iterator itL;
    for ( itL = itNew->second->begin(); itL != itNew->second->end(); ++itL )
      insertDistance( itOld->second, itL->first, itL->second );
  }
}
void KalmanAlignmentMetricsCalculator::insertUpdatedDistances ( FullDistancesList updated) [private]

Insert changes due to the update of the lists of the current alignables.

Definition at line 161 of file KalmanAlignmentMetricsCalculator.cc.

References theDistances.

Referenced by updateDistances().

{
  FullDistancesList::iterator itOld;
  FullDistancesList::iterator itNew;

  for ( itNew = updated.begin(); itNew != updated.end(); ++itNew )
  {
    itOld = theDistances.find( itNew->first );
    delete itOld->second;
    itOld->second = itNew->second;
  }
}
unsigned int KalmanAlignmentMetricsCalculator::nDistances ( void  ) const

Number of stored distances.

Definition at line 97 of file KalmanAlignmentMetricsCalculator.cc.

References theDistances.

{
  unsigned int nod = 0;

  FullDistancesList::const_iterator itD;
  for ( itD = theDistances.begin(); itD != theDistances.end(); ++itD ) nod += itD->second->size();

  return nod;
}
short int KalmanAlignmentMetricsCalculator::operator() ( Alignable i,
Alignable j 
) const

Return distance between two Alignables. If there is no metrical relation between the two Alignables -1 is returned.

Definition at line 83 of file KalmanAlignmentMetricsCalculator.cc.

References theDistances.

{
  if ( i == j ) return 0;

  FullDistancesList::const_iterator itD = theDistances.find( i );
  if ( itD == theDistances.end() ) return -1;

  SingleDistancesList::const_iterator itL = itD->second->find( j );
  if ( itL == itD->second->end() ) return -1;

  return itL->second;
}
void KalmanAlignmentMetricsCalculator::readDistances ( std::string  filename)

Definition at line 268 of file KalmanAlignmentMetricsCalculator.cc.

{

}
void KalmanAlignmentMetricsCalculator::setBranchAddresses ( TTree *  tree) [private]

Definition at line 280 of file KalmanAlignmentMetricsCalculator.cc.

{

}
void KalmanAlignmentMetricsCalculator::setMaxDistance ( short int  maxDistance) [inline]

Set maximum distance to be stored.

Definition at line 40 of file KalmanAlignmentMetricsCalculator.h.

References theMaxDistance.

Referenced by SimpleMetricsUpdator::SimpleMetricsUpdator().

{ theMaxDistance = maxDistance; }
void KalmanAlignmentMetricsCalculator::updateDistances ( const std::vector< Alignable * > &  alignables)

Update list of distances with a set Alignables.

Definition at line 10 of file KalmanAlignmentMetricsCalculator.cc.

References clearDistances(), extractPropagatedDistances(), insertPropagatedDistances(), insertUpdatedDistances(), theDistances, and updateList().

Referenced by SimpleMetricsUpdator::update().

{
  // List of the distances of the current alignables.
  FullDistancesList currentDistances;

  // Updated list of the distances of the current alignables.
  FullDistancesList updatedDistances;

  // List of distances between the current and all other alignables that changed due to the update of the list
  // of the current alignables. This information has to be propagated to the lists of all other alignables.
  FullDistancesList propagatedDistances;

  // Iterate over current alignables and set the distances between them to 1 - save pointers to
  // their distances-lists for further manipulation.
  std::vector< Alignable* >::const_iterator itA;
  for ( itA = alignables.begin(); itA != alignables.end(); ++itA )
  {
    FullDistancesList::iterator itD = theDistances.find( *itA );

    if ( itD != theDistances.end() )
    {
      currentDistances[*itA] = itD->second;

      std::vector< Alignable* >::const_iterator itA2;
      for ( itA2 = alignables.begin(); itA2 != alignables.end(); ++itA2 ) (*itD->second)[*itA2] = ( *itA == *itA2 ) ? 0 : 1;
    }
    else
    {
      SingleDistancesList* newEntry = new SingleDistancesList;
      theDistances[*itA] = newEntry;
      currentDistances[*itA] = newEntry;

      std::vector< Alignable* >::const_iterator itA2;
      for ( itA2 = alignables.begin(); itA2 != alignables.end(); ++itA2 ) (*newEntry)[*itA2] = ( *itA == *itA2 ) ? 0 :  1;
    }
  }

  // Iterate over the current alignables' distances-lists and compute updates.
  FullDistancesList::iterator itC1;
  FullDistancesList::iterator itC2;
  for ( itC1 = currentDistances.begin(); itC1 != currentDistances.end(); ++itC1 )
  {
    SingleDistancesList* updatedList = new SingleDistancesList( *itC1->second );

    for ( itC2 = currentDistances.begin(); itC2 != currentDistances.end(); ++itC2 )
    {
      if ( itC1->first != itC2->first ) updateList( updatedList, itC2->second );
    }

    extractPropagatedDistances( propagatedDistances, itC1->first, itC1->second, updatedList );
    updatedDistances[itC1->first] = updatedList;
  }

  // Insert the updated distances-lists.
  insertUpdatedDistances( updatedDistances );

  // Insert the propagated distances-lists.
  insertPropagatedDistances( propagatedDistances );

  // Used only temporary - clear it to deallocate its memory.
  clearDistances( propagatedDistances );
}
void KalmanAlignmentMetricsCalculator::updateList ( SingleDistancesList thisList,
SingleDistancesList otherList 
) [private]

Update thisList with information from otherList - thisList and otherList are assumed to belong to different alignables.

Definition at line 134 of file KalmanAlignmentMetricsCalculator.cc.

References theMaxDistance.

Referenced by updateDistances().

{
  SingleDistancesList::iterator itThis;
  SingleDistancesList::iterator itOther;

  // Iterate through the ordered entries (via "<") of thisList and otherList.
  for ( itThis = thisList->begin(), itOther = otherList->begin(); itOther != otherList->end(); ++itOther )
  {
    // Irrelevant information.
    if ( itOther->second >= theMaxDistance ) continue;

    // Skip these elements of thisList - no new information available for them in otherList.
    while ( itThis != thisList->end() && itThis->first < itOther->first ) ++itThis;

    // Insert new element ...
    if ( itThis == thisList->end() || itThis->first > itOther->first ) {
      (*thisList)[itOther->first] = itOther->second + 1;
    // ... or write smaller distance for existing element.
    } else if ( itThis->second > itOther->second ) {
      itThis->second = itOther->second + 1;
    }

  }
}
void KalmanAlignmentMetricsCalculator::writeDistances ( std::string  filename)

Definition at line 262 of file KalmanAlignmentMetricsCalculator.cc.

{

}

Member Data Documentation

Definition at line 90 of file KalmanAlignmentMetricsCalculator.h.

Definition at line 91 of file KalmanAlignmentMetricsCalculator.h.

Definition at line 90 of file KalmanAlignmentMetricsCalculator.h.

Definition at line 91 of file KalmanAlignmentMetricsCalculator.h.

Definition at line 83 of file KalmanAlignmentMetricsCalculator.h.

Referenced by getDistances().

Definition at line 92 of file KalmanAlignmentMetricsCalculator.h.

Definition at line 81 of file KalmanAlignmentMetricsCalculator.h.

Referenced by setMaxDistance(), and updateList().