1#ifndef L1AlgoEfficiencyPerformance_h
2#define L1AlgoEfficiencyPerformance_h
12#include "CbmL1Counters.h"
57 for (
int iih = 0; iih < NHits; iih++){
69 for (
int ih = 0; ih < NHits; ih++){
70 flag &= (a.
i[ih] ==
i[ih]);
100 bool isReconstructable;
111 AddCounter(
"slow_prim",
"ExtraPrim efficiency");
118template<
int NHits = 3>
129 void Print(TString title =
"Triplets performance statistic",
bool station = 0);
137 vector<L1RecoTracklet > recoTracklets;
138 vector<L1MCTracklet > mcTracklets;
153 recoTracklets.clear();
157 ntra_sta[iSta] = ntra;
166 for ( vector<CbmL1MCTrack>::iterator mtraIt = fL1->vMCTracks.begin(); mtraIt != fL1->vMCTracks.end(); mtraIt++ ) {
170 const int NMCPoints = mtra.
Points.size();
172 int lastIterSta = -1;
173 for (
int iterOffset = 0; iterOffset < NMCPoints;iterOffset++){
175 int iterSta = fL1->vMCPoints[ mtra.
Points[iterOffset] ].iStation;
176 if (iterSta == lastIterSta)
continue;
177 lastIterSta = iterSta;
183 for (
int is = 0, offset = iterOffset; ((offset < NMCPoints) && (is < NHits)); offset++){
184 const int mcId = mtra.
Points[offset];
189 const int NPointHits = mcPs->
hitIds.size();
190 for (
int ih = 0; ih < NPointHits; ih++){
191 trlet.hitIds[is].push_back(mcPs->
hitIds[ih]);
197 for (
int is = 0; is < NHits; is++){
198 good &= trlet.hitIds[is].size();
202 trlet.iStation = iterSta;
203 trlet.mcTrackId = mtra.
ID;
206 if (mtra.
p > fL1->MinRecoMom) trlet.SetAsReconstructable();
208 mcTracklets.push_back(trlet);
220 vector<int> mcIds[NHits];
223 for (
int iih = 0; iih < NHits; iih++){
224 int nMC = fL1->vStsHits[iHits[iih]].mcPointIds.size();
225 for (
int iMC = 0; iMC < nMC; iMC++){
226 const int iMCP = fL1->vStsHits[iHits[iih]].mcPointIds[iMC];
227 int mcId = fL1->vMCPoints[ iMCP ].ID;
228 mcIds[iih].push_back(mcId);
233 for (
int level = 0; level < NHits-1; level++){
234 vector<int> &mcs1 = mcIds[level];
235 vector<int> &mcs2 = mcIds[level+1];
238 for (
unsigned int i2 = 0; i2 < mcs2.size(); i2++){
242 for (
unsigned int i1 = 0; i1 < mcs1.size(); i1++){
243 flag |= (mcs1[i1] == mc2);
250 vector<int> &mcsN = mcIds[NHits-1];
251 for (
unsigned int i = 0;
i < mcsN.size();
i++){
253 trlet.mcTrackId = mcsN[
i];
254 trlet.iStation = fL1->vMCPoints[ fL1->vStsHits[iHits[0]].mcPointIds[0] ].iStation;
261 recoTracklets.push_back(trlet);
263 return (trlet.mcTrackId >= 0);
273 const int NRecoTrlets = recoTracklets.size();
274 const int NMCTrlets = mcTracklets.size();
276 for (
int iReco = 0, iMC = 0; (iReco < NRecoTrlets) && (iMC < NMCTrlets) ; ){
277 L1MCTracklet &mcTrlet = mcTracklets[iMC];
278 L1RecoTracklet &recoTrlet = recoTracklets[iReco];
284 if (recoTrlet != mcTrlet){
285 if (recoTrlet < mcTrlet) iReco++;
293 const int nReco = mcTrlet.recoIds.size();
294 for (
int iR = 0; iR < nReco; iR++){
295 flag &= (recoTrlet != recoTracklets[mcTrlet.recoIds[iR]]);
297 if (flag) mcTrlet.AddReconstructed(iReco);
309 const int NRecoTrlets = recoTracklets.size();
310 for (
int iReco = 0; iReco < NRecoTrlets; iReco++){
312 ntra.ghosts += reco.IsGhost();
315 const int NMCTrlets = mcTracklets.size();
316 for (
int iMC = 0; iMC < NMCTrlets; iMC++){
318 if (!mtra.IsReconstructable())
continue;
319 int iSta = mtra.iStation;
325 ntra_sta[iSta].Inc(reco,
"total");
327 if ( mtra.p > fL1->MinRefMom ){
328 ntra_sta[iSta].Inc(reco,
"fast");
329 if ( mtra.IsPrimary() ){
330 ntra_sta[iSta].Inc(reco,
"fast_prim");
348 ntra_sta[iSta].Inc(reco,
"fast_sec");
352 ntra_sta[iSta].Inc(reco,
"slow");
353 if ( mtra.IsPrimary() ){
354 ntra_sta[iSta].Inc(reco,
"slow_prim");
357 ntra_sta[iSta].Inc(reco,
"slow_sec");
360 ntra_sta[iSta].clones += mtra.GetNClones();
364 ntra += ntra_sta[iSta];
365 NTRA_STA[iSta] += ntra_sta[iSta];
366 ntra_sta[iSta].CalcEff();
367 NTRA_STA[iSta].CalcEff();
383 cout <<
"-------- " << title <<
" ----------" << endl;
388 for (
int iSta = 0; iSta < fL1->NStation-NHits+1; iSta++){
389 TString title_sta = title;
390 title_sta +=
" station ";
393 cout <<
"-------- " << title_sta <<
" ----------" << endl;
394 NTRA_STA[iSta].PrintEff();
bool IsReconstructed() const
static CbmL1 * Instance()
reconstructed tracks
void SetAsReconstructable()
void AddReconstructed(int recoId)
vector< int > hitIds[NHits]
bool operator!=(const L1Tracklet< NHits > &a)
bool operator==(const L1RTracklet< NHits > &a)
static bool compare(const L1Tracklet< NHits > &a, const L1Tracklet< NHits > &b)
bool operator!=(const L1Tracklet< NHits > &a)
bool operator<(const L1Tracklet< NHits > &a)
bool operator==(const L1Tracklet< NHits > &a)
virtual void AddCounter(TString shortname, TString name)