CMS 3D CMS Logo

Public Types | Public Member Functions | Protected Member Functions | Protected Attributes

AlignmentExtendedCorrelationsStore Class Reference

#include <AlignmentExtendedCorrelationsStore.h>

Inheritance diagram for AlignmentExtendedCorrelationsStore:
AlignmentCorrelationsStore

List of all members.

Public Types

typedef std::map< Alignable
*, ExtendedCorrelationsTable * > 
ExtendedCorrelations
typedef
AlignmentExtendedCorrelationsEntry 
ExtendedCorrelationsEntry
typedef std::map< Alignable
*, ExtendedCorrelationsEntry
ExtendedCorrelationsTable

Public Member Functions

 AlignmentExtendedCorrelationsStore (const edm::ParameterSet &config)
virtual void correlations (Alignable *ap1, Alignable *ap2, AlgebraicSymMatrix &cov, int row, int col) const
virtual bool correlationsAvailable (Alignable *ap1, Alignable *ap2) const
 Check whether correlations are stored for a given pair of alignables.
virtual void getCorrelations (Alignable *ap1, Alignable *ap2, AlgebraicMatrix &mat) const
 Get correlations.
virtual void resetCorrelations (void)
 Reset correlations.
virtual void setCorrelations (Alignable *ap1, Alignable *ap2, AlgebraicMatrix &mat)
virtual void setCorrelations (Alignable *ap1, Alignable *ap2, const AlgebraicSymMatrix &cov, int row, int col)
virtual unsigned int size (void) const
 Get number of stored correlations.
virtual ~AlignmentExtendedCorrelationsStore (void)

Protected Member Functions

virtual void fillCorrelationsTable (Alignable *ap1, Alignable *ap2, ExtendedCorrelationsTable *table, const AlgebraicSymMatrix &cov, int row, int col, bool transpose)
virtual void fillCovariance (Alignable *ap1, Alignable *ap2, const ExtendedCorrelationsEntry &entry, AlgebraicSymMatrix &cov, int row, int col) const
virtual void fillCovarianceT (Alignable *ap1, Alignable *ap2, const ExtendedCorrelationsEntry &entry, AlgebraicSymMatrix &cov, int row, int col) const
virtual void readFromCovariance (Alignable *ap1, Alignable *ap2, ExtendedCorrelationsEntry &entry, const AlgebraicSymMatrix &cov, int row, int col)
virtual void readFromCovarianceT (Alignable *ap1, Alignable *ap2, ExtendedCorrelationsEntry &entry, const AlgebraicSymMatrix &cov, int row, int col)
void resizeCorruptCorrelations (ExtendedCorrelationsEntry &entry, double maxCorr)

Protected Attributes

ExtendedCorrelations theCorrelations
double theCut
int theMaxUpdates
double theWeight

Detailed Description

Definition at line 18 of file AlignmentExtendedCorrelationsStore.h.


Member Typedef Documentation

Definition at line 25 of file AlignmentExtendedCorrelationsStore.h.

Definition at line 23 of file AlignmentExtendedCorrelationsStore.h.

Definition at line 24 of file AlignmentExtendedCorrelationsStore.h.


Constructor & Destructor Documentation

AlignmentExtendedCorrelationsStore::AlignmentExtendedCorrelationsStore ( const edm::ParameterSet config)

Definition at line 11 of file AlignmentExtendedCorrelationsStore.cc.

References edm::ParameterSet::getParameter(), theCut, theMaxUpdates, and theWeight.

{
  theMaxUpdates = config.getParameter<int>( "MaxUpdates" );
  theCut = config.getParameter<double>( "CutValue" );
  theWeight = config.getParameter<double>( "Weight" );

  edm::LogInfo("Alignment") << "@SUB=AlignmentExtendedCorrelationsStore::AlignmentExtendedCorrelationsStore"
                            << "Created.";
}
virtual AlignmentExtendedCorrelationsStore::~AlignmentExtendedCorrelationsStore ( void  ) [inline, virtual]

Definition at line 29 of file AlignmentExtendedCorrelationsStore.h.

{}

Member Function Documentation

