Skip to content
Snippets Groups Projects
CbmL1GlobalTrackFinder.cxx 11.43 KiB
/* Copyright (C) 2019-2020 IKF-UFra, GSI
   SPDX-License-Identifier: GPL-3.0-only
   Authors: Valentina Akishina [committer] */

/*
 *====================================================================
 *
 *  CBM Level 1 Reconstruction
 *
 *  Authors: V. Akishina
 *
 *  e-mail : v.akishina@gsi.de
 *
 *====================================================================
 *
 *  CbmL1GlobalTrackFinder source file
 *
 *====================================================================
 */
#include "CbmL1GlobalTrackFinder.h"

#include "CbmEvent.h"
#include "CbmGlobalTrack.h"
#include "CbmKFMath.h"
#include "CbmMuchTrack.h"
#include "CbmStsHit.h"
#include "CbmStsTrack.h"
#include "CbmTofTrack.h"
#include "CbmTrack.h"
#include "CbmTrdTrack.h"

#include "FairHit.h"
#include "FairMCPoint.h"
#include "FairRootManager.h"

#include "TClonesArray.h"
#include "TDatabasePDG.h"

#include <iostream>
#include <vector>

#include "L1Algo/L1Algo.h"

using std::cout;
using std::endl;
using std::vector;

ClassImp(CbmL1GlobalTrackFinder)

  // -----   Default constructor   -------------------------------------------
  CbmL1GlobalTrackFinder::CbmL1GlobalTrackFinder()
  : fGlobalTracks(nullptr)
  , fStsTracks(nullptr)
  , fMuchTracks(nullptr)
  , fTrdTracks(nullptr)
  , fTofTracks(nullptr)
{
  fName = "Global Track Finder L1";
}
// -------------------------------------------------------------------------


// -----   Destructor   ----------------------------------------------------
CbmL1GlobalTrackFinder::~CbmL1GlobalTrackFinder() {}
// -------------------------------------------------------------------------

// -----   Public method Init   --------------------------------------------
void CbmL1GlobalTrackFinder::Init() {}
// -------------------------------------------------------------------------

// -----   Copy tracks to output array   -----------------------------------
Int_t CbmL1GlobalTrackFinder::CopyL1Tracks(CbmEvent* event)
{
  CbmL1* L1 = CbmL1::Instance();
  if (!L1) return 0;
  Int_t globalTrackIndex      = fGlobalTracks->GetEntriesFast();
  Int_t globalTrackIndexStart = globalTrackIndex;

  Int_t stsTrackIndex  = fStsTracks->GetEntriesFast();
  Int_t muchTrackIndex = fMuchTracks->GetEntriesFast();
  Int_t trdTrackIndex  = fTrdTracks->GetEntriesFast();
  Int_t tofTrackIndex  = fTofTracks->GetEntriesFast();

  LOG(debug) << "Copy L1 tracks : " << L1->fvRecoTracks.size() << " tracks in L1";

  for (vector<CbmL1Track>::iterator it = L1->fvRecoTracks.begin(); it != L1->fvRecoTracks.end(); ++it) {
    CbmL1Track& T = *it;
    //BEGIN add global track
    new ((*fGlobalTracks)[globalTrackIndex]) CbmGlobalTrack();
    if (event) event->AddData(ECbmDataType::kGlobalTrack, globalTrackIndex);
    CbmGlobalTrack* t = L1_DYNAMIC_CAST<CbmGlobalTrack*>(fGlobalTracks->At(globalTrackIndex++));
    t->SetFlag(0);
    FairTrackParam fpar(*t->GetParamFirst()), lpar(*t->GetParamLast());
    CbmKFMath::CopyTC2TrackParam(&fpar, T.T, T.C);
    CbmKFMath::CopyTC2TrackParam(&lpar, T.TLast, T.CLast);
    t->SetParamFirst(&fpar);
    t->SetParamLast(&lpar);
    t->SetChi2(T.chi2);
    //   t->SetLength(T.length);
    t->SetNDF(T.NDF);
    t->SetPidHypo(T.T[4] >= 0 ? 211 : -211);
    //     t->SetTime(T.Tpv[6]);
    //     t->SetTimeError(T.Cpv[20]);
    //END add global track
    //BEGIN create detector tracks if needed
    bool hasStsHits  = false;
    bool hasMuchHits = false;
    bool hasTrdHits  = false;
    bool hasTofHits  = false;
    for (vector<int>::iterator ih = it->Hits.begin(); ih != it->Hits.end(); ++ih) {
      const CbmL1HitId& h = L1->fvExternalHits[*ih];

      if (h.detId == 1 && hasStsHits == false) {
        hasStsHits         = true;
        CbmStsTrack* track = new ((*fStsTracks)[stsTrackIndex]) CbmStsTrack();
        t->SetStsTrackIndex(stsTrackIndex);
        if (event) event->AddData(ECbmDataType::kStsTrack, stsTrackIndex);
        CbmL1TrackToCbmStsTrack(T, track, h.detId);
        stsTrackIndex++;
      }
      if (h.detId == 2 && hasMuchHits == false) {
        hasMuchHits = true;

        CbmMuchTrack* track = new ((*fMuchTracks)[muchTrackIndex]) CbmMuchTrack();
        t->SetMuchTrackIndex(muchTrackIndex);
        if (event) event->AddData(ECbmDataType::kMuchTrack, muchTrackIndex);
        CbmL1TrackToCbmMuchTrack(T, track, h.detId);
        muchTrackIndex++;
      }
      if (h.detId == 3 && hasTrdHits == false) {
        hasTrdHits         = true;
        CbmTrdTrack* track = new ((*fTrdTracks)[trdTrackIndex]) CbmTrdTrack();
        t->SetTrdTrackIndex(trdTrackIndex);
        if (event) event->AddData(ECbmDataType::kTrdTrack, trdTrackIndex);
        CbmL1TrackToCbmTrdTrack(T, track, h.detId);
        trdTrackIndex++;
      }
      if (h.detId == 4 && hasTofHits == false) {
        hasTofHits         = true;
        CbmTofTrack* track = new ((*fTofTracks)[tofTrackIndex]) CbmTofTrack();

        t->SetTofTrackIndex(tofTrackIndex);

        if (event) event->AddData(ECbmDataType::kTofTrack, tofTrackIndex);
        CbmL1TrackToCbmTofTrack(T, track, h.detId);
        tofTrackIndex++;

        // if (event) event->AddData(ECbmDataType::kTofHit, h.hitId);
      }
    }
    //END create detector tracks if needed
  }
  return globalTrackIndex - globalTrackIndexStart;
}
// -------------------------------------------------------------------------


