3 #include "AlidNdEtaSystematicsSelector.h"
13 #include <TParticle.h>
14 #include <TParticlePDG.h>
19 #include <AliHeader.h>
20 #include <AliGenEventHeader.h>
21 #include <../PYTHIA6/AliGenPythiaEventHeader.h>
22 #include <../EVGEN/AliGenCocktailEventHeader.h>
24 #include "esdTrackCuts/AliESDtrackCuts.h"
25 #include "AliPWG0Helper.h"
26 #include "AliPWG0depHelper.h"
27 #include "dNdEta/AlidNdEtaCorrection.h"
29 ClassImp(AlidNdEtaSystematicsSelector)
31 AlidNdEtaSystematicsSelector::AlidNdEtaSystematicsSelector() :
42 // Constructor. Initialization of pointers
45 for (Int_t i=0; i<4; ++i)
46 fdNdEtaCorrectionSpecies[i] = 0;
48 for (Int_t i=0; i<3; ++i) {
49 fdNdEtaCorrectionVertexReco[i] = 0;
50 fdNdEtaCorrectionTriggerBias[i] = 0;
54 AlidNdEtaSystematicsSelector::~AlidNdEtaSystematicsSelector()
61 void AlidNdEtaSystematicsSelector::Begin(TTree* tree)
65 AliSelectorRL::Begin(tree);
67 ReadUserObjects(tree);
70 void AlidNdEtaSystematicsSelector::ReadUserObjects(TTree* tree)
72 // read the user objects, called from slavebegin and begin
74 if (!fEsdTrackCuts && fInput)
75 fEsdTrackCuts = dynamic_cast<AliESDtrackCuts*> (fInput->FindObject("AliESDtrackCuts"));
77 if (!fEsdTrackCuts && tree)
78 fEsdTrackCuts = dynamic_cast<AliESDtrackCuts*> (tree->GetUserInfo()->FindObject("AliESDtrackCuts"));
81 AliDebug(AliLog::kError, "ERROR: Could not read EsdTrackCuts from input list.");
84 void AlidNdEtaSystematicsSelector::SlaveBegin(TTree* tree)
86 // The SlaveBegin() function is called after the Begin() function.
87 // When running with PROOF SlaveBegin() is called on each slave server.
88 // The tree argument is deprecated (on PROOF 0 is passed).
90 AliSelector::SlaveBegin(tree);
92 ReadUserObjects(tree);
94 TString option(GetOption());
96 printf("Running AlidNdEtaSystematicsSelector with options %s\n", option.Data());
98 // Options: secondaries particle-composition sigma-vertex vertexreco triggerbias
100 if (option.Contains("secondaries"))
102 fSecondaries = new TH2F("fSecondaries", "fSecondaries;Case;N", 8, 0.5, 8.5, 2001, -0.5, 2000.5);
103 fSecondaries->GetXaxis()->SetBinLabel(1, "All Primaries");
104 fSecondaries->GetXaxis()->SetBinLabel(2, "All Secondaries");
105 fSecondaries->GetXaxis()->SetBinLabel(3, "Primaries pT > 0.3 GeV/c");
106 fSecondaries->GetXaxis()->SetBinLabel(4, "Secondaries pT > 0.3 GeV/c");
107 fSecondaries->GetXaxis()->SetBinLabel(5, "Tracks from Primaries");
108 fSecondaries->GetXaxis()->SetBinLabel(6, "Tracks from Secondaries");
109 fSecondaries->GetXaxis()->SetBinLabel(7, "Accepted Tracks from Primaries");
110 fSecondaries->GetXaxis()->SetBinLabel(8, "Accepted Tracks from Secondaries");
113 if (option.Contains("particle-composition"))
115 for (Int_t i=0; i<4; ++i)
118 name.Form("correction_%d", i);
119 fdNdEtaCorrectionSpecies[i] = new AlidNdEtaCorrection(name, name);
123 if (option.Contains("sigma-vertex"))
125 fSigmaVertex = new TH1F("fSigmaVertex", "fSigmaVertex;Nsigma2vertex;NacceptedTracks", 50, 0.05, 5.05);
126 printf("WARNING: sigma-vertex analysis enabled. This will produce weird results in the AliESDtrackCuts histograms\n");
129 if (option.Contains("vertexreco")) {
130 fdNdEtaCorrectionVertexReco[0] = new AlidNdEtaCorrection("vertexRecoND", "vertexRecoND");
131 fdNdEtaCorrectionVertexReco[1] = new AlidNdEtaCorrection("vertexRecoSD", "vertexRecoSD");
132 fdNdEtaCorrectionVertexReco[2] = new AlidNdEtaCorrection("vertexRecoDD", "vertexRecoDD");
135 if (option.Contains("triggerbias")) {
136 fdNdEtaCorrectionTriggerBias[0] = new AlidNdEtaCorrection("triggerBiasND", "triggerBiasND");
137 fdNdEtaCorrectionTriggerBias[1] = new AlidNdEtaCorrection("triggerBiasSD", "triggerBiasSD");
138 fdNdEtaCorrectionTriggerBias[2] = new AlidNdEtaCorrection("triggerBiasDD", "triggerBiasDD");
141 fPIDParticles = new TH1F("pid_particles", "PID of generated primary particles", 10001, -5000.5, 5000.5);
142 fPIDTracks = new TH1F("pid_tracks", "MC PID of reconstructed tracks", 10001, -5000.5, 5000.5);
144 if (option.Contains("only-positive"))
146 AliInfo("Processing only positive particles.");
149 else if (option.Contains("only-negative"))
151 AliInfo("Processing only negative particles.");
155 if (option.Contains("low-multiplicity"))
157 AliInfo("Processing only events with low multiplicity.");
158 fMultiplicityMode = 1;
160 else if (option.Contains("high-multiplicity"))
162 AliInfo("Processing only events with high multiplicity.");
163 fMultiplicityMode = 2;
167 Bool_t AlidNdEtaSystematicsSelector::Process(Long64_t entry)
169 // The Process() function is called for each entry in the tree (or possibly
170 // keyed object in the case of PROOF) to be processed. The entry argument
171 // specifies which entry in the currently loaded tree is to be processed.
172 // It can be passed to either TTree::GetEntry() or TBranch::GetEntry()
173 // to read either all or the required parts of the data. When processing
174 // keyed objects with PROOF, the object is already loaded and is available
175 // via the fObject pointer.
177 // This function should contain the "body" of the analysis. It can contain
178 // simple or elaborate selection criteria, run algorithms on the data
179 // of the event and typically fill histograms.
181 // WARNING when a selector is used with a TChain, you must use
182 // the pointer to the current TTree to call GetEntry(entry).
183 // The entry is always the local entry number in the current tree.
184 // Assuming that fTree is the pointer to the TChain being processed,
185 // use fTree->GetTree()->GetEntry(entry).
187 if (AliSelectorRL::Process(entry) == kFALSE)
190 // Check prerequisites
193 AliDebug(AliLog::kError, "ESD branch not available");
199 AliDebug(AliLog::kError, "fESDTrackCuts not available");
203 AliStack* stack = GetStack();
206 AliDebug(AliLog::kError, "Stack not available");
210 // --------------------------------------------------------------
211 // related to events:
213 // stuff for vertex reconstruction correction systematics
214 Bool_t vertexRecoStudy = kFALSE;
215 Bool_t triggerBiasStudy = kFALSE;
216 if (fdNdEtaCorrectionVertexReco[0]) vertexRecoStudy = kTRUE;
217 if (fdNdEtaCorrectionTriggerBias[0]) triggerBiasStudy = kTRUE;
219 AliHeader* header = GetHeader();
221 AliDebug(AliLog::kError, "Header not available");
225 // getting process information NB: this only works for Pythia !!!
226 Int_t processtype = AliPWG0depHelper::GetPythiaEventProcessType(header);
228 // can only read pythia headers, either directly or from cocktalil header
229 AliGenEventHeader* genHeader = (AliGenEventHeader*)(header->GenEventHeader());
232 AliDebug(AliLog::kError, "Gen header not available");
238 genHeader->PrimaryVertex(vtxMC);
240 TObjArray* listOfTracks = fEsdTrackCuts->GetAcceptedTracks(fESD);
241 Int_t nGoodTracks = listOfTracks->GetEntries();
243 Bool_t eventTriggered = AliPWG0Helper::IsEventTriggered(fESD);
244 Bool_t vertexReconstructed = AliPWG0Helper::IsVertexReconstructed(fESD);
247 if (processtype!=92 && processtype!=93 && processtype!=94) {
248 // NB: passing the wrong process type here (1), since the process type is defined by the index in the array (here non-diffractive)
249 if (triggerBiasStudy) fdNdEtaCorrectionTriggerBias[0]->FillEvent(vtxMC[2], nGoodTracks, eventTriggered, vertexReconstructed, 1);
250 if (vertexRecoStudy) fdNdEtaCorrectionVertexReco[0] ->FillEvent(vtxMC[2], nGoodTracks, eventTriggered, vertexReconstructed, 1);
253 // single diffractive
254 if (processtype==92 || processtype==93) {
255 if (triggerBiasStudy) fdNdEtaCorrectionTriggerBias[1]->FillEvent(vtxMC[2], nGoodTracks, eventTriggered, vertexReconstructed, 1);
256 if (vertexRecoStudy) fdNdEtaCorrectionVertexReco[1] ->FillEvent(vtxMC[2], nGoodTracks, eventTriggered, vertexReconstructed, 1);
259 // double diffractive
260 if (processtype==94) {
261 if (triggerBiasStudy) fdNdEtaCorrectionTriggerBias[2]->FillEvent(vtxMC[2], nGoodTracks, eventTriggered, vertexReconstructed, 1);
262 if (vertexRecoStudy) fdNdEtaCorrectionVertexReco[2] ->FillEvent(vtxMC[2], nGoodTracks, eventTriggered, vertexReconstructed, 1);
265 for (Int_t i=0; i<4; ++i) {
266 if (fdNdEtaCorrectionSpecies[i])
267 fdNdEtaCorrectionSpecies[i]->FillEvent(vtxMC[2], nGoodTracks, eventTriggered, vertexReconstructed, 1);
270 // --------------------------------------------------------------
274 Int_t nPrim = stack->GetNprimary();
276 for (Int_t iMc = 0; iMc < nPrim; ++iMc)
278 TParticle* particle = stack->Particle(iMc);
282 AliDebug(AliLog::kError, Form("UNEXPECTED: particle with label %d not found in stack (mc loop).", iMc));
286 if (AliPWG0Helper::IsPrimaryCharged(particle, nPrim) == kFALSE)
289 if (SignOK(particle->GetPDG()) == kFALSE)
292 Float_t eta = particle->Eta();
293 Float_t pt = particle->Pt();
296 switch (TMath::Abs(particle->GetPdgCode()))
298 case 211: id = 0; break;
299 case 321: id = 1; break;
300 case 2212: id = 2; break;
303 /*if (pt < 0.1 && particle->GetMother(0) > -1)
305 TParticle* mother = stack->Particle(particle->GetMother(0));
306 printf("Mother pdg code is %d\n", mother->GetPdgCode());
309 //if (particle->GetUniqueID() == 1)
311 //printf("Found illegal particle mc id = %d file = %s event = %d\n", iMc, fTree->GetCurrentFile()->GetName(), fTree->GetTree()->GetReadEntry());
313 default: id = 3; break;
316 if (eventTriggered & vertexReconstructed) {
317 if (fdNdEtaCorrectionSpecies[id])
318 fdNdEtaCorrectionSpecies[id]->FillMCParticle(vtxMC[2], eta, pt, eventTriggered, vertexReconstructed, 1);
321 fPIDParticles->Fill(particle->GetPdgCode());
325 if (processtype!=92 && processtype!=93 && processtype!=94) {
326 if (triggerBiasStudy) fdNdEtaCorrectionTriggerBias[0]->FillMCParticle(vtxMC[2], eta, pt, eventTriggered, vertexReconstructed, 1);
327 if (vertexRecoStudy) fdNdEtaCorrectionVertexReco[0] ->FillMCParticle(vtxMC[2], eta, pt, eventTriggered, vertexReconstructed, 1);
329 // single diffractive
330 if (processtype==92 || processtype==93) {
331 if (triggerBiasStudy) fdNdEtaCorrectionTriggerBias[1]->FillMCParticle(vtxMC[2], eta, pt, eventTriggered, vertexReconstructed, 1);
332 if (vertexRecoStudy) fdNdEtaCorrectionVertexReco[1] ->FillMCParticle(vtxMC[2], eta, pt, eventTriggered, vertexReconstructed, 1);
334 // double diffractive
335 if (processtype==94) {
336 if (triggerBiasStudy) fdNdEtaCorrectionTriggerBias[2]->FillMCParticle(vtxMC[2], eta, pt, eventTriggered, vertexReconstructed, 1);
337 if (vertexRecoStudy) fdNdEtaCorrectionVertexReco[2] ->FillMCParticle(vtxMC[2], eta, pt, eventTriggered, vertexReconstructed, 1);
340 }// end of mc particle
343 // --------------------------------------------------------------
347 if (fMultiplicityMode == 1 && listOfTracks->GetEntries() > 20 ||
348 fMultiplicityMode == 2 && listOfTracks->GetEntries() < 40)
355 // loop over esd tracks
356 TIterator* iter = listOfTracks->MakeIterator();
358 while ((obj = iter->Next()) != 0)
360 AliESDtrack* esdTrack = dynamic_cast<AliESDtrack*> (obj);
364 // using the properties of the mc particle
365 Int_t label = TMath::Abs(esdTrack->GetLabel());
366 TParticle* particle = stack->Particle(label);
369 AliDebug(AliLog::kError, Form("UNEXPECTED: particle with label %d not found in stack (track loop).", label));
373 Float_t eta = particle->Eta();
374 Float_t pt = particle->Pt();
377 if (processtype!=92 && processtype!=93 && processtype!=94) {
378 if (triggerBiasStudy) fdNdEtaCorrectionTriggerBias[0]->FillTrackedParticle(vtxMC[2], eta, pt);
379 if (vertexRecoStudy) fdNdEtaCorrectionVertexReco[0] ->FillTrackedParticle(vtxMC[2], eta, pt);
382 // single diffractive
383 if (processtype==92 || processtype==93) {
384 if (triggerBiasStudy) fdNdEtaCorrectionTriggerBias[1]->FillTrackedParticle(vtxMC[2], eta, pt);
385 if (vertexRecoStudy) fdNdEtaCorrectionVertexReco[1] ->FillTrackedParticle(vtxMC[2], eta, pt);
388 // double diffractive
389 if (processtype==94) {
390 if (triggerBiasStudy) fdNdEtaCorrectionTriggerBias[2]->FillTrackedParticle(vtxMC[2], eta, pt);
391 if (vertexRecoStudy) fdNdEtaCorrectionVertexReco[2] ->FillTrackedParticle(vtxMC[2], eta, pt);
395 TParticle* mother = particle;
396 // find primary particle that created this particle
397 while (label >= nPrim)
399 //printf("Particle %d (pdg %d) is not a primary. Let's check its mother %d\n", label, mother->GetPdgCode(), mother->GetMother(0));
401 if (mother->GetMother(0) == -1)
403 AliDebug(AliLog::kError, Form("UNEXPECTED: Could not find mother of secondary particle %d.", label));
408 label = mother->GetMother(0);
410 mother = stack->Particle(label);
413 AliDebug(AliLog::kError, Form("UNEXPECTED: particle with label %d not found in stack (find mother loop).", label));
421 if (SignOK(mother->GetPDG()) == kFALSE)
424 //printf("We continue with particle %d (pdg %d)\n", label, mother->GetPdgCode());
427 switch (TMath::Abs(mother->GetPdgCode()))
429 case 211: id = 0; break;
430 case 321: id = 1; break;
431 case 2212: id = 2; break;
432 default: id = 3; break;
435 if (vertexReconstructed && eventTriggered) {
436 if (fdNdEtaCorrectionSpecies[id])
437 fdNdEtaCorrectionSpecies[id]->FillTrackedParticle(vtxMC[2], eta, pt);
440 fPIDTracks->Fill(particle->GetPdgCode());
442 } // end of track loop
461 void AlidNdEtaSystematicsSelector::FillSecondaries()
463 // fills the secondary histograms
465 AliStack* stack = GetStack();
467 Int_t particlesPrimaries = 0;
468 Int_t particlesSecondaries = 0;
469 Int_t particlesPrimariesPtCut = 0;
470 Int_t particlesSecondariesPtCut = 0;
472 for (Int_t iParticle = 0; iParticle < stack->GetNtrack(); iParticle++)
474 TParticle* particle = stack->Particle(iParticle);
477 AliDebug(AliLog::kError, Form("UNEXPECTED: particle with label %d not found in stack (particle loop).", iParticle));
481 if (TMath::Abs(particle->Eta()) > 0.9)
484 Bool_t isPrimary = kFALSE;
485 if (iParticle < stack->GetNprimary())
487 if (AliPWG0Helper::IsPrimaryCharged(particle, stack->GetNprimary()) == kFALSE)
494 particlesPrimaries++;
496 particlesSecondaries++;
498 if (particle->Pt() < 0.3)
502 particlesPrimariesPtCut++;
504 particlesSecondariesPtCut++;
507 fSecondaries->Fill(1, particlesPrimaries);
508 fSecondaries->Fill(2, particlesSecondaries);
509 fSecondaries->Fill(3, particlesPrimariesPtCut);
510 fSecondaries->Fill(4, particlesSecondariesPtCut);
512 Int_t allTracksPrimaries = 0;
513 Int_t allTracksSecondaries = 0;
514 Int_t acceptedTracksPrimaries = 0;
515 Int_t acceptedTracksSecondaries = 0;
517 for (Int_t iTrack = 0; iTrack < fESD->GetNumberOfTracks(); iTrack++)
519 AliESDtrack* esdTrack = fESD->GetTrack(iTrack);
522 AliDebug(AliLog::kError, Form("UNEXPECTED: Could not get track %d.", iTrack));
526 Int_t label = TMath::Abs(esdTrack->GetLabel());
527 TParticle* particle = stack->Particle(label);
530 AliDebug(AliLog::kError, Form("UNEXPECTED: particle with label %d not found in stack (track loop).", label));
534 if (label < stack->GetNprimary())
535 allTracksPrimaries++;
537 allTracksSecondaries++;
539 if (!fEsdTrackCuts->AcceptTrack(esdTrack))
542 if (label < stack->GetNprimary())
543 acceptedTracksPrimaries++;
545 acceptedTracksSecondaries++;
548 fSecondaries->Fill(5, allTracksPrimaries);
549 fSecondaries->Fill(6, allTracksSecondaries);
550 fSecondaries->Fill(7, acceptedTracksPrimaries);
551 fSecondaries->Fill(8, acceptedTracksSecondaries);
553 //printf("P = %d, S = %d, P_pt = %d, S_pt = %d, T_P = %d, T_S = %d, T_P_acc = %d, T_S_acc = %d\n", particlesPrimaries, particlesSecondaries, particlesPrimariesPtCut, particlesSecondariesPtCut, allTracksPrimaries, allTracksSecondaries, acceptedTracksPrimaries, acceptedTracksSecondaries);
556 void AlidNdEtaSystematicsSelector::FillSigmaVertex()
558 // fills the fSigmaVertex histogram
560 // save the old value
561 Float_t oldSigmaVertex = fEsdTrackCuts->GetMinNsigmaToVertex();
564 fEsdTrackCuts->SetMinNsigmaToVertex(5);
566 TObjArray* list = fEsdTrackCuts->GetAcceptedTracks(fESD);
568 TIterator* iter = list->MakeIterator();
570 while ((obj = iter->Next()) != 0)
572 AliESDtrack* esdTrack = dynamic_cast<AliESDtrack*> (obj);
576 Float_t sigma2Vertex = fEsdTrackCuts->GetSigmaToVertex(esdTrack);
578 for (Double_t nSigma = 0.1; nSigma < 5.05; nSigma += 0.1)
580 if (sigma2Vertex < nSigma)
581 fSigmaVertex->Fill(nSigma);
591 // set back the old value
592 fEsdTrackCuts->SetMinNsigmaToVertex(oldSigmaVertex);
595 void AlidNdEtaSystematicsSelector::SlaveTerminate()
597 // The SlaveTerminate() function is called after all entries or objects
598 // have been processed. When running with PROOF SlaveTerminate() is called
599 // on each slave server.
601 AliSelector::SlaveTerminate();
603 // Add the histograms to the output on each slave server
606 AliDebug(AliLog::kError, Form("ERROR: Output list not initialized."));
611 fOutput->Add(fSecondaries);
613 for (Int_t i=0; i<4; ++i)
614 if (fdNdEtaCorrectionSpecies[i])
615 fOutput->Add(fdNdEtaCorrectionSpecies[i]);
618 fOutput->Add(fSigmaVertex);
620 for (Int_t i=0; i<3; ++i) {
621 if (fdNdEtaCorrectionVertexReco[i])
622 fOutput->Add(fdNdEtaCorrectionVertexReco[i]);
624 if (fdNdEtaCorrectionTriggerBias[i])
625 fOutput->Add(fdNdEtaCorrectionTriggerBias[i]);
630 void AlidNdEtaSystematicsSelector::Terminate()
632 // The Terminate() function is the last function to be called during
633 // a query. It always runs on the client, it can be used to present
634 // the results graphically or save the results to file.
636 AliSelector::Terminate();
638 fSecondaries = dynamic_cast<TH2F*> (fOutput->FindObject("fSecondaries"));
639 for (Int_t i=0; i<4; ++i)
640 fdNdEtaCorrectionSpecies[i] = dynamic_cast<AlidNdEtaCorrection*> (fOutput->FindObject(Form("correction_%d", i)));
641 fSigmaVertex = dynamic_cast<TH1F*> (fOutput->FindObject("fSigmaVertex"));
643 fdNdEtaCorrectionVertexReco[0] = dynamic_cast<AlidNdEtaCorrection*> (fOutput->FindObject("vertexRecoND"));
644 fdNdEtaCorrectionVertexReco[1] = dynamic_cast<AlidNdEtaCorrection*> (fOutput->FindObject("vertexRecoSD"));
645 fdNdEtaCorrectionVertexReco[2] = dynamic_cast<AlidNdEtaCorrection*> (fOutput->FindObject("vertexRecoDD"));
647 fdNdEtaCorrectionTriggerBias[0] = dynamic_cast<AlidNdEtaCorrection*> (fOutput->FindObject("triggerBiasND"));
648 fdNdEtaCorrectionTriggerBias[1] = dynamic_cast<AlidNdEtaCorrection*> (fOutput->FindObject("triggerBiasSD"));
649 fdNdEtaCorrectionTriggerBias[2] = dynamic_cast<AlidNdEtaCorrection*> (fOutput->FindObject("triggerBiasDD"));
653 TDatabasePDG* pdgDB = new TDatabasePDG;
655 for (Int_t i=0; i <= fPIDParticles->GetNbinsX()+1; ++i)
656 if (fPIDParticles->GetBinContent(i) > 0)
657 printf("PDG = %d (%s): generated: %d, reconstructed: %d, ratio: %f\n",
658 (Int_t) fPIDParticles->GetBinCenter(i),
659 pdgDB->GetParticle((Int_t) fPIDParticles->GetBinCenter(i))->GetName(),
660 (Int_t) fPIDParticles->GetBinContent(i),
661 (Int_t) fPIDTracks->GetBinContent(i),
662 ((fPIDTracks->GetBinContent(i) > 0) ? fPIDParticles->GetBinContent(i) / fPIDTracks->GetBinContent(i) : -1));
668 for (Int_t i=0; i<3; ++i) {
669 if (fdNdEtaCorrectionVertexReco[i])
670 fdNdEtaCorrectionVertexReco[i]->Finish();
672 if (fdNdEtaCorrectionTriggerBias[i])
673 fdNdEtaCorrectionTriggerBias[i]->Finish();
676 TFile* fout = TFile::Open("systematics.root", "RECREATE");
679 fEsdTrackCuts->SaveHistograms("esd_track_cuts");
682 fSecondaries->Write();
685 fSigmaVertex->Write();
687 for (Int_t i=0; i<4; ++i)
688 if (fdNdEtaCorrectionSpecies[i])
689 fdNdEtaCorrectionSpecies[i]->SaveHistograms();
691 for (Int_t i=0; i<3; ++i) {
692 if (fdNdEtaCorrectionVertexReco[i])
693 fdNdEtaCorrectionVertexReco[i]->SaveHistograms();
695 if (fdNdEtaCorrectionTriggerBias[i])
696 fdNdEtaCorrectionTriggerBias[i]->SaveHistograms();
705 fSecondaries->Draw("COLZ");
711 fSigmaVertex->Draw();
715 Bool_t AlidNdEtaSystematicsSelector::SignOK(TParticlePDG* particle)
717 // returns if a particle with this sign should be counted
718 // this is determined by the value of fSignMode, which should have the same sign
720 // if fSignMode is 0 all particles are counted
727 printf("WARNING: not counting a particle that does not have a pdg particle\n");
731 Double_t charge = particle->Charge();