void AlignmentExtendedCorrelationsStore::correlations ( Alignable ap1,
Alignable ap2,
AlgebraicSymMatrix cov,
int  row,
int  col 
) const [virtual]

Write correlations directly to the covariance matrix starting at the given position. Indices are assumed to start from 0.

Reimplemented from AlignmentCorrelationsStore.

Definition at line 22 of file AlignmentExtendedCorrelationsStore.cc.

References fillCovariance(), fillCovarianceT(), swap(), theCorrelations, and geometryDiff::transpose().

Referenced by resetCorrelations().

{
  static Alignable* previousAlignable = 0;
  static ExtendedCorrelationsTable* previousCorrelations;

  // Needed by 'resetCorrelations()' to reset the static pointer:
  if ( ap1 == 0 ) { previousAlignable = 0; return; }

  bool transpose = ( ap2 > ap1 );
  if ( transpose ) std::swap( ap1, ap2 ); 

  if ( ap1 == previousAlignable )
  {
    ExtendedCorrelationsTable::const_iterator itC2 = previousCorrelations->find( ap2 );
    if ( itC2 != previousCorrelations->end() )
    {
      transpose ?
        fillCovarianceT( ap1, ap2, (*itC2).second, cov, row, col ) :
        fillCovariance( ap1, ap2, (*itC2).second, cov, row, col );
    }
  }
  else
  {
    ExtendedCorrelations::const_iterator itC1 = theCorrelations.find( ap1 );
    if ( itC1 != theCorrelations.end() )
    {
      previousAlignable = ap1;
      previousCorrelations = (*itC1).second;

      ExtendedCorrelationsTable::const_iterator itC2 = (*itC1).second->find( ap2 );
      if ( itC2 != (*itC1).second->end() )
      {
        transpose ?
          fillCovarianceT( ap1, ap2, (*itC2).second, cov, row, col ) :
          fillCovariance( ap1, ap2, (*itC2).second, cov, row, col );
      }
    }
  }

  // don't fill anything into the covariance if there's no entry
  return;
}
bool AlignmentExtendedCorrelationsStore::correlationsAvailable ( Alignable ap1,
Alignable ap2 
) const [virtual]

Check whether correlations are stored for a given pair of alignables.

Reimplemented from AlignmentCorrelationsStore.

Definition at line 154 of file AlignmentExtendedCorrelationsStore.cc.

References swap(), theCorrelations, and geometryDiff::transpose().

{
  bool transpose = ( ap2 > ap1 );
  if ( transpose ) std::swap( ap1, ap2 );

  ExtendedCorrelations::const_iterator itC1 = theCorrelations.find( ap1 );
  if ( itC1 != theCorrelations.end() )
  {
    ExtendedCorrelationsTable::const_iterator itC2 = itC1->second->find( ap2 );
    if ( itC2 != itC1->second->end() ) return true;
  }
  return false;
}
void AlignmentExtendedCorrelationsStore::fillCorrelationsTable ( Alignable ap1,
Alignable ap2,
ExtendedCorrelationsTable table,
const AlgebraicSymMatrix cov,
int  row,
int  col,
bool  transpose 
) [protected, virtual]

Definition at line 194 of file AlignmentExtendedCorrelationsStore.cc.

References Alignable::alignmentParameters(), AlignmentParameters::numSelected(), readFromCovariance(), and readFromCovarianceT().

Referenced by setCorrelations().

{
  ExtendedCorrelationsTable::iterator itC = table->find( ap2 );

  if ( itC != table->end() )
  {
    //if ( itC->second.counter() > theMaxUpdates ) return;

    transpose ?
      readFromCovarianceT( ap1, ap2, itC->second, cov, row, col ) :
      readFromCovariance( ap1, ap2, itC->second, cov, row, col );

    //itC->second.incrementCounter();
  }
  else
  {
    int nRow = ap1->alignmentParameters()->numSelected();
    int nCol = ap2->alignmentParameters()->numSelected();
    ExtendedCorrelationsEntry newEntry( nRow, nCol );

    transpose ?
      readFromCovarianceT( ap1, ap2, newEntry, cov, row, col ) :
      readFromCovariance( ap1, ap2, newEntry, cov, row, col );

    (*table)[ap2] = newEntry;
  }
}
void AlignmentExtendedCorrelationsStore::fillCovariance ( Alignable ap1,
Alignable ap2,
const ExtendedCorrelationsEntry entry,
AlgebraicSymMatrix cov,
int  row,
int  col 
) const [protected, virtual]

