diff --git a/reco/L1/CbmL1Performance.cxx b/reco/L1/CbmL1Performance.cxx index 1bced1df02fb935aa13be5ee3a9eb08065320115..70996109620b874d097e9833d466a74940266403 100644 --- a/reco/L1/CbmL1Performance.cxx +++ b/reco/L1/CbmL1Performance.cxx @@ -1025,6 +1025,22 @@ void CbmL1::TrackFitPerformance() static TH2F *PRes2D, *PRes2DPrim, *PRes2DSec; + static TH2F* pion_res_pt_fstt; + static TH2F* kaon_res_pt_fstt; + static TH2F* pton_res_pt_fstt; + + static TH2F* pion_res_pt_vtxt; + static TH2F* kaon_res_pt_vtxt; + static TH2F* pton_res_pt_vtxt; + + static TH2F* pion_res_pz_fstt; + static TH2F* kaon_res_pz_fstt; + static TH2F* pton_res_pz_fstt; + + static TH2F* pion_res_pz_vtxt; + static TH2F* kaon_res_pz_vtxt; + static TH2F* pton_res_pz_vtxt; + static bool first_call = 1; L1Fit fit; @@ -1043,6 +1059,22 @@ void CbmL1::TrackFitPerformance() PRes2DPrim = new TH2F("PRes2DPrim", "Resolution P vs P", 100, 0., 20., 100, -15., 15.); PRes2DSec = new TH2F("PRes2DSec", "Resolution P vs P", 100, 0., 20., 100, -15., 15.); + pion_res_pt_fstt = new TH2F("pion_res_pt_fstt", "", 100, 0, 10, 1000, 0, 500); + kaon_res_pt_fstt = new TH2F("kaon_res_pt_fstt", "", 100, 0, 10, 1000, 0, 500); + pton_res_pt_fstt = new TH2F("pton_res_pt_fstt", "", 100, 0, 10, 1000, 0, 500); + + pion_res_pt_vtxt = new TH2F("pion_res_pt_vtxt", "", 100, 0, 10, 1000, 0, 5000); + kaon_res_pt_vtxt = new TH2F("kaon_res_pt_vtxt", "", 100, 0, 10, 1000, 0, 5000); + pton_res_pt_vtxt = new TH2F("pton_res_pt_vtxt", "", 100, 0, 10, 1000, 0, 5000); + + pion_res_pz_fstt = new TH2F("pion_res_pz_fstt", "", 100, 0, 10, 1000, 0, 500); + kaon_res_pz_fstt = new TH2F("kaon_res_pz_fstt", "", 100, 0, 10, 1000, 0, 500); + pton_res_pz_fstt = new TH2F("pton_res_pz_fstt", "", 100, 0, 10, 1000, 0, 500); + + pion_res_pz_vtxt = new TH2F("pion_res_pz_vtxt", "", 100, 0, 10, 1000, 0, 5000); + kaon_res_pz_vtxt = new TH2F("kaon_res_pz_vtxt", "", 100, 0, 10, 1000, 0, 5000); + pton_res_pz_vtxt = new TH2F("pton_res_pz_vtxt", "", 100, 0, 10, 1000, 0, 5000); + struct { const char* name; const char* title; @@ -1151,8 +1183,12 @@ void CbmL1::TrackFitPerformance() fld.Set(B[0], z[0], B[1], z[1], B[2], z[2]); L1Extrapolate(trPar, mcP.zIn, trPar.qp, fld); - h_fit[0]->Fill((trPar.x[0] - mcP.xIn) * 1.e4); - h_fit[1]->Fill((trPar.y[0] - mcP.yIn) * 1.e4); + double dx = trPar.x[0] - mcP.xIn; + double dy = trPar.y[0] - mcP.yIn; + double dt = sqrt(dx * dx + dy * dy); + double pt = sqrt(mcP.px * mcP.px + mcP.py * mcP.py); + h_fit[0]->Fill(dx * 1.e4); + h_fit[1]->Fill(dy * 1.e4); h_fit[2]->Fill((trPar.tx[0] - mcP.pxIn / mcP.pzIn) * 1.e3); h_fit[3]->Fill((trPar.ty[0] - mcP.pyIn / mcP.pzIn) * 1.e3); h_fit[4]->Fill(fabs(1. / trPar.qp[0]) / mcP.p - 1); @@ -1160,9 +1196,26 @@ void CbmL1::TrackFitPerformance() PRes2D->Fill(mcP.p, (1. / fabs(trPar.qp[0]) - mcP.p) / mcP.p * 100.); CbmL1MCTrack mcTrack = *(it->GetMCTracks()[0]); - if (mcTrack.IsPrimary()) PRes2DPrim->Fill(mcP.p, (1. / fabs(trPar.qp[0]) - mcP.p) / mcP.p * 100.); - else + + if (mcTrack.IsPrimary()) { + PRes2DPrim->Fill(mcP.p, (1. / fabs(trPar.qp[0]) - mcP.p) / mcP.p * 100.); + + if (abs(mcTrack.pdg == 211)) { + pion_res_pz_fstt->Fill(mcP.pz, dt * 1.e4); + pion_res_pt_fstt->Fill(pt, dt * 1.e4); + } + if (abs(mcTrack.pdg == 321)) { + kaon_res_pz_fstt->Fill(mcP.pz, dt * 1.e4); + kaon_res_pt_fstt->Fill(pt, dt * 1.e4); + } + if (abs(mcTrack.pdg == 2212)) { + pton_res_pz_fstt->Fill(mcP.pz, dt * 1.e4); + pton_res_pt_fstt->Fill(pt, dt * 1.e4); + } + } + else { PRes2DSec->Fill(mcP.p, (1. / fabs(trPar.qp[0]) - mcP.p) / mcP.p * 100.); + } if (finite(trPar.C00[0]) && trPar.C00[0] > 0) h_fit[5]->Fill((trPar.x[0] - mcP.xIn) / sqrt(trPar.C00[0])); if (finite(trPar.C11[0]) && trPar.C11[0] > 0) h_fit[6]->Fill((trPar.y[0] - mcP.yIn) / sqrt(trPar.C11[0])); @@ -1286,7 +1339,8 @@ void CbmL1::TrackFitPerformance() CbmL1MCTrack mc = *(it->GetMCTracks()[0]); L1TrackPar trPar(it->T, it->C); - if (mc.mother_ID != -1) { // secondary + // if (mc.mother_ID != -1) { // secondary + if (!mc.IsPrimary()) { // secondary { // extrapolate to vertex L1FieldRegion fld _fvecalignment; @@ -1402,6 +1456,23 @@ void CbmL1::TrackFitPerformance() } if (mc.z != trPar.z[0]) continue; + double dx = trPar.x[0] - mc.x; + double dy = trPar.y[0] - mc.y; + double dt = sqrt(dx * dx + dy * dy); + double pt = sqrt(mc.px * mc.px + mc.py * mc.py); + + if (abs(mc.pdg == 211)) { + pion_res_pz_vtxt->Fill(mc.pz, dt * 1.e4); + pion_res_pt_vtxt->Fill(pt, dt * 1.e4); + } + if (abs(mc.pdg == 321)) { + kaon_res_pz_vtxt->Fill(mc.pz, dt * 1.e4); + kaon_res_pt_vtxt->Fill(pt, dt * 1.e4); + } + if (abs(mc.pdg == 2212)) { + pton_res_pz_vtxt->Fill(mc.pz, dt * 1.e4); + pton_res_pt_vtxt->Fill(pt, dt * 1.e4); + } // calculate pulls h_fitPV[0]->Fill((mc.x - trPar.x[0])); @@ -1668,7 +1739,6 @@ void CbmL1::InputPerformance() static TH1F *pullXmuch, *pullYmuch, *pullTmuch, *resXmuch, *resYmuch, *resTmuch /*, *pullZ*/; static TH1F *pullXtrd, *pullYtrd, *pullTtrd, *resXtrd, *resYtrd, *resTtrd /*, *pullZ*/; static TH1F *pullXtof, *pullYtof, *pullTtof, *resXtof, *resYtof, *resTtof /*, *pullZ*/; - static TH1F* trdMCPointsZ = nullptr; static bool first_call = 1; @@ -1823,7 +1893,6 @@ void CbmL1::InputPerformance() if (h.Det != 1) continue; // mvd hit const CbmStsHit* sh = L1_DYNAMIC_CAST<CbmStsHit*>(listStsHits->At(h.extIndex)); - // int iMCPoint = -1; CbmLink link; CbmStsPoint* pt = 0; @@ -1847,19 +1916,15 @@ void CbmL1::InputPerformance() } } - if (stsHitMatch.GetNofLinks() > 0) { Float_t bestWeight = 0.f; for (Int_t iLink = 0; iLink < stsHitMatch.GetNofLinks(); iLink++) { if (stsHitMatch.GetLink(iLink).GetWeight() > bestWeight) { - bestWeight = stsHitMatch.GetLink(iLink).GetWeight(); - Int_t iFile = stsHitMatch.GetLink(iLink).GetFile(); - Int_t iEvent = stsHitMatch.GetLink(iLink).GetEntry(); - - link = stsHitMatch.GetLink(iLink); - - - pt = (CbmStsPoint*) fStsPoints->Get(iFile, iEvent, stsHitMatch.GetLink(iLink).GetIndex()); + link = stsHitMatch.GetLink(iLink); + bestWeight = link.GetWeight(); + Int_t iFile = link.GetFile(); + Int_t iEvent = link.GetEntry(); + pt = (CbmStsPoint*) fStsPoints->Get(iFile, iEvent, link.GetIndex()); } } } @@ -1876,12 +1941,12 @@ void CbmL1::InputPerformance() sh->Position(hitPos); sh->PositionError(hitErr); - // pt->Position(mcPos); // this is wrong! - mcPos.SetX(pt->GetX(hitPos.Z())); - mcPos.SetY(pt->GetY(hitPos.Z())); + double t = (hitPos.Z() - pt->GetZIn()) / (pt->GetZOut() - pt->GetZIn()); + mcPos.SetX(pt->GetXIn() + t * (pt->GetXOut() - pt->GetXIn())); + mcPos.SetY(pt->GetYIn() + t * (pt->GetYOut() - pt->GetYIn())); mcPos.SetZ(hitPos.Z()); -#if 0 // standard errors +#if 0 // standard errors if (hitErr.X() != 0) pullXsts->Fill( (hitPos.X() - mcPos.X()) / hitErr.X() ); // standard errors if (hitErr.Y() != 0) pullYsts->Fill( (hitPos.Y() - mcPos.Y()) / hitErr.Y() ); #elif 1 // qa errors @@ -1889,7 +1954,7 @@ void CbmL1::InputPerformance() if (hitErr.Y() != 0) pullYsts->Fill((hitPos.Y() - mcPos.Y()) / sh->GetDy()); pullTsts->Fill((sh->GetTime() - mcTime) / sh->GetTimeError()); -#else // errors used in TF +#else // errors used in TF if (hitErr.X() != 0) pullXsts->Fill((hitPos.X() - mcPos.X()) / sqrt(algo->vStations[NMvdStations].XYInfo.C00[0])); if (hitErr.Y() != 0) @@ -1995,7 +2060,7 @@ void CbmL1::InputPerformance() mcPos.SetY(0.5 * (pt->GetYIn() + pt->GetYOut())); mcPos.SetZ(hitPos.Z()); -#if 0 // standard errors +#if 0 // standard errors if (hitErr.X() != 0) pullXmuch->Fill( (hitPos.X() - mcPos.X()) / hitErr.X() ); // standard errors if (hitErr.Y() != 0) pullYmuch->Fill( (hitPos.Y() - mcPos.Y()) / hitErr.Y() ); #elif 1 // qa errors @@ -2003,7 +2068,7 @@ void CbmL1::InputPerformance() if (hitErr.Y() != 0) pullYmuch->Fill((h.y - mcPos.Y()) / sh->GetDy()); pullTmuch->Fill((h.t - mcTime) / sh->GetTimeError()); -#else // errors used in TF +#else // errors used in TF if (hitErr.X() != 0) pullXmuch->Fill((hitPos.X() - mcPos.X()) / sqrt(algo->vStations[NMvdStations].XYInfo.C00[0])); if (hitErr.Y() != 0) @@ -2027,12 +2092,13 @@ void CbmL1::InputPerformance() if (hm->GetNofLinks() == 0) continue; - if (hm->GetNofLinks() != 1) continue; //SG!! + if (hm->GetNofLinks() != 1) continue; // only check single-linked hits Float_t bestWeight = 0.f; Float_t totalWeight = 0.f; int iMCPoint = -1; CbmLink link; + for (int iLink = 0; iLink < hm->GetNofLinks(); iLink++) { totalWeight += hm->GetLink(iLink).GetWeight(); if (hm->GetLink(iLink).GetWeight() > bestWeight) { @@ -2062,7 +2128,7 @@ void CbmL1::InputPerformance() mcPos.SetY((pt->GetYIn() + pt->GetYOut()) / 2.); mcPos.SetZ(hitPos.Z()); -#if 0 // standard errors +#if 0 // standard errors if (hitErr.X() != 0) pullXtrd->Fill( (hitPos.X() - mcPos.X()) / hitErr.X() ); // standard errors if (hitErr.Y() != 0) pullYtrd->Fill( (hitPos.Y() - mcPos.Y()) / hitErr.Y() ); #elif 1 // qa errors @@ -2070,7 +2136,7 @@ void CbmL1::InputPerformance() if (hitErr.Y() != 0) pullYtrd->Fill((h.y - mcPos.Y()) / sh->GetDy()); pullTtrd->Fill((h.t - mcTime) / sh->GetTimeError()); -#else // errors used in TF +#else // errors used in TF if (hitErr.X() != 0) pullXtrd->Fill((hitPos.X() - mcPos.X()) / sqrt(algo->vStations[NMvdStations].XYInfo.C00[0])); if (hitErr.Y() != 0) pullYtrd->Fill((hitPos.Y() - mcPos.Y()) / sqrt(algo->vStations[NMvdStations].XYInfo.C11[0])); #endif @@ -2129,7 +2195,7 @@ void CbmL1::InputPerformance() mcPos.SetY((pt->GetY())); mcPos.SetZ(hitPos.Z()); -#if 0 // standard errors +#if 0 // standard errors if (hitErr.X() != 0) pullXmuch->Fill( (hitPos.X() - mcPos.X()) / hitErr.X() ); // standard errors if (hitErr.Y() != 0) pullYmuch->Fill( (hitPos.Y() - mcPos.Y()) / hitErr.Y() ); #elif 1 // qa errors @@ -2137,7 +2203,7 @@ void CbmL1::InputPerformance() if (hitErr.Y() != 0) pullYtof->Fill((h.y - mcPos.Y()) / sh->GetDy()); pullTtof->Fill((sh->GetTime() - mcTime) / sh->GetTimeError()); -#else // errors used in TF +#else // errors used in TF if (hitErr.X() != 0) pullXtof->Fill((hitPos.X() - mcPos.X()) / sqrt(algo->vStations[NMvdStations].XYInfo.C00[0])); if (hitErr.Y() != 0) pullYtof->Fill((hitPos.Y() - mcPos.Y()) / sqrt(algo->vStations[NMvdStations].XYInfo.C11[0])); #endif