118 if (hP->GetEntries() == 0) {
119 LOG(warning) << TString::Format(
"P (momentum) histogram is empty for PDG = %d", pdg_key);
124 TString dist_func_name = TString::Format(
"distP_pdg%d", pdg_key);
125 TF1* p_distribution =
new TF1(dist_func_name,
"gaus(0)+gaus(3)+landau(6)", p_min, p_max);
126 Double_t p_avg = (p_min + p_max) / 2;
128 Double_t x_max_value = hP->GetXaxis()->GetBinUpEdge(hP->GetMaximumBin());
129 p_distribution->SetParLimits(1, p_min, p_avg);
130 p_distribution->SetParameter(1, p_min);
131 p_distribution->SetParLimits(2, 0.1, p_avg);
132 p_distribution->SetParameter(2, p_avg / 4);
133 p_distribution->SetParLimits(4, x_max_value - 0.1, p_max);
134 p_distribution->SetParameter(4, x_max_value - 0.1);
135 p_distribution->SetParLimits(5, 0.1, p_avg);
136 p_distribution->SetParameter(5, p_avg / 2);
137 p_distribution->SetParLimits(7, p_min, TMath::Min(x_max_value, p_avg));
138 p_distribution->SetParameter(7, p_min);
139 p_distribution->SetParLimits(8, 0.1, p_avg);
140 p_distribution->SetParameter(8, p_avg / 4);
142 TFitResultPtr r = hP->Fit(p_distribution,
"SQ0");
144 LOG(error) << TString::Format(
"Fit of the P (momentum) histogram failed for PDG = %d", pdg_key);
179 if (hY->GetEntries() == 0) {
180 LOG(warning) << TString::Format(
"Rapidity histogram is empty for %d PDG code", pdg_key);
185 if (pdg_key != 2212) {
186 TFitResultPtr r = hY->Fit(
"gaus",
"SQ0");
187 y0_output = r->Parameter(1);
188 sigma_putput = r->Parameter(2);
191 Double_t max_bin_value = hY->GetMaximum();
192 const string minimizer_type = ROOT::Math::MinimizerOptions::DefaultMinimizerType();
193 ROOT::Math::MinimizerOptions::SetDefaultMinimizer(
"Genetic");
205 unique_ptr<TF1> fProtonYDistribution =
206 make_unique<TF1>(
"distProtonY",
"gaus(0)+gaus(3)+gaus(6)", 0.2, 5);
207 fProtonYDistribution->SetParLimits(0, 0, max_bin_value);
208 fProtonYDistribution->SetParLimits(1, 0, 0.05);
209 fProtonYDistribution->SetParLimits(2, 0.01, 0.4);
210 fProtonYDistribution->SetParameter(2, 0.2);
211 fProtonYDistribution->SetParLimits(3, 0, max_bin_value);
212 fProtonYDistribution->SetParName(4,
"proton_y0");
213 fProtonYDistribution->SetParLimits(4, 0.3, 2);
214 fProtonYDistribution->SetParameter(4, 1);
215 fProtonYDistribution->SetParName(5,
"proton_sigma");
216 fProtonYDistribution->SetParLimits(5, 0.05, 1);
217 fProtonYDistribution->SetParameter(5, 0.5);
218 fProtonYDistribution->SetParLimits(6, 0, max_bin_value);
219 fProtonYDistribution->SetParLimits(7, 1.5, 3);
220 fProtonYDistribution->SetParameter(7, 2.25);
221 fProtonYDistribution->SetParLimits(8, 0.05, 1);
222 fProtonYDistribution->SetParameter(8, 0.5);
224 TFitResultPtr r = hY->Fit(fProtonYDistribution.get(),
"SQ0",
"", 0, 5);
225 y0_output = r->Parameter(r->Index(
"proton_y0"));
226 sigma_putput = r->Parameter(r->Index(
"proton_sigma"));
228 ROOT::Math::MinimizerOptions::SetDefaultMinimizer(minimizer_type.c_str());
265 gSystem->ExpandPathName(input_list_file);
268 list<string> file_list;
269 ifstream list_file(input_list_file.Data());
271 while (getline(list_file, s))
272 file_list.push_back(s);
273 if (file_list.empty()) {
274 cout <<
"WARNING: There are no files in the list of the input text file: " << input_list_file << endl;
279 TChain dataChain(
"bmndata");
280 for (
auto const& cur_file_path : file_list) {
281 TString strFilePath(cur_file_path);
282 gSystem->ExpandPathName(strFilePath);
284 dataChain.AddFile(strFilePath);
287 if (dataChain.GetEntries() < 1) {
288 cout <<
"WARNING: There are no correct input files in the text list stored at: \"" << input_list_file <<
"\""
295 TClonesArray* mcTracks =
nullptr;
297 if (dataChain.GetBranch(
"MCTrack") ==
nullptr) {
298 LOG(info) <<
"'MCTrack' branch was not found, searching for 'BmnMCInfo->MCTrack'...";
299 if (dataChain.GetBranch(
"BmnMCInfo.") ==
nullptr) {
300 LOG(error) <<
"'BmnMCInfo.' branch was not found too, please, check the structure of the files, exiting...";
303 dataChain.SetBranchAddress(
"BmnMCInfo.", &mcInfo);
304 if (mcInfo ==
nullptr) {
306 <<
"'BmnMCInfo.' branch was not read correctly, please, check the structure of the files, exiting...";
310 LOG(info) <<
"'BmnMCInfo->MCTrack' has been found";
311 dataChain.SetBranchStatus(
"*", 0);
312 dataChain.SetBranchStatus(
"BmnMCInfo*", 1);
314 dataChain.SetBranchAddress(
"MCTrack", &mcTracks);
315 if (mcTracks ==
nullptr) {
317 <<
"MCTrack' branch was not read correctly, please, check the structure of the files, exiting...";
320 dataChain.SetBranchStatus(
"*", 0);
321 dataChain.SetBranchStatus(
"MCTrack*", 1);
324 int iEventNumber = dataChain.GetEntries();
325 if (iEventNumber < 1) {
326 cout <<
"WARNING: There are no correct entries in the file list stored at: \"" << input_list_file <<
"\""
331 TFile* hist_file = TFile::Open(output_histo_file,
"RECREATE");
334 map<Int_t, unique_ptr<stParticleInfo>> particle_infos;
335 for (
auto pdg_key : fParticles)
336 particle_infos.emplace(pdg_key, make_unique<stParticleInfo>(pdg_key, fPMin, fPMax, fIntervalCount));
338 Double_t interval_width = (fPMax - fPMin) / fIntervalCount;
340 for (
auto pdg_key : fParticles) {
341 TString histogram_name = TString::Format(
"hP_pdg%d", pdg_key);
342 particle_infos[pdg_key]->fPHist = make_unique<TH1D>(histogram_name, histogram_name, 80, fPMin, fPMax);
343 histogram_name = TString::Format(
"hPt_pdg%d", pdg_key);
344 particle_infos[pdg_key]->fPtHist = make_unique<TH1D>(histogram_name, histogram_name, 60,
fPtMin,
fPtMax);
345 histogram_name = TString::Format(
"hY_pdg%d", pdg_key);
346 particle_infos[pdg_key]->fYHist = make_unique<TH1D>(histogram_name, histogram_name, 60,
fYMin,
fYMax);
347 histogram_name = TString::Format(
"hEta_pdg%d", pdg_key);
348 particle_infos[pdg_key]->fEtaHist = make_unique<TH1D>(histogram_name, histogram_name, 60,
fEtaMin,
fEtaMax);
349 histogram_name = TString::Format(
"hTheta_pdg%d", pdg_key);
350 particle_infos[pdg_key]->fThetaHist =
352 histogram_name = TString::Format(
"hPhi_pdg%d", pdg_key);
353 particle_infos[pdg_key]->fPhiHist = make_unique<TH1D>(histogram_name, histogram_name, 64,
fPhiMin,
fPhiMax);
354 int hist_counter = 0;
355 for (
auto& p_hist : particle_infos[pdg_key]->fPHistVector) {
356 histogram_name = TString::Format(
"hP%d_pdg%d", ++hist_counter, pdg_key);
357 p_hist = make_unique<TH1D>(histogram_name, histogram_name, 40, fPMin + (hist_counter - 1) * interval_width,
358 fPMin + hist_counter * interval_width);
361 for (
auto& eta_hist : particle_infos[pdg_key]->fEtaHistVector) {
362 histogram_name = TString::Format(
"hEta%d_pdg%d", ++hist_counter, pdg_key);
363 eta_hist = make_unique<TH1D>(histogram_name, histogram_name, 60, -4, 8);
368 int iCurrentEvent = 0;
369 LOG(info) <<
"Processing events...";
370 for (Int_t iEvent = 0; iEvent < iEventNumber; iEvent++) {
373 if (iCurrentEvent % 1000 == 0)
374 LOG(info) <<
"Processing event #" << iCurrentEvent <<
" of " << iEventNumber;
375 dataChain.GetEntry(iEvent);
377 TClonesArray* mc_tracks =
nullptr;
381 mc_tracks = mcTracks;
383 for (
int i = 0;
i < mc_tracks->GetEntries();
i++) {
391 if (iParticleCut > 0) {
395 if (iParticleCut > 1) {
403 if (
auto part_iter = particle_infos.find(part_code); part_iter != particle_infos.end()) {
404 int interval_number = (pTrack->
GetP() - fPMin) / interval_width;
405 part_iter->second->fPHist->Fill(pTrack->
GetP());
406 part_iter->second->fPtHist->Fill(pTrack->
GetPt());
407 part_iter->second->fYHist->Fill(pTrack->
GetRapidity());
408 part_iter->second->fEtaHist->Fill(
409 0.5 * TMath::Log((pTrack->
GetP() + pTrack->
GetPz()) / (pTrack->
GetP() - pTrack->
GetPz())));
410 part_iter->second->fThetaHist->Fill(
411 TMath::ACos(pTrack->
GetPz() / pTrack->
GetP()));
412 part_iter->second->fPhiHist->Fill(
413 TMath::ATan2(pTrack->
GetPy(), pTrack->
GetPx()));
415 if ((pTrack->
GetP() >= fPMin) && (isless(pTrack->
GetP(), fPMax))) {
416 part_iter->second->fPHistVector[interval_number]->Fill(pTrack->
GetP());
417 part_iter->second->fEtaHistVector[interval_number]->Fill(
418 0.5 * TMath::Log((pTrack->
GetP() + pTrack->
GetPz()) / (pTrack->
GetP() - pTrack->
GetPz())));
425 for (
auto pdg_key : fParticles) {
426 if (particle_infos[pdg_key]->fPHist->GetEntries() == 0) {
427 LOG(error) <<
"Momentum histogram is empty for pdg=" << pdg_key;
430 if (particle_infos[pdg_key]->fPtHist->GetEntries() == 0) {
431 LOG(error) <<
"Transverse momentum histogram is empty for pdg=" << pdg_key;
434 if (particle_infos[pdg_key]->fYHist->GetEntries() == 0) {
435 LOG(error) <<
"Rapidity histogram is empty for pdg=" << pdg_key;
438 if (particle_infos[pdg_key]->fEtaHist->GetEntries() == 0) {
439 LOG(error) <<
"Pseudorapidity histogram is empty for pdg=" << pdg_key;
442 if (particle_infos[pdg_key]->fThetaHist->GetEntries() == 0) {
443 LOG(error) <<
"Theta angle histogram is empty for pdg=" << pdg_key;
446 if (particle_infos[pdg_key]->fPhiHist->GetEntries() == 0) {
447 LOG(error) <<
"Phi angle histogram is empty for pdg=" << pdg_key;
453 Double_t fY0 = 0, fSigma = 0.72, fT = 0.223;
454 for (
auto pdg_key : fParticles) {
455 TDatabasePDG* pdgBase = TDatabasePDG::Instance();
456 TParticlePDG* particle = pdgBase->GetParticle(pdg_key);
458 LOG(fatal) <<
"PDG code " << pdg_key <<
"is not defined. exiting...";
461 Double_t fPDGMass = particle->Mass();
464 if (
FitPHistogram(particle_infos[pdg_key]->fPHist, pdg_key, fPMin, fPMax) != 0)
472 if (
FitYHistogram(particle_infos[pdg_key]->fYHist, pdg_key, fY0, fSigma) != 0)
474 TVector3 Y0SigmaT(fY0, fSigma, fT);
475 TString vector_name = TString::Format(
"Y0SigmaT_pdg%d", pdg_key);
476 hist_file->WriteObject(&Y0SigmaT, vector_name);
482 LOG(info) << TString::Format(
"pdg=%i y0=%4.2f sigma_y=%4.2f T_pt=%6.4f", pdg_key, fY0, fSigma, fT);
486 for (
auto pdg_key : fParticles) {
487 particle_infos[pdg_key]->fPHist->Write();
488 particle_infos[pdg_key]->fPtHist->Write();
489 particle_infos[pdg_key]->fYHist->Write();
490 particle_infos[pdg_key]->fEtaHist->Write();
491 particle_infos[pdg_key]->fThetaHist->Write();
492 particle_infos[pdg_key]->fPhiHist->Write();
493 for (
auto& p_hist : particle_infos[pdg_key]->fPHistVector)
495 for (
auto& eta_hist : particle_infos[pdg_key]->fEtaHistVector)
633 for (
auto part_iter = fParticleInfos.begin(); part_iter != fParticleInfos.end(); part_iter++)
634 fill(part_iter->second->fParticleNumber.begin(), part_iter->second->fParticleNumber.end(), 0);
636 fill(fMaxParticles.begin(), fMaxParticles.end(), 0);
640 TClonesArray* arrParticles = ((
CbmStack*)gMC->GetStack())->GetListOfParticles();
641 for (
int i = 0;
i < arrParticles->GetEntries();
i++) {
643 TParticle* part = (TParticle*)arrParticles->At(
i);
644 Int_t part_code = part->GetPdgCode();
645 Double_t part_p = part->P();
646 Double_t part_eta = part->Eta();
649 if (!part->IsPrimary())
653 int interval_number = (part_p - fPMin) / fIntervalStep;
654 if ((interval_number < 0) || (interval_number >= fIntervalCount))
658 LOG(debug) << TString::Format(
"Found particle: PDG=%i P=%4.2f Eta=%4.2f", part_code, part_p, part_eta);
659 if (
auto part_iter = fParticleInfos.find(part_code); part_iter != fParticleInfos.end()) {
661 if (iParticleCut > 0) {
662 if (fParticleInfos[part_code]->fPHistVector[interval_number]->GetBinContent(
663 fParticleInfos[part_code]->fPHistVector[interval_number]->FindBin(part_p))
666 if (fParticleInfos[part_code]->fEtaHistVector[interval_number]->GetBinContent(
667 fParticleInfos[part_code]->fEtaHistVector[interval_number]->FindBin(part_eta))
681 part_iter->second->fParticleNumber[interval_number] += 1;
683 if (part_iter->second->fParticleNumber[interval_number] > fMaxParticles[interval_number])
684 fMaxParticles[interval_number] = part_iter->second->fParticleNumber[interval_number];
689 for (
auto pdg_key : fParticles) {
690 LOG(debug) << TString::Format(
"Current particle type to be equalized: pdg=%i y0=%4.2f sigma_y=%4.2f T_pt=%6.4f",
691 pdg_key, fParticleInfos[pdg_key]->fY0, fParticleInfos[pdg_key]->fSigma,
692 fParticleInfos[pdg_key]->fT);
693 Double_t cur_p = fPMin;
695 LOG(debug) <<
"Adding paticle to equalize the numbers...";
696 for (
int cur_interval = 0; cur_interval < fIntervalCount; cur_interval++, cur_p += fIntervalStep) {
697 int add_particle = fMaxParticles[cur_interval] - fParticleInfos[pdg_key]->fParticleNumber[cur_interval];
699 <<
" " << add_particle <<
" particle with PDG = " << pdg_key <<
" (" << cur_p <<
" GeV)";
702 for (Int_t k = 0; k < add_particle; k++) {
703 Double_t phi = gRandom->Uniform(0, TMath::TwoPi());
705 if (fParticleInfos[pdg_key]->fPHistVector[cur_interval]->GetEntries() > 2)
706 p = fParticleInfos[pdg_key]->fPHistVector[cur_interval]->GetRandom();
708 TString dist_func_name = TString::Format(
"distP_pdg%d", pdg_key);
709 p = fParticleInfos[pdg_key]
710 ->fPHist->GetFunction(dist_func_name)
711 ->GetRandom(cur_p, cur_p + fIntervalStep);
718 if (fParticleInfos[pdg_key]->fEtaHistVector[cur_interval]->GetEntries() > 2)
719 eta = fParticleInfos[pdg_key]->fEtaHistVector[cur_interval]->GetRandom();
722 eta = fParticleInfos[pdg_key]->fEtaHist->GetRandom();
724 Double_t pt = p / TMath::CosH(eta);
725 Double_t px = pt * TMath::Cos(phi);
726 Double_t py = pt * TMath::Sin(phi);
727 Double_t pz = pt * TMath::SinH(eta);
729 LOG(debug) <<
"Particle generated: pdg=" << pdg_key <<
" p=" << p <<
" eta=" << eta;
730 FairMCEventHeader* pCurrent = primGen->GetEvent();
732 primGen->AddTrack(pdg_key, px, py, pz, pCurrent->GetX(), pCurrent->GetY(), pCurrent->GetZ());
743 TFile*
f = TFile::Open(input_histo_file);
744 for (
int particle_number : fParticles) {
745 new TCanvas(TString::Format(
"c_%d", particle_number),
746 TString::Format(
"Distributions for particle PDG = %d", particle_number), 1000,
748 TH1D* h1 = (TH1D*)
f->Get(TString::Format(
"hP_pdg%d", particle_number));
750 Double_t x_max_value = h1->GetXaxis()->GetBinCenter(h1->GetMaximumBin());
751 Double_t y_max_value = h1->GetBinContent(h1->GetMaximumBin());
752 Double_t p_avg = (fPMin + fPMax) / 2;
753 cout <<
"avg_value = " << p_avg << endl;
754 cout <<
"x_max_value = " << x_max_value << endl;
755 cout <<
"y_max_value = " << y_max_value << endl;
756 TF1* p_distribution =
new TF1(
"distFit",
"gaus(0)+gaus(3)+landau(6)", fPMin, fPMax);
757 p_distribution->SetParLimits(1, fPMin, p_avg);
758 p_distribution->SetParameter(1, fPMin);
759 p_distribution->SetParLimits(2, 0.1, p_avg);
760 p_distribution->SetParameter(2, p_avg / 4);
761 p_distribution->SetParLimits(4, x_max_value - 0.1, fPMax);
762 p_distribution->SetParameter(4, x_max_value - 0.1);
763 p_distribution->SetParLimits(5, 0.1, p_avg);
764 p_distribution->SetParameter(5, p_avg / 2);
765 p_distribution->SetParLimits(7, fPMin, TMath::Min(x_max_value, p_avg));
766 p_distribution->SetParameter(7, fPMin);
767 p_distribution->SetParLimits(8, 0.1, p_avg);
768 p_distribution->SetParameter(8, p_avg / 4);
769 h1->Fit(p_distribution);
834 gSystem->ExpandPathName(input_list_file);
837 list<string> file_list;
838 ifstream list_file(input_list_file.Data());
840 while (getline(list_file, s))
841 file_list.push_back(s);
842 if (file_list.empty()) {
843 cout <<
"WARNING: There are no files in the list of the input text file: " << input_list_file << endl;
848 TChain dataChain(
"bmndata");
849 for (
auto const& cur_file_path : file_list) {
850 TString strFilePath(cur_file_path);
851 gSystem->ExpandPathName(strFilePath);
853 dataChain.Add(strFilePath);
858 TClonesArray *mcTracks =
nullptr, *globalTracks =
nullptr;
860 if (dataChain.GetBranch(
"MCTrack") ==
nullptr) {
861 if (dataChain.GetBranch(
"BmnMCInfo.") ==
nullptr) {
862 LOG(error) <<
"'MCTrack' and 'BmnMCInfo.' branches were not found, please, check the structure of the "
866 dataChain.SetBranchAddress(
"BmnMCInfo.", &mcInfo);
867 if (mcInfo ==
nullptr) {
869 <<
"'BmnMCInfo.' branch was not read correctly, please, check the structure of the files, exiting...";
872 dataChain.SetBranchAddress(
"BmnGlobalTrack", &globalTracks);
873 if (globalTracks ==
nullptr) {
874 LOG(error) <<
"'BmnGlobalTrack' branch was not read correctly, please, check the structure of the files, "
883 dataChain.SetBranchAddress(
"MCTrack", &mcTracks);
884 if (mcTracks ==
nullptr) {
886 <<
"MCTrack' branch was not read correctly, please, check the structure of the files, exiting...";
895 new TCanvas(
"c_number",
"Multiplicity of different particle types for all the momentum intervals", 1000, 500);
898 int bin_count = fIntervalCount, cur_hist = 0;
900 map<int, TH1I*> mapParticleNumberHists;
901 for (
int particle_number : fParticles) {
902 TH1I* hParticleNumber =
903 new TH1I(TString::Format(
"hParticleNumber_%d", particle_number),
904 TString::Format(
"hParticleNumber_%d", particle_number), bin_count, fPMin, fPMax);
906 hParticleNumber->SetStats(kFALSE);
907 hParticleNumber->LabelsDeflate();
908 hParticleNumber->SetLabelFont(62);
909 hParticleNumber->SetMarkerSize(0.6);
911 hParticleNumber->SetTitle(
"");
912 hParticleNumber->GetXaxis()->SetTitle(
"momentum interval");
913 hParticleNumber->GetXaxis()->SetTitleSize(0.03);
914 hParticleNumber->GetXaxis()->CenterTitle();
915 hParticleNumber->GetXaxis()->SetLabelSize(0.02 - 0.00017 * bin_count);
917 hParticleNumber->GetXaxis()->SetNdivisions(bin_count);
918 hParticleNumber->GetYaxis()->SetTitle(
"particle multiplicity");
921 hParticleNumber->GetYaxis()->SetLabelSize(0.02);
922 hParticleNumber->SetBarWidth(0.18);
923 hParticleNumber->SetBarOffset(0.05 + cur_hist * 0.18);
926 hParticleNumber->SetFillColor(49);
929 hParticleNumber->SetFillColor(50);
932 hParticleNumber->SetFillColor(42);
935 hParticleNumber->SetFillColor(29);
938 hParticleNumber->SetFillColor(36);
944 mapParticleNumberHists[particle_number] = hParticleNumber;
949 map<int, TH1D*> mapPHists, mapPtHists, mapYHists, mapEtaHists, mapThetaHists, mapPhiHists;
950 for (
int particle_number : fParticles) {
951 TH1D* hP =
new TH1D(TString::Format(
"hP_%d", particle_number), TString::Format(
"hP_%d", particle_number), 80,
953 mapPHists[particle_number] = hP;
954 TH1D* hPt =
new TH1D(TString::Format(
"hPt_%d", particle_number), TString::Format(
"hPt_%d", particle_number), 60,
956 mapPtHists[particle_number] = hPt;
957 TH1D* hY =
new TH1D(TString::Format(
"hY_%d", particle_number), TString::Format(
"hY_%d", particle_number), 60,
959 mapYHists[particle_number] = hY;
960 TH1D* hEta =
new TH1D(TString::Format(
"hEta_%d", particle_number), TString::Format(
"hEta_%d", particle_number),
962 mapEtaHists[particle_number] = hEta;
963 TH1D* hTheta =
new TH1D(TString::Format(
"hTheta_%d", particle_number),
965 mapThetaHists[particle_number] = hTheta;
966 TH1D* hPhi =
new TH1D(TString::Format(
"hPhi_%d", particle_number), TString::Format(
"hPhi_%d", particle_number),
968 mapPhiHists[particle_number] = hPhi;
971 int iEventNumber = dataChain.GetEntries(), iCurrentEvent = 0;
972 if (iEventNumber < 1) {
973 cout <<
"WARNING: There are no correct entries in the file list stored at: \"" << input_list_file <<
"\""
979 for (iCurrentEvent = 0; iCurrentEvent < iEventNumber; iCurrentEvent++) {
981 if ((iCurrentEvent + 1) % 1000 == 0)
982 LOG(info) <<
"Processing event #" << iCurrentEvent + 1 <<
" of " << iEventNumber;
983 dataChain.GetEntry(iCurrentEvent);
985 Int_t track_count = 0;
986 TClonesArray* mc_tracks =
nullptr;
989 track_count = globalTracks->GetEntries();
991 mc_tracks = mcTracks;
992 track_count = mc_tracks->GetEntries();
996 for (Int_t iTrack = 0; iTrack < track_count; iTrack++) {
997 Int_t track_pdg = -1, track_mass = -1;
998 Double_t track_p = 0, track_pt = 0, track_y = 0, track_eta = 0, track_theta = 0, track_phi = 0;
1004 global_track = (
BmnGlobalTrack*)globalTracks->UncheckedAt(iTrack);
1010 if (mc_index > -1) {
1011 mc_track = (
CbmMCTrack*)mc_tracks->At(mc_index);
1013 track_mass = mc_track->
GetMass();
1015 track_pdg = global_track->
GetPDG();
1016 if (track_pdg != 0) {
1017 TDatabasePDG* pdg_db = TDatabasePDG::Instance();
1018 TParticlePDG* part_pdg = pdg_db->GetParticle(track_pdg);
1020 track_mass = part_pdg->Mass();
1022 cout <<
"WARNING: PDG code was not found in the PDG database: " << track_pdg << endl;
1026 Double_t mass_tof = global_track->
GetMass2(1);
1027 if (mass_tof == -1000.0) {
1028 mass_tof = global_track->
GetMass2(2);
1029 if (mass_tof == -1000.0) {
1035 track_pdg = GetPDGCodeByMass(mass_tof, -0.03, fParticles);
1036 if (track_pdg == 0) {
1047 Double_t track_qp = parFirst->GetQp();
1048 track_p = (TMath::Abs(track_qp) > 1.e-4) ? 1. / TMath::Abs(track_qp) : 1.e4;
1050 parFirst->Momentum(vecMom);
1051 track_pt = TMath::Sqrt(vecMom.x() * vecMom.x() + vecMom.y() * vecMom.y());
1052 Double_t e = TMath::Sqrt(track_p * track_p + track_mass * track_mass);
1053 track_y = 0.5 * TMath::Log((e + vecMom.z()) / (e - vecMom.z()));
1054 track_eta = 0.5 * TMath::Log((track_p + vecMom.z()) / (track_p - vecMom.z()));
1055 track_phi = TMath::ATan2(parFirst->GetTy(), parFirst->GetTx());
1056 track_theta = TMath::ATan2(parFirst->GetTx(), TMath::Cos(track_phi));
1060 mc_track = (
CbmMCTrack*)mc_tracks->At(iTrack);
1065 if (iParticleCut > 0) {
1069 if (iParticleCut > 1) {
1078 track_p = mc_track->
GetP();
1079 track_pt = mc_track->
GetPt();
1081 track_eta = 0.5 * TMath::Log((track_p + mc_track->
GetPz()) / (track_p - mc_track->
GetPz()));
1082 track_theta = TMath::ATan2(track_pt, mc_track->
GetPz());
1083 track_phi = TMath::ATan2(mc_track->
GetPy(), mc_track->
GetPx());
1086 auto iter_pdg = find(fParticles.begin(), fParticles.end(), track_pdg);
1087 if (iter_pdg == fParticles.end())
1090 if ((track_p >= fPMin) && (track_p < fPMax)) {
1091 mapParticleNumberHists[*iter_pdg]->Fill(track_p);
1092 mapPHists[*iter_pdg]->Fill(track_p);
1093 mapPtHists[*iter_pdg]->Fill(track_pt);
1094 mapYHists[*iter_pdg]->Fill(track_y);
1095 mapEtaHists[*iter_pdg]->Fill(track_eta);
1096 mapThetaHists[*iter_pdg]->Fill(track_theta);
1097 mapPhiHists[*iter_pdg]->Fill(track_phi);
1103 if (iCurrentEvent == 0) {
1104 cout <<
"ERROR: There are no necessary tree branches or DST events in the files from the list: "
1105 << input_list_file << endl;
1106 for (
const auto& pair : mapPHists)
1108 for (
const auto& pair : mapPtHists)
1110 for (
const auto& pair : mapYHists)
1112 for (
const auto& pair : mapEtaHists)
1114 for (
const auto& pair : mapThetaHists)
1116 for (
const auto& pair : mapPhiHists)
1123 Double_t max_y_value = 0;
1124 for (
const auto& pair_hist : mapParticleNumberHists) {
1125 if (max_y_value < pair_hist.second->GetMaximum())
1126 max_y_value = pair_hist.second->GetMaximum();
1130 TLegend* legend =
new TLegend(0.7, 0.74, 0.85, 0.88);
1131 TString hist_options =
"bar2,hist,text";
1133 for (
const auto& pair_hist : mapParticleNumberHists) {
1134 if (cur_hist == 0) {
1135 if (pair_hist.second->GetMaximum() < max_y_value)
1136 pair_hist.second->SetMaximum(max_y_value + 10);
1137 pair_hist.second->DrawCopy(hist_options);
1139 pair_hist.second->DrawCopy(hist_options +
",same");
1142 legend->AddEntry(pair_hist.second, TString::Format(
"Multiplitcity for %d", pair_hist.first),
"f");
1148 TCanvas* c_p =
new TCanvas(
"c_p",
"Particle Momentum", 1000, 500);
1149 c_p->Divide((fParticles.size() / 3) + 1, 3);
1151 for (
int particle_number : fParticles) {
1153 mapPHists[particle_number]->Draw();
1156 TCanvas* c_pt =
new TCanvas(
"c_pt",
"Transverse Momentum", 1000, 500);
1157 c_pt->Divide((fParticles.size() / 3) + 1, 3);
1159 for (
int particle_number : fParticles) {
1161 mapPtHists[particle_number]->Draw();
1164 TCanvas* c_y =
new TCanvas(
"c_y",
"Rapidity", 1000, 500);
1165 c_y->Divide((fParticles.size() / 3) + 1, 3);
1167 for (
int particle_number : fParticles) {
1169 mapYHists[particle_number]->Draw();
1172 TCanvas* c_eta =
new TCanvas(
"c_eta",
"Pseudorapidity", 1000, 500);
1173 c_eta->Divide((fParticles.size() / 3) + 1, 3);
1175 for (
int particle_number : fParticles) {
1176 c_eta->cd(cur_hist);
1177 mapEtaHists[particle_number]->Draw();
1180 TCanvas* c_theta =
new TCanvas(
"c_theta",
"Theta angle", 1000, 500);
1181 c_theta->Divide((fParticles.size() / 3) + 1, 3);
1183 for (
int particle_number : fParticles) {
1184 c_theta->cd(cur_hist);
1185 mapThetaHists[particle_number]->Draw();
1188 TCanvas* c_phi =
new TCanvas(
"c_phi",
"Phi Angle", 1000, 500);
1189 c_phi->Divide((fParticles.size() / 3) + 1, 3);
1191 for (
int particle_number : fParticles) {
1192 c_phi->cd(cur_hist);
1193 mapPhiHists[particle_number]->Draw();