00001 #ifndef Geometry_TrackingGeometryAligner_GeometryAligner_h
00002 #define Geometry_TrackingGeometryAligner_GeometryAligner_h
00003
00004 #include <vector>
00005 #include <algorithm>
00006 #include <iterator>
00007
00008 #include "FWCore/Utilities/interface/Exception.h"
00009 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00010
00011 #include "Geometry/CommonDetUnit/interface/DetPositioner.h"
00012
00013 #include "CondFormats/Alignment/interface/Alignments.h"
00014 #include "CondFormats/Alignment/interface/AlignmentErrors.h"
00015 #include "CondFormats/Alignment/interface/AlignTransform.h"
00016 #include "CondFormats/Alignment/interface/AlignTransformError.h"
00017 #include "CondFormats/Alignment/interface/AlignmentSurfaceDeformations.h"
00018
00019 #include "Geometry/CommonDetUnit/interface/GeomDet.h"
00020 #include "Geometry/CommonDetUnit/interface/GeomDetUnit.h"
00021 #include "DataFormats/TrackingRecHit/interface/AlignmentPositionError.h"
00022 #include "DataFormats/GeometryCommonDetAlgo/interface/GlobalError.h"
00023 #include "DataFormats/GeometrySurface/interface/Surface.h"
00024 #include "Geometry/CommonTopologies/interface/SurfaceDeformationFactory.h"
00025 #include "Geometry/CommonTopologies/interface/SurfaceDeformation.h"
00026
00027 class Alignments;
00028 class AlignmentSurfaceDeformations;
00029
00031
00032 class GeometryAligner : public DetPositioner {
00033
00034 public:
00035 template<class C>
00036 void applyAlignments( C* geometry,
00037 const Alignments* alignments,
00038 const AlignmentErrors* alignmentErrors,
00039 const AlignTransform& globalCoordinates );
00040
00041 template<class C>
00042 void attachSurfaceDeformations( C* geometry,
00043 const AlignmentSurfaceDeformations* surfaceDeformations );
00044
00045 inline void removeGlobalTransform( const Alignments* alignments,
00046 const AlignmentErrors* alignmentErrors,
00047 const AlignTransform& globalCoordinates,
00048 Alignments* newAlignments,
00049 AlignmentErrors* newAlignmentErrors );
00050 };
00051
00052
00053 template<class C>
00054 void GeometryAligner::applyAlignments( C* geometry,
00055 const Alignments* alignments,
00056 const AlignmentErrors* alignmentErrors,
00057 const AlignTransform& globalCoordinates )
00058 {
00059
00060 edm::LogInfo("Alignment") << "@SUB=GeometryAligner::applyAlignments"
00061 << "Starting to apply alignments.";
00062
00063
00064 if ( alignments->m_align.size() != geometry->theMap.size() )
00065 throw cms::Exception("GeometryMismatch")
00066 << "Size mismatch between geometry (size=" << geometry->theMap.size()
00067 << ") and alignments (size=" << alignments->m_align.size() << ")";
00068 if ( alignments->m_align.size() != alignmentErrors->m_alignError.size() )
00069 throw cms::Exception("GeometryMismatch")
00070 << "Size mismatch between geometry (size=" << geometry->theMap.size()
00071 << ") and alignment errors (size=" << alignmentErrors->m_alignError.size() << ")";
00072
00073 const AlignTransform::Translation &globalShift = globalCoordinates.translation();
00074 const AlignTransform::Rotation globalRotation = globalCoordinates.rotation();
00075 const AlignTransform::Rotation inverseGlobalRotation = globalRotation.inverse();
00076
00077
00078 std::vector<AlignTransform>::const_iterator iAlign = alignments->m_align.begin();
00079 std::vector<AlignTransformError>::const_iterator
00080 iAlignError = alignmentErrors->m_alignError.begin();
00081
00082 std::map<unsigned int, GeomDet*> theMap;
00083 std::copy(geometry->theMap.begin(), geometry->theMap.end(), std::inserter(theMap,theMap.begin()));
00084 unsigned int nAPE = 0;
00085 for ( std::map<unsigned int, GeomDet*>::const_iterator iPair = theMap.begin();
00086 iPair != theMap.end(); ++iPair, ++iAlign, ++iAlignError )
00087 {
00088
00089 if ( (*iPair).first != (*iAlign).rawId() )
00090 throw cms::Exception("GeometryMismatch")
00091 << "DetId mismatch between geometry (rawId=" << (*iPair).first
00092 << ") and alignments (rawId=" << (*iAlign).rawId();
00093
00094 if ( (*iPair).first != (*iAlignError).rawId() )
00095 throw cms::Exception("GeometryMismatch")
00096 << "DetId mismatch between geometry (rawId=" << (*iPair).first
00097 << ") and alignment errors (rawId=" << (*iAlignError).rawId();
00098
00099
00100 CLHEP::Hep3Vector positionHep = globalRotation * CLHEP::Hep3Vector( (*iAlign).translation() ) + globalShift;
00101 CLHEP::HepRotation rotationHep = CLHEP::HepRotation( (*iAlign).rotation() ) * inverseGlobalRotation;
00102
00103
00104 Surface::PositionType position( positionHep.x(), positionHep.y(), positionHep.z() );
00105 Surface::RotationType rotation( rotationHep.xx(), rotationHep.xy(), rotationHep.xz(),
00106 rotationHep.yx(), rotationHep.yy(), rotationHep.yz(),
00107 rotationHep.zx(), rotationHep.zy(), rotationHep.zz() );
00108 GeomDet* iGeomDet = (*iPair).second;
00109 this->setGeomDetPosition( *iGeomDet, position, rotation );
00110
00111
00112 GlobalError error( (*iAlignError).matrix() );
00113 if ( error.cxx() || error.cyy() || error.czz() ||
00114 error.cyx() || error.czx() || error.czy() ||
00115 iGeomDet->alignmentPositionError() ) {
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138 AlignmentPositionError ape( error );
00139 this->setAlignmentPositionError( *iGeomDet, ape );
00140 ++nAPE;
00141 }
00142 }
00143
00144 edm::LogInfo("Alignment") << "@SUB=GeometryAligner::applyAlignments"
00145 << "Finished to apply " << theMap.size() << " alignments with "
00146 << nAPE << " non-zero APE.";
00147 }
00148
00149
00150 template<class C>
00151 void GeometryAligner::attachSurfaceDeformations( C* geometry,
00152 const AlignmentSurfaceDeformations* surfaceDeformations )
00153 {
00154 edm::LogInfo("Alignment") << "@SUB=GeometryAligner::attachSurfaceDeformations"
00155 << "Starting to attach surface deformations.";
00156
00157
00158 std::map<unsigned int, GeomDetUnit*> theMap;
00159 std::copy(geometry->theMapUnit.begin(), geometry->theMapUnit.end(), std::inserter(theMap, theMap.begin()));
00160
00161 unsigned int nSurfDef = 0;
00162 unsigned int itemIndex = 0;
00163 std::map<unsigned int, GeomDetUnit*>::const_iterator iPair = theMap.begin();
00164 for ( std::vector<AlignmentSurfaceDeformations::Item>::const_iterator iItem = surfaceDeformations->items().begin();
00165 iItem != surfaceDeformations->items().end();
00166 ++iItem, ++iPair) {
00167
00168
00169
00170 while ( (*iPair).first != (*iItem).m_rawId ) {
00171
00172
00173 GeomDetUnit* geomDetUnit = (*iPair).second;
00174 this->setSurfaceDeformation( *geomDetUnit, 0 );
00175
00176 ++iPair;
00177 if ( iPair==theMap.end() )
00178 throw cms::Exception("GeometryMismatch")
00179 << "GeomDetUnit with rawId=" << (*iItem).m_rawId
00180 << " not found in geometry";
00181 }
00182
00183
00184 AlignmentSurfaceDeformations::ParametersConstIteratorPair iteratorPair = surfaceDeformations->parameters(itemIndex);
00185 std::vector<double> parameters;
00186 std::copy(iteratorPair.first, iteratorPair.second, std::back_inserter(parameters));
00187
00188
00189 SurfaceDeformation * surfDef = SurfaceDeformationFactory::create( (*iItem).m_parametrizationType, parameters);
00190 GeomDetUnit* geomDetUnit = (*iPair).second;
00191 this->setSurfaceDeformation( *geomDetUnit, surfDef );
00192
00193
00194
00195
00196
00197
00198 ++nSurfDef;
00199
00200 ++itemIndex;
00201 }
00202
00203 edm::LogInfo("Alignment") << "@SUB=GeometryAligner::attachSurfaceDeformations"
00204 << "Finished to attach " << nSurfDef << " surface deformations.";
00205 }
00206
00207 void GeometryAligner::removeGlobalTransform( const Alignments* alignments,
00208 const AlignmentErrors* alignmentErrors,
00209 const AlignTransform& globalCoordinates,
00210 Alignments* newAlignments,
00211 AlignmentErrors* newAlignmentErrors )
00212 {
00213 edm::LogInfo("Alignment") << "@SUB=GeometryAligner::removeGlobalTransform"
00214 << "Starting to remove global position from alignments and errors";
00215
00216 if ( alignments->m_align.size() != alignmentErrors->m_alignError.size() )
00217 throw cms::Exception("GeometryMismatch")
00218 << "Size mismatch between alignments (size=" << alignments->m_align.size()
00219 << ") and alignment errors (size=" << alignmentErrors->m_alignError.size() << ")";
00220
00221 const AlignTransform::Translation &globalShift = globalCoordinates.translation();
00222 const AlignTransform::Rotation globalRotation = globalCoordinates.rotation();
00223 const AlignTransform::Rotation inverseGlobalRotation = globalRotation.inverse();
00224
00225 AlignTransform::Translation newPosition;
00226 AlignTransform::Rotation newRotation;
00227
00228 std::vector<AlignTransform>::const_iterator iAlign = alignments->m_align.begin();
00229 std::vector<AlignTransformError>::const_iterator iAlignError = alignmentErrors->m_alignError.begin();
00230 unsigned int nAPE = 0;
00231 for ( iAlign = alignments->m_align.begin();
00232 iAlign != alignments->m_align.end();
00233 ++iAlign, ++iAlignError ) {
00234
00235
00236 newPosition = inverseGlobalRotation * ( (*iAlign).translation() - globalShift );
00237 newRotation = (*iAlign).rotation() * globalRotation;
00238
00239 newAlignments->m_align.push_back( AlignTransform(newPosition,
00240 newRotation,
00241 (*iAlign).rawId()) );
00242
00243
00244
00245
00246 GlobalError error( (*iAlignError).matrix() );
00247 newAlignmentErrors->m_alignError.push_back( AlignTransformError( error.matrix(),
00248 (*iAlignError).rawId() ) );
00249 if ( error.cxx() || error.cyy() || error.czz() ||
00250 error.cyx() || error.czx() || error.czy() ) {
00251 ++nAPE;
00252 }
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272 }
00273
00274 edm::LogInfo("Alignment") << "@SUB=GeometryAligner::removeGlobalTransform"
00275 << "Finished to remove global transformation from "
00276 << alignments->m_align.size() << " alignments with "
00277 << nAPE << " non-zero APE.";
00278 }
00279
00280 #endif