Definition at line 227 of file AlignmentExtendedCorrelationsStore.cc.

References Exception, edm::detail::isnan(), AlignmentExtendedCorrelationsEntry::numCol(), AlignmentExtendedCorrelationsEntry::numRow(), and mathSSE::sqrt().

Referenced by correlations().

{
  int nRow = entry.numRow();
  int nCol = entry.numCol();

  for ( int iRow = 0; iRow < nRow; ++iRow )
  {
    double factor = sqrt(cov[row+iRow][row+iRow]);
    if ( std::isnan(factor) ) throw cms::Exception("LogicError") << "[AlignmentExtendedCorrelationsStore::fillCovariance] "
                                                            << "NaN-factor: sqrt(" << cov[row+iRow][row+iRow] << ")";

    for ( int jCol = 0; jCol < nCol; ++jCol )
      cov[row+iRow][col+jCol] = entry( iRow, jCol )*factor;
  }

  for ( int jCol = 0; jCol < nCol; ++jCol )
  {
    double factor = sqrt(cov[col+jCol][col+jCol]);
    if ( std::isnan(factor) ) throw cms::Exception("LogicError") << "[AlignmentExtendedCorrelationsStore::fillCovariance] "
                                                            << "NaN-factor: sqrt(" << cov[col+jCol][col+jCol] << ")";

    for ( int iRow = 0; iRow < nRow; ++iRow )
      cov[row+iRow][col+jCol] *= factor;
  }
}
void AlignmentExtendedCorrelationsStore::fillCovarianceT ( Alignable ap1,
Alignable ap2,
const ExtendedCorrelationsEntry entry,
AlgebraicSymMatrix cov,
int  row,
int  col 
) const [protected, virtual]

Definition at line 256 of file AlignmentExtendedCorrelationsStore.cc.

References Exception, edm::detail::isnan(), AlignmentExtendedCorrelationsEntry::numCol(), AlignmentExtendedCorrelationsEntry::numRow(), and mathSSE::sqrt().

Referenced by correlations().

{
  int nRow = entry.numRow();
  int nCol = entry.numCol();

  for ( int iRow = 0; iRow < nRow; ++iRow )
  {
    double factor = sqrt(cov[col+iRow][col+iRow]);
    if ( std::isnan(factor) ) throw cms::Exception("LogicError") << "[AlignmentExtendedCorrelationsStore::fillCovarianceT] "
                                                            << "NaN-factor: sqrt(" << cov[col+iRow][col+iRow] << ")";
    for ( int jCol = 0; jCol < nCol; ++jCol )
      cov[row+jCol][col+iRow] = entry( iRow, jCol )*factor;
  }

  for ( int jCol = 0; jCol < nCol; ++jCol )
  {
    double factor = sqrt(cov[row+jCol][row+jCol]);
    if ( std::isnan(factor) ) throw cms::Exception("LogicError") << "[AlignmentExtendedCorrelationsStore::fillCovarianceT] "
                                                            << "NaN-factor: sqrt(" << cov[row+jCol][row+jCol] << ")";
    for ( int iRow = 0; iRow < nRow; ++iRow )
      cov[row+jCol][col+iRow] *= factor;
  }

}
void AlignmentExtendedCorrelationsStore::getCorrelations ( Alignable ap1,
Alignable ap2,
AlgebraicMatrix mat 
) const [virtual]

Get correlations.

Definition at line 134 of file AlignmentExtendedCorrelationsStore.cc.

References swap(), theCorrelations, and geometryDiff::transpose().

