#ifndef RICH_MIRRORS_CBMRICHRONCHIANA_H_ #define RICH_MIRRORS_CBMRICHRONCHIANA_H_ #include "TObject.h" #include "TVector3.h" #include #include #include using namespace std; class TH2; class CbmRichRonchiIntersectionData { public: CbmRichRonchiIntersectionData(): fPixelX(0), fPixelY(0), fLineX(0), fLineY(0), fNormalRadX(0.), fNormalRadY(0.), fOrderedLineX(0), fOrderedLineY(0), fCcdV(), fRulingV(), fMirrorV(), fCornerTL(), fCornerTR(), fCornerBL(), fCornerBR(), fCornerTLRot(), fCornerTRRot(), fCornerBLRot(), fCornerBRRot(), fTLPositionX(0.), fTLPositionY(0.), fTRPositionX(0.), fTRPositionY(0.), fBLPositionX(0.), fBLPositionY(0.), fBRPositionX(0.), fBRPositionY(0.), fTLHeight(0.), fTRHeight(0.), fBLHeight(0.), fBRHeight(0.), fTotHeight(0.), fIndexScan(false), fIndexSum(0), fIndexSphere(false), fDeviation(0.) {} int fPixelX; int fPixelY; int fLineX; int fLineY; int fOrderedLineX; int fOrderedLineY; double fNormalRadX; // Normal X in radians double fNormalRadY; TVector3 fCcdV; // XYZ positions CCD in microns TVector3 fRulingV; // XYZ positions ronchi ruling in microns TVector3 fMirrorV; // XYZ positions of mirror in microns TVector3 fCornerTL; // corners of segment BEFORE rotation TVector3 fCornerTR; TVector3 fCornerBL; TVector3 fCornerBR; TVector3 fCornerTLRot; // corners of segment AFTER rotation TVector3 fCornerTRRot; TVector3 fCornerBLRot; TVector3 fCornerBRRot; TVector3 fCornerTLSphere; // corners of segment after 'DoSphere' TVector3 fCornerTRSphere; TVector3 fCornerBLSphere; TVector3 fCornerBRSphere; double fTLPositionX; // positions of corners of segment (top/bottom left/right) double fTLPositionY; double fTRPositionX; double fTRPositionY; double fBLPositionX; double fBLPositionY; double fBRPositionX; double fBRPositionY; std::vector fVecTL; // vectors that point from center of a segment to the corners (for calculation of rotations) std::vector fVecTR; std::vector fVecBL; std::vector fVecBR; double fTLHeight; // heights of corners of segment (top/bottom left/right) double fTRHeight; double fBLHeight; double fBRHeight; double fTLSum; double fTRSum; double fBLSum; double fBRSum; double fTotHeight; // at center bool fIndexScan; // index to hand over initial values to 'DoScanLine' (old: 13) int fIndexSum; // index for summed heights to prevent double assigning (old: 21) and to look for remaining intersections (DoRemaining); not boolian because four values are needed (0,1,2,3) bool fIndexSphere; double fDeviation; }; class CbmRichRonchiLineData { public: CbmRichRonchiLineData(): fNofPoints(0), fMeanPrimary(0), fMeanSecondary(0), fLineInd(0) {} int fNofPoints; double fMeanPrimary; double fMeanSecondary; int fLineInd; }; class CbmRichRonchiAna : public TObject { public: CbmRichRonchiAna(); virtual ~CbmRichRonchiAna(); void Run(); void SetTiffFileNameV(const string& fileName) {fTiffFileNameV = fileName;} void SetTiffFileNameH(const string& fileName) {fTiffFileNameH = fileName;} private: string fTiffFileNameV; string fTiffFileNameH; // constant values double fPi; double fRadiusMirror; // in microns double fEdgeLengthCCD; // in microns double fCcdPixelSize; // in microns double fPitchGrid; // in microns; distance of lines double fImageWidth; // in pixels // values to be measured first double fDistRulingCCD; // in microns double fDistMirrorRuling; // in microns double fOffsetCCDOptAxisX; // in microns; horizontal distance of center of CCD to optical axis of mirror double fOffsetCCDOptAxisY; // in microns; vertical distance of center of CCD to optical axis of mirror double fOffsetLEDOpticalAxisX; // in microns; horizontal distance of light source to optical axis of mirror double fOffsetLEDOpticalAxisY; double fEffectiveEdgeLengthGridPlate; // in microns double fEffectiveEdgeLengthMirror; // in microns; edge length of part of mirror that is projected onto CCD double fEffectiveEdgeLengthCCD; // in microns; edge length of mirror image on CCD (NumberOfLines*LineDistance) double fCorrection; // correction value; defines center of mirror at exactly 3,000,000 mum in z dircetion // values that will be determined by function double fCenterCcdX; // in pixels; approximate center of image on CCD, will be defined in 'DoLocalNormal' function double fCenterCcdY; // in pixels double fImageCenterMirrorX; // in pixels; approximate center of image on mirror (NEEDED??) double fImageCenterMirrorY; // in pixels vector > ReadTiffFile(const string& fileName); void DoRotation(vector >& data); void FillH2WithVector(TH2* hist, const vector >& data); void DoMeanIntensityY(vector >& data); void DoPeakFinderY(vector >& data); void DoSmoothLines(vector >& data); void DoLineSearch(vector >& data); vector > DoSuperpose(const vector >& dataH, const vector >& dataV); vector DoIntersection(vector >& dataH, const vector >& dataV); void DoOrderLines(vector &intersections, const string &option); bool AreTwoSegmentsSameLine(const CbmRichRonchiLineData *line1, const CbmRichRonchiLineData *line2); void UpdateIntersectionLineInd(vector &intersections, CbmRichRonchiLineData *line1, CbmRichRonchiLineData *line2, const string &option); void DoLocalNormal(vector &data); void DrawXYMum(vector &data); void DrawHeightMum(vector &data); void DrawXZProjection(vector &data, int orderedLineY, double scale); void DrawMirrorSegments(vector &data, int orderedLineX, int orderedLineY); void DrawSphere(vector &data); void DoHeight(vector &intersections); void DoSphere(vector &intersections); void DoHeightCorners(vector &intersections); void DoScanLineHeight(vector &intersections); void DoCalculateRemaining(vector &intersections); void DoIntegrate(vector &intersections); void DoAverageSurroundings(vector &intersections); void RotatePointImpl(TVector3 *inPos, TVector3 *outPos, Double_t rotX, Double_t rotY, TVector3* cV); void DoDeviation(vector &data); void rootgeom(bool &vis); /** * \brief Copy constructor. */ CbmRichRonchiAna(const CbmRichRonchiAna &); /** * \brief Assignment operator. */ CbmRichRonchiAna &operator=(const CbmRichRonchiAna &); ClassDef(CbmRichRonchiAna, 1) }; #endif /* RICH_MIRRORS_CBMRICHRONCHIANA_H_ */