22 std::vector<const xAOD::TrackParticle*> & ListTracksNearMuon)
27 std::vector<const xAOD::TrackParticle*> SelectedTracks(0);
28 ListTracksNearMuon.clear();
30 if( InpTrk.empty() ) {
return nullptr;}
32 long int NTracks = SelectedTracks.size();
33 TLorentzVector TrkJet =
TotalMom(SelectedTracks);
36 h.m_hb_nseltrk->Fill( (
double)NTracks );
38 if( NTracks < 1 ) {
return nullptr;}
44 h.m_hb_muonPt->Fill(
Muon->pt() );
51 int nTracksNearMuon=ListTracksNearMuon.size();
58 if(ListTracksNearMuon.empty()) {
return nullptr;}
66 std::vector<double> ErrorMatrix;
67 std::vector< std::vector<double> > TrkAtVrt;
68 TLorentzVector Momentum;
69 std::vector<double> Impact,ImpactError;
71 double Chi2 =
FitCommonVrt( ListTracksNearMuon, PrimVrt,
Muon, FitVertex, ErrorMatrix, Momentum, TrkAtVrt);
72 if( Chi2 < 0 && ListTracksNearMuon.size()>2 ) {
73 double tpmax=0;
int ipmax=-1;
74 for(
int it=0;
it<(
int)ListTracksNearMuon.size();
it++)
if(tpmax<ListTracksNearMuon[
it]->
pt()){tpmax=ListTracksNearMuon[
it]->pt(); ipmax=
it;}
76 Chi2 =
FitCommonVrt( ListTracksNearMuon, PrimVrt,
Muon, FitVertex, ErrorMatrix, Momentum, TrkAtVrt);
77 if( Chi2 < 0 && ListTracksNearMuon.size()>2 ) {
79 for(
int it=0;
it<(
int)ListTracksNearMuon.size();
it++)
if(tpmax<ListTracksNearMuon[
it]->
pt()){tpmax=ListTracksNearMuon[
it]->pt(); ipmax=
it;}
81 Chi2 =
FitCommonVrt( ListTracksNearMuon, PrimVrt,
Muon, FitVertex, ErrorMatrix, Momentum, TrkAtVrt);
85 if( Chi2 < 0) {
return nullptr; }
93 h.m_hb_r2dc->Fill( FitVertex.perp() );
94 h.m_hb_totmass->Fill( Momentum.M() );
95 h.m_hb_nvrt2->Fill( (
double)nTracksNearMuon );
103 std::vector<float> floatErrMtx; floatErrMtx.resize(ErrorMatrix.size());
104 for(
int i=0;
i<(
int)ErrorMatrix.size();
i++) floatErrMtx[
i]=ErrorMatrix[
i];
106 tmpVertex->
setFitQuality(Chi2, (
float)(ListTracksNearMuon.size()*2.-3.));
110 double Signif3D;
VrtVrtDist(PrimVrt, FitVertex, ErrorMatrix, Signif3D);
113 std::vector<Trk::VxTrackAtVertex> & tmpVTAV=tmpVertex->
vxTrackAtVertex(); tmpVTAV.clear();
114 for(
int ii=0; ii<(
int)ListTracksNearMuon.size(); ii++) {
116 CovMtxP.setIdentity();
119 tmpVTAV.emplace_back( 1., tmpMeasPer );
142 std::vector<double> & ErrorMatrix,
143 TLorentzVector & Momentum,
144 std::vector< std::vector<double> > & TrkAtVrt)
150 ListSecondTracks.insert(ListSecondTracks.begin(),
Muon);
152 int NTracksVrt = ListSecondTracks.size();
154 const double maxRecMASS=6000.;
156 double Chi2 = 0., FitProb=0.;
158 std::vector<double> Chi2PerTrk(0);
163 std::vector<double> InpMass(NTracksVrt,
m_massPi);
166 if(
sc.isFailure() || FitVertex.perp() >
m_Rlayer2*2. ) {
178 for (
int i=0;
i < NTracksVrt-1;
i++) {
179 sc=
VKalVrtFitBase(ListSecondTracks,FitVertex, Momentum,Charge,ErrorMatrix,Chi2PerTrk,TrkAtVrt,Chi2,
181 if(
sc.isFailure() || Chi2 > 1000000. ) {
return -10000.;}
183 FitProb=TMath::Prob( Chi2, 2*ListSecondTracks.size()-3);
184 if(ListSecondTracks.size() == 2 )
break;
185 if( FitProb > 0.001) {
186 if( Momentum.M() <maxRecMASS) {
189 double minM=1.e12;
int minT=-1;
double minChi2=1.e12;
190 for(
int it=0;
it<(
int)ListSecondTracks.size();
it++){
191 std::vector<const xAOD::TrackParticle*> tmpList(ListSecondTracks);
192 tmpList.erase(tmpList.begin()+
it);
193 sc=
VKalVrtFitBase(tmpList,tmpVertex,Momentum,Charge,ErrorMatrix,Chi2PerTrk,TrkAtVrt,Chi2,*state,
true);
194 if(
sc.isFailure())
continue;
195 if(Momentum.M()<minM && minM>maxRecMASS){minM=Momentum.M(); minT=
it; minChi2=Chi2;}
196 else if(Momentum.M()<maxRecMASS && minM<maxRecMASS && Chi2<minChi2){minChi2=Chi2; minT=
it;}
225 std::vector<const xAOD::TrackParticle*> & ListSecondTracks)
229 std::vector<double> ErrorMatrix,Chi2PerTrk,VKPerigee,CovPerigee;
230 std::vector< std::vector<double> > TrkAtVrt;
231 TLorentzVector Momentum;
232 std::vector<double> Impact,ImpactError;
233 double Chi2, Signif3D, Dist2D, MuonVrtDir;
236 long int NTracks = (
int) (SelectedTracks.size());
237 std::vector<const xAOD::TrackParticle*> TracksForFit(2,
nullptr);
242 std::vector<double> TrackSignif(NTracks);
243 double SignifR,SignifZ;
244 for (
int i=0;
i<NTracks;
i++) {
246 if(
sin(SelectedTracks[
i]->
phi() -
Muon->phi())*Impact[0] < 0 ){
247 Impact[0] = -std::abs(Impact[0]);
249 else{ Impact[0] = std::abs(Impact[0]); }
250 if( (SelectedTracks[
i]->p4().Theta() -
Muon->p4().Theta())*Impact[1] < 0 ){
251 Impact[1] = -std::abs(Impact[1]);
253 else{ Impact[1] = std::abs(Impact[1]); }
255 SignifR = Impact[0]/ std::sqrt(ImpactError[0]);
256 SignifZ = Impact[1]/ std::sqrt(ImpactError[2]);
259 h.m_hb_impactR->Fill( SignifR );
260 h.m_hb_impactZ->Fill( SignifZ );
261 h.m_hb_impact->Fill( TrackSignif[
i] );
267 ListSecondTracks.reserve(2*NTracks);
270 TracksForFit[0]=
Muon;
271 for (
int i=0;
i<NTracks;
i++) {
274 TracksForFit[1]=SelectedTracks[
i];
276 if(
sc.isFailure() || FitVertex.perp() >
m_Rlayer2*2. ) {
280 MuonVrtDir =
Muon->p4().Px()*vDist.x() +
Muon->p4().Py()*vDist.y() +
Muon->p4().Pz()*vDist.z();
281 if( MuonVrtDir>0. ) iniVrt=FitVertex;
286 ErrorMatrix,Chi2PerTrk,TrkAtVrt,Chi2,
288 if(
sc.isFailure())
continue;
290 double mass_PiPi = Momentum.M();
291 if(mass_PiPi > 6000.)
continue;
294 h.m_hb_massPiPi->Fill( mass_PiPi );
296 Dist2D=FitVertex.perp();
297 if(Dist2D > 180. )
continue;
298 VrtVrtDist(PrimVrt, FitVertex, ErrorMatrix, Signif3D);
301 double vPos=(vDist.x()*Momentum.Px()+vDist.y()*Momentum.Py()+vDist.z()*Momentum.Pz())/Momentum.Rho();
302 if(vPos<0.)
continue;
305 h.m_hb_r2d->Fill( Dist2D );
306 h.m_hb_signif3D->Fill( Signif3D );