{
  bool transpose = ( ap2 > ap1 );
  if ( transpose ) std::swap( ap1, ap2 );

  ExtendedCorrelations::const_iterator itC1 = theCorrelations.find( ap1 );
  if ( itC1 != theCorrelations.end() )
  {
    ExtendedCorrelationsTable::const_iterator itC2 = itC1->second->find( ap2 );
    if ( itC2 != itC1->second->end() )
    {
      mat = transpose ? itC2->second.matrix().T() : itC2->second.matrix();
      return;
    }
  }

  mat = AlgebraicMatrix();
}
void AlignmentExtendedCorrelationsStore::readFromCovariance ( Alignable ap1,
Alignable ap2,
ExtendedCorrelationsEntry entry,
const AlgebraicSymMatrix cov,
int  row,
int  col 
) [protected, virtual]

Definition at line 284 of file AlignmentExtendedCorrelationsStore.cc.

References AlignmentExtendedCorrelationsEntry::numCol(), AlignmentExtendedCorrelationsEntry::numRow(), resizeCorruptCorrelations(), and mathSSE::sqrt().

Referenced by fillCorrelationsTable().

{
  int nRow = entry.numRow();
  int nCol = entry.numCol();

  for ( int iRow = 0; iRow < nRow; ++iRow )
  {
    double factor = sqrt(cov[row+iRow][row+iRow]);
    for ( int jCol = 0; jCol < nCol; ++jCol )
      entry( iRow, jCol ) = cov[row+iRow][col+jCol]/factor;
  }

  double maxCorr = 0;

  for ( int jCol = 0; jCol < nCol; ++jCol )
  {
    double factor = sqrt(cov[col+jCol][col+jCol]);
    for ( int iRow = 0; iRow < nRow; ++iRow )
    {
      entry( iRow, jCol ) /= factor;
      if ( fabs( entry( iRow, jCol ) ) > maxCorr ) maxCorr = fabs( entry( iRow, jCol ) );
    }
  }

  resizeCorruptCorrelations( entry, maxCorr );
}
void AlignmentExtendedCorrelationsStore::readFromCovarianceT ( Alignable ap1,
Alignable ap2,
ExtendedCorrelationsEntry entry,
const AlgebraicSymMatrix cov,
int  row,
int  col 
) [protected, virtual]

Definition at line 314 of file AlignmentExtendedCorrelationsStore.cc.

References AlignmentExtendedCorrelationsEntry::numCol(), AlignmentExtendedCorrelationsEntry::numRow(), resizeCorruptCorrelations(), and mathSSE::sqrt().

Referenced by fillCorrelationsTable().

{
  int nRow = entry.numRow();
  int nCol = entry.numCol();

  for ( int iRow = 0; iRow < nRow; ++iRow )
  {
    double factor = sqrt(cov[col+iRow][col+iRow]);
    for ( int jCol = 0; jCol < nCol; ++jCol )
      entry( iRow, jCol ) = cov[row+jCol][col+iRow]/factor;
  }

  double maxCorr = 0;

  for ( int jCol = 0; jCol < nCol; ++jCol )
  {
    double factor = sqrt(cov[row+jCol][row+jCol]);
    for ( int iRow = 0; iRow < nRow; ++iRow )
    {
      entry( iRow, jCol ) /= factor;
      if ( fabs( entry( iRow, jCol ) ) > maxCorr ) maxCorr = fabs( entry( iRow, jCol ) );
    }
  }

  resizeCorruptCorrelations( entry, maxCorr );
}
void AlignmentExtendedCorrelationsStore::resetCorrelations ( void  ) [virtual]

Reset correlations.

Reimplemented from AlignmentCorrelationsStore.

Definition at line 169 of file AlignmentExtendedCorrelationsStore.cc.

References correlations(), setCorrelations(), and theCorrelations.

{
  ExtendedCorrelations::iterator itC;
  for ( itC = theCorrelations.begin(); itC != theCorrelations.end(); ++itC ) delete (*itC).second;
  theCorrelations.erase( theCorrelations.begin(), theCorrelations.end() );

  // Reset the static pointers to the 'previous alignables'
  AlgebraicSymMatrix dummy;
  correlations( 0, 0, dummy, 0, 0 );
  setCorrelations( 0, 0, dummy, 0, 0 );
}
void AlignmentExtendedCorrelationsStore::resizeCorruptCorrelations ( ExtendedCorrelationsEntry entry,
double  maxCorr 
) [protected]

Definition at line 344 of file AlignmentExtendedCorrelationsStore.cc.