// -----   Public method CbmL1TrackToCbmTrack   ------------------------------------------
void CbmL1GlobalTrackFinder::CbmL1TrackToCbmTrack(CbmL1Track l1track, CbmTrack* track, int systemIdT)
{
  Int_t ndf = 0;

  CbmL1Track* T = &l1track;

  CbmL1* L1 = CbmL1::Instance();

  for (vector<int>::iterator ih = T->Hits.begin(); ih != T->Hits.end(); ++ih) {
    CbmL1HitId& h = L1->fvExternalHits[*ih];
    if (h.detId != systemIdT) continue;
  }
  ndf -= 5;
  if (ndf <= 0) ndf = 1;
  track->SetChiSq(T->chi2);
  track->SetNDF(ndf);
  //track->SetPreviousTrackId(T->GetPreviousTrackId());//???
  //track->SetFlag(T->GetQuality());//???

  FairTrackParam fpar(*track->GetParamFirst()), lpar(*track->GetParamLast());
  CbmKFMath::CopyTC2TrackParam(&fpar, T->T, T->C);
  CbmKFMath::CopyTC2TrackParam(&lpar, T->TLast, T->CLast);
}
// -------------------------------------------------------------------------

// -----   Public method CbmL1TrackToCbmStsTrack   ------------------------------------------
void CbmL1GlobalTrackFinder::CbmL1TrackToCbmStsTrack(CbmL1Track l1track, CbmStsTrack* track, int systemIdT)
{
  Int_t ndf = 0;

  CbmL1Track* T = &l1track;

  CbmL1* L1 = CbmL1::Instance();

  for (vector<int>::iterator ih = T->Hits.begin(); ih != T->Hits.end(); ++ih) {
    CbmL1HitId& h = L1->fvExternalHits[*ih];
    if (h.detId != systemIdT) continue;
    track->AddHit(h.hitId, kSTSHIT);
  }

  ndf -= 5;
  if (ndf <= 0) ndf = 1;


  track->SetFlag(0);
  track->SetChiSq(T->chi2);
  track->SetNDF(T->NDF);
  track->SetPidHypo(T->T[4] >= 0 ? 211 : -211);
  track->SetStartTime(T->Tpv[6]);
  track->SetStartTimeError(T->Cpv[20]);
  track->SetFirstHitTime(T->T[6]);
  track->SetFirstHitTimeError(T->C[20]);
  track->SetLastHitTime(T->TLast[6]);
  track->SetLastHitTimeError(T->CLast[20]);

  FairTrackParam fpar(*track->GetParamFirst()), lpar(*track->GetParamLast());
  CbmKFMath::CopyTC2TrackParam(&fpar, T->T, T->C);
  CbmKFMath::CopyTC2TrackParam(&lpar, T->TLast, T->CLast);
}
// -------------------------------------------------------------------------

