AliPhysics  9c7580a (9c7580a)
AliEmcalTrackingQATask.cxx
Go to the documentation of this file.
1 #include <iostream>
2 
3 #include <THnSparse.h>
4 #include <TMath.h>
5 #include <TString.h>
6 
7 #include <AliESDtrack.h>
8 #include <AliAODTrack.h>
9 #include <AliAODMCParticle.h>
10 #include <AliLog.h>
11 #include <AliAnalysisManager.h>
12 #include <AliVEventHandler.h>
13 
14 #include "AliMCParticleContainer.h"
15 
16 #include "AliEmcalTrackingQATask.h"
17 
18 ClassImp(AliEmcalTrackingQATask)
19 
20 
24  AliAnalysisTaskEmcalLight("AliEmcalTrackingQA", kTRUE),
25  fDoSigma1OverPt(kFALSE),
26  fDoSigmaPtOverPtGen(kFALSE),
27  fIsEsd(kFALSE),
28  fGeneratorLevel(nullptr),
29  fDetectorLevel(nullptr),
30  fPtHistBins(),
31  fEtaHistBins(),
32  fPhiHistBins(),
33  fCentHistBins(),
34  fPtRelDiffHistBins(),
35  fPtResHistBins(),
36  f1OverPtResHistBins(),
37  fIntegerHistBins(),
38  fTracks(nullptr),
39  fParticlesPhysPrim(nullptr),
40  fParticlesMatched(nullptr)
41 {
42  SetMakeGeneralHistograms(kTRUE);
43 
44  GenerateHistoBins();
45 }
46 
51  AliAnalysisTaskEmcalLight("AliEmcalTrackingQA", kTRUE),
52  fDoSigma1OverPt(kFALSE),
53  fDoSigmaPtOverPtGen(kFALSE),
54  fIsEsd(kFALSE),
55  fGeneratorLevel(nullptr),
56  fDetectorLevel(nullptr),
57  fPtHistBins(),
58  fEtaHistBins(),
59  fPhiHistBins(),
60  fCentHistBins(),
61  fPtRelDiffHistBins(),
62  fPtResHistBins(),
63  f1OverPtResHistBins(),
64  fIntegerHistBins(),
65  fTracks(nullptr),
66  fParticlesPhysPrim(nullptr),
67  fParticlesMatched(nullptr)
68 {
70 
72 }
73 
78 {
79 }
80 
85 {
86  GenerateFixedBinArray(6, 0.0, 0.3, fPtHistBins, false);
87  GenerateFixedBinArray(7, 0.3, 1.0, fPtHistBins, false);
88  GenerateFixedBinArray(10, 1.0, 3.0, fPtHistBins, false);
89  GenerateFixedBinArray(14, 3.0, 10.0, fPtHistBins, false);
90  GenerateFixedBinArray(10, 10.0, 20.0, fPtHistBins, false);
91  GenerateFixedBinArray(15, 20.0, 50.0, fPtHistBins, false);
92  GenerateFixedBinArray(20, 50.0, 150.0, fPtHistBins);
93 
94  GenerateFixedBinArray(100, -1.0, 1.0, fEtaHistBins);
95 
96  GenerateFixedBinArray(100, 0.0, TMath::TwoPi(), fPhiHistBins);
97 
98  fCentHistBins.push_back(0);
99  fCentHistBins.push_back(10);
100  fCentHistBins.push_back(30);
101  fCentHistBins.push_back(50);
102  fCentHistBins.push_back(90);
103 
104  GenerateFixedBinArray(50, 0.00, 0.05, fPtResHistBins, false);
105  GenerateFixedBinArray(25, 0.05, 0.10, fPtResHistBins, false);
106  GenerateFixedBinArray(25, 0.10, 0.20, fPtResHistBins, false);
107  GenerateFixedBinArray(30, 0.20, 0.50, fPtResHistBins, false);
108  GenerateFixedBinArray(25, 0.50, 1.00, fPtResHistBins, false);
109  GenerateFixedBinArray(20, 1.00, 2.00, fPtResHistBins);
110 
111  GenerateFixedBinArray(200, -2.0, 2.0, fPtRelDiffHistBins);
112 
113  GenerateFixedBinArray(100, 0.00, 0.02, f1OverPtResHistBins, false);
114  GenerateFixedBinArray( 60, 0.02, 0.05, f1OverPtResHistBins, false);
115  GenerateFixedBinArray( 50, 0.05, 0.10, f1OverPtResHistBins, false);
116  GenerateFixedBinArray( 50, 0.10, 0.20, f1OverPtResHistBins, false);
117  GenerateFixedBinArray( 75, 0.20, 0.50, f1OverPtResHistBins, false);
118  GenerateFixedBinArray( 80, 0.50, 1.50, f1OverPtResHistBins);
119 
120  GenerateFixedBinArray(10, -0.5, 9.5, fIntegerHistBins);
121 }
122 
127 {
129 
130  if (fParticleCollArray.empty()) {
131  AliErrorStream() << "This task needs at least one particle container! The task won't run." << std::endl;
132  fInhibit = kTRUE;
133  return;
134  }
135 
136  AliDebugStream(3) << "Loading the detector track container" << std::endl;
137  if (!fDetectorLevel) {
138  auto iter = fParticleCollArray.find("detector");
139  if (iter == fParticleCollArray.end()) {
140  AliErrorStream() << "This task needs at least one particle container named 'detector'! The task won't run." << std::endl;
141  fInhibit = kTRUE;
142  return;
143  }
144  else {
145  fDetectorLevel = static_cast<AliTrackContainer*>(iter->second);
146  }
147  }
148 
149  AliDebugStream(3) << "Loading the generator particle container" << std::endl;
150  if (!fGeneratorLevel) {
151  auto iter = fParticleCollArray.find("generator");
152  if (iter == fParticleCollArray.end()) {
153  AliInfoStream() << "No particle container named 'generator' was found. Assuming this is not a MC production." << std::endl;
154  }
155  else {
156  fGeneratorLevel = static_cast<AliMCParticleContainer*>(iter->second);
157  }
158  }
159 
160  AliDebugStream(3) << "Allocating histograms" << std::endl;
162 
163  if (fGeneratorLevel) {
166  }
167 }
168 
170 {
172  if (!fDetectorLevel->GetArray()) {
173  AliErrorStream() << "Could not load track array! The task won't run." << std::endl;
174  fInhibit = kTRUE;
175  return;
176  }
177  if (fDetectorLevel->GetArray()->GetClass()->InheritsFrom("AliESDtrack")) fIsEsd = kTRUE;
178 }
179 
186 THnSparse* AliEmcalTrackingQATask::GenerateTHnSparse(const char* name, const std::vector<std::tuple<std::string, std::vector<Double_t>::iterator, std::vector<Double_t>::iterator>>& axis)
187 {
188  std::vector<int> nbins;
189  for (auto a : axis) nbins.push_back(int(std::get<2>(a) - std::get<1>(a) - 1));
190 
191  THnSparse* h = new THnSparseF(name, name, nbins.size(), &nbins[0]);
192  Int_t i = 0;
193  for (auto a : axis) {
194  h->GetAxis(i)->SetTitle(std::get<0>(a).c_str());
195  h->SetBinEdges(i, &(*(std::get<1>(a))));
196  i++;
197  }
198 
199  return h;
200 }
201 
206 {
207  typedef std::vector<Double_t>::iterator my_iterator;
208 
209  std::vector<std::tuple<std::string, my_iterator, my_iterator>> axis;
210 
212  axis.push_back(std::make_tuple("Centrality %", fCentHistBins.begin(), fCentHistBins.end()));
213  }
214 
215  axis.push_back(std::make_tuple("#it{p}_{T} (GeV/#it{c})", fPtHistBins.begin(), fPtHistBins.end()));
216  axis.push_back(std::make_tuple("#eta", fEtaHistBins.begin(), fEtaHistBins.end()));
217  axis.push_back(std::make_tuple("#phi", fPhiHistBins.begin(), fPhiHistBins.end()));
218  axis.push_back(std::make_tuple("MC Generator", fIntegerHistBins.begin(), fIntegerHistBins.begin() + 3));
219  axis.push_back(std::make_tuple("track type", fIntegerHistBins.begin(), fIntegerHistBins.begin() + 4));
220 
221  if (fDoSigma1OverPt) {
222  axis.push_back(std::make_tuple("#sigma(1/#it{p}_{T}) (GeV/#it{c})^{-1}", f1OverPtResHistBins.begin(), f1OverPtResHistBins.end()));
223  }
224  else {
225  axis.push_back(std::make_tuple("#sigma(#it{p}_{T}) / #it{p}_{T}", fPtResHistBins.begin(), fPtResHistBins.end()));
226  }
227 
228  fTracks = GenerateTHnSparse("fTracks", axis);
229 
230  fOutput->Add(fTracks);
231 }
232 
237 {
238  typedef std::vector<Double_t>::iterator my_iterator;
239 
240  std::vector<std::tuple<std::string, my_iterator, my_iterator>> axis;
241 
243  axis.push_back(std::make_tuple("Centrality %", fCentHistBins.begin(), fCentHistBins.end()));
244  }
245 
246  axis.push_back(std::make_tuple("#it{p}_{T} (GeV/#it{c})", fPtHistBins.begin(), fPtHistBins.end()));
247  axis.push_back(std::make_tuple("#eta", fEtaHistBins.begin(), fEtaHistBins.end()));
248  axis.push_back(std::make_tuple("#phi", fPhiHistBins.begin(), fPhiHistBins.end()));
249  axis.push_back(std::make_tuple("MC Generator", fIntegerHistBins.begin(), fIntegerHistBins.begin() + 3));
250  axis.push_back(std::make_tuple("Findable", fIntegerHistBins.begin(), fIntegerHistBins.begin() + 3));
251 
252  fParticlesPhysPrim = GenerateTHnSparse("fParticlesPhysPrim", axis);
253 
255 }
256 
261 {
262  typedef std::vector<Double_t>::iterator my_iterator;
263 
264  std::vector<std::tuple<std::string, my_iterator, my_iterator>> axis;
265 
267  axis.push_back(std::make_tuple("Centrality %", fCentHistBins.begin(), fCentHistBins.end()));
268  }
269 
270  axis.push_back(std::make_tuple("#it{p}_{T}^{gen} (GeV/#it{c})", fPtHistBins.begin(), fPtHistBins.end()));
271  axis.push_back(std::make_tuple("#eta^{gen}", fEtaHistBins.begin(), fEtaHistBins.end()));
272  axis.push_back(std::make_tuple("#phi^{gen}", fPhiHistBins.begin(), fPhiHistBins.end()));
273  axis.push_back(std::make_tuple("#it{p}_{T}^{det} (GeV/#it{c})", fPtHistBins.begin(), fPtHistBins.end()));
274  axis.push_back(std::make_tuple("#eta^{det}", fEtaHistBins.begin(), fEtaHistBins.end()));
275  axis.push_back(std::make_tuple("#phi^{det}", fPhiHistBins.begin(), fPhiHistBins.end()));
276  axis.push_back(std::make_tuple("track type", fIntegerHistBins.begin(), fIntegerHistBins.begin() + 4));
277 
278  if (fDoSigma1OverPt) {
279  axis.push_back(std::make_tuple("(#it{p}_{T}^{gen} - #it{p}_{T}^{det}) / #it{p}_{T}^{gen}", fPtRelDiffHistBins.begin(), fPtRelDiffHistBins.end()));
280  }
281  else {
282  axis.push_back(std::make_tuple("(#it{p}_{T}^{gen} - #it{p}_{T}^{det}) / #it{p}_{T}^{det}", fPtRelDiffHistBins.begin(), fPtRelDiffHistBins.end()));
283  }
284 
285  fParticlesMatched = GenerateTHnSparse("fParticlesMatched", axis);
286 
288 }
289 
294  Double_t sigma1OverPt, Int_t mcGen, Byte_t trackType)
295 {
296  std::vector<Double_t> contents(fTracks->GetNdimensions());
297 
298  for (Int_t i = 0; i < fTracks->GetNdimensions(); i++) {
299  TString title(fTracks->GetAxis(i)->GetTitle());
300  if (title=="Centrality %")
301  contents[i] = cent;
302  else if (title=="#it{p}_{T} (GeV/#it{c})")
303  contents[i] = trackPt;
304  else if (title=="#eta")
305  contents[i] = trackEta;
306  else if (title=="#phi")
307  contents[i] = trackPhi;
308  else if (title=="#sigma(1/#it{p}_{T}) (GeV/#it{c})^{-1}")
309  contents[i] = sigma1OverPt;
310  else if (title=="#sigma(#it{p}_{T}) / #it{p}_{T}")
311  contents[i] = sigma1OverPt*trackPt;
312  else if (title=="MC Generator")
313  contents[i] = mcGen;
314  else if (title=="track type")
315  contents[i] = trackType;
316  else
317  AliWarning(Form("Unable to fill dimension %s of histogram %s!", title.Data(), fTracks->GetName()));
318  }
319 
320  fTracks->Fill(&contents[0]);
321 }
322 
326 void AliEmcalTrackingQATask::FillGeneratorLevelTHnSparse(Double_t cent, Double_t partEta, Double_t partPhi, Double_t partPt, Int_t mcGen, Byte_t findable)
327 {
328  std::vector<Double_t> contents(fParticlesPhysPrim->GetNdimensions());
329 
330  for (Int_t i = 0; i < fParticlesPhysPrim->GetNdimensions(); i++) {
331  TString title(fParticlesPhysPrim->GetAxis(i)->GetTitle());
332  if (title=="Centrality %")
333  contents[i] = cent;
334  else if (title=="#it{p}_{T} (GeV/#it{c})")
335  contents[i] = partPt;
336  else if (title=="#eta")
337  contents[i] = partEta;
338  else if (title=="#phi")
339  contents[i] = partPhi;
340  else if (title=="MC Generator")
341  contents[i] = mcGen;
342  else if (title=="Findable")
343  contents[i] = findable;
344  else
345  AliWarning(Form("Unable to fill dimension %s of histogram %s!", title.Data(), fParticlesPhysPrim->GetName()));
346  }
347 
348  fParticlesPhysPrim->Fill(&contents[0]);
349 }
350 
355  Double_t trackEta, Double_t trackPhi, Double_t trackPt, Byte_t trackType)
356 {
357  std::vector<Double_t> contents(fParticlesMatched->GetNdimensions());
358 
359  for (Int_t i = 0; i < fParticlesMatched->GetNdimensions(); i++) {
360  TString title(fParticlesMatched->GetAxis(i)->GetTitle());
361  if (title=="Centrality %")
362  contents[i] = cent;
363  else if (title=="#it{p}_{T}^{gen} (GeV/#it{c})")
364  contents[i] = partPt;
365  else if (title=="#eta^{gen}")
366  contents[i] = partEta;
367  else if (title=="#phi^{gen}")
368  contents[i] = partPhi;
369  else if (title=="#it{p}_{T}^{det} (GeV/#it{c})")
370  contents[i] = trackPt;
371  else if (title=="#eta^{det}")
372  contents[i] = trackEta;
373  else if (title=="#phi^{det}")
374  contents[i] = trackPhi;
375  else if (title=="(#it{p}_{T}^{gen} - #it{p}_{T}^{det}) / #it{p}_{T}^{gen}")
376  contents[i] = (partPt - trackPt) / partPt;
377  else if (title=="(#it{p}_{T}^{gen} - #it{p}_{T}^{det}) / #it{p}_{T}^{det}")
378  contents[i] = (partPt - trackPt) / trackPt;
379  else if (title=="track type")
380  contents[i] = (Double_t)trackType;
381  else
382  AliWarning(Form("Unable to fill dimension %s of histogram %s!", title.Data(), fParticlesMatched->GetName()));
383  }
384 
385  fParticlesMatched->Fill(&contents[0]);
386 }
387 
392 {
393  auto iterable = fDetectorLevel->accepted_momentum();
394  for (auto trackIterator = iterable.begin(); trackIterator != iterable.end(); trackIterator++) {
395  auto track = trackIterator->second;
396  Byte_t type = fDetectorLevel->GetTrackType(track);
397  if (type <= 2) {
398  Double_t sigma = 0;
399 
400  if (fIsEsd) {
401  AliESDtrack *esdTrack = dynamic_cast<AliESDtrack*>(track);
402  if (esdTrack) sigma = TMath::Sqrt(esdTrack->GetSigma1Pt2());
403  }
404  else { // AOD
405  AliAODTrack *aodtrack = dynamic_cast<AliAODTrack*>(track);
406  if(!aodtrack) AliFatal("Not a standard AOD");
407 
408  AliExternalTrackParam exParam;
409 
410  //get covariance matrix
411  Double_t cov[21] = {0,};
412  aodtrack->GetCovMatrix(cov);
413  Double_t pxpypz[3] = {0,};
414  aodtrack->PxPyPz(pxpypz);
415  Double_t xyz[3] = {0,};
416  aodtrack->GetXYZ(xyz);
417  Short_t sign = aodtrack->Charge();
418  exParam.Set(xyz,pxpypz,cov,sign);
419 
420  sigma = TMath::Sqrt(exParam.GetSigma1Pt2());
421  }
422 
423  Int_t label = TMath::Abs(track->GetLabel());
424  AliDebugStream(10) << "Track " << trackIterator.current_index() << " with type " << int(type) << " and label " << label <<
425  ", pt = " << track->Pt() << std::endl;
426  Int_t mcGen = 1;
427  // reject particles generated from other generators in the cocktail but keep fake tracks (label == 0)
428  if (label == 0 || track->GetGeneratorIndex() <= 0) mcGen = 0;
429 
430  FillDetectorLevelTHnSparse(fCent, track->Eta(), track->Phi(), track->Pt(), sigma, mcGen, type);
431 
432  if (fGeneratorLevel && label > 0) {
433  AliAODMCParticle *part = fGeneratorLevel->GetAcceptMCParticleWithLabel(label);
434  if (part) {
435  if (part->GetGeneratorIndex() <= 0) {
436  Int_t pdg = TMath::Abs(part->PdgCode());
437  // select charged pions, protons, kaons , electrons, muons
438  if (pdg == 211 || pdg == 2212 || pdg == 321 || pdg == 11 || pdg == 13) {
439  FillMatchedParticlesTHnSparse(fCent, part->Eta(), part->Phi(), part->Pt(), track->Eta(), track->Phi(), track->Pt(), type);
440  }
441  }
442  }
443  }
444  }
445  else {
446  AliErrorStream() << "Track " << trackIterator.current_index() << " has type " << type << " not recognized!" << std::endl;
447  }
448  }
449 
450  if (fGeneratorLevel) {
451  auto iterable = fGeneratorLevel->accepted_momentum();
452  for (auto partIterator = iterable.begin(); partIterator != iterable.end(); partIterator++) {
453  auto part = partIterator->second;
454 
455  Int_t mcGen = 1;
456  Byte_t findable = 0;
457 
458  if (part->GetGeneratorIndex() <= 0) mcGen = 0;
459 
460  Int_t pdg = TMath::Abs(part->PdgCode());
461  // select charged pions, protons, kaons , electrons, muons
462  if (pdg == 211 || pdg == 2212 || pdg == 321 || pdg == 11 || pdg == 13) findable = 1;
463 
464  FillGeneratorLevelTHnSparse(fCent, part->Eta(), part->Phi(), part->Pt(), mcGen, findable);
465  }
466  }
467 
468  return kTRUE;
469 }
470 
477 {
478  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
479  if (!mgr) {
480  AliErrorClassStream() << "No analysis manager to connect to." << std::endl;
481  return nullptr;
482  }
483 
484  // Check the analysis type using the event handlers connected to the analysis manager
485  AliVEventHandler* handler = mgr->GetInputEventHandler();
486  if (!handler) {
487  AliErrorClassStream() << "This task requires an input event handler" << std::endl;
488  return nullptr;
489  }
490  else {
491  AliInfoClassStream() << "Event handler ok!" << std::endl;
492  }
493 
494  EDataType_t dataType = kUnknownDataType;
495 
496  if (handler->InheritsFrom("AliESDInputHandler")) {
497  dataType = kESD;
498  AliInfoClassStream() << "Data type is ESD." << std::endl;
499  }
500  else if (handler->InheritsFrom("AliAODInputHandler")) {
501  dataType = kAOD;
502  AliInfoClassStream() << "Data type is AOD." << std::endl;
503  }
504 
505  TString track_name("tracks");
506  if (dataType == kESD) track_name = "Tracks";
507 
508  // Init the task and do settings
509  TString name("AliEmcalTrackingQATask");
510  AliInfoClassStream() << "Allocating task." << std::endl;
512  qaTask->SetVzRange(-10,10);
513  AliInfoClassStream() << "Task allocated, setting containers." << std::endl;
514  qaTask->AddParticleContainer(track_name.Data(), "detector");
515  if (isMC) qaTask->AddParticleContainer("mcparticles", "generator");
516 
517  AliInfoClassStream() << "Containers ok, adding task to the analysis manager." << std::endl;
518  // Final settings, pass to manager and set the containers
519  mgr->AddTask(qaTask);
520 
521  AliInfoClassStream() << "Task added, setting input/output." << std::endl;
522  // Create containers for input/output
523  AliAnalysisDataContainer *cinput1 = mgr->GetCommonInputContainer() ;
524 
525  TString contName(name);
526  contName += "_histos";
527  AliAnalysisDataContainer *coutput1 = mgr->CreateContainer(contName.Data(),
528  TList::Class(),AliAnalysisManager::kOutputContainer,
529  Form("%s", AliAnalysisManager::GetCommonFileName()));
530  mgr->ConnectInput (qaTask, 0, cinput1 );
531  mgr->ConnectOutput (qaTask, 1, coutput1 );
532 
533 
534  AliInfoClassStream() << "Task configuration done." << std::endl;
535  return qaTask;
536 }
537 
Int_t pdg
Bool_t fInhibit
!inhibit execution of the task
std::vector< Double_t > fEtaHistBins
! eta bins
double Double_t
Definition: External.C:58
EDataType_t
Switch for the data type.
AliTrackContainer * fDetectorLevel
! detector level container
const char * title
Definition: MakeQAPdf.C:27
std::vector< Double_t > fIntegerHistBins
! integer bins
const AliMCParticleIterableMomentumContainer accepted_momentum() const
std::vector< Double_t > f1OverPtResHistBins
! 1/pt res bins
Container with name, TClonesArray and cuts for particles.
static std::vector< double > GenerateFixedBinArray(int n, double min, double max, bool last=true)
THnSparse * GenerateTHnSparse(const char *name, const std::vector< std::tuple< std::string, std::vector< Double_t >::iterator, std::vector< Double_t >::iterator >> &axis)
std::vector< Double_t > fPtHistBins
! pt bins
TString part
use mixed event to constrain combinatorial background
Definition: InvMassFit.C:52
Double_t * sigma
EBeamType_t fForceBeamType
forced beam type
void FillMatchedParticlesTHnSparse(Double_t cent, Double_t partEta, Double_t partPhi, Double_t partPt, Double_t trackEta, Double_t trackPhi, Double_t trackPt, Byte_t trackType)
void FillDetectorLevelTHnSparse(Double_t cent, Double_t trackEta, Double_t trackPhi, Double_t trackPt, Double_t sigma1OverPt, Int_t mcGen, Byte_t trackType)
Bool_t fIsEsd
! whether it is ESD data
std::vector< Double_t > fPtResHistBins
! pt res bins
int Int_t
Definition: External.C:63
Base task in the EMCAL framework (lighter version of AliAnalysisTaskEmcal)
virtual AliAODMCParticle * GetAcceptMCParticleWithLabel(Int_t lab)
std::vector< Double_t > fCentHistBins
! cent bins
std::vector< Double_t > fPtRelDiffHistBins
! pt relative difference bins
static AliEmcalTrackingQATask * AddTaskTrackingQA(Bool_t isMC)
short Short_t
Definition: External.C:23
Bool_t isMC
void FillGeneratorLevelTHnSparse(Double_t cent, Double_t partEta, Double_t partPhi, Double_t partPt, Int_t mcGen, Byte_t findable)
AliParticleContainer * AddParticleContainer(std::string branchName, std::string contName="")
AliMCParticleContainer * fGeneratorLevel
! generator level container
Char_t GetTrackType(const AliVTrack *track) const
std::map< std::string, AliParticleContainer * > fParticleCollArray
particle/track collection array
void SetVzRange(Double_t min, Double_t max)
const AliTrackIterableMomentumContainer accepted_momentum() const
Bool_t fDoSigma1OverPt
add sigma(1/pt), if false add sigma(pt)/pt instead
std::vector< Double_t > fPhiHistBins
! phi bins
const Int_t nbins
bool Bool_t
Definition: External.C:53
THnSparse * fParticlesPhysPrim
all tracks
Container for MC-true particles within the EMCAL framework.
Double_t fCent
!event centrality
THnSparse * fParticlesMatched
all physical primary particles