References theCut, and theWeight.

Referenced by readFromCovariance(), and readFromCovarianceT().

{
  if ( maxCorr > 1. )
  {
    entry *= theWeight/maxCorr;
  }
  else if ( maxCorr > theCut )
  {
    entry *= 1. - ( maxCorr - theCut )/( 1. - theCut )*( 1. - theWeight );
  }
}
void AlignmentExtendedCorrelationsStore::setCorrelations ( Alignable ap1,
Alignable ap2,
const AlgebraicSymMatrix cov,
int  row,
int  col 
) [virtual]

Get correlations directly from the given position of the covariance matrix and store them. Indices are assumed to start from 0.

Reimplemented from AlignmentCorrelationsStore.

Definition at line 67 of file AlignmentExtendedCorrelationsStore.cc.

References fillCorrelationsTable(), swap(), theCorrelations, and geometryDiff::transpose().

Referenced by resetCorrelations().

{
  static Alignable* previousAlignable = 0;
  static ExtendedCorrelationsTable* previousCorrelations;

  // Needed by 'resetCorrelations()' to reset the static pointer:
  if ( ap1 == 0 ) { previousAlignable = 0; return; }

  bool transpose = ( ap2 > ap1 );
  if ( transpose ) std::swap( ap1, ap2 );

  if ( ap1 == previousAlignable )
  {
    fillCorrelationsTable( ap1, ap2, previousCorrelations, cov, row, col, transpose );
  }
  else
  {
    ExtendedCorrelations::iterator itC = theCorrelations.find( ap1 );
    if ( itC != theCorrelations.end() )
    {
      fillCorrelationsTable( ap1, ap2, itC->second, cov, row, col, transpose );
      previousAlignable = ap1;
      previousCorrelations = itC->second;
    }
    else
    {
      // make new entry
      ExtendedCorrelationsTable* newTable = new ExtendedCorrelationsTable;
      fillCorrelationsTable( ap1, ap2, newTable, cov, row, col, transpose );

      theCorrelations[ap1] = newTable;

      previousAlignable = ap1;
      previousCorrelations = newTable;
    }
  }
}
void AlignmentExtendedCorrelationsStore::setCorrelations ( Alignable ap1,
Alignable ap2,
AlgebraicMatrix mat 
) [virtual]

Set correlations without checking whether the maximum number of updates has already been reached.

Reimplemented from AlignmentCorrelationsStore.

Definition at line 107 of file AlignmentExtendedCorrelationsStore.cc.

References swap(), theCorrelations, and geometryDiff::transpose().

{
  bool transpose = ( ap2 > ap1 );
  if ( transpose ) std::swap( ap1, ap2 );

  ExtendedCorrelations::iterator itC1 = theCorrelations.find( ap1 );
  if ( itC1 != theCorrelations.end() )
  { 
    ExtendedCorrelationsTable::iterator itC2 = itC1->second->find( ap1 );
    if ( itC2 != itC1->second->end() )
    {
      itC2->second = transpose ? ExtendedCorrelationsEntry( mat.T() ) : ExtendedCorrelationsEntry( mat );
    }
    else
    {
      (*itC1->second)[ap2] = transpose ? ExtendedCorrelationsEntry( mat.T() ) : ExtendedCorrelationsEntry( mat );
    }
  }
  else
  {
    ExtendedCorrelationsTable* newTable = new ExtendedCorrelationsTable;
    (*newTable)[ap2] = transpose ? ExtendedCorrelationsEntry( mat.T() ) : ExtendedCorrelationsEntry( mat );
    theCorrelations[ap1] = newTable;
  }
}
unsigned int AlignmentExtendedCorrelationsStore::size ( void  ) const [virtual]

Get number of stored correlations.

Reimplemented from AlignmentCorrelationsStore.

Definition at line 182 of file AlignmentExtendedCorrelationsStore.cc.

References theCorrelations.

{
  unsigned int size = 0;
  ExtendedCorrelations::const_iterator itC;
  for ( itC = theCorrelations.begin(); itC != theCorrelations.end(); ++itC )
    size += itC->second->size();

  return size;
}

Member Data Documentation