FairRoot/PandaRoot
PndPidDrcInfo.cxx
Go to the documentation of this file.
1 #include "PndPidCorrelator.h"
2 #include "PndDrcHit.h"
3 #include "PndDrcBarPoint.h"
4 
5 #include <cmath>
6 
7 //_________________________________________________________________
8 Bool_t PndPidCorrelator::GetDrcInfo(FairTrackParH* helix, PndPidCandidate* pidCand) {
9  if (helix->GetZ()>120.) return kFALSE; // cut fwd endcap tracks
10  //---
11  PndDrcHit *drcHit = NULL;
12  Int_t drcEntries = fDrcHit->GetEntriesFast();
13  Int_t drcIndex = -1, drcPhot = 0;
14  Float_t drcThetaC = -1000, drcThetaCErr = 0, drcGLength = -1000;
15  Float_t drcQuality = 1000000;
16 
17  TVector3 vertex(0., 0., 0.);
18  //Float_t vertex_z = -1000; //[R.K.03/2017] unused variable
19  TVector3 drcPos(0., 0., 0.);
20  TVector3 momentum(0., 0., 0.);
21 
22  if (fGeanePro) // Overwrites vertex if Geane is used
23  {
24  fGeanePropagator->PropagateToVolume("DrcBarSensor",0,1);
25 // fGeanePropagator->PropagateToVolume("BarrelDIRC",0,1);
26  vertex.SetXYZ(-10000, -10000, -10000); // reset vertex
27  FairTrackParH *fRes= new FairTrackParH();
28  Bool_t rc = fGeanePropagator->Propagate(helix, fRes, fPidHyp*pidCand->GetCharge());
29  if (!rc) return kFALSE;
30  vertex.SetXYZ(fRes->GetX(), fRes->GetY(), 0.);
31  //vertex_z = fRes->GetZ(); //[R.K.03/2017] unused variable
32  drcGLength = fGeanePropagator->GetLengthAtPCA();
33  if (drcGLength>30.) return kFALSE; // additional cut on extrapolation distance to avoid fake correlations
34  }
35  for (Int_t dd = 0; dd<drcEntries; dd++)
36  {
37  drcHit = (PndDrcHit*)fDrcHit->At(dd);
38  if ( fIdeal && ( ((PndDrcBarPoint*)fDrcPoint->At(drcHit->GetRefIndex()))->GetTrackID() !=pidCand->GetMcIndex()) ) continue;
39  drcHit->Position(drcPos);
40 
41  Float_t dphi = vertex.DeltaPhi(drcPos);
42  Float_t dist = dphi * dphi;
43  if (drcQuality > dist)
44  {
45  drcIndex = dd;
46  drcQuality = dist;
47  drcThetaC = drcHit->GetThetaC();
48  drcThetaCErr = drcHit->GetErrThetaC();
49  drcPhot = 0; // ** to be filled **
50  }
51  if (fDebugMode)
52  {
53  Float_t ntuple[] = {static_cast<Float_t>(vertex.X()), static_cast<Float_t>(vertex.Y()), static_cast<Float_t>(vertex.Z()), static_cast<Float_t>(vertex.Phi()),
54  static_cast<Float_t>(helix->GetMomentum().Mag()), static_cast<Float_t>(helix->GetQ()), static_cast<Float_t>(helix->GetMomentum().Theta()), static_cast<Float_t>(helix->GetZ()),
55  static_cast<Float_t>(drcPos.X()), static_cast<Float_t>(drcPos.Y()), static_cast<Float_t>(drcPos.Phi()),
56  dist, static_cast<Float_t>(drcHit->GetThetaC()), 0., static_cast<Float_t>(vertex.DeltaPhi(drcPos)), drcGLength,
57  static_cast<Float_t>(pidCand->GetFitStatus())
58  };
59  // Float_t ntuple[] = {vertex.X(), vertex.Y(), vertex_z, vertex.Phi(),
60  // helix->GetMomentum().Mag(), helix->GetQ(), helix->GetMomentum().Theta(), helix->GetZ(),
61  // drcPos.X(), drcPos.Y(), drcPos.Phi(),
62  // dist, drcHit->GetThetaC(), 0., vertex.DeltaPhi(drcPos), drcGLength,
63  // pidCand->GetFitStatus()
64  // };
65  drcCorr->Fill(ntuple);
66  }
67  }
68  if ((drcQuality<fCorrPar->GetDrcCut()) || (fIdeal && drcIndex!=-1))
69  {
70  pidCand->SetDrcQuality(drcQuality);
71  pidCand->SetDrcThetaC(drcThetaC);
72  pidCand->SetDrcThetaCErr(drcThetaCErr);
73  pidCand->SetDrcNumberOfPhotons(drcPhot);
74  pidCand->SetDrcIndex(drcIndex);
75  }
76  return kTRUE;
77 }
78 
Int_t GetCharge() const
Int_t GetMcIndex() const
void SetDrcThetaCErr(Double_t val)
virtual Double_t GetErrThetaC()
Definition: PndDrcHit.h:43
Bool_t GetDrcInfo(FairTrackParH *helix, PndPidCandidate *pid)
void SetDrcNumberOfPhotons(Int_t val)
TClonesArray * fDrcHit
PndDrcBarPoint TCA.
FairGeanePro * fGeanePropagator
Refitter for MDT tracks.
void SetDrcQuality(Double_t val)
void SetDrcIndex(Int_t val)
void SetDrcThetaC(Double_t val)
TClonesArray * fDrcPoint
PndMdtTrk TCA.
virtual Int_t GetRefIndex()
Definition: PndDrcHit.h:44
ClassImp(PndAnaContFact)
virtual Double_t GetThetaC()
Definition: PndDrcHit.h:42
Int_t GetFitStatus() const