/* * PndIsochroneTrackFinder.h * * Created on: 10.10.2014 * Author: Stockmanns */ #ifndef PNDISOCHRONETRACKFINDER_H_ #define PNDISOCHRONETRACKFINDER_H_ #include #include #include #include #include "TObject.h" #include "TH2D.h" #include "TGraph.h" #include "FairHit.h" #include "PndTrack.h" #include "PndTrackCand.h" #include "PndTrackFromCircle.h" #include "PndSttHit.h" #include "TClonesArray.h" class TVector2; class PndGeneralHoughHit : public FairHit { public: PndGeneralHoughHit(){}; ~PndGeneralHoughHit(){}; PndGeneralHoughHit(const FairHit& hit) : FairHit(hit), isochroneRadius(0){}; void SetIsochroneRadius(Double_t val) {isochroneRadius = val;} Double_t GetIsochroneRadius() const {return isochroneRadius;} private: Double_t isochroneRadius; }; class PndIsochroneTrackFinder : public TObject { public: PndIsochroneTrackFinder(); virtual ~PndIsochroneTrackFinder(); void SetTubeArray(TClonesArray* val){fSttTubeArray = val;} void SetAngleRange(std::pair range) {fAngleRange = range;} void SetAngleStepSize(Double_t stepSize) {fAngleStepSize = stepSize;} void SetUseGpu(Bool_t gpu); void SetEventNumber(int _eventNr) {fEventNumber = _eventNr;}; void SetNumberOfThreads(int _nThreads) {fNumberOfThreads = _nThreads;}; // DELETE void AddHits(TClonesArray* hits, Int_t branchId); std::vector FindTracks(); TH2D* GetHoughHisto(){return fHoughHisto;} void SetSkewedBranchName(TString branchName){fSkewedBranchName = branchName;} void SetSkewedArray (TClonesArray* val){ fSttSkewedArray = val; } TClonesArray* GetSkewed() const {return fSttSkewedArray;} std::vector GetTrackCands(){return fTrackCands;} std::vector GetPeakCoordinates(){return fPeakCoordinates;}; TGraph GetPeakCoordinateGraph(); int GetEventNumber() {return fEventNumber;}; void AssignSkewedHits(PndTrackCand& cand, std::vector > skewedHits, TVector2 circle); void Reset(){ if (fHoughHisto != 0) fHoughHisto->Reset(); fBinsWithContent.clear(); for (std::map >::iterator iter = fBinToHit.begin(); iter != fBinToHit.end(); ++iter){ iter->second.clear(); } fBinToHit.clear(); fHitsUsed.clear(); fTrackCands.clear(); fHitsToFit.clear(); fSkewedHits.clear(); if (fSttSkewedArray != 0) fSttSkewedArray->Delete(); fPeakCoordinates.clear(); } protected: TVector2 IsoCalc(Double_t x0, Double_t y0, Double_t isoR, Double_t phi); Int_t GetHistoBin(TH2* histo, Double_t xVal, Double_t yVal); void InterpolateHisto(TH2* histo, TVector2& in, TVector2& out, Int_t& hitId, Double_t weight = 1.); std::multimap FindPeaks(std::set& binsWithContent, TH2* histo, Int_t threshold); PndTrackCand FillTrackCand(Int_t histoBin); Double_t CalcArcLength(FairHit hit, TVector2 circleCenter); PndTrack CalcPndTrack(PndTrackCand& cand, std::vector > skewedHits, TVector2 circle, Double_t mag = 2.0); FairTrackParP CalcTrackParP(FairHit hit, TVector2 circleCenter, Double_t mag); TVector3 CalcHitPosInTrack(FairHit hit, TVector2 circleCenter); Double_t CalcPt(Double_t mag, TVector2 circleCenter); TVector2 CalcPtDir(TVector2 hit, TVector2 circleCenter); std::vector< std::vector > FindSkewedHits(TVector2 circle); std::vector GenerateHoughValues(std::vector angles, Double_t xVal, Double_t yVal, Double_t isoChrone); std::vector GenerateAngles(); void FillHoughHist(std::vector, Int_t, Double_t); std::vector PeaksToTracks(std::multimap); //void GetStartEndPointOfTube(PndSttHit*, TVector3& startPoint, TVector3& endPoint); // void FillHistogram(); private: std::pair fAngleRange; Double_t fAngleStepSize; TH2D* fHoughHisto; std::set fBinsWithContent; //! std::vector fHitsToFit; std::map > fBinToHit; //Map of BinInHisto(key) to index in TClonesArray std::set fHitsUsed; Bool_t fClockwise; std::vector fTrackCands; std::map fWeightMap; TClonesArray* fSttTubeArray; std::vector fSkewedHits; std::map fMapFairLinkHit; std::vector fPeakCoordinates; PndTrackFromCircle fTrackCalc; TString fSkewedBranchName; //