Compare trk-cand vs. trk-fit –—————————
(II) missed tracks are defined on hits information GHOST -------------------------------------------------------------------------------------------------------------------------------------------------------————— check repeated assignment to one MC trk (maybe one MC trk rec. trk was assigned to several REC trk) ------------------—————
END check repeated assignment to one MC trk ------------------------------------------------------------------------------------------------------————
END GHOST-----------------------------------------------------------------------------------------------------------------------------------------------------------———
MISSED ------------------------------------------------------------------------------------------------------------------------------------------------------------------——
152 Double_t glXrecLMD, glYrecLMD, glZrecLMD, glThetarecLMD, glPhirecLMD;
153 Double_t glXrec, glYrec, glZrec, glThetarec, glPhirec, glMomrec;
154 Double_t glXmc, glYmc, glZmc, glThetamc, glPhimc, glMommc;
155 Double_t glXmcLMD, glYmcLMD, glZmcLMD, glThetamcLMD, glPhimcLMD, glMommcLMD;
161 int glNumDoubleMChits;
163 int glModule, glHalf;
164 FairRootManager* ioman = FairRootManager::Instance();
166 double glEvTime = ioman->GetEventTime();
174 const int nParticles =
fMCTracks->GetEntriesFast();
175 const int numTrk =
fRecTracks->GetEntriesFast();
176 const int nRecHits =
fRecHits->GetEntriesFast();
177 const int nMCHits =
fMCHits->GetEntriesFast();
183 cout <<
"%%%%%! Event #" <<
fEventNr <<
" has " << nParticles
184 <<
" true particles, " <<
" out of it " << nRecHits <<
" hits, "
185 << nTrkCandidates <<
" trk-cands, " << numTrk <<
" tracks and "
186 << nGeaneTrks <<
" geane Trks!" << endl;
191 for (Int_t iN = 0; iN < nParticles; iN++) {
196 if (motherid < 0 &&
fabs(mcID) < 1e5) {
206 int MCtksSIMhits[nParticles];
207 int MCDoubleHits[nParticles];
208 for (
int imctrk = 0; imctrk < nParticles; imctrk++) {
209 MCtksSIMhits[imctrk] = 0;
210 MCDoubleHits[imctrk] = 0;
212 for (
int imc = 0; imc < nMCHits; imc++) {
214 int MCtrk = MCPoint->GetTrackID();
215 MCtksSIMhits[MCtrk]++;
221 int MCtksREChits[nParticles];
224 for (
int imctrk = 0; imctrk < nParticles; imctrk++) {
225 MCtksREChits[imctrk] = 0;
228 cout <<
" ** ALL REChits are made from MChits: " << endl;
230 for (
int irec = 0; irec < nRecHits; irec++) {
233 int MCtrkidbot, MCtrkidtop;
236 int MCtrkid = MCPointBot->GetTrackID();
238 MCtksREChits[MCtrkid]++;
239 MCtrkidbot = MCtrkid;
241 cout <<
" " << MCtrkid <<
"(MChitID=" << mcrefbot <<
",z="
242 << MCPointBot->GetZ() <<
")";
244 int mcreftop = myHit->GetRefIndex();
247 int MCtrkid = MCPointTop->GetTrackID();
249 MCtksREChits[MCtrkid]++;
250 MCtrkidtop = MCtrkid;
252 cout <<
" " << MCtrkid <<
"(MChitID=" << mcreftop <<
",z="
253 << MCPointTop->GetZ() <<
")";
255 if (mcreftop > 0 && mcrefbot > 0) {
256 if (MCtrkidtop == MCtrkidbot) {
257 MCDoubleHits[MCtrkidbot]++;
260 cout <<
" REChit No." << irec <<
"contain MCid: " << MCtrkidtop
261 <<
", " << MCtrkidbot <<
" !" << endl;
275 for (Int_t iN = 0; iN < nGeaneTrks; iN++) {
280 glThetarecLMD = -9999;
297 glThetamcLMD = -9999;
300 trkRECStatus = -9999;
305 glNumDoubleMChits = -9999;
310 TVector3 PosRecLMD(fFittedTrkP.GetX(), fFittedTrkP.GetY(),
312 TVector3 MomRecLMD(fFittedTrkP.GetPx(), fFittedTrkP.GetPy(),
313 fFittedTrkP.GetPz());
314 MomRecLMD *=
fPbeam / MomRecLMD.Mag();
320 const int numPts = trkcand->
GetNHits();
329 TVector3 MomRecCandLMD = pos2 - posSeed;
330 MomRecCandLMD *=
fPbeam / MomRecCandLMD.Mag();
339 int MCtrk[nParticles];
340 int RECtrkMCid[nGeaneTrks];
341 for (
int nk = 0;
nk < nParticles;
nk++)
343 bool goodTrk[nGeaneTrks];
344 bool ghostTrk[nGeaneTrks];
345 for (Int_t iN = 0; iN < nGeaneTrks; iN++) {
347 ghostTrk[iN] =
false;
352 for (Int_t iN = 0; iN < nGeaneTrks; iN++) {
353 FairTrackParH *fRes = (FairTrackParH*)
fRecBPTracks->At(iN);
354 TVector3 PosRec = fRes->GetPosition();
355 Double_t lyambda = fRes->GetLambda();
357 cout <<
"GEANE didn't propagate trk No." << iN <<
"!" << endl;
365 const int Ntrkcandhits = trkcand->
GetNHits();
367 int MCtrkID[Ntrkcandhits];
368 for (Int_t iHit = 0; iHit < Ntrkcandhits; iHit++) {
369 MCtrkID[iHit] = 9999;
376 cout <<
" *** REChits in trk (with " << Ntrkcandhits
377 <<
" hits) are made from MChits: " << endl;
378 for (Int_t iHit = 0; iHit < Ntrkcandhits; iHit++) {
380 cout <<
"No." << iHit <<
": ";
389 int MCtrkid = MCPointBot->GetTrackID();
393 cout <<
" " << MCtrkid <<
"!!!";
397 MCtrkID[iHit] = MCtrkid;
399 cout <<
" " << MCtrkid;
403 cout <<
" Ooops, mcrefbot = " << mcrefbot;
405 int mcreftop = myHit->GetRefIndex();
411 int MCtrkid = MCPointTop->GetTrackID();
415 cout <<
" " << MCtrkid <<
"!!!";
419 MCtrkID[iHit] = MCtrkid;
421 cout <<
" " << MCtrkid;
425 cout <<
" Ooops, mcreftop = " << mcreftop;
438 for (Int_t
n = 0;
n < Ntrkcandhits;
n++) {
441 for (Int_t
m =
n + 1;
m < Ntrkcandhits;
m++)
442 if (MCtrkID[
m] < x) {
448 MCtrkID[k] = MCtrkID[
n];
454 Int_t prevID = MCtrkID[0];
455 for (
int nk = 0;
nk < nParticles;
nk++) {
456 if (MCtrkID[0] ==
nk)
457 MCtrk[
nk] = MCtrk[
nk] + 1;
460 for (Int_t
n = 1;
n < Ntrkcandhits;
n++) {
461 if (MCtrkID[
n] > 9998)
463 if (prevID < MCtrkID[
n]) {
466 for (
int nk = 0;
nk < nParticles;
nk++) {
467 if (MCtrkID[n] ==
nk)
468 MCtrk[
nk] = MCtrk[
nk] + 1;
477 RECtrkMCid[iN] = MCtrkID[0];
479 if (MCtrkID[0] < 9999)
486 vector<int> countMC_IDs(diffIDs);
487 for (
int kn = 0; kn < diffIDs; kn++) {
493 for (Int_t n = 0; n < Ntrkcandhits; n++) {
495 if (MCtrkID[n] > 9998) {
501 if (prevID < MCtrkID[n]) {
505 countMC_IDs[diffCount]++;
508 int maxID = countMC_IDs[0];
510 for (
int kn = 0; kn < diffIDs; kn++) {
512 cout <<
"countMC_IDs[" << kn <<
"]=" << countMC_IDs[kn]
513 <<
" 0.65*Ntrkcandhits = " << 0.65 * Ntrkcandhits << endl;
514 if (countMC_IDs[kn] > 0.65 * Ntrkcandhits) {
516 ghostTrk[iN] =
false;
524 if (countMC_IDs[kn] > maxID) {
525 maxID = countMC_IDs[kn];
531 for (Int_t n = 0; n < Ntrkcandhits; n++) {
532 if (diffCount == posIDmax)
533 RECtrkMCid[iN] = prevID;
534 if (prevID < MCtrkID[n]) {
588 int RECassigMC[nGeaneTrks];
589 for (Int_t iN = 0; iN < nGeaneTrks; iN++)
592 for (Int_t iN = 0; iN < nGeaneTrks; iN++) {
593 int mc_i = RECtrkMCid[iN];
594 for (Int_t jN = (iN + 1); jN < nGeaneTrks; jN++) {
595 int mc_j = RECtrkMCid[jN];
599 cout <<
"GHOST?!: rec.trks #" << iN <<
" and #" << jN
600 <<
"were assigned to one MC trk =|" << endl;
606 int goodRecII = 0, ghostRecI = 0, ghostRecII = 0;
607 for (Int_t iN = 0; iN < nGeaneTrks; iN++) {
610 if (RECassigMC[iN] > 1) {
619 cout <<
"... RECtrk#" << iN <<
" was defined as GOOD ..." << endl;
625 cout <<
"... RECtrk#" << iN <<
" was defined as GHOST ..." << endl;
632 cout <<
"Ooops, RECtrk isn't GOOD and isn't GHOST!!!" << endl;
636 FairTrackParH *fRes = (FairTrackParH*)
fRecBPTracks->At(iN);
637 Double_t lyambda = fRes->GetLambda();
643 TVector3 MomRecBP = fRes->GetMomentum();
644 TVector3 PosBP = fRes->GetPosition();
650 glThetarec = thetaBP;
652 glMomrec = MomRecBP.Mag();
660 TVector3 errMomBP(errPx, errPy, errPz);
662 Double_t err_lyambda = fRes->GetDLambda();
669 TVector3 PosRecLMD(fFittedTrkP.GetX(), fFittedTrkP.GetY(),
671 TVector3 MomRecLMD(fFittedTrkP.GetPx(), fFittedTrkP.GetPy(),
672 fFittedTrkP.GetPz());
673 MomRecLMD *=
fPbeam / MomRecLMD.Mag();
674 glXrecLMD = PosRecLMD.X();
675 glYrecLMD = PosRecLMD.Y();
676 glZrecLMD = PosRecLMD.Z();
677 glThetarecLMD = MomRecLMD.Theta();
678 glPhirecLMD = MomRecLMD.Phi();
679 trkRECStatus = trkType;
688 auto const& digi_info(lmd_geo_helper.getHitLocationInfo(sensorID));
689 glModule = digi_info.module;
690 glHalf = digi_info.detector_half;
691 glTrkTime = myHit->GetTimeStamp();
706 int MCidforREC = RECtrkMCid[iN];
709 if (MCidforREC > 9998) {
719 glThetamcLMD = -9999;
723 glNumDoubleMChits = -9999;
731 glThetamc = MomMC.Theta();
732 glPhimc = MomMC.Phi();
733 glMommc = MomMC.Mag();
743 glNumMChits = MCtksSIMhits[MCidforREC];
744 glNumDoubleMChits = MCDoubleHits[MCidforREC];
749 int mcreftop = myHit->GetRefIndex();
751 cout <<
"mcrefbot = " << mcrefbot <<
" mcreftop = " << mcreftop << endl;
762 if (MCPointHit != NULL) {
765 double pxTrue = MCPointHit->GetPx();
766 double pyTrue = MCPointHit->GetPy();
767 double pzTrue = MCPointHit->GetPz();
768 TVector3 MomMClmd(pxTrue, pyTrue, pzTrue);
769 glXmcLMD = PosMClmd.X();
770 glYmcLMD = PosMClmd.Y();
771 glZmcLMD = PosMClmd.Z();
772 glThetamcLMD = MomMClmd.Theta();
773 glPhimcLMD = MomMClmd.Phi();
774 glMommcLMD = MomMClmd.Mag();
787 glThetamcLMD = -9999;
791 glNumDoubleMChits = -9999;
803 trkqlmd->
SetLMDpoint(glXrecLMD, glYrecLMD, glZrecLMD);
804 trkqlmd->
SetLMDdir(glThetarecLMD, glPhirecLMD);
807 trkqlmd->
SetIPmom(glThetarec, glPhirec, glMomrec);
809 trkqlmd->
SetIPerrmom(err_lyambda, err_phi, errMomBP.Mag());
812 trkqlmd->
SetMCmom(glThetamc, glPhimc, glMommc);
817 trkqlmd->
SetMCmomLMD(glThetamcLMD, glPhimcLMD, glMommcLMD);
832 if ((nParticles - goodRecII) > 0) {
834 int nMCmissedTrkSearch = 0;
835 int nMCmissedLossHits = 0;
836 for (
int imc = 0; imc < nParticles; imc++) {
838 for (
int irec = 0; irec < nGeaneTrks; irec++) {
839 int mc_comp = RECtrkMCid[irec];
840 if (mc_comp == imc && goodTrk[irec])
850 glThetamc = MomMC.Theta();
851 glPhimc = MomMC.Phi();
852 glMommc = MomMC.Mag();
856 int minHits = MCDoubleHits[imc] + 2;
857 if (MCDoubleHits[imc] == 4)
861 if (MCtksREChits[imc] > minHits) {
863 cout <<
" --- MCtrk#" << imc
864 <<
" was defined as MISSED during trk-search (#MChits="
865 << MCtksREChits[imc] <<
" with limit>" << minHits <<
")"
867 if (MCDoubleHits[imc] > 0)
868 cout <<
" NB:this MCtrk contains " << MCDoubleHits[imc]
869 <<
" double hits!" << endl;
872 nMCmissedTrkSearch++;
874 if (MCtksREChits[imc] > 0) {
879 cout <<
" --- MCtrk#" << imc
880 <<
" was defined as MISSED due to little amount of hits (#MChits="
881 << MCtksREChits[imc] <<
" with limit>" << minHits <<
")"
885 for (
int imhc = 0; imhc < nMCHits; imhc++) {
887 int MCtrkID = MCPoint->GetTrackID();
889 if (MCtrkID == imc) {
897 double pxTrue = MCPointHit->GetPx();
898 double pyTrue = MCPointHit->GetPy();
899 double pzTrue = MCPointHit->GetPz();
900 TVector3 MomMClmd(pxTrue, pyTrue, pzTrue);
901 glXmcLMD = PosMClmd.X();
902 glYmcLMD = PosMClmd.Y();
903 glZmcLMD = PosMClmd.Z();
904 glThetamcLMD = MomMClmd.Theta();
905 glPhimcLMD = MomMClmd.Phi();
906 glMommcLMD = MomMClmd.Mag();
912 glThetamcLMD = -9999;
921 glThetamcLMD = -9999;
937 glThetarecLMD = -9999;
952 TClonesArray& clref = *
fTrackQ;
953 Int_t size = clref.GetEntriesFast();
958 trkqlmd->
SetLMDpoint(glXrecLMD, glYrecLMD, glZrecLMD);
959 trkqlmd->
SetLMDdir(glThetarecLMD, glPhirecLMD);
962 trkqlmd->
SetIPmom(glThetarec, glPhirec, glMomrec);
964 trkqlmd->
SetMCmom(glThetamc, glPhimc, glMommc);
972 trkqlmd->
SetMCmomLMD(glThetamcLMD, glPhimcLMD, glMommcLMD);
996 cout <<
"PndLmdTrkQTask::Exec END!" << endl;
TClonesArray * fRecBPTracks
void SetEvRECMulti(int tot)
TVector3 GetPosition() const
void SetMCmom(double theta, double phi, double mom)
void SetMCpoint(double x, double y, double z)
PndTrackCandHit GetSortedHit(UInt_t i)
void SetTrkRecStatus(int st)
static PndLmdGeometryHelper & getInstance()
void SetLMDdir(double theta, double phi)
TVector3 GetMomentum() const
void SetIPpoint(double x, double y, double z)
void SetMCpointLMD(double x, double y, double z)
void SetIPerrpoint(double errx, double erry, double errz)
void SetMCmomLMD(double theta, double phi, double mom)
void SetSecondary(int sec)
void SetIPerrmom(double errtheta, double errphi, double errmom)
TClonesArray * fRecCandTracks
friend F32vec4 fabs(const F32vec4 &a)
void SetEvTime(double evtm)
void SetTrkTime(double trktm)
TClonesArray * fRecTracks
void SetSumEvPDG(int sumid)
void SetLMDchi2(double chi2)
TVector3 GetPosition() const
void SetLMDpoint(double x, double y, double z)
Int_t GetSecondMCHit() const
void SetNumMChits(int num)
void SetNumDoubleMChits(int num)
void SetEvMCMulti(int tot)
Int_t GetRefIndex() const
TVector3 GetStartVertex() const
Int_t GetSensorID() const
Int_t GetMotherID() const
void SetIPmom(double theta, double phi, double mom)
FairTrackParP GetParamFirst()