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 bool 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
00102 unsigned int addHitCount(const std::vector<AlignmentParameters*> &parVec,
00103 const std::vector<bool> &validHitVecY) const;
00104
00106 void addRefTrackData2D(const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr,
00107 unsigned int iTrajHit, TMatrixDSym &aHitCovarianceM,
00108 TMatrixF &aHitResidualsM, TMatrixF &aLocalDerivativesM);
00109
00111 void addVirtualMeas(const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr,
00112 unsigned int iVirtualMeas);
00113
00115 void addRefTrackVirtualMeas1D(const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr,
00116 unsigned int iVirtualMeas,TMatrixDSym &aHitCovarianceM,
00117 TMatrixF &aHitResidualsM, TMatrixF &aLocalDerivativesM);
00118
00120 bool globalDerivativesHierarchy(const EventInfo &eventInfo,
00121 const TrajectoryStateOnSurface &tsos,
00122 Alignable *ali, const AlignableDetOrUnitPtr &alidet,
00123 std::vector<float> &globalDerivativesX,
00124 std::vector<float> &globalDerivativesY,
00125 std::vector<int> &globalLabels,
00126 AlignmentParameters *&lowestParams) const;
00127
00129 int callMille(const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr,
00130 unsigned int iTrajHit, const std::vector<int> &globalLabels,
00131 const std::vector<float> &globalDerivativesX,
00132 const std::vector<float> &globalDerivativesY);
00133
00135 int callMille1D(const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr,
00136 unsigned int iTrajHit, const std::vector<int> &globalLabels,
00137 const std::vector<float> &globalDerivativesX);
00138
00142 int callMille2D ( const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr,
00143 unsigned int iTrajHit, const std::vector<int> &globalLabels,
00144 const std::vector<float> &globalDerivativesx,
00145 const std::vector<float> &globalDerivativesy);
00146 void diagonalize(TMatrixDSym &aHitCovarianceM, TMatrixF &aLocalDerivativesM,
00147 TMatrixF &aHitResidualsM,TMatrixF &theGlobalDerivativesM) const;
00148
00149 void makeGlobDerivMatrix(const std::vector<float> &globalDerivativesx,
00150 const std::vector<float> &globalDerivativesy,
00151 TMatrixF &aGlobalDerivativesM);
00152
00153
00154
00155
00157 bool is2D(const TransientTrackingRecHit::ConstRecHitPointer &recHit) const;
00158
00160 bool readFromPede(const edm::ParameterSet &mprespset, bool setUserVars,
00161 const RunRange &runrange);
00162 bool areEmptyParams(const std::vector<Alignable*> &alignables) const;
00163 unsigned int doIO(int loop) const;
00165 void buildUserVariables(const std::vector<Alignable*> &alignables) const;
00166
00167 void addLaserData(const EventInfo &eventInfo,
00168 const TkFittedLasBeamCollection &tkLasBeams,
00169 const TsosVectorCollection &tkLasBeamTsoses);
00170 void addLasBeam(const EventInfo &eventInfo,
00171 const TkFittedLasBeam &lasBeam,
00172 const std::vector<TrajectoryStateOnSurface> &tsoses);
00173
00175 void addPxbSurvey(const edm::ParameterSet &pxbSurveyCfg);
00176
00177
00178
00179
00180 enum EModeBit {myMilleBit = 1 << 0, myPedeRunBit = 1 << 1, myPedeSteerBit = 1 << 2,
00181 myPedeReadBit = 1 << 3};
00182 unsigned int decodeMode(const std::string &mode) const;
00183 bool isMode(unsigned int testMode) const {return (theMode & testMode);}
00184 bool addHitStatistics(int fromLoop, const std::string &outFile,
00185 const std::vector<std::string> &inFiles) const;
00186 bool addHits(const std::vector<Alignable*> &alis,
00187 const std::vector<AlignmentUserVariables*> &mpVars) const;
00188
00189 edm::ParameterSet theConfig;
00190 unsigned int theMode;
00191 std::string theDir;
00192 AlignmentParameterStore *theAlignmentParameterStore;
00193 std::vector<Alignable*> theAlignables;
00194 AlignableNavigator *theAlignableNavigator;
00195 MillePedeMonitor *theMonitor;
00196 Mille *theMille;
00197 const PedeLabelerBase *thePedeLabels;
00198 PedeSteerer *thePedeSteer;
00199 TrajectoryFactoryBase *theTrajectoryFactory;
00200 unsigned int theMinNumHits;
00201 double theMaximalCor2D;
00202
00203 int theLastWrittenIov;
00204 std::vector<float> theFloatBufferX;
00205 std::vector<float> theFloatBufferY;
00206 std::vector<int> theIntBuffer;
00207 bool theDoSurveyPixelBarrel;
00208 };
00209
00210 #endif