-
Sergey Gorbunov authoredSergey Gorbunov authored
CbmL1CATrdTrackFinderSA.cxx 95.34 KiB
/* Copyright (C) 2006-2021 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
SPDX-License-Identifier: GPL-3.0-only
Authors: Sergey Gorbunov, Denis Bertini [committer] */
// -----------------------------------------------------------------------
// ----- CbmL1CATrdTrackFinderSA -----
// ----- Created 2/12/2006 by A. Bubak & M. Krauze -----
// -----------------------------------------------------------------------
#include "CbmL1CATrdTrackFinderSA.h"
#include "CbmGeoTrdPar.h"
#include "CbmKF.h"
#include "CbmKFTrack.h"
#include "CbmKFTrdHit.h"
#include "CbmL1.h"
#include "CbmL1TrdTracklet.h"
#include "CbmL1TrdTracklet4.h"
#include "CbmMCTrack.h"
#include "CbmStsTrack.h"
#include "CbmTrdHit.h"
#include "CbmTrdPoint.h"
#include "CbmTrdTrack.h"
#include "CbmTrdTrackFitterKF.h"
#include "CbmVertex.h"
#include "FairBaseParSet.h"
#include "FairDetector.h"
#include "FairGeoNode.h"
#include "FairMCPoint.h"
#include "FairRootManager.h"
#include "FairRunAna.h"
#include "FairRuntimeDb.h"
#include "TClonesArray.h"
#include "TH1F.h"
#include "TH2F.h"
#include "TLinearFitter.h"
#include <iostream>
#include <list>
#include <map>
#include <vector>
#include <cmath>
#include "L1Def.h"
using std::cout;
using std::endl;
using std::fabs;
using std::map;
using std::pair;
using std::set;
using std::vector;
//#include "L1CATrdDraw.h"
ClassImp(CbmL1CATrdTrackFinderSA);
CbmL1CATrdTrackFinderSA* CbmL1CATrdTrackFinderSA::fInstance = 0;
// ----------------------- Default constructor ---------------------------
CbmL1CATrdTrackFinderSA::CbmL1CATrdTrackFinderSA()
: geoLayer()
, fNTrdHits(0)
, fNoTrdStations(0)
, fNoTrdPerStation(0)
, planeHits()
, fivTrdHitArr()
, fArrayTrdHit(new TClonesArray("CbmTrdHit"))
, fArrayTrdTrack(new TClonesArray("CbmTrdTrack"))
, TrdPar(0)
, fEvents(0)
, fNofEvents(0)
, fMCTrackArray(0)
, fMCPointArray(0)
, trdTrackFitterKF(new CbmTrdTrackFitterKF(1, 11))
, fVerbose(1)
,
fvTempArray()
, fvFoundTracks()
, tempTrack()
,
iStation1()
, iStation2()
, fImapSt1()
, fImapSt2()
, itTrackletsLeft()
, itTrackletsRight()
,
iHitMap1(0)
, iHitMap2(0)
, iHitMapY1(0)
, iHitMapY2(0)
, fTrd13_Z(0)
, fTrd14_Z(0)
, fTrd21_Z(0)
, fTrd24_Z(0)
, fTrd31_Z(0)
, fKfTrack(0)
, createSegments()
, findNeighbour()
, createSPs()
, createSPs_SL()
, sortSPs()
, doFind()
, sortHits()
, tagTracks()
, createTracks()
, selectTracks()
, delTime()
, secondLoopTime()
, refittingKF()
, thirdLoopTime()
, totCreateSegments(0)
, totFindNeighbour(0)
, totCreateSPs(0)
, totCreateSPs_SL(0)
, totSortSPs(0)
, totDoFind(0)
, totSortHits(0)
, totTagTracks(0)
, totCreateTracks(0)
, totDelTime(0)
, totSecondLoopTime(0)
, totThirdLoopTime(0)
, totSelectTracks(0)
, totRefittingKF(0)
, fh_chi2hit(0)
, fh_chi2hit_plane(0)
, fDistLongX(0)
, fDistLongY(0)
, fDistShortX(0)
, fDistShortY(0)
, fDistLongBX(0)
, fDistLongBY(0)
, fDistShortBX(0)
, fDistShortBY(0)
, fDistY12(0)
, fMomDistLongPrimaryX(0)
, fMomDistLongPrimaryY(0)
, fMomDistLongExtraX(0)
, fMomDistLongExtraY(0)
, fMomDistExtrapolPrimaryX(0)
, fMomDistExtrapolPrimaryY(0)
, fMomDistExtrapolExtraX(0)
, fMomDistExtrapolExtraY(0)
, fMomDistShortPrimaryX(0)
, fMomDistShortPrimaryY(0)
, fMomDistShortExtraX(0)
, fMomDistShortExtraY(0)
, fDistY(0)
, fDistX(0)
, fPlane1Ydens(0)
, fPlane5Ydens(0)
, fPlane9Ydens(0)
, fSPlength(0)
, fSPlengthMC(0)
, fYat0(0)
, fYat0MC(0)
, fNoEvTime(0)
, fh_SP_xDiff_MC(0)
, fh_SP_yDiff_MC(0)
, fh_SP_xDiff_nMC(0)
, fh_SP_yDiff_nMC(0)
, fUsedHitsPerPlane(0)
, fUnUsedHitsPerPlane(0)
, fRUsedHits()
, fRUnUsedHits()
, fTotHits()
{
if (!fInstance) fInstance = this;
}
// -----------------------------------------------------------------------
// --------------------------- Destructor --------------------------------
CbmL1CATrdTrackFinderSA::~CbmL1CATrdTrackFinderSA()
{
delete fArrayTrdHit;
delete fArrayTrdTrack;
delete trdTrackFitterKF;
// delete fKfTrack;
if (fInstance == this) fInstance = 0;
}
// -----------------------------------------------------------------------
// ------------------------- Initialisation ------------------------------
void CbmL1CATrdTrackFinderSA::Init()
{
// Create histogramms
CreateHistogramms();
// Activate data branches
DataBranches();
FairRootManager* ioman = FairRootManager::Instance();
if (!ioman) {
cout << "-E- CbmL1CATrdTrackFinderSA::Init: "
<< "RootManager not instantised!" << endl;
return;
}
// Get MCTrack array
fMCTrackArray = L1_DYNAMIC_CAST<TClonesArray*>(ioman->GetObject("MCTrack"));
if (!fMCTrackArray) {
cout << "-E- CbmL1CATrdTrackFinderSA::Init: No MCTrack array!" << endl;
return;
}
// Get MCPoint array
fMCPointArray = L1_DYNAMIC_CAST<TClonesArray*>(ioman->GetObject("TrdPoint"));
if (!fMCPointArray) {
cout << "-E- CbmL1CATrdTrackFinderSA::Init: No MCPoint array!" << endl;
return;
}
// Determine the TRD layout
TrdLayout();
// Init KF Track fitter
trdTrackFitterKF->Init();
}
// -----------------------------------------------------------------------
// -------------------- Algorithm implementation -------------------------
Int_t CbmL1CATrdTrackFinderSA::DoFind(TClonesArray* hitArray, TClonesArray* trackArray)
{
#ifdef DRAW
InitL1Draw();
#endif
fArrayTrdHit = hitArray;
fArrayTrdTrack = trackArray;
fNofEvents++;
doFind.Start();
// Initialize control counters
// Int_t nNoTrdPoint = 0;
Int_t nNoTrdHit = 0;
Int_t trdPlaneID = 0;
Int_t ptIndex = 0;
Int_t noHitsPerTracklet = 4;
// Create pointers to TRD hit and TrdPoint
CbmTrdHit* pHit = NULL;
CbmTrdPoint* pMCpt = NULL;
// CbmMCTrack* pMCtr = NULL;
//--- Function: CreateSpacePoint --------------------------------------
Double_t // b
sigmaA_FL = 2, //3 3 3 2.5 2.5
sigmaB_FL = 2, //3 3 3 2.5 2.5
sigmaA_SL = 3, //4 4 4 3 3
sigmaB_SL = 3, //4 4 4 3 3
sigmaA_TL = 4, //4 4 4 4 4
sigmaB_TL = 4; //4 4 4 4 4
//--- Function: CreateSegments; Data from MC, look inside function ----
Double_t dY_FL = 0.3, //0.5 0.5 0.5 0.4 0.4
dX_FL = 0.3, //0.5 0.5 0.5 0.4 0.4
dY_SL = 0.5, //0.7 0.6 0.8 0.6 0.6
dX_SL = 0.5, //0.8 0.8 0.8 0.6 0.6
dY_TL = 0.7, //0.7 0.6 0.8 0.7 0.8
dX_TL = 0.7; //0.8 0.8 0.8 0.7 0.8
//--- Function: FindNeighbour ------------------------------------------
//distance from Y-propagated point, around which we look for neighbours
Double_t distPropLongY_FL = 2.5, //3 3 3 3 2
distPropLongX_FL = 2.5, //3 3 3 3 2
distPropLongY_SL = 3, //4 4 4 3 3
distPropLongX_SL = 3, //8 6 8 3 3
distPropLongY_TL = 4, //4 4 4 3 4
distPropLongX_TL = 4; //8 6 8 3 4
//----------------------------------------------------------------------
Bool_t competition = true;
Bool_t removeUsedHits = true;
Bool_t secondLoop = true;
Bool_t thirdLoop = true;
Int_t segment = 0; //0 = long tracks, 1 = segments only
//Int_t nrLoop = 1;
//---- Simulate detector inefficiency -----------------------------------
Int_t accept = 100;
set<Int_t> globalSetRejectedHits;
globalSetRejectedHits.clear();
//----------------------------------------------------------------------
sortHits.Start();
//--- hit sorting procedure ------------------------------------------------
Int_t nTrdHit = hitArray->GetEntriesFast();
for (Int_t iHit = 0; iHit < nTrdHit; iHit++) {
// Loop over hits. Get corresponding MCPoint and MCTrack index
pHit = L1_DYNAMIC_CAST<CbmTrdHit*>(hitArray->At(iHit));
if (!Rejection(accept)) {
// Simulate detector inefficiency
globalSetRejectedHits.insert(iHit);
continue;
}
if (!pHit) {
cout << "-E- CbmL1CATrdTrackFinderSA::DoFind: Empty slot "
<< "in HitArray at position " << iHit << endl;
nNoTrdHit++;
continue;
}
ptIndex = pHit->GetRefId();
//if (ptIndex < 0) continue; // fake or background hit
pMCpt = L1_DYNAMIC_CAST<CbmTrdPoint*>(fMCPointArray->At(ptIndex));
//if (!pMCpt) {
// nNoTrdPoint++;
// continue;
//}
// pMCtr = L1_DYNAMIC_CAST<CbmMCTrack*>(fMCTrackArray->At(pMCpt->GetTrackID()));
//if ( ! pMCtr ) continue;
trdPlaneID = pHit->GetPlaneId();
Int_t trdPlaneIDN = trdPlaneID - 1;
planeHits.mcTrackID = pMCpt->GetTrackID();
planeHits.hitIndex = iHit;
planeHits.X = pHit->GetX();
planeHits.Y = pHit->GetY();
planeHits.Z = pHit->GetZ();
planeHits.DX = pHit->GetDx();
planeHits.DY = pHit->GetDy();
planeHits.planeID = trdPlaneID;
fvTrdHitArr[trdPlaneIDN].push_back(planeHits);
// cout << "geoLayer: " <<geoLayer.Y[trdPlaneID] <<", "<< geoLayer.Z[trdPlaneID] << endl;
//ptIndex = pHit->GetRefIndex();
//pMCpt = (CbmTrdPoint*) (fMCPointArray->At(ptIndex));
//planeHits.hitIndex = ptIndex;
//planeHits.X = pMCpt->GetX();
//planeHits.Y = pMCpt->GetY();
//planeHits.Z = pMCpt->GetZ();
//planeHits.DX = 0;
//planeHits.DY = 0;;
//fvTrdPointArr[trdPlaneIDN].push_back(planeHits);
}
for (Int_t i = 0; i < 12; i++) {
sort(fvTrdHitArr[i].begin(), fvTrdHitArr[i].end(), CompareY);
}
/*
//-----------------------------------------------------------
vector <LayerWithHits>::iterator ivT;
LayerWithHits pl;
for(ivT = fvTrdHitArr[0].begin();
ivT != fvTrdHitArr[0].end();
ivT++){
pl = (*ivT);
cout <<"(X:Y) "<<pl.X<<"\t"<< pl.Y << endl;
fPlane1Ydens->Fill(pl.Y);
}
for(ivT = fvTrdHitArr[5].begin();
ivT != fvTrdHitArr[5].end();
ivT++){
pl = (*ivT);
// cout << pl.Y << endl;
fPlane5Ydens->Fill(pl.Y);
}
for(ivT = fvTrdHitArr[9].begin();
ivT != fvTrdHitArr[9].end();
ivT++){
pl = (*ivT);
// cout << pl.Y << endl;
fPlane9Ydens->Fill(pl.Y);
}
//-----------------------------------------------------------
*/
sortHits.Stop();
if (fVerbose > 2) {
cout << "-I- CbmL1CATrdTrackFinderSA::DoFind " << endl;
for (Int_t i = 0; i < 12; i++) {
cout << " Size of vector " << i << ": " << fvTrdHitArr[i].size() << endl;
}
}
//create vectors that will hold the tracklet (4-hit) objects
vector<CbmL1TrdTracklet4*> clTracklets[3];
vector<CbmL1TrdTracklet4*> clTrackletsNew[3];
//create vectors that will hold the mini-tracklet (2-hit) objects - Space Points
vector<CbmL1TrdTracklet*> clSpacePoints[6];
if (noHitsPerTracklet == 4) { //noHitsPerTracklet == 4
//------ creation of mini tracklet 1-2 -------------------------------------
cout << endl
<< "-I- CbmL1CATrdTrackFinderSA::DoFind " << endl
<< "--------------------------------------------------" << endl
<< " ### Start creation of Space Points" << endl
<< "--------------------------------------------------" << endl;
createSPs.Start();
for (Int_t i = 0, j = 0; i < 6; i++, j = j + 2) {
CreateSpacePoints(fvTrdHitArr[j], fvTrdHitArr[j + 1], clSpacePoints[i], sigmaA_FL, sigmaB_FL);
}
createSPs.Stop();
//------- Sorting spacepoints -------------------------------------------------
sortSPs.Start();
for (Int_t i = 0; i < 6; i++) {
sort(clSpacePoints[i].begin(), clSpacePoints[i].end(), CbmL1TrdTracklet::Compare1);
}
sortSPs.Stop();
// --------------- Creation tracklet from 4 space points ----------------
cout << endl
<< "-I- CbmL1CATrdTrackFinderSA::DoFind " << endl
<< "--------------------------------------------------" << endl
<< " ### Start creation tracklets" << endl
<< "--------------------------------------------------" << endl;
createSegments.Start();
//joining SP together to create 4-hit tracklets
for (Int_t i = 0, j = 0; i < 3; i++, j = j + 2) {
CreateSegments(clSpacePoints[j], clSpacePoints[j + 1], clTracklets[i], dX_FL, dY_FL);
}
createSegments.Stop();
//--- TESTING -------------------------------
/* How many segments have 4 hits belonging to the same track (has the same trackID)*/
/*
vector<CbmL1TrdTracklet4*>::iterator itclTrackletsRight;
vector<CbmL1TrdTracklet4*>::iterator iTrackletT;
Int_t iSumSegment = 0;
CbmTrdHit *trdHit;
CbmTrdPoint* trdPoint;
for(int i = 0; i < 3; i++){
Double_t clSegmentSize = clTracklets[i].size();
cout <<"Tracklet size: "<< clSegmentSize << endl;
iSumSegment = 0;
for(iTrackletT = clTracklets[i].begin();
iTrackletT != clTracklets[i].end();
iTrackletT++){
Int_t k = 0;
Int_t Ind0 = (*iTrackletT)->GetInd(0);
trdHit = L1_DYNAMIC_CAST<CbmTrdHit*>( hitArray->At(Ind0);
trdPoint = (CbmTrdPoint*) fMCPointArray->At(trdHit->GetRefIndex());
Double_t trackID1 = trdPoint->GetTrackID();
for(int iw = 1; iw < 4; iw++){
Int_t Ind1 = (*iTrackletT)->GetInd(iw);
trdHit = L1_DYNAMIC_CAST<CbmTrdHit*>( hitArray->At(Ind1);
trdPoint = (CbmTrdPoint*) fMCPointArray->At(trdHit->GetRefIndex());
Double_t trackID2 = trdPoint->GetTrackID();
if(trackID1 == trackID2) k++;
}
if(k == 3){
iSumSegment++;
}
}
Double_t sumSegmentWith4 = (iSumSegment*100)/clSegmentSize;
//printf("(size %f, %i, %f)\n", clSegmentSize, iSumSegment, sumSegmentWith4);
}
//---------------------------------------------
*/
//---------- BEGIN: Find friend ------------------------------------------------
findNeighbour.Start();
cout << "--- Finding neighbour 14-58" << endl;
FindNeighbour(clTracklets[0], clTracklets[1], distPropLongX_FL, distPropLongY_FL);
cout << "--- Finding neighbour 58-912" << endl;
FindNeighbour(clTracklets[1], clTracklets[2], distPropLongX_FL, distPropLongY_FL);
findNeighbour.Stop();
} //end of noHitsPerTracklet == 4
//###################################################################################################
cout << endl
<< "-I- CbmL1CATrdTrackFinderSA::DoFind " << endl
<< "--------------------------------------------------" << endl
<< " ### (FL) in Event No. " << fNofEvents << " ###" << endl
<< "--------------------------------------------------" << endl;
if (fVerbose > 2) {
cout << "size of segment vector 14 = " << clTracklets[0].size() << endl
<< "size of segment vector 58 = " << clTracklets[1].size() << endl
<< "size of segment vector 912 = " << clTracklets[2].size() << endl;
}
if (fVerbose > 1)
cout << "-I- CbmL1CATrdTrackFinderSA::DoFind " << endl
<< "Tracklet finding phase completed." << endl
<< "Now constructing tracks from tracklets..." << endl;
tagTracks.Start();
if (noHitsPerTracklet == 4) { //noHitsPerTracklet == 4
//BEGIN: Tagging procedure ------------------------------------------------------
cout << endl
<< "-I- CbmL1CATrdTrackFinderSA::DoFind " << endl
<< "--------------------------------------------------" << endl
<< " ### Starting tagging procedure" << endl
<< "--------------------------------------------------" << endl;
TagSegments(clTracklets[1], clTracklets[2], 1);
cout << "--- Tagging 58-921 done." << endl;
TagSegments(clTracklets[0], clTracklets[1], 0);
cout << "--- Tagging 14-58 done." << endl;
} //end of noHitsPerTracklet == 4
tagTracks.Stop();
//-------------------------------------------------------------------------
//--------------------------------------------------------------------------------------
// Counting number of segments which have a value of 4, 3, 2, ... etc.
CbmL1TrdTracklet4* clSegRight; //segment nearer to the target
map<Int_t, Int_t> segValues14;
map<Int_t, Int_t> segValues58;
map<Int_t, Int_t> segValues912;
Int_t segValue;
vector<CbmL1TrdTracklet4*>::iterator itclTrackletsRight;
//for tracklets in the 1st station
for (itclTrackletsRight = clTracklets[0].begin(); itclTrackletsRight != clTracklets[0].end(); itclTrackletsRight++) {
clSegRight = *itclTrackletsRight;
segValue = clSegRight->GetVal();
segValues14[segValue]++;
if (segValue == 3) clTrackletsNew[0].push_back(clSegRight);
}
//for tracklets in the 2nd station
for (itclTrackletsRight = clTracklets[1].begin(); itclTrackletsRight != clTracklets[1].end(); itclTrackletsRight++) {
clSegRight = *itclTrackletsRight;
segValue = clSegRight->GetVal();
segValues58[segValue]++;
if (segValue == 2) clTrackletsNew[1].push_back(clSegRight);
}
//for tracklets in the 3rd station
for (itclTrackletsRight = clTracklets[2].begin(); itclTrackletsRight != clTracklets[2].end(); itclTrackletsRight++) {
clSegRight = *itclTrackletsRight;
segValue = clSegRight->GetVal();
segValues912[segValue]++;
if (segValue == 1) clTrackletsNew[2].push_back(clSegRight);
}
//--- For test only ----------------------------------------------------
if (fVerbose > 0) {
map<Int_t, Int_t>::iterator mIt;
cout << "--- Map no. 14 has: " << endl;
for (mIt = segValues14.begin(); mIt != segValues14.end(); mIt++) {
cout << mIt->first << " segment has a count of " << mIt->second << endl;
}
cout << "--- Map no. 58 has: " << endl;
for (mIt = segValues58.begin(); mIt != segValues58.end(); mIt++) {
cout << mIt->first << " segment has a count of " << mIt->second << endl;
}
cout << "--- Map no. 912 has: " << endl;
for (mIt = segValues912.begin(); mIt != segValues912.end(); mIt++) {
cout << mIt->first << " segment has a count of " << mIt->second << endl;
}
cout << endl;
}
//-------------------------------------------------------------------------
//vector<CbmTrdTrack*> vTrdTrackCand;
//vector<CbmTrdTrack*> vTempTrdTrackCand;
//vector<CbmTrdTrack*>::iterator ivTempTrdTrackCand;
//vector<CbmTrdTrack*> trackCand1;
cout << "--------------------------------------------------" << endl
<< " ### Starting creating the tracks " << endl
<< "--------------------------------------------------" << endl;
createTracks.Start();
set<Int_t> globalSetUsedHits;
globalSetUsedHits.clear();
if (segment == 0) { //segment == 0 -> we create long tracks
if (fVerbose > 2) {
cout << "Outer area: " << endl
<< "--- size of fArrayTrdTrack = " << fArrayTrdTrack->GetEntriesFast() << endl
<< "--- size of globalSetUsedHits = " << globalSetUsedHits.size() << endl;
}
//create long tracks from 3 sorts of tracklets - station 1,2,3
CreateTracks(clTracklets[0], clTracklets[1], clTracklets[2], globalSetUsedHits, removeUsedHits, competition, 1);
createTracks.Stop();
//clearing and removing objects that are not needed anymore
for (Int_t i = 0; i < 3; i++) {
DeleteTracklets(clTracklets[i]);
clTracklets[i].clear();
}
//----------------------------------------------------
for (Int_t i = 0; i < 6; i++) {
DeleteTracklets(clSpacePoints[i]);
clSpacePoints[i].clear();
}
//--- [Second Loop] ------------------------------------------------------
secondLoopTime.Start();
cout << endl
<< "-I- CbmL1CATrdTrackFinderSA::DoFind (Second loop)" << endl
<< "--------------------------------------------------" << endl
<< " ### (SL) in Event No. " << fNofEvents << " ###" << endl
<< "--------------------------------------------------" << endl;
if (secondLoop) {
for (Int_t i = 0; i < 12; i++) {
fvTrdHitArr[i].clear();
}
set<Int_t>::iterator iglobalSetUsedHits;
set<Int_t>::iterator iglobalSetRejectedHits;
for (Int_t iHit = 0; iHit < nTrdHit; iHit++) {
pHit = L1_DYNAMIC_CAST<CbmTrdHit*>(hitArray->At(iHit));
// if(!Rejection(accept)) continue;
if (!pHit) {
cout << "-E- CbmL1CATrdTrackFinderSA::DoFind: Empty slot "
<< "in HitArray at position " << iHit << endl;
nNoTrdHit++;
continue;
}
//---- Simulate detector inefficiency -----------------------------------
iglobalSetRejectedHits = globalSetRejectedHits.find(iHit);
if (iglobalSetRejectedHits != globalSetRejectedHits.end()) continue;
//----------------------------------------------------------------------
iglobalSetUsedHits = globalSetUsedHits.find(iHit);
if (iglobalSetUsedHits != globalSetUsedHits.end()) continue;
trdPlaneID = pHit->GetPlaneId();
Int_t trdPlaneIDN = trdPlaneID - 1;
planeHits.mcTrackID = pMCpt->GetTrackID();
planeHits.hitIndex = iHit;
planeHits.X = pHit->GetX();
planeHits.Y = pHit->GetY();
planeHits.Z = pHit->GetZ();
planeHits.DX = pHit->GetDx();
planeHits.DY = pHit->GetDy();
fvTrdHitArr[trdPlaneIDN].push_back(planeHits);
}
for (Int_t i = 0; i < 12; i++) {
sort(fvTrdHitArr[i].begin(), fvTrdHitArr[i].end(), CompareY);
}
//for(Int_t i = 0; i < 12; i++){
// cout <<" Size of vector "<< i <<": "<< fvTrdHitArr[i].size() << endl;
//}
//--------------------------------------------------------------------------------------
createSPs_SL.Start();
//performing second step - make all previous tasks but with less restrictive conditions
cout << "[Second Loop]::Creating space points" << endl;
for (Int_t i = 0, j = 0; i < 6; i++, j = j + 2) {
CreateSpacePoints(fvTrdHitArr[j], fvTrdHitArr[j + 1], clSpacePoints[i], sigmaA_SL, sigmaB_SL);
}
createSPs_SL.Stop();
for (Int_t i = 0; i < 6; i++) {
sort(clSpacePoints[i].begin(), clSpacePoints[i].end(), CbmL1TrdTracklet::Compare1);
}
cout << "[Second Loop]::Creating tracklets" << endl;
for (Int_t i = 0, j = 0; i < 3; i++, j = j + 2) {
CreateSegments(clSpacePoints[j], clSpacePoints[j + 1], clTracklets[i], dX_SL, dY_SL);
}
if (fVerbose > 2) {
cout << "--- size of segment vector 14 = " << clTracklets[0].size() << endl
<< "--- size of segment vector 58 = " << clTracklets[1].size() << endl
<< "--- size of segment vector 912 = " << clTracklets[2].size() << endl;
}
cout << "[Second Loop]::Finding friends 14-58" << endl;
FindNeighbour(clTracklets[0], clTracklets[1], distPropLongX_SL, distPropLongY_SL);
cout << "[Second Loop]::Finding friends 58-912" << endl;
FindNeighbour(clTracklets[1], clTracklets[2], distPropLongX_SL, distPropLongY_SL);
cout << "[Second Loop]::Tagging segments 58-912" << endl;
TagSegments(clTracklets[1], clTracklets[2], 1);
//--------------------------------------------------------------------------------------------
cout << "[Second Loop]::Tagging segments 14-58" << endl;
TagSegments(clTracklets[0], clTracklets[1], 0);
//--------------------------------------------------------------------------------------------
cout << "[Second Loop]::Creating tracks" << endl;
CreateTracks(clTracklets[0], clTracklets[1], clTracklets[2], globalSetUsedHits, removeUsedHits, competition, 2);
//competition -> selects the best track candidate from each branch
}
for (Int_t i = 0; i < 3; i++) {
DeleteTracklets(clTracklets[i]);
clTracklets[i].clear();
}
for (Int_t i = 0; i < 6; i++) {
DeleteTracklets(clSpacePoints[i]);
clSpacePoints[i].clear();
}
secondLoopTime.Stop();
thirdLoopTime.Start();
cout << endl
<< "-I- CbmL1CATrdTrackFinderSA::DoFind (Third loop)" << endl
<< "--------------------------------------------------" << endl
<< " ### (TL) in Event No. " << fNofEvents << " ###" << endl
<< "--------------------------------------------------" << endl;
if (thirdLoop) {
for (Int_t i = 0; i < 12; i++) {
fvTrdHitArr[i].clear();
}
set<Int_t>::iterator iglobalSetUsedHits;
set<Int_t>::iterator iglobalSetRejectedHits;
for (Int_t iHit = 0; iHit < nTrdHit; iHit++) {
pHit = L1_DYNAMIC_CAST<CbmTrdHit*>(hitArray->At(iHit));
// if(!Rejection(accept)) continue;
if (!pHit) {
cout << "-E- CbmL1CATrdTrackFinderSA::DoFind: Empty slot "
<< "in HitArray at position " << iHit << endl;
nNoTrdHit++;
continue;
}
//---- Simulate detector inefficiency -----------------------------------
iglobalSetRejectedHits = globalSetRejectedHits.find(iHit);
if (iglobalSetRejectedHits != globalSetRejectedHits.end()) continue;
//----------------------------------------------------------------------
iglobalSetUsedHits = globalSetUsedHits.find(iHit);
if (iglobalSetUsedHits != globalSetUsedHits.end()) continue;
trdPlaneID = pHit->GetPlaneId();
Int_t trdPlaneIDN = trdPlaneID - 1;
planeHits.mcTrackID = pMCpt->GetTrackID();
planeHits.hitIndex = iHit;
planeHits.X = pHit->GetX();
planeHits.Y = pHit->GetY();
planeHits.Z = pHit->GetZ();
planeHits.DX = pHit->GetDx();
planeHits.DY = pHit->GetDy();
fvTrdHitArr[trdPlaneIDN].push_back(planeHits);
}
for (Int_t i = 0; i < 12; i++) {
sort(fvTrdHitArr[i].begin(), fvTrdHitArr[i].end(), CompareY);
}
for (Int_t i = 0, j = 0; i < 6; i++, j = j + 2) {
CreateSpacePoints(fvTrdHitArr[j], fvTrdHitArr[j + 1], clSpacePoints[i], sigmaA_TL, sigmaB_TL);
}
for (Int_t i = 0; i < 6; i++) {
sort(clSpacePoints[i].begin(), clSpacePoints[i].end(), CbmL1TrdTracklet::Compare1);
}
for (Int_t i = 0, j = 0; i < 3; i++, j = j + 2) {
CreateSegments(clSpacePoints[j], clSpacePoints[j + 1], clTracklets[i], dX_TL, dY_TL);
}
FindNeighbour(clTracklets[0], clTracklets[1], distPropLongX_TL, distPropLongY_TL);
FindNeighbour(clTracklets[1], clTracklets[2], distPropLongX_TL, distPropLongY_TL);
TagSegments(clTracklets[1], clTracklets[2], 1);
TagSegments(clTracklets[0], clTracklets[1], 0);
CreateTracks(clTracklets[0], clTracklets[1], clTracklets[2], globalSetUsedHits, removeUsedHits, competition, 3);
}
thirdLoopTime.Stop();
} //end segment == 0
if (segment == 1) { //segment == 1 -> we create only 4-hit, 1-segment tracks!
CreateAndManageSegments(clTracklets[0], clTracklets[1], clTracklets[2]);
}
//------ Used and Unused hists in the TRD's planes ------------------------
//------ Histogramming
set<Int_t>::iterator iglSetUsedHits;
nTrdHit = hitArray->GetEntriesFast();
for (Int_t iHit = 0; iHit < nTrdHit; iHit++) {
pHit = L1_DYNAMIC_CAST<CbmTrdHit*>(hitArray->At(iHit));
trdPlaneID = pHit->GetPlaneId();
fTotHits[trdPlaneID]++;
iglSetUsedHits = globalSetUsedHits.find(iHit);
if (iglSetUsedHits != globalSetUsedHits.end()) {
fRUsedHits[trdPlaneID]++;
//fUsedHitsPerPlane->Fill(trdPlaneID-1);
}
else {
fRUnUsedHits[trdPlaneID]++;
//fUnUsedHitsPerPlane->Fill(trdPlaneID-1);
}
}
//---------------------------------------------------------------------------
cout << endl
<< "-I- CbmL1CATrdTrackFinderSA::DoFind " << endl
<< "--------------------------------------------------" << endl
<< " ### Summary" << endl
<< "--------------------------------------------------" << endl
<< "--- Number of found tracks: " << fArrayTrdTrack->GetEntriesFast() << endl
<< endl;
delTime.Start();
cout << "\n-I- CbmL1CATrdTrackFinderSA::DoFind " << endl
<< "--------------------------------------------------" << endl
<< " ### Delete:Clear" << endl
<< "--------------------------------------------------" << endl;
for (Int_t i = 0; i < 12; i++) {
fvTrdHitArr[i].clear();
}
//----------------------------------------------------
for (Int_t i = 0; i < 3; i++) {
DeleteTracklets(clTracklets[i]);
clTracklets[i].clear();
}
//----------------------------------------------------
for (Int_t i = 0; i < 6; i++) {
DeleteTracklets(clSpacePoints[i]);
clSpacePoints[i].clear();
}
//----------------------------------------------------
//segValues14.clear();
//segValues58.clear();
//segValues912.clear();
delTime.Stop();
doFind.Stop();
//-------------------------------------------------------
#ifdef DRAW
fNTrdHits = hitArray->GetEntriesFast();
for (Int_t iHit = 0; iHit < fNTrdHits; iHit++) {
pHit = L1_DYNAMIC_CAST<CbmTrdHit*>( hitArray->At(iHit);
ptIndex = pHit->GetRefIndex();
pMCpt = (CbmTrdPoint*) (fMCPointArray->At(ptIndex));
// pMCtr = (CbmMCTrack*) fMCTrackArray->At(pMCpt->GetTrackID());
trdPlaneID = pHit->GetPlaneID();
Int_t trdPlaneIDN = trdPlaneID-1;
planeHits.mcTrackID = pMCpt->GetTrackID();
planeHits.hitIndex = iHit;
planeHits.X = pHit->GetX();
planeHits.Y = pHit->GetY();
planeHits.Z = pHit->GetZ();
planeHits.DX = pHit->GetDx();
planeHits.DY = pHit->GetDy();
planeHits.planeID = trdPlaneID;
fvTrdHitArr[trdPlaneIDN].push_back(planeHits);
}
Draw2();
DrawAsk();
for (Int_t i = 0; i < 12; i++) {
fvTrdHitArr[i].clear();
}
#endif
//-------------------------------------------------------
//-----------------------------------------------------------------
Double_t rtime;
Double_t ctime;
Double_t qtime = Double_t(fNofEvents);
cout << endl
<< "\n-I- CbmL1CATrdTrackFinderSA::DoFind " << endl
<< "--------------------------------------------------" << endl
<< " ### Time" << endl
<< "--------------------------------------------------" << endl;
cout << " Do find: ";
rtime = doFind.RealTime();
ctime = doFind.CpuTime();
totDoFind += ctime;
printf("RealTime=%4.2f s, CpuTime=%4.2f s, TotCpu=%4.2f s, %4.2f/event\n", rtime, ctime, totDoFind,
totDoFind / qtime);
cout << " Sort Hits: ";
rtime = sortHits.RealTime();
ctime = sortHits.CpuTime();
totSortHits += ctime;
printf("RealTime=%4.2f s, CpuTime=%4.2f s, TotCpu=%4.2f s, %4.2f/event\n", rtime, ctime, totSortHits,
totSortHits / qtime);
cout << " Create SPs: ";
rtime = createSPs.RealTime();
ctime = createSPs.CpuTime();
totCreateSPs += ctime;
printf("RealTime=%4.2f s, CpuTime=%4.2f s, TotCpu=%4.2f s, %4.2f/event\n", rtime, ctime, totCreateSPs,
totCreateSPs / qtime);
cout << " Sort SPs: ";
rtime = sortSPs.RealTime();
ctime = sortSPs.CpuTime();
totSortSPs += ctime;
printf("RealTime=%4.2f s, CpuTime=%4.2f s, TotCpu=%4.2f s, %4.2f/event\n", rtime, ctime, totSortSPs,
totSortSPs / qtime);
cout << " Create segments: ";
rtime = createSegments.RealTime();
ctime = createSegments.CpuTime();
totCreateSegments += ctime;
printf("RealTime=%4.2f s, CpuTime=%4.2f s, TotCpu=%4.2f s, %4.2f/event\n", rtime, ctime, totCreateSegments,
totCreateSegments / qtime);
cout << " Find friend: ";
rtime = findNeighbour.RealTime();
ctime = findNeighbour.CpuTime();
totFindNeighbour += ctime;
printf("RealTime=%4.2f s, CpuTime=%4.2f s, TotCpu=%4.2f s, %4.2f/event\n", rtime, ctime, totFindNeighbour,
totFindNeighbour / qtime);
cout << " Tag Tracklets: ";
rtime = tagTracks.RealTime();
ctime = tagTracks.CpuTime();
totTagTracks += ctime;
printf("RealTime=%4.2f s, CpuTime=%4.2f s, TotCpu=%4.2f s, %4.2f/event\n", rtime, ctime, totTagTracks,
totTagTracks / qtime);
cout << " Create Tracks: ";
rtime = createTracks.RealTime();
ctime = createTracks.CpuTime();
totCreateTracks += ctime;
printf("RealTime=%4.2f s, CpuTime=%4.2f s, TotCpu=%4.2f s, %4.2f/event\n", rtime, ctime, totCreateTracks,
totCreateTracks / qtime);
cout << "Refitting Tracks: ";
rtime = refittingKF.RealTime();
ctime = refittingKF.CpuTime();
totRefittingKF += ctime;
printf("RealTime=%4.2f s, CpuTime=%4.2f s, TotCpu=%4.2f s, %4.2f/event\n", rtime, ctime, totRefittingKF,
totRefittingKF / qtime);
cout << " Second Loop: ";
rtime = secondLoopTime.RealTime();
ctime = secondLoopTime.CpuTime();
totSecondLoopTime += ctime;
printf("RealTime=%4.2f s, CpuTime=%4.2f s, TotCpu=%4.2f s, %4.2f/event\n", rtime, ctime, totSecondLoopTime,
totSecondLoopTime / qtime);
cout << " Third Loop: ";
rtime = thirdLoopTime.RealTime();
ctime = thirdLoopTime.CpuTime();
totThirdLoopTime += ctime;
printf("RealTime=%4.2f s, CpuTime=%4.2f s, TotCpu=%4.2f s, %4.2f/event\n", rtime, ctime, totThirdLoopTime,
totThirdLoopTime / qtime);
cout << "Deleting Objects: ";
rtime = delTime.RealTime();
ctime = delTime.CpuTime();
totDelTime += ctime;
printf("RealTime=%4.2f s, CpuTime=%4.2f s, TotCpu=%4.2f s, %4.2f/event\n", rtime, ctime, totDelTime,
totDelTime / qtime);
cout << "[Second Loop]" << endl;
cout << " Create SPs: ";
rtime = createSPs_SL.RealTime();
ctime = createSPs_SL.CpuTime();
totCreateSPs_SL += ctime;
printf("RealTime=%4.2f s, CpuTime=%4.2f s, TotCpu=%4.2f s, %4.2f/event\n", rtime, ctime, totCreateSPs_SL,
totCreateSPs_SL / qtime);
cout << endl
<< "-I- CbmL1CATrdTrackFinderSA::DoFind " << endl
<< "--------------------------------------------------" << endl
<< " ### END: Track constructing phase completed" << endl
<< "--------------------------------------------------" << endl;
fNoEvTime->Fill(fArrayTrdTrack->GetEntriesFast(), doFind.RealTime());
return 1;
}
// -----------------------------------------------------------------------
void CbmL1CATrdTrackFinderSA::DeleteTracklets(vector<CbmL1TrdTracklet4*> vect)
{
vector<CbmL1TrdTracklet4*>::iterator it;
for (it = vect.begin(); it != vect.end(); it++) {
delete (*it);
}
}
// -----------------------------------------------------------------------
void CbmL1CATrdTrackFinderSA::DeleteTracklets(vector<CbmL1TrdTracklet*> vect)
{
vector<CbmL1TrdTracklet*>::iterator it;
for (it = vect.begin(); it != vect.end(); it++) {
delete (*it);
}
}
// ---------------------- Create histogramms -----------------------------
void CbmL1CATrdTrackFinderSA::CreateHistogramms()
{
fUsedHitsPerPlane = new TH1F("h_UsedHitsPerPlane", "h_UsedHitsPerPlane", 13, 0, 13);
fUnUsedHitsPerPlane = new TH1F("h_UnUsedHitsPerPlane", "h_UnUsedHitsPerPlane", 13, 0, 13);
// Normalized distance to hit
fh_chi2hit = new TH1F("h_chi2hit", "Normalized distance to hit", 500, 0., 50.);
fh_chi2hit_plane =
new TH2F("h_chi2hit_plane", "Normalized distance to hit vs. plane number", 500, 0., 50., 12, 0., 12.);
fDistLongX = new TH1F("DistLongX", "DistLongX", 100, -200, 200);
fDistLongY = new TH1F("DistLongY", "DistLongY", 100, -200, 200);
fDistShortX = new TH1F("DistShortX", "DistShortX", 100, -10, 10);
fDistShortY = new TH1F("DistShortY", "DistShortY", 100, -10, 10);
fDistLongBX = new TH1F("DistLongBX", "DistLongBX", 100, -200, 200);
fDistLongBY = new TH1F("DistLongBY", "DistLongBY", 100, -200, 200);
fDistShortBX = new TH1F("DistShortBX", "DistShortBX", 100, -200, 200);
fDistShortBY = new TH1F("DistShortBY", "DistShortBY", 100, -200, 200);
fDistY12 = new TH1F("DistY12", "DistY12", 100, -1, 1);
fMomDistLongPrimaryX = new TH2F("MomDistLongPrimaryX", "MomDistLongPrimaryX", 100, 0, 10, 100, -30, 30);
fMomDistLongPrimaryY = new TH2F("MomDistLongPrimaryY", "MomDistLongPrimaryY", 100, 0, 10, 100, -30, 30);
fMomDistExtrapolPrimaryX = new TH2F("MomDistExtrapolPrimaryX", "MomDistExtrapolPrimaryX", 100, 0, 10, 200, -20, 20);
fMomDistExtrapolPrimaryY = new TH2F("MomDistExtrapolPrimaryY", "MomDistExtrapolPrimaryY", 100, 0, 10, 200, -20, 20);
fMomDistLongExtraX = new TH2F("MomDistLongExtraX", "MomDistLongExtraX", 100, 0, 10, 100, -30, 30);
fMomDistLongExtraY = new TH2F("MomDistLongExtraY", "MomDistLongExtraY", 100, 0, 10, 100, -30, 30);
fMomDistExtrapolExtraX = new TH2F("MomDistExtrapolExtraX", "MomDistExtrapolExtraX", 100, 0, 10, 200, -20, 20);
fMomDistExtrapolExtraY = new TH2F("MomDistExtrapolExtraY", "MomDistExtrapolExtraY", 100, 0, 10, 200, -20, 20);
fMomDistShortPrimaryX = new TH2F("MomDistShortPrimaryX", "MomDistShortPrimaryX", 100, 0, 10, 100, -5, 5);
fMomDistShortPrimaryY = new TH2F("MomDistShortPrimaryY", "MomDistShortPrimaryY", 100, 0, 10, 100, -5, 5);
fMomDistShortExtraX = new TH2F("MomDistShortExtraX", "MomDistShortExtraX", 100, 0, 10, 100, -5, 5);
fMomDistShortExtraY = new TH2F("MomDistShortExtraY", "MomDistShortExtraY", 100, 0, 10, 100, -5, 5);
fDistY = new TH1F("DistY", "DistY", 1000, -10, 10);
fDistX = new TH1F("DistX", "DistX", 1000, -10, 10);
fPlane1Ydens = new TH1F("Plane1Ydens", "Plane1Ydens", 1000, -1000, 1000);
fPlane5Ydens = new TH1F("Plane5Ydens", "Plane5Ydens", 1000, -1000, 1000);
fPlane9Ydens = new TH1F("Plane9Ydens", "Plane9Ydens", 1000, -1000, 1000);
fSPlengthMC = new TH1F("SPlengthMC", "SPlengthMC", 200, 0, 20);
fSPlength = new TH1F("SPlength", "SPlength", 200, 0, 20);
fYat0 = new TH1F("Yat0", "Yat0", 500, -500, 500);
fYat0MC = new TH1F("Yat0MC", "Yat0MC", 500, -500, 500);
fNoEvTime = new TH2F("NoEvTime", "NoEvTime", 1000, 0, 1000, 1000, 0, 5);
fh_SP_xDiff_MC = new TH1F("fh_SP_xDiff_MC", "fh_SP_xDiff_MC", 400, -20, 20);
fh_SP_yDiff_MC = new TH1F("fh_SP_yDiff_MC", "fh_SP_yDiff_MC", 400, -20, 20);
fh_SP_xDiff_nMC = new TH1F("fh_SP_xDiff_nMC", "fh_SP_xDiff_nMC", 400, -20, 20);
fh_SP_yDiff_nMC = new TH1F("fh_SP_yDiff_nMC", "fh_SP_yDiff_nMC", 400, -20, 20);
}
// -----------------------------------------------------------------------
// -------------------- Activates data branches --------------------------
void CbmL1CATrdTrackFinderSA::DataBranches()
{
// Get pointer to the ROOT manager
FairRootManager* rootMgr = FairRootManager::Instance();
if (NULL == rootMgr) {
cout << "-E- CbmL1CATrdTrackFinderSA::DataBranches : "
<< "ROOT manager is not instantiated" << endl;
return;
}
fArrayTrdHit = L1_DYNAMIC_CAST<TClonesArray*>(rootMgr->GetObject("TrdHit"));
if (!fArrayTrdHit) {
cout << "-E- CbmL1CATrdTrackFinderSA::Init: No TrdHit array!" << endl;
return;
}
}
// -----------------------------------------------------------------------
// ------------------- Determines the TRD layout -------------------------
void CbmL1CATrdTrackFinderSA::TrdLayout()
{
// Get the pointer to the singleton FairRunAna object
FairRunAna* ana = FairRunAna::Instance();
if (NULL == ana) {
cout << "-E- CbmL1CATrdTrackFinderSA::TrdLayout :"
<< " no FairRunAna object!" << endl;
return;
}
// Get the pointer to run-time data base
FairRuntimeDb* rtdb = ana->GetRuntimeDb();
if (NULL == rtdb) {
cout << "-E- CbmL1CATrdTrackFinderSA::TrdLayout :"
<< " no runtime database!" << endl;
return;
}
// Get the pointer to container of base parameters
FairBaseParSet* baseParSet = L1_DYNAMIC_CAST<FairBaseParSet*>(rtdb->getContainer("FairBaseParSet"));
if (NULL == baseParSet) {
cout << "-E- CbmL1CATrdTrackFinderSA::TrdLayout :"
<< " no container of base parameters!" << endl;
return;
}
TrdPar = L1_DYNAMIC_CAST<CbmGeoTrdPar*>(rtdb->findContainer("CbmGeoTrdPar"));
TObjArray* Nodes = TrdPar->GetGeoSensitiveNodes();
for (Int_t i = 0; i < Nodes->GetEntriesFast(); i++) {
FairGeoNode* node = dynamic_cast<FairGeoNode*>(Nodes->At(i));
//FairGeoNode *node = (FairGeoNode*) Nodes->At(i);
if (!node) continue;
TString name = node->getName();
//TString Sname = node->getShapePointer()->GetName();
FairGeoVector nodeV = node->getLabTransform()->getTranslation(); //in cm
// FairGeoBasicShape *gShapePointer = (FairGeoBasicShape *)node->getShapePointer();
//gShapePointer->printParam();
// node->print();
//Int_t id = node->getMCid();
//cout <<"name: "<< name <<"\tid: "<< id << endl;
cout << " name: " << name << "\t(z): " << nodeV.Z() << endl;
// if(name.Contains("trd13")) fTrd13_Z = nodeV.Z();
// if(name.Contains("trd14")) fTrd14_Z = nodeV.Z();
// if(name.Contains("trd21")) fTrd21_Z = nodeV.Z();
// if(name.Contains("trd24")) fTrd24_Z = nodeV.Z();
// if(name.Contains("trd31")) fTrd31_Z = nodeV.Z();
if (name == "trd1gas#3") fTrd13_Z = Int_t(nodeV.Z());
if (name == "trd1gas#4") fTrd14_Z = Int_t(nodeV.Z());
if (name == "trd2gas#1") fTrd21_Z = Int_t(nodeV.Z());
if (name == "trd2gas#4") fTrd24_Z = Int_t(nodeV.Z());
if (name == "trd3gas#1") fTrd31_Z = Int_t(nodeV.Z());
// if(name == "trd13") fTrd13_Z = nodeV.Z();
// if(name == "trd14") fTrd14_Z = nodeV.Z();
// if(name == "trd21") fTrd21_Z = nodeV.Z();
// if(name == "trd24") fTrd24_Z = nodeV.Z();
// if(name == "trd31") fTrd31_Z = nodeV.Z();
if (name == "trd1gas#1") geoLayer.Z[0] = nodeV.Z();
if (name == "trd1gas#2") geoLayer.Z[1] = nodeV.Z();
if (name == "trd1gas#3") geoLayer.Z[2] = nodeV.Z();
if (name == "trd1gas#4") geoLayer.Z[3] = nodeV.Z();
if (name == "trd2gas#1") geoLayer.Z[4] = nodeV.Z();
if (name == "trd2gas#2") geoLayer.Z[5] = nodeV.Z();
if (name == "trd2gas#3") geoLayer.Z[6] = nodeV.Z();
if (name == "trd2gas#4") geoLayer.Z[7] = nodeV.Z();
if (name == "trd3gas#1") geoLayer.Z[8] = nodeV.Z();
if (name == "trd3gas#2") geoLayer.Z[9] = nodeV.Z();
if (name == "trd3gas#3") geoLayer.Z[10] = nodeV.Z();
if (name == "trd3gas#4") geoLayer.Z[11] = nodeV.Z();
}
#ifdef DRAW
for (int i = 0; i < 4; i++) {
geoLayer.Y[i] = 273.1;
}
for (int i = 4; i < 8; i++) {
geoLayer.Y[i] = 396.0;
}
for (int i = 8; i < 12; i++) {
geoLayer.Y[i] = 518.9;
}
Int_t scaleZ = 300;
Int_t scaleZA = 0;
for (int i = 0; i < 12; i++) {
if (i == 4) scaleZA = 1000;
if (i == 8) scaleZA *= 2;
geoLayer.scale[i] += ((i + 1) * scaleZ) + scaleZA;
geoLayer.Z[i] += geoLayer.scale[i];
}
#endif
/*
TrdPar = (CbmGeoTrdPar*) (rtdb->findContainer("CbmGeoTrdPar"));
//TObjArray *Nodes = TrdPar->GetGeoSensitiveNodes();
Nodes = TrdPar->GetGeoSensitiveNodes();
for( Int_t i=0;i<Nodes->GetEntriesFast(); i++) {
FairGeoNode *node = dynamic_cast<FairGeoNode*> (Nodes->At(i));
if ( !node ) continue;
TString name = node->getName();
FairGeoVector nodeV = node->getLabTransform()->getTranslation(); //in cm
Int_t uid = i+1;
cout <<"name, uid, Z: "<< name <<", "<< uid <<", "<< nodeV.Z() << endl;
if(uid == 3) fTrd13_Z = nodeV.Z();
if(uid == 4) fTrd14_Z = nodeV.Z();
if(uid == 5) fTrd21_Z = nodeV.Z();
if(uid == 8) fTrd24_Z = nodeV.Z();
if(uid == 9) fTrd31_Z = nodeV.Z();
}
*/
// Get the pointer to detector list
TObjArray* detList = baseParSet->GetDetList();
if (NULL == detList) {
cout << "-E- CbmL1CATrdTrackFinderSA::TrdLayout :"
<< " no detector list!" << endl;
return;
}
// Find TRD detector
FairDetector* trd = L1_DYNAMIC_CAST<FairDetector*>(detList->FindObject("TRD"));
if (NULL == trd) {
cout << "-E- CbmL1CATrdTrackFinderSA::TrdLayout :"
<< " no TRD detector!" << endl;
return;
}
// Determine the geometry version
TString name = trd->GetGeometryFileName();
if (name.Contains("9")) {
cout << "-I- CbmL1CATrdTrackFinderSA::TrdLayout :"
<< " TRD geometry : 3x3." << endl;
fNoTrdStations = 3;
fNoTrdPerStation = 3;
}
else if (name.Contains("12")) {
cout << "-I- CbmL1CATrdTrackFinderSA::TrdLayout :"
<< " TRD geometry : 3x4." << endl;
fNoTrdStations = 3;
fNoTrdPerStation = 4;
}
else if (name.Contains("6x2")) {
cout << "-I- CbmL1CATrdTrackFinderSA::TrdLayout :"
<< " TRD geometry : 6x2." << endl;
fNoTrdStations = 6;
fNoTrdPerStation = 2;
}
fNoTrdStations = 3;
fNoTrdPerStation = 4;
}
// -----------------------------------------------------------------------
// ------------------------- Write histogramms ---------------------------
void CbmL1CATrdTrackFinderSA::WriteHistogramms()
{
fh_chi2hit->Write();
fh_chi2hit_plane->Write();
fDistLongBX->Write();
fDistLongBY->Write();
fDistShortBX->Write();
fDistShortBY->Write();
fDistY12->Write();
//----------------------------------------------------------
fMomDistLongPrimaryX->Write();
fMomDistLongPrimaryY->Write();
fMomDistLongExtraX->Write();
fMomDistLongExtraY->Write();
fMomDistExtrapolPrimaryX->Write();
fMomDistExtrapolPrimaryY->Write();
fMomDistExtrapolExtraX->Write();
fMomDistExtrapolExtraY->Write();
fMomDistShortPrimaryX->Write();
fMomDistShortPrimaryY->Write();
fMomDistShortExtraX->Write();
fMomDistShortExtraY->Write();
fDistLongX->Write();
fDistLongY->Write();
fDistShortX->Write();
fDistShortY->Write();
fDistY->Write();
fDistX->Write();
fPlane1Ydens->Write();
fPlane5Ydens->Write();
fPlane9Ydens->Write();
fSPlength->Write();
fSPlengthMC->Write();
fYat0->Write();
fYat0MC->Write();
fNoEvTime->Write();
fh_SP_xDiff_MC->Write();
fh_SP_yDiff_MC->Write();
fh_SP_xDiff_nMC->Write();
fh_SP_yDiff_nMC->Write();
//---------------------------------------------------------------------
map<Int_t, Int_t>::iterator iUsedHits;
map<Int_t, Int_t>::iterator iUnUsedHits;
map<Int_t, Int_t>::iterator iTotHits;
Double_t nContent;
for (iUsedHits = fRUsedHits.begin(); iUsedHits != fRUsedHits.end(); iUsedHits++) {
iTotHits = fTotHits.find(iUsedHits->first);
nContent = (iUsedHits->second * 100) / iTotHits->second;
// cout << iUsedHits->first <<", "
// << iUsedHits->second <<", "
// << iTotHits->second <<", "
// << nContent << endl;
fUsedHitsPerPlane->SetBinContent((iUsedHits->first), nContent);
}
for (iUnUsedHits = fRUnUsedHits.begin(); iUnUsedHits != fRUnUsedHits.end(); iUnUsedHits++) {
iTotHits = fTotHits.find(iUnUsedHits->first);
nContent = (iUnUsedHits->second * 100) / iTotHits->second;
fUnUsedHitsPerPlane->SetBinContent((iUnUsedHits->first), nContent);
}
fUsedHitsPerPlane->Write();
fUnUsedHitsPerPlane->Write();
//---------------------------------------------------------------------
}
// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
Double_t CbmL1CATrdTrackFinderSA::FitLinear(CbmTrdTrack* tr, Int_t /*var*/ = 1)
{
//fit using a least square method
// cout << ">>> Trying to fit a track..." << endl;
Int_t noHits = tr->GetNofHits();
// cout << "No Hits in the track : " << noHits << endl;
Int_t iHit;
CbmTrdHit* hit;
Double_t C1[12];
Double_t C2[12];
Double_t Z[12];
Double_t n = 12;
for (int i = 0; i < 12; i++) {
C1[i] = 0;
C2[i] = 0;
Z[i] = 0;
}
// Int_t ind = 0;
for (int i = 0; i < noHits; i++) {
iHit = tr->GetHitIndex(i);
hit = L1_DYNAMIC_CAST<CbmTrdHit*>(fArrayTrdHit->At(iHit));
C1[i] = hit->GetX();
C2[i] = hit->GetY();
Z[i] = hit->GetZ();
}
Double_t sumXZ = 0, sumYZ = 0, sumX = 0, sumY = 0, sumZx = 0, sumZy = 0, sumX2 = 0, sumY2 = 0, sumZx2 = 0, sumZy2 = 0;
for (int i = 0; i < 12; i += 2) {
// cout << "C1[" << i << "]=" << C1[i] << endl;
// cout << "C2[" << i << "]=" << C2[i] << endl;
// if(!(i % 2))
{
sumXZ += C1[i] * Z[i];
sumX += C1[i];
sumX2 += C1[i] * C1[i];
sumZx += Z[i];
sumZx2 += Z[i] * Z[i];
}
}
for (int i = 1; i < 12; i += 2) {
// cout << "C1[" << i << "]=" << C1[i] << endl;
// cout << "C2[" << i << "]=" << C2[i] << endl;
// if(!((1i % 2))
{
sumYZ += C2[i] * Z[i];
sumY += C2[i];
sumY2 += C2[i] * C2[i];
sumZy += Z[i];
sumZy2 += Z[i] * Z[i];
}
}
cout << "";
// Double_t a = (n*sumXZ - sumX*sumZ)/(n*sumX2 - sumX*sumX);
// Double_t b = (sumZ - a*sumX)/n;
Double_t r1 = (n * sumXZ - sumX * sumZx) / sqrt((n * sumX2 - sumX * sumX) * (n * sumZx2 - sumZx * sumZx));
// Double_t Sa = sqrt((n*(sumY2 -a*sumXZ-b*sumY))/((n-2)*(n*sumX2-sumX*sumX)));
// Double_t Sb = Sa*sqrt(sumX2/n);
Double_t r2 = (n * sumYZ - sumY * sumZy) / sqrt((n * sumY2 - sumY * sumY) * (n * sumZy2 - sumZy * sumZy));
// cout << "Linear coefficients: a= "
// << a << ", Sa= " << Sa << ", b= " << b << ", Sb= " << Sb << endl
// << ", r=" << r << ", chi2=" << tr->GetChi2() << endl;
return sqrt(r1 * r1 + r2 * r2);
}
// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
Double_t CbmL1CATrdTrackFinderSA::DistTwoTrackletsY(Int_t iIndexFirst, Int_t iIndexSecond, Double_t zed)
{
//returns an extrapolated coordinate
CbmTrdHit *pHitFirst, *pHitSecond;
Double_t dist;
Double_t Y1 = 0;
Double_t Z1 = 0;
// Get hits from first and second plane in station
if (iIndexFirst != -1) {
pHitFirst = L1_DYNAMIC_CAST<CbmTrdHit*>(fArrayTrdHit->At(iIndexFirst));
Y1 = pHitFirst->GetY();
Z1 = pHitFirst->GetZ();
}
pHitSecond = L1_DYNAMIC_CAST<CbmTrdHit*>(fArrayTrdHit->At(iIndexSecond));
// Get position Y & Z of hits
Double_t Y4 = pHitSecond->GetY();
Double_t Z4 = pHitSecond->GetZ();
Double_t a = (Y4 - Y1) / (Z4 - Z1);
Double_t b = Y1 - a * Z1;
Double_t Y = a * zed + b; // - Y1;
dist = Y;
// cout << "From the coords (y1,z1) = ("
// << Y1 << ", " << Z1 << endl
// << "From the coords (y2,z2) = ("
// << Y4 << ", " << Z4 << endl
// << " we get the value = "
// << dist
// << endl;
return dist;
}
// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
Double_t CbmL1CATrdTrackFinderSA::DistTwoTrackletsX(Int_t iIndexFirst, Int_t iIndexSecond, Double_t zed)
{
CbmTrdHit *pHitFirst, *pHitSecond;
Double_t dist;
Double_t X1 = 0;
Double_t Z1 = 0;
// Get hits from first and second plane in station
if (iIndexFirst != -1) {
pHitFirst = L1_DYNAMIC_CAST<CbmTrdHit*>(fArrayTrdHit->At(iIndexFirst));
X1 = pHitFirst->GetX();
Z1 = pHitFirst->GetZ();
}
pHitSecond = L1_DYNAMIC_CAST<CbmTrdHit*>(fArrayTrdHit->At(iIndexSecond));
Double_t X4 = pHitSecond->GetX();
Double_t Z4 = pHitSecond->GetZ();
Double_t a = (X4 - X1) / (Z4 - Z1);
Double_t b = X1 - a * Z1;
// Double_t X = (dz)/(dx)*(zed - Z1);
Double_t X = a * zed + b;
// = dy/dz * (zed + Z1) - X1;
dist = X;
// cout << "From the coords (x1,z1) = ("
// << X1 << ", " << Z1 << endl
// << "From the coords (x4,z4) = ("
// << X4 << ", " << Z4 << endl
// << "and at zed = " << zed << endl
// << " we get the value = "
// << dist
// << endl;
return dist;
}
// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
void CbmL1CATrdTrackFinderSA::FindNeighbour(vector<CbmL1TrdTracklet4*>& v1, vector<CbmL1TrdTracklet4*>& v2, Double_t dY,
Double_t dX)
{
vector<CbmL1TrdTracklet4*>::iterator iv1;
CbmL1TrdTracklet4* tr1;
Double_t extY = 0,
extX = 0, //two extrapolated coords from the first tracklet
mesY = 0, mesX = 0, //two measured coords from the second tracklet
aminY, amaxY, aminX, amaxX;
Int_t indexA, indexB;
Int_t Left = 0, Right, Mid = 0;
Int_t il = 0;
for (iv1 = v1.begin(); iv1 != v1.end(); iv1++) {
il++;
tr1 = *iv1;
extY = tr1->GetExt(0);
extX = tr1->GetExt(1);
indexA = tr1->GetIndex();
amaxY = extY + dY;
aminY = extY - dY;
amaxX = extX + dX;
aminX = extX - dX;
Left = 0;
Right = v2.size();
Mid = 0;
// ----------- looking by bisection ------------------
while (Left < Right) {
Mid = (Left + Right) / 2;
mesY = v2[Mid]->GetCoord(0);
if (amaxY < mesY) { Left = Mid + 1; }
else {
Right = Mid - 1;
}
/*
cout << il << ": Size: "<< v1.size()
<<" mesY: "<< v2[Mid]->GetCoord(0)
<<" extY: "<< extY
<<" Mid: "<< Mid
<< endl;
*/
}
//----------------------------------------------------
Int_t size = v2.size();
for (Int_t i = Mid; i < size; i++) {
mesY = v2[i]->GetCoord(0);
mesX = v2[i]->GetCoord(1);
//cout <<"(mesX,MesY) "<< mesX <<"\t"<< mesY << endl;
indexB = v2[i]->GetIndex();
//cout <<"indexB "<< indexB << endl;
if (mesY > amaxY) continue;
if (mesY < aminY) break;
// cout <<"----------- Setting vAccost [Right|Left]"<< endl;
// cout << aminX <<", "<< mesX <<", "<< amaxX << endl;
if (aminX < mesX && mesX < amaxX) {
tr1->vAccostRight.push_back(indexB);
v2[i]->vAccostLeft.push_back(indexA);
// cout << aminX <<", "<< mesX <<", "<< amaxX << endl;
}
}
}
}
// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
Bool_t CbmL1CATrdTrackFinderSA::OverlapsHitsXY(Int_t posA, Int_t posB)
{
Bool_t overlap = false;
CbmTrdHit *pHitA, *pHitB;
Double_t hitPosA_X, hitPosA_Y, hitPosB_X, hitPosB_Y,
dMul1 = 3, //sigma multiplier for calculating the range of overlapping hits
dMul2 = 3; //sigma multiplier for calculating the range of overlapping hits
Double_t hitPosA_DX, hitPosA_DY, hitPosB_DX, hitPosB_DY;
pHitA = L1_DYNAMIC_CAST<CbmTrdHit*>(fArrayTrdHit->At(posA));
hitPosA_X = pHitA->GetX();
hitPosA_Y = pHitA->GetY();
hitPosA_DX = pHitA->GetDx();
hitPosA_DY = pHitA->GetDy();
pHitB = L1_DYNAMIC_CAST<CbmTrdHit*>(fArrayTrdHit->At(posB));
hitPosB_X = pHitB->GetX();
hitPosB_Y = pHitB->GetY();
hitPosB_DX = pHitB->GetDx();
hitPosB_DY = pHitB->GetDy();
// cout
// << "Overlap function...\n"
// << "X1=" << hitPosA_X << ", dX1=" << hitPosA_DX << ", Y1=" << hitPosA_Y << ", dY1=" << hitPosA_DY
// << "X2=" << hitPosB_X << ", dX2=" << hitPosB_DX << ", Y2=" << hitPosB_Y << ", dY2=" << hitPosB_DY
// << endl;
if (((hitPosA_X + dMul1 * hitPosA_DX) >= (hitPosB_X - dMul2 * hitPosB_DX))
&& ((hitPosA_X - dMul1 * hitPosA_DX) <= (hitPosB_X + dMul2 * hitPosB_DX))
&& ((hitPosA_Y + dMul2 * hitPosA_DY) >= (hitPosB_Y - dMul1 * hitPosB_DY))
&& ((hitPosA_Y - dMul2 * hitPosA_DY) <= (hitPosB_Y + dMul1 * hitPosB_DY))) {
overlap = true;
}
// CbmTrdPoint *pt1 = (CbmTrdPoint*)fMCPointArray->At(posA);
// CbmTrdPoint *pt2 = (CbmTrdPoint*)fMCPointArray->At(posB);
// if(overlap && (pt1->GetTrackID() == pt2->GetTrackID())) return true;
// else return false;
return overlap;
}
// -----------------------------------------------------------------------
void CbmL1CATrdTrackFinderSA::TagSegments(vector<CbmL1TrdTracklet4*>& clTrackletsA,
vector<CbmL1TrdTracklet4*>& clTrackletsB, Int_t /*noCombSegments*/)
{
//asigning numbers to each segment, 4- highest, 0 - lowest
// cout << "TagSegments: engaging... " << endl;
// vector<CbmL1TrdTracklet4*>::iterator itclTrackletsLeft;
vector<CbmL1TrdTracklet4*>::iterator itclTrackletsRight;
CbmL1TrdTracklet4* clSegRight;
vector<Int_t> vLeft;
vector<Int_t> vRight;
vector<Int_t>::iterator ivLeft;
// vector <Int_t>::iterator ivRight;
Int_t valLeft = 0, valRight = 0;
// CbmL1TrdTracklet4* clSegLeft; //segment farther from the target
// CbmL1TrdTracklet4* clSegRight; //segment nearer to the target
// cout << "Engaging Right loop " << endl;
for (itclTrackletsRight = clTrackletsB.begin(); itclTrackletsRight != clTrackletsB.end(); itclTrackletsRight++) {
clSegRight = *itclTrackletsRight;
//cout << "---> X of tracklet = " << clSegRight->GetCoord(0) << endl;
vLeft = clSegRight->vAccostLeft;
//cout << "Size of Right vector = " << clSegRight->vAccostRight.size() << endl;
//cout << "Size of Left vector = " << clSegRight->vAccostLeft.size() << endl;
// iHitRightA = clSegRight->GetInd(0);
// iHitRightB = clSegRight->GetInd(1);
// cout << "Tracklets 912: iHitRight: " << iHitRight << "\t" << endl;
if (vLeft.size() > 0) {
// cout << "Processing Comrade vector of size " << vLeft.size() << endl;
valRight = clSegRight->GetVal();
if (valRight == 0) {
clSegRight->SetVal(1);
valRight++;
}
for (ivLeft = vLeft.begin(); ivLeft != vLeft.end(); ivLeft++) {
valLeft = (clTrackletsA[*ivLeft])->GetVal();
if (valLeft <= valRight) clTrackletsA[*ivLeft]->SetVal(valRight + 1);
}
}
// if(noCombSegments == 1){
// if((*itclTrackletsRight)->GetVal() != 2) clTrackletsB.erase(itclTrackletsRight);
//}
//cout << "clSegRight = " << clSegRight->GetVal() << endl;
//if(isAlone == true) clSegRight->SetIsAlone(true);
}
}
// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
void CbmL1CATrdTrackFinderSA::CreateTracks(vector<CbmL1TrdTracklet4*> clTracklets14,
vector<CbmL1TrdTracklet4*> clTracklets58,
vector<CbmL1TrdTracklet4*> clTracklets912, set<Int_t>& globalSetUsedHits,
Bool_t removeUsedHits, Bool_t competition, Int_t /*nrLoop*/)
{
//create long tracks from previously selected segments
if (fVerbose > 2) {
cout << "Inner area: " << endl
<< "--- size of fArrayTrdTrack = " << fArrayTrdTrack->GetEntriesFast() << endl
<< "--- size of globalSetUsedHits = " << globalSetUsedHits.size() << endl;
}
CbmL1TrdTracklet4 *clTrdSeg1, *clTrdSeg2;
vector<CbmL1TrdTracklet4*>::iterator itclSeg3;
Bool_t isEmpty = true;
Int_t licz = 0, counter = 0;
CbmTrdTrack* tr1 = NULL;
// CbmTrdTrack* tr2 = NULL;
// CbmTrdHit* hit1 = NULL;
//CbmTrdHit* hit2 = NULL;
vector<CbmTrdTrack*> vTempTrdTrackCand;
vector<CbmTrdTrack*>::iterator ivTempTrdTrackCand;
set<Int_t>::iterator iglobalSetUsedHits;
vector<CbmTrdTrack*>::iterator ivTrdTrackCand;
Int_t iFakeTrack = 0;
Int_t iHit = 0;
Bool_t bTrueTrack = true;
FairTrackParam* trParam;
trParam = new FairTrackParam();
trParam->SetQp(0.);
CbmVertex vtx;
TVector3 vzero(0, 0, 0);
vtx.Position(vzero);
Int_t iSecondLoop = 1;
Int_t trMax = 1; //number of tracks from one tree accepted as tracks candidates
Int_t noHitsAccepted =
0; //number of used hits above which the tracks is recognized as fake; 0 = all tracks are fake.
vector<TempTrackStruct> auxTrack;
auxTrack.clear();
Int_t trdInd;
vector<TempTrackStruct>::iterator ikol;
cout << "--- Engaging main loop..." << endl;
if (fVerbose > 2) cout << "--- No of outer iterations to go: " << clTracklets14.size() << endl;
// Int_t vSize = Int_t(clTracklets14.size());
//for(int i = 0; i < vSize; i++) {
// if( (clTracklets14[i])->GetVal() == 3) licz++;
// }
// cout << "* No of 3 in vector: " << licz << endl;
Int_t trackArrayInd = fArrayTrdTrack->GetEntriesFast();
Int_t trlsNo[] = {0, 0, 0};
for (itclSeg3 = clTracklets14.begin(); itclSeg3 != clTracklets14.end();
itclSeg3++) { //loop over tracklets with value of 3
if ((*itclSeg3)->GetVal() != 3) {
trlsNo[0]++;
continue;
}
for (int i = 0; i < 12; i++)
tempTrack.M[i] = 0;
tempTrack.M[0] = (*itclSeg3)->GetInd(0);
tempTrack.M[1] = (*itclSeg3)->GetInd(1);
tempTrack.M[2] = (*itclSeg3)->GetInd(2);
tempTrack.M[3] = (*itclSeg3)->GetInd(3);
Int_t iInd2 = 0;
Int_t size2 = Int_t((*itclSeg3)->vAccostRight.size());
for (Int_t iSeg2 = 0; iSeg2 < size2; iSeg2++) { //loop over clTracklets with value of 2
iInd2 = (*itclSeg3)->vAccostRight[iSeg2];
clTrdSeg2 = clTracklets58[iInd2];
if (clTrdSeg2->GetVal() != 2) continue;
tempTrack.M[4] = clTrdSeg2->GetInd(0);
tempTrack.M[5] = clTrdSeg2->GetInd(1);
tempTrack.M[6] = clTrdSeg2->GetInd(2);
tempTrack.M[7] = clTrdSeg2->GetInd(3);
Int_t iInd1 = 0;
Int_t size1 = Int_t(clTrdSeg2->vAccostRight.size());
for (Int_t iSeg1 = 0; iSeg1 < size1; iSeg1++) { //loop over clTracklets with value of 1
iInd1 = clTrdSeg2->vAccostRight[iSeg1];
clTrdSeg1 = clTracklets912[iInd1];
if (clTrdSeg1->GetVal() != 1) continue;
tempTrack.M[8] = clTrdSeg1->GetInd(0);
tempTrack.M[9] = clTrdSeg1->GetInd(1);
tempTrack.M[10] = clTrdSeg1->GetInd(2);
tempTrack.M[11] = clTrdSeg1->GetInd(3);
counter++;
isEmpty = false;
/*
//-------------------------------------
tr2 = new CbmTrdTrack();
tr2->SetParamFirst(*trParam);
tr2->SetParamLast(*trParam);
for(Int_t we = 0; we < 12; we++) {
hit1 = L1_DYNAMIC_CAST<CbmTrdHit*>( fArrayTrdHit->At(tempTrack.M[we]);
tr2->AddHit(tempTrack.M[we], hit1);
}
tr2->SortHits();
FitKF(tr2);
// trdTrackFitterKF->DoFit(tr2);
tempTrack.Chi2 = tr2->GetChi2();
delete tr2;
//------------------------------------- */
//tempTrack.Chi2 = FitTLinearFitter(tempTrack.M);
//tempTrack.Chi2 = FitLinear(tempTrack.M, 1);
//tempTrack.Chi2 = FitLSM(tempTrack.M);
tempTrack.Chi2 = Fit(tempTrack.M);
auxTrack.push_back(tempTrack);
//if((counter%1000) == 0) {
//printf("\rTracks: %i",counter);
//fflush(stdout);
//}
} //end::loop 1
} //end::loop 2
//if(iSecondLoop%2 == 0)
{
iSecondLoop = 0;
sort(auxTrack.begin(), auxTrack.end(), CompareChi2);
//if(nrLoop == 1) trMax = 1000;
//if(nrLoop == 2) trMax = 1000;
// if(nrLoop == 1) cout <<"auxTrack.size(): "<< auxTrack.size() << endl;
Int_t li = 0;
//CbmTrdTrack *T3;
//Double_t chiMax = 1000;
for (ikol = auxTrack.begin(); ikol != auxTrack.end(); ikol++) {
if (li >= trMax) break;
tr1 = new CbmTrdTrack();
for (Int_t we = 0; we < 12; we++) {
trdInd = (*ikol).M[we];
// hit1 = L1_DYNAMIC_CAST<CbmTrdHit*>( fArrayTrdHit->At(trdInd) );
tr1->AddHit(trdInd, kTRDHIT);
}
// tr1->SortHits();
//tr1->SetChi2((*ikol).Chi2);
//cout << tempTrack.Chi2 << endl;
/*// Set reliable Q/p value. Based on MC values ----------------
CbmTrdPoint *pMCpt;
CbmMCTrack *mcTr;
Int_t ptIndex;
Double_t mom;
trdInd = tr1->GetTrdHitIndex(0);
hit1 = L1_DYNAMIC_CAST<CbmTrdHit*>( fArrayTrdHit->At(trdInd);
ptIndex = hit1->GetRefIndex();
pMCpt = (CbmTrdPoint*) (fMCPointArray->At(ptIndex));
mcTr = (CbmMCTrack*)fMCTrackArray->At(pMCpt->GetTrackID());
mom = mcTr->GetMomentum().Mag();
Int_t pdgCode = mcTr->GetPdgCode();
Int_t charge = PdgToCharge(pdgCode);
trParam->SetQp(charge/mom);
//trParam->SetQp(1.);
//cout <<"(pdg, Qp) "<< pdgCode <<", "<< charge/mom << endl;
//-------------------------------------------------------------
*/
tr1->SetParamFirst(trParam);
tr1->SetParamLast(trParam);
//FitKF(tr1);
// if(tr1->GetChi2() < chiMax){
// T3 = tr1;
// chiMax = tr1->GetChi2();
//}
//if((*ikol).Chi2 < 3)
vTempTrdTrackCand.push_back(tr1);
li++;
}
//vTempTrdTrackCand.push_back(T3);
auxTrack.clear();
// cout << "------------------"<< endl;
}
//cout << iSecondLoop << endl;
iSecondLoop++;
} //loop over 3s
//cout << clTracklets14.size() <<"\t"
// << trlsNo[0] << endl;
// if(nrLoop == 2) competition = false;
if (competition) {
refittingKF.Start();
cout << "\n--- Refiting by KF..." << endl;
/* Refit using KF fitter */
//Int_t iKlops = 0;
//cout << "vTempTrdTrackCand.size(): " << vTempTrdTrackCand.size() << endl;
for (ivTempTrdTrackCand = vTempTrdTrackCand.begin(); ivTempTrdTrackCand != vTempTrdTrackCand.end();
ivTempTrdTrackCand++) {
//FitKF(*ivTempTrdTrackCand);
//trdTrackFitterKF->DoFit(*ivTempTrdTrackCand, &vtx);
trdTrackFitterKF->DoFit(*ivTempTrdTrackCand);
// Double_t mX = (*ivTempTrdTrackCand)->GetParamLast()->GetX();
// Double_t mY = (*ivTempTrdTrackCand)->GetParamLast()->GetY();
// Double_t mXY = sqrt(mX*mX+mY*mY);
// Double_t mChi2 = (*ivTempTrdTrackCand)->GetChi2();
// (*ivTempTrdTrackCand)->SetChi2(mChi2*mX2);
//cout <<"Chi2: "<< (*ivTempTrdTrackCand)->GetChi2() << endl;
//iKlops++;
//cout << iKlops <<": GetNofTrdHits(): " << (*ivTempTrdTrackCand)->GetNofTrdHits() << endl;
}
refittingKF.Stop();
sort(vTempTrdTrackCand.begin(), vTempTrdTrackCand.end(), CompareChi2TrdTrack);
}
CbmTrdTrack* trCand;
Int_t firstHitSunk = 0;
for (ivTrdTrackCand = vTempTrdTrackCand.begin(); ivTrdTrackCand != vTempTrdTrackCand.end();
ivTrdTrackCand++) { //Loop over track candidates; mark used hits
trCand = (*ivTrdTrackCand);
//cout << "Track no " << trackInd++
// << " has " << (*ivTrdTrackCand)->GetNofTrdHits()
// << " hits and chi2= " << (*ivTrdTrackCand)->GetChi2() << endl;
// if(nrLoop == 2) removeUsedHits = false;
if (removeUsedHits) { //RemoveHits
Int_t noHitsA = trCand->GetNofHits();
bTrueTrack = true;
firstHitSunk = 0;
for (int i = 0; i < noHitsA; i++) {
iHit = trCand->GetHitIndex(i);
iglobalSetUsedHits = globalSetUsedHits.find(iHit);
if (iglobalSetUsedHits != globalSetUsedHits.end()) {
if (firstHitSunk == noHitsAccepted) {
bTrueTrack = false;
iFakeTrack++;
break;
}
firstHitSunk++;
}
}
// Int_t k = 0;
// for(int i = 0; i < noHitsA; i++) {
// if(i != 11) k = SA[i]+SA[i+1];
// // if(i != 10) k = SA[i]+SA[i+1]+SA[i+2];
// if(k == noHitsAccepted){
// bTrueTrack = false;
// iFakeTrack++;
// break;
// }
// }
//if(firstHitSunk != 0) cout << firstHitSunk << endl;
if (bTrueTrack) {
new ((*fArrayTrdTrack)[trackArrayInd]) CbmTrdTrack(*trCand);
trackArrayInd++;
for (int i = 0; i < noHitsA; i++) {
iHit = trCand->GetHitIndex(i);
globalSetUsedHits.insert(iHit);
}
delete trCand;
}
}
else { // end of RemoveHits
new ((*fArrayTrdTrack)[trackArrayInd]) CbmTrdTrack(*trCand);
trackArrayInd++;
delete trCand;
}
}
cout << "\n--- Finding tracks finished" << endl;
cout << ":::Track candidates: " << vTempTrdTrackCand.size() << endl
<< ":::Fake tracks: " << iFakeTrack << endl
<< ":::fArrayTrdTrack: " << fArrayTrdTrack->GetEntriesFast() << endl;
vTempTrdTrackCand.clear();
// delete trParam;
if (!isEmpty) {
licz++;
isEmpty = true;
}
}
// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
void CbmL1CATrdTrackFinderSA::CreateSegments(vector<CbmL1TrdTracklet*> clSpacePointsAB,
vector<CbmL1TrdTracklet*> clSpacePointsCD,
vector<CbmL1TrdTracklet4*>& clTrackletsAD, Double_t dX, Double_t dY)
{
//--- method to create 4-hit tracklets from Space Points (smaller 2-hit tracklets) ---
vector<CbmL1TrdTracklet*>::iterator iSpacePtA;
vector<CbmL1TrdTracklet*>::iterator iSpacePtB;
vector<CbmL1TrdTracklet*>::iterator iSpacePtStart;
Int_t iIndex = 0, //index
indSpacePtA, //index of 1st miniTracklet
indSpacePtB, //index of 2nd miniTracklet
indSpacePtC, //index of 3rd miniTracklet
indSpacePtD, //index of 4th miniTracklet
noXSurv = 0, //number of tracklets that survived the X distance cut
noYSurv = 0, //number of tracklets that survived the Y distance cut
noXYSurv = 0, //number of tracklets that survived both X & Y distance cuts
noAllPairs = 0, iSegAcc14 = 0;
CbmL1TrdTracklet4* clTr;
CbmL1TrdTracklet *trLeft, *trRight;
iSpacePtStart = clSpacePointsCD.begin();
//---------- BEGIN: Creation tracklet 12-34 ---------------------------------
for (iSpacePtA = clSpacePointsAB.begin(); iSpacePtA != clSpacePointsAB.end(); iSpacePtA++) {
trLeft = *iSpacePtA;
indSpacePtA = trLeft->GetIndLeft();
indSpacePtB = trLeft->GetIndRight();
// cout << "GetCoord1: " << trLeft->GetCoord1() << endl;
//cout << "--------------------" << clSpacePointsCD.size() << endl;
//--- extrapolate --------------------------------------------
Double_t y1 = trLeft->GetCoord(0), x1 = trLeft->GetCoord(1), y1z = trLeft->GetCoord(2), x1z = trLeft->GetCoord(3),
x2 = 0, y2 = 0, distBetweenLayer = x1z - y1z, y2z = y1z + distBetweenLayer * 2,
x2z = x1z + distBetweenLayer * 2;
y2 = (y1 / y1z) * y2z;
x2 = (x1 / x1z) * x2z;
//--- end: extrapolate --------------------------------------
Bool_t bFirst = true;
//for(y = 0; y < trsize; y++){//y
//trRight = clSpacePointsCD[y];
//cout << trRight->GetCoord(0) << endl;
// Bool_t bFirst = true;
for (iSpacePtB = iSpacePtStart; iSpacePtB != clSpacePointsCD.end(); iSpacePtB++) {
trRight = *iSpacePtB;
indSpacePtC = trRight->GetIndLeft();
indSpacePtD = trRight->GetIndRight();
noAllPairs++;
Double_t yB = trRight->GetCoord(0), xB = trRight->GetCoord(1), yBz = trRight->GetCoord(2),
xBz = trRight->GetCoord(3);
/*
//--- for estimation dx and dy ----------------------------
trdHit1 = L1_DYNAMIC_CAST<CbmTrdHit*>( fArrayTrdHit->At(indSpacePtA);
Int_t refInd1 = trdHit1->GetRefIndex();
trdHit1 = L1_DYNAMIC_CAST<CbmTrdHit*>( fArrayTrdHit->At(indSpacePtB);
Int_t refInd2 = trdHit1->GetRefIndex();
trdHit1 = L1_DYNAMIC_CAST<CbmTrdHit*>( fArrayTrdHit->At(indSpacePtC);
Int_t refInd3 = trdHit1->GetRefIndex();
trdHit1 = L1_DYNAMIC_CAST<CbmTrdHit*>( fArrayTrdHit->At(indSpacePtD);
Int_t refInd4 = trdHit1->GetRefIndex();
CbmTrdPoint
*pPointAy,
*pPointBx,
*pPointCy,
*pPointDx;
pPointAy = (CbmTrdPoint*) fMCPointArray->At(refInd1);
pPointBx = (CbmTrdPoint*) fMCPointArray->At(refInd2);
pPointCy = (CbmTrdPoint*) fMCPointArray->At(refInd3);
pPointDx = (CbmTrdPoint*) fMCPointArray->At(refInd4);
Int_t trIDAy = pPointAy->GetTrackID();
Int_t trIDBx = pPointBx->GetTrackID();
Int_t trIDCy = pPointCy->GetTrackID();
Int_t trIDDx = pPointDx->GetTrackID();
CbmMCTrack *pMCtrack;
Int_t noTRDPoints;
Double_t
x1 = pPointBx->GetX(),
y1 = pPointAy->GetY(),
z1y = pPointAy->GetZ(),
z1x = pPointBx->GetZ(),
x2 = 0,
y2 = 0,
z2y = z1y+distBetweenLayer*2,
z2x = z1x+distBetweenLayer*2;
y2 = (y1/z1y)*z2y;
x2 = (x1/z1x)*z2x;
if(trIDAy == trIDCy){
pMCtrack = (CbmMCTrack*) fMCTrackArray->At(trIDAy);
noTRDPoints = pMCtrack->GetTrdPoints();
if(noTRDPoints == 12){
Double_t fPosY = pPointCy->GetY();
fDistY->Fill(fabs(fPosY-y2));
}
}
if(trIDBx == trIDDx){
pMCtrack = (CbmMCTrack*) fMCTrackArray->At(trIDBx);
noTRDPoints = pMCtrack->GetTrdPoints();
if(noTRDPoints == 12){
Double_t fPosX = pPointDx->GetX();
fDistX->Fill(fabs(fPosX-x2));
}
}
//--- end: for estimation dx and dy -------------------------------
*/
if (trRight->GetCoord(0) > y2 + dY) { continue; }
else {
if (bFirst) {
bFirst = false;
iSpacePtStart = iSpacePtB;
}
}
if (trRight->GetCoord(0) < y2 - dY) break;
if ((trRight->GetCoord(1) < x2 + dX) && (trRight->GetCoord(1) > x2 - dX)) {
iSegAcc14++; //we have one more tracklet
//we create a new tracklet object to add it into a vector
clTr = new CbmL1TrdTracklet4();
clTr->SetCoord(0, y1);
clTr->SetCoord(1, x1);
clTr->SetCoord(2, yB);
clTr->SetCoord(3, xB);
clTr->M[0] = y1z;
clTr->M[1] = x1z;
clTr->M[2] = yBz;
clTr->M[3] = xBz;
//zed is a z-axis value to which we extrapolate
Double_t zed = 0;
//cout << trdHit1->GetZ() <<" : "<< trRight->GetCoord(3) << endl;
if (Int_t(trRight->GetCoord(3) + 1) == fTrd14_Z) {
zed = fTrd21_Z;
//cout <<"fTrd21_Z: "<< fTrd21_Z << endl;
}
//cout << trRight->GetCoord(3) <<"\t"<< fTrd14_Z << endl;
if (Int_t(trRight->GetCoord(3) + 1) == fTrd24_Z) {
zed = fTrd31_Z;
//cout <<"fTrd31_Z: "<< fTrd31_Z << endl;
}
//cout << trRight->GetCoord(3) <<"\t"<< fTrd24_Z << endl;
//if(trRight->GetPlanesID(1) == 4) zed = fTrd21_Z;
//if(trRight->GetPlanesID(1) == 8) zed = fTrd31_Z;
// if(trRight->GetPlanesID(1) == 4) zed = 970;
//if(trRight->GetPlanesID(1) == 8) zed = fTrd31_Z;
/* //Extrapolated by CbmTrdTrackFitterKF::Extrapolate insteas fo DistTwoTrackletsY
//Extrapolate && fo DistTwoTrackletsY give the same results
CbmTrdTrack *trdTrack = new CbmTrdTrack();
CbmTrdHit *hit1;
hit1 = L1_DYNAMIC_CAST<CbmTrdHit*>( fArrayTrdHit->At(indSpacePtA);
trdTrack->AddHit(indSpacePtA, hit1);
hit1 = L1_DYNAMIC_CAST<CbmTrdHit*>( fArrayTrdHit->At(indSpacePtB);
trdTrack->AddHit(indSpacePtB, hit1);
hit1 = L1_DYNAMIC_CAST<CbmTrdHit*>( fArrayTrdHit->At(indSpacePtC);
trdTrack->AddHit(indSpacePtC, hit1);
hit1 = L1_DYNAMIC_CAST<CbmTrdHit*>( fArrayTrdHit->At(indSpacePtD);
trdTrack->AddHit(indSpacePtD, hit1);
trdTrack->SortHits();
FairTrackParam *trParam;
trParam = new FairTrackParam();
trParam->SetQp(0.);
trdTrack->SetParamFirst(*trParam);
trdTrack->SetParamLast(*trParam);
trdTrackFitterKF->DoFit(trdTrack);
//FairTrackParam *e_track = new FairTrackParam();
trdTrackFitterKF->Extrapolate(trdTrack, zed, trParam);
clTr->SetExt(0, trParam->GetY());
clTr->SetExt(1, trParam->GetX());
cout <<"(MY, KF) "
<< DistTwoTrackletsY(indSpacePtB, indSpacePtD, zed) <<", "
<< trParam->GetX() << endl;
*/
//set the extrapolated coordinates - Y
clTr->SetExt(0, DistTwoTrackletsY(indSpacePtA, indSpacePtC, zed));
//set the extrapolated coordinates - X
clTr->SetExt(1, DistTwoTrackletsX(indSpacePtB, indSpacePtD, zed + distBetweenLayer));
//set the indices of all 4 point in tracklet
clTr->SetInd(0, indSpacePtA);
clTr->SetInd(1, indSpacePtB);
clTr->SetInd(2, indSpacePtC);
clTr->SetInd(3, indSpacePtD);
//initial value is always 0; it is modified if necessary
clTr->SetVal(0);
//position of the tracklet in tracklets vector
clTr->SetIndex(iIndex);
iIndex++;
//add a tracklet to a vector
clTrackletsAD.push_back(clTr);
noXYSurv++;
}
}
}
if (fVerbose > 2) {
cout << " ----------- Tracklet 12-34 ------------------" << endl;
cout << " Number of X survivors: " << noXSurv << endl;
cout << " Number of Y survivors: " << noYSurv << endl;
cout << "Number of XY survivors: " << noXYSurv << endl;
cout << " Number of all pairs: " << noAllPairs << endl;
}
}
// -----------------------------------------------------------------------
void CbmL1CATrdTrackFinderSA::CreateSpacePoints(vector<LayerWithHits> vTrdHitArrayA,
vector<LayerWithHits> vTrdHitArrayB,
vector<CbmL1TrdTracklet*>& clSpacePointsAB, Double_t sigmaA,
Double_t sigmaB)
{
//method to create Space Points (SP) from two individual detector hist
vector<LayerWithHits>::iterator itA;
vector<LayerWithHits>::iterator itB;
vector<LayerWithHits>::iterator itStart;
Int_t noOverlapsAB = 0,
// noMCOverlapsAB = 0,
iInd = 0;
CbmL1TrdTracklet* clSpacePt;
Int_t indA, indB;
Double_t A_X, A_Y, A_Z, A_DX, A_DY;
Double_t B_X, B_Y, B_Z, B_DX, B_DY;
Int_t A_planeID, B_planeID;
Int_t A_mcTrID, B_mcTrID;
// Double_t SPlength;
/*
68,0%; <= 1sigma
95,5%; <= 2sigma
99,7%, <= 3sigma
*/
itStart = vTrdHitArrayB.begin();
for (itA = vTrdHitArrayA.begin(); itA != vTrdHitArrayA.end(); itA++) {
indA = (*itA).hitIndex;
A_X = (*itA).X;
A_Y = (*itA).Y;
A_Z = (*itA).Z;
A_DX = (*itA).DX;
A_DY = (*itA).DY;
A_planeID = (*itA).planeID;
A_mcTrID = (*itA).mcTrackID;
/*//--- extrapolate --------------------------------------------
Double_t distBetweenLayer = fTrd14_Z-fTrd13_Z;
cout << "distBetweenLayer: " << distBetweenLayer << endl;
Double_t
x1 = A_X,
y1 = A_Y,
z1y = A_Z,
z1x = A_Z,
x2 = 0,
y2 = 0,
z2y = z1y+distBetweenLayer, // 12 is a distance beetwen plane in TRD
z2x = z1x+distBetweenLayer; // 12 is a distance beetwen plane in TRD
y2 = (y1/z1y)*z2y;
x2 = (x1/z1x)*z2x;
//--- end: extrapolate --------------------------------------*/
Bool_t bFirst = true;
for (itB = itStart; itB != vTrdHitArrayB.end(); itB++) {
indB = (*itB).hitIndex;
B_X = (*itB).X;
B_Y = (*itB).Y;
B_Z = (*itB).Z;
B_DX = (*itB).DX;
B_DY = (*itB).DY;
B_planeID = (*itB).planeID;
B_mcTrID = (*itB).mcTrackID;
if (B_Y + sigmaB * B_DY < A_Y - sigmaA * A_DY) { continue; }
else {
/* Finding the bottom level to begin the second loop.
The value of bottom level is taken from previous "second loop".*/
if (bFirst) {
itStart = itB;
bFirst = false;
}
}
if (B_Y - sigmaB * B_DY > A_Y + sigmaA * A_DY) break;
// cout <<"(A_X, A_DX, sigmaA*A_DX) "<< A_X <<", "<< A_DX <<", "<< sigmaA*A_DX <<", "<< endl;
// cout <<"(A_Y, A_DY, sigmaA*A_DY) "<< A_Y <<", "<< A_DY <<", "<< sigmaA*A_DY <<", "<< endl;
// cout <<"(B_X, B_DX, sigmaB*B_DX) "<< B_X <<", "<< B_DX <<", "<< sigmaB*B_DX <<", "<< endl;
// cout <<"(B_Y, B_DY, sigmaB*B_DY) "<< B_Y <<", "<< B_DY <<", "<< sigmaB*B_DY <<", "<< endl;
// cout <<"-----------------------------------------"<< endl;
// if (B_Y < y2 - sigmaB*A_DY) continue;
// if (B_Y > y2 + sigmaB*A_DY) break;
// cout <<"[Extrapol, Real, Diff] "
// << y2 <<", "<< B_Y <<", "<< B_Y-y2 << endl;
if ((B_X - sigmaB * B_DX < A_X + sigmaA * A_DX) && (B_X + sigmaB * B_DX > A_X - sigmaA * A_DX)) {
noOverlapsAB++;
clSpacePt = new CbmL1TrdTracklet();
clSpacePt->SetIndLeft(indA);
clSpacePt->SetIndRight(indB);
clSpacePt->SetVal(0);
clSpacePt->SetIndex(iInd);
clSpacePt->SetCoord(0, A_Y);
clSpacePt->SetCoord(1, B_X);
clSpacePt->SetCoord(2, A_Z);
clSpacePt->SetCoord(3, B_Z);
clSpacePt->SetPlanesID(A_planeID, B_planeID);
// //----------------------------------------
// TVector3 t1, t2, t3;
// t1.SetXYZ(A_X, A_Y, A_Z);
// t2.SetXYZ(B_X, B_Y, B_Z);
// t3 = t2 - t1;
// SPlength = t3.Mag();
// Double_t
// x = 0,
// y = 0,
// z = 0,
// t = 0;
// t = (z - A_Z)/(B_Z - A_Z);
// x = A_X + t*(B_X-A_X);
// y = A_Y + t*(B_Y-A_Y);
// //SPlength = sqrt(2*(B_Y-A_Y)*(B_Y-A_Y));
// if(Station == 1){
// if(A_mcTrID == B_mcTrID){
// noMCOverlapsAB++;
// fSPlengthMC->Fill(SPlength);
// fYat0MC->Fill(x);
// }else{
// fSPlength->Fill(SPlength);
// fYat0->Fill(x);
// }
// }
iInd++;
clSpacePointsAB.push_back(clSpacePt);
if (A_mcTrID == B_mcTrID) {
fh_SP_xDiff_MC->Fill(A_X - B_X);
fh_SP_yDiff_MC->Fill(A_Y - B_Y);
}
else {
fh_SP_xDiff_nMC->Fill(A_X - B_X);
fh_SP_yDiff_nMC->Fill(A_Y - B_Y);
}
}
}
}
iInd = 0;
if (fVerbose > 1) cout << "--- No Space Points: " << noOverlapsAB << endl;
// cout <<"--- (No SP, MCSP) "
// << noOverlapsAB <<", "
// << noMCOverlapsAB <<endl;
}
// -----------------------------------------------------------------------
void CbmL1CATrdTrackFinderSA::CreateAndManageSegments(vector<CbmL1TrdTracklet4*> clTracklets14,
vector<CbmL1TrdTracklet4*> clTracklets58,
vector<CbmL1TrdTracklet4*> clTracklets912)
{
//CreateAndManageSegments with no long track creation, 1 track = 1 segment
vector<CbmL1TrdTracklet4*>::iterator itclSeg;
CbmTrdTrack* tr1 = NULL;
// CbmTrdHit* hit1 = NULL;
// CbmTrdHit* hit2 = NULL;
// CbmTrdHit* hit3 = NULL;
// CbmTrdHit* hit4 = NULL;
CbmL1TrdTracklet4* clTrdSeg;
Int_t trackArrayInd = 0;
Int_t indTrdHit1, indTrdHit2, indTrdHit3, indTrdHit4;
for (itclSeg = clTracklets14.begin(); itclSeg != clTracklets14.end(); itclSeg++) {
clTrdSeg = *itclSeg;
tr1 = new CbmTrdTrack();
indTrdHit1 = clTrdSeg->GetInd(0);
// hit1 = L1_DYNAMIC_CAST<CbmTrdHit*>( fArrayTrdHit->At(indTrdHit1) );
tr1->AddHit(indTrdHit1, kTRDHIT);
indTrdHit2 = clTrdSeg->GetInd(1);
// hit2 = L1_DYNAMIC_CAST<CbmTrdHit*>( fArrayTrdHit->At(indTrdHit2) );
tr1->AddHit(indTrdHit2, kTRDHIT);
indTrdHit3 = clTrdSeg->GetInd(2);
// hit3 = L1_DYNAMIC_CAST<CbmTrdHit*>( fArrayTrdHit->At(indTrdHit3) );
tr1->AddHit(indTrdHit3, kTRDHIT);
indTrdHit4 = clTrdSeg->GetInd(3);
// hit4 = L1_DYNAMIC_CAST<CbmTrdHit*>( fArrayTrdHit->At(indTrdHit4) );
tr1->AddHit(indTrdHit4, kTRDHIT);
// tr1->SortHits();
new ((*fArrayTrdTrack)[trackArrayInd]) CbmTrdTrack(*tr1);
delete tr1;
trackArrayInd++;
}
for (itclSeg = clTracklets58.begin(); itclSeg != clTracklets58.end(); itclSeg++) {
clTrdSeg = *itclSeg;
tr1 = new CbmTrdTrack();
indTrdHit1 = clTrdSeg->GetInd(0);
// hit1 = L1_DYNAMIC_CAST<CbmTrdHit*>( fArrayTrdHit->At(indTrdHit1) );
tr1->AddHit(indTrdHit1, kTRDHIT);
indTrdHit2 = clTrdSeg->GetInd(1);
// hit2 = L1_DYNAMIC_CAST<CbmTrdHit*>( fArrayTrdHit->At(indTrdHit2) );
tr1->AddHit(indTrdHit2, kTRDHIT);
indTrdHit3 = clTrdSeg->GetInd(2);
// hit3 = L1_DYNAMIC_CAST<CbmTrdHit*>( fArrayTrdHit->At(indTrdHit3) );
tr1->AddHit(indTrdHit3, kTRDHIT);
indTrdHit4 = clTrdSeg->GetInd(3);
// hit4 = L1_DYNAMIC_CAST<CbmTrdHit*>( fArrayTrdHit->At(indTrdHit4) );
tr1->AddHit(indTrdHit4, kTRDHIT);
// tr1->SortHits();
new ((*fArrayTrdTrack)[trackArrayInd]) CbmTrdTrack(*tr1);
delete tr1;
trackArrayInd++;
}
for (itclSeg = clTracklets912.begin(); itclSeg != clTracklets912.end(); itclSeg++) {
clTrdSeg = *itclSeg;
tr1 = new CbmTrdTrack();
indTrdHit1 = clTrdSeg->GetInd(0);
// hit1 = L1_DYNAMIC_CAST<CbmTrdHit*>( fArrayTrdHit->At(indTrdHit1) );
tr1->AddHit(indTrdHit1, kTRDHIT);
indTrdHit2 = clTrdSeg->GetInd(1);
// hit2 = L1_DYNAMIC_CAST<CbmTrdHit*>( fArrayTrdHit->At(indTrdHit2) );
tr1->AddHit(indTrdHit2, kTRDHIT);
indTrdHit3 = clTrdSeg->GetInd(2);
// hit3 = L1_DYNAMIC_CAST<CbmTrdHit*>( fArrayTrdHit->At(indTrdHit3) );
tr1->AddHit(indTrdHit3, kTRDHIT);
indTrdHit4 = clTrdSeg->GetInd(3);
// hit4 = L1_DYNAMIC_CAST<CbmTrdHit*>( fArrayTrdHit->At(indTrdHit4) );
tr1->AddHit(indTrdHit4, kTRDHIT);
// tr1->SortHits();
new ((*fArrayTrdTrack)[trackArrayInd]) CbmTrdTrack(*tr1);
delete tr1;
trackArrayInd++;
}
}
// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
Double_t CbmL1CATrdTrackFinderSA::Fit(CbmTrdTrack* tr)
{ //fits a track with a straight line and caluculates each point's deviation
Double_t chi2 = 0;
Int_t iHit;
CbmTrdHit* pHit[12];
Double_t y1, y2, z1, z2, yA[12], zA[12], yB[12], zB[12];
Double_t dist1 = 0;
Double_t dist2 = 0;
// Double_t sum1 = 0;
// Double_t sum2 = 0;
Double_t yS1 = 0;
Double_t yS2 = 0;
Int_t noHits = tr->GetNofHits();
for (int i = 0; i < noHits; i++) {
iHit = tr->GetHitIndex(i);
pHit[i] = L1_DYNAMIC_CAST<CbmTrdHit*>(fArrayTrdHit->At(iHit));
}
//first and last X(orY) pointa in the track
yA[0] = pHit[0]->GetY();
zA[0] = pHit[0]->GetZ();
yB[10] = pHit[10]->GetY();
zB[10] = pHit[10]->GetZ();
//first and last Y(orX) pointa in the track
yA[1] = pHit[1]->GetX();
zA[1] = pHit[1]->GetZ();
yB[11] = pHit[11]->GetX();
zB[11] = pHit[11]->GetZ();
Int_t t1 = 0;
Int_t t2 = 1;
for (int i = 0; i < 4; i++) {
//for X(orY) coordinates
t1 += 2;
y1 = fabs(pHit[t1]->GetY());
z1 = pHit[t1]->GetZ();
yS1 = fabs((((yB[10] - yA[0]) * (z1 - zA[0])) / (zB[10] - zA[0])) + yA[0]);
dist1 = fabs(yS1 - y1);
//for Y(orX) coordinates
t2 += 2;
y2 = fabs(pHit[t2]->GetX());
z2 = pHit[t2]->GetZ();
yS2 = fabs((((yB[11] - yA[1]) * (z2 - zA[1])) / (zB[11] - zA[1])) + yA[1]);
dist2 = fabs(yS2 - y2);
chi2 += (dist1 + dist2) / 2;
}
// cout << "chi2: " << chi2 << endl;
// for(int i = 0; i < 4; i++){
// //for X(orY) coordinates
// t1+=2;
// y1 = fabs(pHit[t1]->Y());
// z1 = pHit[t1]->Z();
// yS1 = fabs((((yB[10]-yA[0])*(z1-zA[0]))/(zB[10]-zA[0]))+yA[0]);
// dist1 = fabs(yS1-y1);
// sum1+=dist1;
// //for Y(orX) coordinates
// t2+=2;
// y2 = fabs(pHit[t2]->X());
// z2 = pHit[t2]->Z();
// yS2 = fabs((((yB[11]-yA[1])*(z2-zA[1]))/(zB[11]-zA[1]))+yA[1]);
// dist2 = fabs(yS2-y2);
// sum2+=dist2;
// }
// chi2=sum1+sum2;
// Calculate length of the track ---------------
// Double_t
// length0 = 0,
// length1 = 0,
// length2 = 0;
// t1 = 0;
// t2 = 1;
// Double_t
// x = 0,
// y = 0,
// z = 0;
// for(int i = 0; i < 4; i++){
// y = fabs(pHit[t1+2]->Y())-fabs(pHit[t1]->Y());
// z = (pHit[t1+2]->Z())-(pHit[t1]->Z());
// length1 += sqrt(y*y + z*z);
// t1+=2;
// x = fabs(pHit[t2+2]->X())-fabs(pHit[t2]->X());
// z = (pHit[t2+2]->Z())-(pHit[t2]->Z());
// length2 += sqrt(x*x + z*z);
// t2+=2;
// }
// width0 = width1 + width2;
// // cout << width0 << endl;
return chi2;
//return length0;
}
// -----------------------------------------------------------------------
Double_t CbmL1CATrdTrackFinderSA::Fit(Int_t M[])
{ //fits a track with a straight line and caluculates each point's deviation
Double_t chi2 = 0;
Int_t iHit;
CbmTrdHit* pHit[12];
Double_t y1, y2, z1, z2, yA[12], zA[12], yB[12], zB[12];
Double_t dist1 = 0;
Double_t dist2 = 0;
Double_t yS1 = 0;
Double_t yS2 = 0;
Int_t noHits = 12;
for (int i = 0; i < noHits; i++) {
iHit = M[i];
pHit[i] = L1_DYNAMIC_CAST<CbmTrdHit*>(fArrayTrdHit->At(iHit));
}
//first and last X(orY) pointa in the track
yA[0] = pHit[0]->GetY();
zA[0] = pHit[0]->GetZ();
yB[10] = pHit[10]->GetY();
zB[10] = pHit[10]->GetZ();
//first and last Y(orX) pointa in the track
yA[1] = pHit[1]->GetX();
zA[1] = pHit[1]->GetZ();
yB[11] = pHit[11]->GetX();
zB[11] = pHit[11]->GetZ();
Int_t t1 = 0;
Int_t t2 = 1;
for (int i = 0; i < 4; i++) {
//for X(orY) coordinates
t1 += 2;
y1 = fabs(pHit[t1]->GetY());
z1 = pHit[t1]->GetZ();
yS1 = fabs((((yB[10] - yA[0]) * (z1 - zA[0])) / (zB[10] - zA[0])) + yA[0]);
dist1 = fabs(yS1 - y1);
//for Y(orX) coordinates
t2 += 2;
y2 = fabs(pHit[t2]->GetX());
z2 = pHit[t2]->GetZ();
yS2 = fabs((((yB[11] - yA[1]) * (z2 - zA[1])) / (zB[11] - zA[1])) + yA[1]);
dist2 = fabs(yS2 - y2);
//chi2 += (dist2+dist1)/2;
chi2 += sqrt(dist1 * dist1 + dist2 * dist2);
}
return chi2;
}
// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
Double_t CbmL1CATrdTrackFinderSA::FitLinear(Int_t M[], Int_t /*var*/ = 1)
{
//fit using a least square method
Int_t noHits = 12;
Int_t iHit;
CbmTrdHit* hit;
Double_t C1[12];
Double_t C2[12];
Double_t Z[12];
Double_t n = 12;
for (int i = 0; i < 12; i++) {
C1[i] = 0;
C2[i] = 0;
Z[i] = 0;
}
// Int_t ind = 0;
for (int i = 0; i < noHits; i++) {
iHit = M[i];
hit = L1_DYNAMIC_CAST<CbmTrdHit*>(fArrayTrdHit->At(iHit));
C1[i] = hit->GetX();
C2[i] = hit->GetY();
Z[i] = hit->GetZ();
}
Double_t sumXZ = 0, sumYZ = 0, sumX = 0, sumY = 0, sumZx = 0, sumZy = 0, sumX2 = 0, sumY2 = 0, sumZx2 = 0, sumZy2 = 0;
for (int i = 0; i < 12; i += 2) {
// cout << "C1[" << i << "]=" << C1[i] << endl;
// cout << "C2[" << i << "]=" << C2[i] << endl;
// if(!(i % 2))
{
sumXZ += C1[i] * Z[i];
sumX += C1[i];
sumX2 += C1[i] * C1[i];
sumZx += Z[i];
sumZx2 += Z[i] * Z[i];
}
}
for (int i = 1; i < 12; i += 2) {
// cout << "C1[" << i << "]=" << C1[i] << endl;
// cout << "C2[" << i << "]=" << C2[i] << endl;
// if(!((1i % 2))
{
sumYZ += C2[i] * Z[i];
sumY += C2[i];
sumY2 += C2[i] * C2[i];
sumZy += Z[i];
sumZy2 += Z[i] * Z[i];
}
}
cout << "";
// Double_t a = (n*sumXZ - sumX*sumZ)/(n*sumX2 - sumX*sumX);
// Double_t b = (sumZ - a*sumX)/n;
Double_t r1 = (n * sumXZ - sumX * sumZx) / sqrt((n * sumX2 - sumX * sumX) * (n * sumZx2 - sumZx * sumZx));
// Double_t Sa = sqrt((n*(sumY2 -a*sumXZ-b*sumY))/((n-2)*(n*sumX2-sumX*sumX)));
// Double_t Sb = Sa*sqrt(sumX2/n);
Double_t r2 = (n * sumYZ - sumY * sumZy) / sqrt((n * sumY2 - sumY * sumY) * (n * sumZy2 - sumZy * sumZy));
// cout << "Linear coefficients: a= "
// << a << ", Sa= " << Sa << ", b= " << b << ", Sb= " << Sb << endl
// << ", r=" << r << ", chi2=" << tr->GetChi2() << endl;
return sqrt(r1 * r1 + r2 * r2);
}
Double_t CbmL1CATrdTrackFinderSA::FitLSM(Int_t M[])
{
Double_t chi2 = 0;
Int_t iHit;
CbmTrdHit* pHit[12];
Int_t noHits = 12;
for (int i = 0; i < noHits; i++) {
iHit = M[i];
pHit[i] = L1_DYNAMIC_CAST<CbmTrdHit*>(fArrayTrdHit->At(iHit));
}
Double_t xAv = 0, yAv = 0, zAvx = 0, zAvy = 0, sumXiXav = 0, sumYiYav = 0, sumXiXav_ZiZAv = 0, sumYiYav_ZiZAv = 0,
sumZiZav_x = 0, sumZiZav_y = 0, bY = 0, bX = 0;
for (int i = 0; i < 12; i += 2) {
yAv += pHit[i]->GetY();
zAvy += pHit[i]->GetZ();
}
for (int i = 1; i < 12; i += 2) {
xAv += pHit[i]->GetX();
zAvx += pHit[i]->GetZ();
}
for (int i = 0; i < 12; i += 2) {
Double_t dy = pHit[i]->GetY() - yAv;
Double_t dz = pHit[i]->GetZ() - zAvy;
sumYiYav_ZiZAv += dy * dz;
sumYiYav += dy * dy;
sumZiZav_y += dz * dz;
}
for (int i = 1; i < 12; i += 2) {
Double_t dx = pHit[i]->GetX() - xAv;
Double_t dz = pHit[i]->GetZ() - zAvx;
sumXiXav_ZiZAv += dx * dz;
sumXiXav += dx * dx;
sumZiZav_x += dz * dz;
}
bY = sumYiYav_ZiZAv / sumYiYav;
bX = sumXiXav_ZiZAv / sumXiXav;
chi2 = sqrt((sumZiZav_y - bY * sumYiYav_ZiZAv) / (4)) + sqrt((sumZiZav_x - bX * sumXiXav_ZiZAv) / (4));
return chi2;
}
Double_t CbmL1CATrdTrackFinderSA::FitKF(CbmTrdTrack* pTrack)
{
// Declare variables outside the loop
CbmTrdHit* pHit = NULL;
CbmKFTrdHit* pKFHit = NULL;
Int_t hitIndex = 0;
// Int_t materialIndex = 0;
Double_t eLoss = 0.;
// Loop over TRD hits of the track
Int_t nTracks = pTrack->GetNofHits();
for (Int_t iHit = 0; iHit < nTracks; iHit++) {
// Get current hit index
hitIndex = pTrack->GetHitIndex(iHit);
//Get the pointer to the CbmTrdHit
pHit = L1_DYNAMIC_CAST<CbmTrdHit*>(fArrayTrdHit->At(hitIndex));
// Accumulate TR energy loss
eLoss += pHit->GetELoss();
// Create CbmKFTrdHit
pKFHit = new CbmKFTrdHit();
pKFHit->Create(pHit);
// materialIndex = pKFHit->MaterialIndex;
// Add to the KFTrack
fKfTrack->fHits.push_back(pKFHit);
} // Loop over TRD hits
fKfTrack->GetRefChi2() = 0.;
fKfTrack->GetRefNDF() = 0;
fKfTrack->SetTrackParam(*(const_cast<FairTrackParam*>(pTrack->GetParamLast())));
fKfTrack->Fit();
// Store parameters at first layer
fKfTrack->GetTrackParam(*(const_cast<FairTrackParam*>(pTrack->GetParamFirst())));
// Store parameters at last layer
fKfTrack->GetTrackParam(*(const_cast<FairTrackParam*>(pTrack->GetParamLast())));
// Store chi2 of fit
pTrack->SetChiSq(fKfTrack->GetRefChi2());
pTrack->SetNDF(fKfTrack->GetRefNDF());
// Store accumulated TR energy loss
pTrack->SetELoss(eLoss);
// Delete CbmKFTrdHit objects
vector<CbmKFHit*>::iterator it;
for (it = fKfTrack->fHits.begin(); it != fKfTrack->fHits.end(); it++) {
pKFHit = L1_DYNAMIC_CAST<CbmKFTrdHit*>(*it);
delete pKFHit;
}
fKfTrack->fHits.clear();
return 0;
}
Double_t CbmL1CATrdTrackFinderSA::FitTLinearFitter(Int_t M[])
{
Double_t chi2 = 0;
Double_t chi2x = 0;
Double_t chi2y = 0;
const Int_t nrPnts = 12;
Int_t k = 0;
Int_t w = 0;
Int_t j = 6;
Double_t ax[6];
Double_t ay[6];
Double_t az1[6];
// Double_t az2[6];
CbmTrdHit* trdHit;
for (int i = 0; i < nrPnts; i++) {
trdHit = L1_DYNAMIC_CAST<CbmTrdHit*>(fArrayTrdHit->At(M[i]));
k = i + 1;
if ((k % 2) == 0) {
ax[w] = trdHit->GetX();
az1[w] = trdHit->GetZ();
w++;
}
else {
ay[w] = trdHit->GetY();
// az2[w] = trdHit->GetZ();
}
}
TLinearFitter* lf;
lf = new TLinearFitter(2);
lf->SetFormula("hyp2");
lf->StoreData(0);
TVectorD x;
x.Use(j, ax);
TVectorD z1;
z1.Use(j, az1);
lf->AssignData(j, 1, ax, az1);
lf->Eval();
chi2x = lf->GetChisquare();
delete lf;
//--------------------------------
lf = new TLinearFitter(2);
lf->SetFormula("hyp2");
lf->StoreData(0);
TVectorD y;
x.Use(j, ay);
TVectorD z2;
z2.Use(j, az1);
lf->AssignData(j, 1, ay, az1);
lf->Eval();
chi2y = lf->GetChisquare();
chi2 = chi2x + chi2y;
return chi2;
}
Int_t CbmL1CATrdTrackFinderSA::PdgToCharge(Int_t pdgCode)
{
Int_t value;
switch (pdgCode) { //switch
case 11: //electron
{
value = -1;
break;
}
case -11: //positron
{
value = +1;
break;
}
case 13: //muon-
{
value = -1;
break;
}
case -13: //muon+
{
value = +1;
break;
}
case 22: {
value = 0; //gamma
break;
}
case 211: {
value = +1; //pi+
break;
}
case -211: {
value = -1; //pi-
break;
}
case 111: {
value = 0; //pi0
break;
}
case 213: {
value = +1; //rho+
break;
}
case -213: {
value = -1; //rho-
break;
}
case 113: {
value = 0; //rho0
break;
}
case 221: {
value = 0; //eta
break;
}
case 323: {
value = 0; //omega
break;
}
case 333: {
value = 0; //phi
break;
}
case 321: {
value = +1; //kaon+
break;
}
case -321: {
value = -1; //kaon-
break;
}
case 443: {
value = 0; //jpsi
break;
}
case 2112: {
value = 0; //neutron
break;
}
case 2212: {
value = +1; //proton
break;
}
case -2212: {
value = 0; //anti-proton (?!)
break;
}
case 3222: {
value = +1; //sigma+
break;
}
case 3112: {
value = -1; //sigma-
break;
}
case 3212: {
value = 0; //sigma0
break;
}
default: {
value = -1000;
break;
}
}
return value;
}
Bool_t CbmL1CATrdTrackFinderSA::Rejection(Double_t Procent, Int_t num)
{
Bool_t accept = true;
Int_t random;
random = (rand() % num);
if (random >= Procent) accept = false;
return accept;
}