// -----   Public method CbmL1TrackToCbmMuchTrack   ------------------------------------------
void CbmL1GlobalTrackFinder::CbmL1TrackToCbmMuchTrack(CbmL1Track l1track, CbmMuchTrack* track, int systemIdT)
{
  Int_t ndf = 0;

  CbmL1Track* T = &l1track;

  CbmL1* L1 = CbmL1::Instance();

  for (vector<int>::iterator ih = T->Hits.begin(); ih != T->Hits.end(); ++ih) {
    CbmL1HitId& h = L1->fvExternalHits[*ih];
    if (h.detId != systemIdT) continue;
    track->AddHit(h.hitId, kMUCHPIXELHIT);
  }
  ndf -= 5;
  if (ndf <= 0) ndf = 1;

  track->SetChiSq(T->chi2);
  track->SetNDF(ndf);
  //track->SetPreviousTrackId(T->GetPreviousTrackId());//???
  //track->SetFlag(T->GetQuality());//???

  FairTrackParam fpar(*track->GetParamFirst()), lpar(*track->GetParamLast());
  CbmKFMath::CopyTC2TrackParam(&fpar, T->T, T->C);
  CbmKFMath::CopyTC2TrackParam(&lpar, T->TLast, T->CLast);
}
// -------------------------------------------------------------------------

// -----   Public method CbmL1TrackToCbmTrdTrack   ------------------------------------------
void CbmL1GlobalTrackFinder::CbmL1TrackToCbmTrdTrack(CbmL1Track l1track, CbmTrdTrack* track, int systemIdT)
{
  Int_t ndf = 0;

  CbmL1Track* T = &l1track;

  CbmL1* L1 = CbmL1::Instance();

  for (vector<int>::iterator ih = T->Hits.begin(); ih != T->Hits.end(); ++ih) {
    CbmL1HitId& h = L1->fvExternalHits[*ih];
    if (h.detId != systemIdT) continue;
    track->AddHit(h.hitId, kTRDHIT);
  }
  ndf -= 5;
  if (ndf <= 0) ndf = 1;


  track->SetChiSq(T->chi2);
  track->SetNDF(ndf);
  //track->SetPreviousTrackId(T->GetPreviousTrackId());//???
  //track->SetFlag(T->GetQuality());//???

  FairTrackParam fpar(*track->GetParamFirst()), lpar(*track->GetParamLast());
  CbmKFMath::CopyTC2TrackParam(&fpar, T->Tpv, T->Cpv);
  CbmKFMath::CopyTC2TrackParam(&lpar, T->TLast, T->CLast);
}
// -------------------------------------------------------------------------

// -----   Public method CbmL1TrackToCbmTofTrack   ------------------------------------------
void CbmL1GlobalTrackFinder::CbmL1TrackToCbmTofTrack(CbmL1Track l1track, CbmTofTrack* track, int systemIdT)
{
  Int_t ndf = 0;

  CbmL1Track* T = &l1track;

  CbmL1* L1 = CbmL1::Instance();

  for (vector<int>::iterator ih = T->Hits.begin(); ih != T->Hits.end(); ++ih) {
    CbmL1HitId& h = L1->fvExternalHits[*ih];
    if (h.detId != systemIdT) continue;
    track->AddHit(h.hitId, kTOFHIT);
  }
  ndf -= 5;
  if (ndf <= 0) ndf = 1;

  //track->SetChiSq(T->chi2);
  //track->SetNDF(ndf);
  //track->SetPreviousTrackId(T->GetPreviousTrackId());//???
  //track->SetFlag(T->GetQuality());//???

  //FairTrackParam fpar(*track->GetParamFirst()), lpar(*track->GetParamLast());
  //CbmKFMath::CopyTC2TrackParam(&fpar, T->T, T->C);
  //CbmKFMath::CopyTC2TrackParam(&lpar, T->TLast, T->CLast);
}
// -------------------------------------------------------------------------

// -----   Public method DoFind   ------------------------------------------
Int_t CbmL1GlobalTrackFinder::DoFind()
{

  if (!fTracks) {
    LOG(error) << "-E- CbmL1GlobalTrackFinder::DoFind: "
               << "Track array missing! ";
    return -1;
  }

  CbmL1* L1 = CbmL1::Instance();
  if (!L1) return 0;

  L1->Reconstruct();
  int ntracks = CopyL1Tracks();

  return ntracks;
}
// -------------------------------------------------------------------------


// -----   Track finding in one event   ------------------------------------
Int_t CbmL1GlobalTrackFinder::FindTracks(CbmEvent* event)
{

  CbmL1* l1 = CbmL1::Instance();
  if (!l1) return 0;

  l1->Reconstruct(event);
  int nTracks = CopyL1Tracks(event);

  return nTracks;
}
// -------------------------------------------------------------------------


// -------------------------------------------------------------------------
void CbmL1GlobalTrackFinder::SetDefaultParticlePDG(int pdg)
{
  /// set a default particle mass for the track fit
  /// it is used during reconstruction for the multiple scattering estimation
  CbmL1* l1 = CbmL1::Instance();
  if (!l1 || !l1->fpAlgo) {
    LOG(fatal) << "L1 instance doesn't exist or is not initialised";
    return;
  }
  auto* p = TDatabasePDG::Instance()->GetParticle(pdg);
  if (!p) {
    LOG(fatal) << "Particle with pdg " << pdg << " doesn't exist";
    return;
  }
  l1->fpAlgo->SetDefaultParticleMass(p->Mass());
}