00001 #ifndef Alignment_MillePedeAlignmentAlgorithm_MillePedeAlignmentAlgorithm_h
00002 #define Alignment_MillePedeAlignmentAlgorithm_MillePedeAlignmentAlgorithm_h
00003
00013
00014
00015 #include "Alignment/CommonAlignmentAlgorithm/interface/AlignmentAlgorithmBase.h"
00016
00017 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00018
00019 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateOnSurface.h"
00020 #include "TrackingTools/TransientTrackingRecHit/interface/TransientTrackingRecHit.h"
00021
00022 #include "Alignment/ReferenceTrajectories/interface/ReferenceTrajectoryBase.h"
00023
00024
00025 #include <vector>
00026 #include <string>
00027
00028 #include <TMatrixDSym.h>
00029 #include <TMatrixD.h>
00030 #include <TMatrixF.h>
00031
00032 class Alignable;
00033 class AlignableTracker;
00034 class AlignableMuon;
00035
00036 class AlignmentParameters;
00037 class AlignableNavigator;
00038 class AlignableDetOrUnitPtr;
00039 class AlignmentUserVariables;
00040
00041 class AlignmentParameterStore;
00042
00043 class MillePedeMonitor;
00044 class PedeSteerer;
00045 class PedeLabeler;
00046 class Mille;
00047 class TrajectoryFactoryBase;
00048
00049 class MillePedeAlignmentAlgorithm : public AlignmentAlgorithmBase
00050 {
00051 public:
00053 MillePedeAlignmentAlgorithm(const edm::ParameterSet &cfg);
00054
00056 virtual ~MillePedeAlignmentAlgorithm();
00057
00059 virtual void initialize(const edm::EventSetup &setup, AlignableTracker *tracker,
00060 AlignableMuon *muon, AlignmentParameterStore *store);
00061
00063 virtual void terminate();
00064
00066 virtual void run(const edm::EventSetup &setup, const ConstTrajTrackPairCollection &tracks);
00067
00068 private:
00069 enum MeasurementDirection {kLocalX = 0, kLocalY};
00070
00074 int addMeasurementData(const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr,
00075 unsigned int iHit, const TrajectoryStateOnSurface &trackTsos,
00076 AlignmentParameters *¶ms);
00077
00078
00079 void addRefTrackData2D(const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr, unsigned int iTrajHit,TMatrixDSym &aHitCovarianceM, TMatrixF &aHitResidualsM, TMatrixF &aLocalDerivativesM);
00080
00081
00083 bool globalDerivativesHierarchy(const TrajectoryStateOnSurface &tsos,
00084 Alignable *ali, const AlignableDetOrUnitPtr &alidet,
00085 std::vector<float> &globalDerivativesX,
00086 std::vector<float> &globalDerivativesY,
00087 std::vector<int> &globalLabels,
00088 AlignmentParameters *&lowestParams) const;
00089
00090
00091 int callMille2D ( const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr,
00092 unsigned int iTrajHit, const std::vector<int> &globalLabels,
00093 const std::vector<float> &globalDerivativesx,
00094 const std::vector<float> &globalDerivativesy);
00095 void diagonalize(TMatrixDSym &aHitCovarianceM, TMatrixF &aLocalDerivativesM,
00096 TMatrixF &aHitResidualsM,TMatrixF &theGlobalDerivativesM) const;
00097
00098 void makeGlobDerivMatrix(const std::vector<float> &globalDerivativesx, const std::vector<float> &globalDerivativesy,TMatrixF &aGlobalDerivativesM);
00099
00100
00101
00102
00104 bool is2D(const TransientTrackingRecHit::ConstRecHitPointer &recHit) const;
00105
00107 bool readFromPede(const std::string &psetName, bool setUserVars);
00108 bool areEmptyParams(const std::vector<Alignable*> &alignables) const;
00109 unsigned int doIO(int loop) const;
00111 void buildUserVariables(const std::vector<Alignable*> &alignables) const;
00112
00113 enum EModeBit {myMilleBit = 1 << 0, myPedeRunBit = 1 << 1, myPedeSteerBit = 1 << 2,
00114 myPedeReadBit = 1 << 3};
00115 unsigned int decodeMode(const std::string &mode) const;
00116 bool isMode(unsigned int testMode) const {return (theMode & testMode);}
00117 bool addHitStatistics(int fromLoop, const std::string &outFile,
00118 const std::vector<std::string> &inFiles) const;
00119 bool addHits(const std::vector<Alignable*> &alis,
00120 const std::vector<AlignmentUserVariables*> &mpVars) const;
00121 bool orderedTsos(const Trajectory *traj,
00122 std::vector<TrajectoryStateOnSurface> &trackTsos) const;
00123 edm::ParameterSet theConfig;
00124 unsigned int theMode;
00125 std::string theDir;
00126 AlignmentParameterStore *theAlignmentParameterStore;
00127 std::vector<Alignable*> theAlignables;
00128 AlignableNavigator *theAlignableNavigator;
00129 MillePedeMonitor *theMonitor;
00130 Mille *theMille;
00131 const PedeLabeler *thePedeLabels;
00132 PedeSteerer *thePedeSteer;
00133 TrajectoryFactoryBase *theTrajectoryFactory;
00134 int theMinNumHits;
00135 double theMaximalCor2D;
00136
00137 bool theUseTrackTsos;
00138
00139 std::vector<float> theFloatBufferX;
00140 std::vector<float> theFloatBufferY;
00141 std::vector<int> theIntBuffer;
00142 };
00143
00144 #endif