HAL posiada wbudowane klasy do analiz fizycznych:
Liczenie spektr
Klasa Hal::Spectra służy do liczenia podstawowych rozkładów jednocząstkowych (spektr). Liczone są 4 rozkłady:
- pęd poprzeczny vs rapidity
- pęd poprzeczny vs pseudorapidity
- masa poprzeczna vs rapidity
- masa poprzeczna vs pseudorapidity
Domyślnie te 4 histogramy są tworzone dla każdej kolekcji cząstkowej. W zasadzie taką samą analizę można zrobić na cut monitorach ale ta klasa umożliwia zrobienie tego szybciej. Poniżej kod robiący analizę spektr 8 rodzajów cząstek.
auto spectra = new Hal::SpectraAna();
//ustawianie osi histogramów spectra->SetPtAxis(200, 0, 2); spectra->SetEtaAxis(200, -3, 3); spectra->SetMtAxis(200, 0, 4); spectra->SetYAxis(200, -3, 3); //tablica z kodami PDG Int_t pids[] = {Hal::Const::PionPlusPID(), -Hal::Const::PionPlusPID(), Hal::Const::KaonPlusPID(), -Hal::Const::KaonPlusPID(), Hal::Const::ProtonPID(), -Hal::Const::ProtonPID(), Hal::Const::LambdaPID(), -Hal::Const::LambdaPID()};
// tablica z masami (są one potrzebne do wyliczenia rapidity oraz mT - bo te nie zawsze są znane) Double_t masses[] = {Hal::Const::PionPlusMass(), Hal::Const::PionPlusMass(), Hal::Const::KaonPlusMass(), Hal::Const::KaonPlusMass(), Hal::Const::ProtonMass(), Hal::Const::ProtonMass(), Hal::Const::LambdaMass(), Hal::Const::LambdaMass()};
// opisy histogramow - żeby łatwiej zidentyfikować wyjściowe histogramy TString labels[] = {"pion+", "pion-", "kaon+", "kaon-", "proton", "antiproton", "lambda", "antilambda"}; //pętla for (int i = 0; i < 8; i++) {
// tworzymy 8 cięc na PDG, w ogólności mogą to być dowolne cięcia jakoś identyfikujące nam cząstki np. cięcie na m2 Hal::TrackPdgCut pid; pid.SetCollectionID(i); pid.SetMinAndMax(pids[i]); spectra->AddCut(pid);
//nazwa dla histogramu z danej kolekcji spectra->SetTrackCollectionName(labels[i], i);
//określenie masy - potrzebne do wyliczenia mT i Y spectra->SetMass(masses[i], i); }
Przepływy
Do liczenia przepływów (eliptycznych, skierowanych) służy klasa Hal::SimpleVnAnalysis. Używa ona standardowej metody liczenia przepływów - oznacza to że musimy jakoś dostarczyć do makra kąta płaszczyzny zderzenia. Przykładowy kod:
Hal::SimpleVnAnalysis* ana = new Hal::SimpleVnAnalysis(1); ana->SetFlowVariableX(Hal::FlowTrackFieldVariable(Hal::DataFieldID::Track::kPt)); ana->SetAxis(100, 0, 2, 'x');
W konstruktorze określamy składową harmoniczną, tutaj jest to 1 więc liczymy przepływ skierowany. W SetFlowVariableX mówimy że liczymy ten przepływ w funkcji zmiennej Pt. Możliwe jest jeszcze wywołanie SetFlowVariableY - wtedy możemy liczyć przepływ w funkcji 2 zmiennych. W SetAxis określamy ile binów i z jakiego zakresu ma być w wyjściowym histogramie, dla histogramu 2D możemy określić tak drugą oś (z flagą 'y').
Ważne - ta klasa wspiera praktycznie dowolną ilość kolekcji cząstek, dodając cięcie z kolejnym numerem kolekcji tworzy się osobna "pod-analiza" dla danego rodzaju cząstek. Można jednak mieć tylko jedną kolekcję zderzeń! Oznacza to że licząc flow dla kilku centralności musimy stworzyć kilka tasków.