00001 #ifndef Alignment_MillePedeAlignmentAlgorithm_MillePedeAlignmentAlgorithm_h
00002 #define Alignment_MillePedeAlignmentAlgorithm_MillePedeAlignmentAlgorithm_h
00003
00013
00014 #include "Alignment/CommonAlignmentAlgorithm/interface/AlignmentAlgorithmBase.h"
00015
00016 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00017
00018 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateOnSurface.h"
00019 #include "TrackingTools/TransientTrackingRecHit/interface/TransientTrackingRecHit.h"
00020
00021 #include "Alignment/ReferenceTrajectories/interface/ReferenceTrajectoryBase.h"
00022
00023 #include <vector>
00024 #include <string>
00025
00026 #include <TMatrixDSym.h>
00027 #include <TMatrixD.h>
00028 #include <TMatrixF.h>
00029
00030 class Alignable;
00031 class AlignableTracker;
00032 class AlignableMuon;
00033 class AlignableExtras;
00034
00035 class AlignmentParameters;
00036 class AlignableNavigator;
00037 class AlignableDetOrUnitPtr;
00038 class AlignmentUserVariables;
00039
00040 class AlignmentParameterStore;
00041
00042 class MillePedeMonitor;
00043 class PedeSteerer;
00044 class PedeLabelerBase;
00045 class Mille;
00046 class TrajectoryFactoryBase;
00047
00048
00049
00050
00051
00052 class MillePedeAlignmentAlgorithm : public AlignmentAlgorithmBase
00053 {
00054 public:
00056 MillePedeAlignmentAlgorithm(const edm::ParameterSet &cfg);
00057
00059 virtual ~MillePedeAlignmentAlgorithm();
00060
00062 virtual void initialize(const edm::EventSetup &setup,
00063 AlignableTracker *tracker, AlignableMuon *muon, AlignableExtras *extras,
00064 AlignmentParameterStore *store);
00065
00067 virtual void terminate();
00068
00070 virtual void run(const edm::EventSetup &setup, const EventInfo &eventInfo);
00071
00073 virtual void endRun(const EventInfo &eventInfo, const EndRunInfo &runInfo,
00074 const edm::EventSetup &setup);
00075
00076
00077
00078
00081 virtual void setParametersForRunRange(const RunRange &runrange);
00082
00083 private:
00084 enum MeasurementDirection {kLocalX = 0, kLocalY};
00085
00087 std::pair<unsigned int, unsigned int>
00088 addReferenceTrajectory(const EventInfo &eventInfo,
00089 const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr);
00090
00094 int addMeasurementData(const EventInfo &eventInfo,
00095 const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr,
00096 unsigned int iHit, AlignmentParameters *¶ms);
00097
00099 void addRefTrackData2D(const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr,
00100 unsigned int iTrajHit, TMatrixDSym &aHitCovarianceM,
00101 TMatrixF &aHitResidualsM, TMatrixF &aLocalDerivativesM);
00102
00104 void addMsMeas(const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr,
00105 unsigned int iMsMeas);
00106
00108 void addRefTrackMsMeas1D(const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr,
00109 unsigned int iTrajHit,TMatrixDSym &aHitCovarianceM,
00110 TMatrixF &aHitResidualsM, TMatrixF &aLocalDerivativesM);
00111
00113 bool globalDerivativesHierarchy(const EventInfo &eventInfo,
00114 const TrajectoryStateOnSurface &tsos,
00115 Alignable *ali, const AlignableDetOrUnitPtr &alidet,
00116 std::vector<float> &globalDerivativesX,
00117 std::vector<float> &globalDerivativesY,
00118 std::vector<int> &globalLabels,
00119 AlignmentParameters *&lowestParams) const;
00120
00122 int callMille(const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr,
00123 unsigned int iTrajHit, const std::vector<int> &globalLabels,
00124 const std::vector<float> &globalDerivativesX,
00125 const std::vector<float> &globalDerivativesY);
00126
00128 int callMille1D(const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr,
00129 unsigned int iTrajHit, const std::vector<int> &globalLabels,
00130 const std::vector<float> &globalDerivativesX);
00131
00135 int callMille2D ( const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr,
00136 unsigned int iTrajHit, const std::vector<int> &globalLabels,
00137 const std::vector<float> &globalDerivativesx,
00138 const std::vector<float> &globalDerivativesy);
00139 void diagonalize(TMatrixDSym &aHitCovarianceM, TMatrixF &aLocalDerivativesM,
00140 TMatrixF &aHitResidualsM,TMatrixF &theGlobalDerivativesM) const;
00141
00142 void makeGlobDerivMatrix(const std::vector<float> &globalDerivativesx,
00143 const std::vector<float> &globalDerivativesy,
00144 TMatrixF &aGlobalDerivativesM);
00145
00146
00147
00148
00150 bool is2D(const TransientTrackingRecHit::ConstRecHitPointer &recHit) const;
00151
00153 bool readFromPede(const edm::ParameterSet &mprespset, bool setUserVars,
00154 const RunRange &runrange);
00155 bool areEmptyParams(const std::vector<Alignable*> &alignables) const;
00156 unsigned int doIO(int loop) const;
00158 void buildUserVariables(const std::vector<Alignable*> &alignables) const;
00159
00160 void addLaserData(const EventInfo &eventInfo,
00161 const TkFittedLasBeamCollection &tkLasBeams,
00162 const TsosVectorCollection &tkLasBeamTsoses);
00163 void addLasBeam(const EventInfo &eventInfo,
00164 const TkFittedLasBeam &lasBeam,
00165 const std::vector<TrajectoryStateOnSurface> &tsoses);
00166
00168 void addPxbSurvey(const edm::ParameterSet &pxbSurveyCfg);
00169
00170
00171
00172
00173 enum EModeBit {myMilleBit = 1 << 0, myPedeRunBit = 1 << 1, myPedeSteerBit = 1 << 2,
00174 myPedeReadBit = 1 << 3};
00175 unsigned int decodeMode(const std::string &mode) const;
00176 bool isMode(unsigned int testMode) const {return (theMode & testMode);}
00177 bool addHitStatistics(int fromLoop, const std::string &outFile,
00178 const std::vector<std::string> &inFiles) const;
00179 bool addHits(const std::vector<Alignable*> &alis,
00180 const std::vector<AlignmentUserVariables*> &mpVars) const;
00181
00182 edm::ParameterSet theConfig;
00183 unsigned int theMode;
00184 std::string theDir;
00185 AlignmentParameterStore *theAlignmentParameterStore;
00186 std::vector<Alignable*> theAlignables;
00187 AlignableNavigator *theAlignableNavigator;
00188 MillePedeMonitor *theMonitor;
00189 Mille *theMille;
00190 const PedeLabelerBase *thePedeLabels;
00191 PedeSteerer *thePedeSteer;
00192 TrajectoryFactoryBase *theTrajectoryFactory;
00193 unsigned int theMinNumHits;
00194 double theMaximalCor2D;
00195
00196 std::vector<float> theFloatBufferX;
00197 std::vector<float> theFloatBufferY;
00198 std::vector<int> theIntBuffer;
00199 bool theDoSurveyPixelBarrel;
00200 };
00201
00202 #endif