-
Sergey Gorbunov authoredSergey Gorbunov authored
CbmL1CATrdTrackFinderSA.h 8.28 KiB
/* Copyright (C) 2006-2010 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
SPDX-License-Identifier: GPL-3.0-only
Authors: Arkadiusz Bubak, M. Krauze, Sergey Gorbunov, Denis Bertini [committer] */
// -----------------------------------------------------------------------
// ----- CbmL1CATrdTrackFinderSA -----
// ----- Created 2/12/2006 by A. Bubak & M. Krauze -----
// -----------------------------------------------------------------------
/** CbmL1CATrdTrackFinderSA_Hits
*@author A.Bubak<abubak@nuph.us.edu.pl> & M.Krauze<meszik@nuph.us.edu.pl>
** Algorithm for track finding in TRD, based on Cellular Automathon algorithm
**/
#ifndef CBML1CATRDTRACKFINDERSA_HITS
#define CBML1CATRDTRACKFINDERSA_HITS
#include "CbmTrdTrack.h"
#include "CbmTrdTrackFinder.h"
#include "TStopwatch.h"
#include <map>
#include <set>
#include <vector>
class TClonesArray;
class CbmTrdHit;
class CbmKF;
class CbmKFTrack;
class TH1F;
class TH2F;
class CbmGeoTrdPar;
class CbmTrdTrackFitterKF;
class CbmL1TrdTracklet;
class CbmL1TrdTracklet4;
class CbmL1CATrdTrackFinderSA : public CbmTrdTrackFinder {
private:
CbmL1CATrdTrackFinderSA(const CbmL1CATrdTrackFinderSA&);
CbmL1CATrdTrackFinderSA operator=(const CbmL1CATrdTrackFinderSA&);
public:
/** Default constructor **/
CbmL1CATrdTrackFinderSA();
/** Destructor **/
virtual ~CbmL1CATrdTrackFinderSA();
static CbmL1CATrdTrackFinderSA* Instance() { return fInstance; }
static CbmL1CATrdTrackFinderSA* fInstance;
/** Initialisation **/
void Init();
/** Track finding algorithm **/
Int_t DoFind(TClonesArray* hitArray, TClonesArray* trackArray);
struct Layer {
Layer() {}
Double_t X[12];
Double_t Y[12];
Double_t Z[12];
Double_t scale[12];
} geoLayer;
Int_t fNTrdHits;
/** TRD layout **/
Int_t fNoTrdStations;
Int_t fNoTrdPerStation;
/** Structure contains trd hits divided per given station **/
struct LayerWithHits {
LayerWithHits() : hitIndex(0), mcTrackID(0), X(0), Y(0), Z(0), DX(0), DY(0), planeID(0) {}
Int_t hitIndex;
Int_t mcTrackID;
Double_t X;
Double_t Y;
Double_t Z;
Double_t DX;
Double_t DY;
Int_t planeID;
} planeHits;
//--- vector with hits which belong to given trd plane
std::vector<LayerWithHits> fvTrdHitArr[12];
std::vector<LayerWithHits> fvTrdPointArr[12];
std::vector<LayerWithHits>::iterator fivTrdHitArr;
/** Data branches **/
TClonesArray* fArrayTrdHit;
TClonesArray* fArrayTrdTrack;
private:
CbmGeoTrdPar* TrdPar;
/** Event counter **/
Int_t fEvents;
Int_t fNofEvents;
/** Arrays of MC information **/
TClonesArray* fMCTrackArray;
TClonesArray* fMCPointArray;
/** Traxk fitter **/
CbmTrdTrackFitterKF* trdTrackFitterKF;
/** Verbosity level **/
Int_t fVerbose;
/** Array of sorted TRD hits **/
Int_t fNoTrdHits[12];
Int_t fTrdHitIndex[12][10000];
/** Arrays for TRD tracks **/
std::vector<CbmTrdTrack*> fvTempArray;
std::vector<CbmTrdTrack*> fvFoundTracks;
inline static Bool_t CompareY(LayerWithHits A, LayerWithHits B) { return (A.Y < B.Y); };
/** Structure contains temporary values of track candidates **/
struct TempTrackStruct {
TempTrackStruct() : Chi2(0) {};
Double_t Chi2;
Int_t M[12];
} tempTrack;
inline static Bool_t CompareChi2(TempTrackStruct A, TempTrackStruct B) { return (A.Chi2 < B.Chi2); };
// iterators to vectors
std::vector<Int_t>::iterator iStation1;
std::vector<Int_t>::iterator iStation2;
std::vector<Int_t>::iterator fImapSt1;
std::vector<Int_t>::iterator fImapSt2;
std::vector<CbmL1TrdTracklet4*>::iterator itTrackletsLeft;
std::vector<CbmL1TrdTracklet4*>::iterator itTrackletsRight;
Int_t iHitMap1, iHitMap2;
Double_t iHitMapY1, iHitMapY2;
/** Z position selected trd layers **/
Double_t fTrd13_Z, fTrd14_Z, fTrd21_Z, fTrd24_Z, fTrd31_Z;
CbmKFTrack* fKfTrack; // KF track
/** To check time comsumption of procedures **/
TStopwatch createSegments, findNeighbour, createSPs, createSPs_SL, sortSPs, doFind, sortHits, tagTracks, createTracks,
selectTracks, delTime, secondLoopTime, refittingKF, thirdLoopTime;
Double_t totCreateSegments, totFindNeighbour, totCreateSPs, totCreateSPs_SL, totSortSPs, totDoFind, totSortHits,
totTagTracks, totCreateTracks, totDelTime, totSecondLoopTime, totThirdLoopTime, totSelectTracks, totRefittingKF;
void DeleteTracklets(std::vector<CbmL1TrdTracklet4*> vect);
void DeleteTracklets(std::vector<CbmL1TrdTracklet*> vect);
Double_t DistTwoTrackletsX(Int_t iIndexFirst, Int_t iIndexSecond, Double_t zed);
Double_t DistTwoTrackletsY(Int_t iIndexFirst, Int_t iIndexSecond, Double_t zed);
void CreateSpacePoints(std::vector<LayerWithHits> vTrdHitArrayA, std::vector<LayerWithHits> vTrdHitArrayB,
std::vector<CbmL1TrdTracklet*>& clSpacePointsAB, Double_t sigmaA, Double_t sigmaB);
void CreateSegments(std::vector<CbmL1TrdTracklet*> clSpacePointsAB, std::vector<CbmL1TrdTracklet*> clSpacePointsCD,
std::vector<CbmL1TrdTracklet4*>& clTrackletsAD, Double_t dX, Double_t dY);
void TagSegments(std::vector<CbmL1TrdTracklet4*>& clTrackletsA, std::vector<CbmL1TrdTracklet4*>& clTrackletsB,
Int_t noCombSegments = 0);
void CreateTracks(std::vector<CbmL1TrdTracklet4*> clTracklets14, std::vector<CbmL1TrdTracklet4*> clTracklets58,
std::vector<CbmL1TrdTracklet4*> clTracklets912, std::set<Int_t>& setUsedHits, Bool_t removeUsedHits,
Bool_t competition = true, Int_t nrLoop = 0);
void CreateAndManageSegments(std::vector<CbmL1TrdTracklet4*> clTracklets14,
std::vector<CbmL1TrdTracklet4*> clTracklets58,
std::vector<CbmL1TrdTracklet4*> clTracklets912);
Bool_t OverlapsHitsXY(Int_t posA, Int_t posB);
void FindNeighbour(std::vector<CbmL1TrdTracklet4*>& v1, std::vector<CbmL1TrdTracklet4*>& v2, Double_t dY,
Double_t dX);
/** Fitting procedures **/
Double_t FitLinear(CbmTrdTrack* tr,
Int_t var); //var = {1,2} => which coordinate to use
Double_t FitLinear(Int_t M[],
Int_t var); //var = {1,2} => which coordinate to use
Double_t Fit(CbmTrdTrack* tr);
Double_t Fit(Int_t M[]);
Double_t FitKF(CbmTrdTrack* pTrack);
Double_t FitTLinearFitter(Int_t M[]);
Double_t FitLSM(Int_t M[]);
/** Rejection procedure **/
Bool_t Rejection(Double_t Procent, Int_t num = 100);
/** Pdg to charge conversion **/
Int_t PdgToCharge(Int_t pdgCode);
/** Create histogramms **/
void CreateHistogramms();
/** Activates data branches **/
void DataBranches();
/** Determine detector layout **/
void TrdLayout();
public:
/** Write histogramms **/
void WriteHistogramms();
/** Public accessors **/
inline const Int_t& GetVerbose() const { return fVerbose; };
/** Public modifiers **/
inline void SetVerbose(const Int_t& verbose) { fVerbose = verbose; };
/** Histogramms **/
TH1F* fh_chi2hit;
TH2F* fh_chi2hit_plane;
// Histogramms for the distance cuts
TH1F* fDistLongX;
TH1F* fDistLongY;
TH1F* fDistShortX;
TH1F* fDistShortY;
TH1F* fDistLongBX;
TH1F* fDistLongBY;
TH1F* fDistShortBX;
TH1F* fDistShortBY;
TH1F* fDistY12;
TH2F* fMomDistLongPrimaryX;
TH2F* fMomDistLongPrimaryY;
TH2F* fMomDistLongExtraX;
TH2F* fMomDistLongExtraY;
TH2F* fMomDistExtrapolPrimaryX;
TH2F* fMomDistExtrapolPrimaryY;
TH2F* fMomDistExtrapolExtraX;
TH2F* fMomDistExtrapolExtraY;
TH2F* fMomDistShortPrimaryX;
TH2F* fMomDistShortPrimaryY;
TH2F* fMomDistShortExtraX;
TH2F* fMomDistShortExtraY;
TH1F* fDistY;
TH1F* fDistX;
TH1F* fPlane1Ydens;
TH1F* fPlane5Ydens;
TH1F* fPlane9Ydens;
TH1F* fSPlength;
TH1F* fSPlengthMC;
TH1F* fYat0;
TH1F* fYat0MC;
TH2F* fNoEvTime;
TH1F* fh_SP_xDiff_MC;
TH1F* fh_SP_yDiff_MC;
TH1F* fh_SP_xDiff_nMC;
TH1F* fh_SP_yDiff_nMC;
TH1F *fUsedHitsPerPlane, *fUnUsedHitsPerPlane;
std::map<Int_t, Int_t> fRUsedHits;
std::map<Int_t, Int_t> fRUnUsedHits;
std::map<Int_t, Int_t> fTotHits;
/** Function for sorting **/
static Bool_t CompareChi2TrdTrack(const CbmTrdTrack* a, const CbmTrdTrack* b)
{
return (a->GetChiSq() / static_cast<Double_t>(a->GetNDF()) < b->GetChiSq() / static_cast<Double_t>(b->GetNDF()));
};
ClassDef(CbmL1CATrdTrackFinderSA, 1);
};
#endif