Analizy femtoskopowe
Analizy femtoskopowe w HAL są zarządzane przez Hal::FemtoBasicAna i klasy pochodne. Ta klasa bazuje z kolei na Hal::TwoTrackAna.
Ponieważ analizy femtoskopowe w HAL bazują na analizach dwucząstkowych dostępne tu są wszystkie metody typu:
- cięcia i monitory cięć dla zderzeń, cząstek i par cząstek
- metody SetBackgroundOption pozwalające wybrać sposób liczenia tła
- SetMixSize określające wielkość bufora przy liczeniu miksowanych zderzeń
- EnableNonIdentical - metoda przełączająca task w analizy cząstek nieidentycznych
Są też rzeczy dodatkowe które powinniśmy (a czasem musimy) skonfigurować dla analizy:
- powinniśmy pamiętać o ograniczeniu liczby kolekcji cząstek, przykładowo jeśli miksujemy tło to możemy mieć maksymalnie 1 kolekcję cząstek lub dwie (analizy nieidentyczne)
- ustawić typ funkcji korelacyjnej jaką chcemy liczyć (SetCorrFctn)
- ustawić algorytm wagowy (dla modeli MC bo te nie mają korelacji) przez SetWeight
- generować freezeout jeśli nasz model MC takich nie posiada przy pomocy SetFreezeoutGenerator
- ustawić kody Pdg analizowanych cząstek (SetPdg), to konieczne do prawidłowego ustawienia energii czterowektora pędu (nie zawsze masa jest dostępna w danych i kod do HBT bierze te dane stąd)
- ustawić flagę IgnoreSign jeśli chcemy liczyć moduł wartości różnicy pędu np |k| a nie k
- UseImgMomenta() - metoda licząca na pędach MC - działa tylko dla danych typu zespolonego
Funkcje korelacyjne FemtoCorrFunc, zawierają tak naprawdę kilka "mniejszych funkcji korelacyjnych" np. FemtoCorrFuncKt zawiera f.k. dla różnych przedziałów kT. Obecne funkcje to:
- FemtoCorrFuncAzimuthalKt - funkcja z binami w funkcji pędu poprzednego pary (kT) oraz kąta poprzecznego pary, używana do funkcji azymutalnych
- FemtoCorrFuncKt - funkcja z binami w funkcji kT
- FemtoCorrFuncPt - funkcja z binami w funkcji sumy modułów pędów poprzecznych
- FemtoCorrFuncY - funkcja z binami w funkcji rapidity pary
Te funkcje z kolei zawierają "funkcje właściwe":
- Femto1DCF- jednowymiarowa funkcja korelacyjna
- Femto3DCF - trójwymiarowa funkcja korelacyjna
- Femto3DCFQinv - trójwymiarowa fukcja korelacjną z informając o średnim qinv dla danego binu
- FemtoDoubleRatio1DCF - funkcja typu double ratio, jednowymiarowa
- FemtoDPhiDEta - funkcja w zależności od kąta azymutalnego polarnego
- FemtoSHCF - funkcja w harmonikach sferycznych
Przykład ustawiania funkcji korelacyjnych - 3 biny kT 0.1-0.2, 0.2-0.4, 0.4-0.6 GeV/c, funkcja dla qinv 0-1 GeV 100 binów:
ana->SetCorrFctn(Hal::FemtoCorrFuncKt(Hal::Femto1DCF("cf", 100, 0, 1, Hal::Femto::EKinematics::kLCMS),{0.1,0.2,0.6}));
Kolejno:
- użycie FemtoCorrFuncKt mówi, że liczymi kilka funkcji korelacyjnych dla różnych kT
- Femto1DCF oznacza, że liczymy funkcję jednowymiarową
- "cf" to nazwa tej funkcji
- 100,0,1 to liczba binów i zakres dla funkcji korelacyjnej
- Hal::Femto::EKinematics::kLCMS oznacza że liczmy qinv (funkcje 1D) lub w układzie LCMS, dostępna jest też flaga Hal::Femto::EKinematics::kPRF dla układu PRF - są też inne, ale nie służą do liczenia zwykłych funkcji korelacyjnych
- {0.1,0.2,0.6} - definuje przedziały kT
Przykładowe makro wygląda więc np. tak:
Hal::FemtoBasicAna* MakeAna() { Hal::FemtoBasicAna* ana = new Hal::FemtoBasicAna(); /** * cut monitory tu w formie property monitorów */ Hal::TrackFieldMonitorXY kin(trackField::kRapidity, trackField::kPt); kin.SetXaxis(100, -4, 4); kin.SetYaxis(100, 0, 2); ana->AddCutMonitor(kin); Hal::EventFieldMonitorX b(eventField::kB); b.SetXaxis(100, 0, 10); ana->AddCutMonitor(b); /** * ustawienia cięć */ Hal::EventImpactParameterCut bCut; bCut.SetMinMax(0, 2); ana->AddCut(bCut); Hal::TrackBasicMCCut mc; mc.SetPdgCut(Hal::Const::ProtonPID()); mc.SetPtCut(0.2, 2); mc.SetEtaCut(-1, 1); ana->AddCut(mc); /** * konfiguracja funkcji korelacyjnej */ ana->SetCorrFctn(Hal::FemtoCorrFuncKt(Hal::Femto1DCF("cf", 100, 0, 1, Hal::Femto::EKinematics::kLCMS), {0.1, 0.2, 0.6})); Hal::FemtoWeightGenerator basic; ana->SetWeight(basic); ana->SetOption(Hal::TwoTrackAna::BackgroundOptionMixed()); ana->SetMixSize(5); ana->SetPdg(Hal::Const::ProtonPID()); /** * a tu generowanie własnych freezoutów (opcjonalne) */ Hal::FemtoSourceModelGauss1D gaus; gaus.SetRadius(3.0); Hal::FemtoFreezeoutGeneratorPRF prf; prf.SetSourceModel(gaus); ana->SetFreezeoutGenerator(prf); return ana; } void ana() { TString dataPath = "/lustre/nyx/cbm/users/wielanek/gen/phsd_output/unigen/freez"; auto run = new Hal::AnalysisManager(); auto list = Hal::Std::GetListOfFiles(dataPath, "root", kTRUE, kFALSE); TString env = gSystem->Getenv("SLURM_ARRAY_TASK_ID"); Int_t no = env.Atoi(); TString outPath = Form("data_%i.root", no); int step = 10; int start = no * step; auto source = new Hal::RootSource(list[start]); for (int i = start + 1; i < start + step; i++) { source->AddFile(list[i]); } run->SetSource(source); run->SetOutput(outPath); auto reader = new PhqmdReader(); // if (useFreezMom) reader->Translate("xx"); run->AddTask(reader); run->AddTask(MakeAna(0)); run->AddTask(MakeAna(1)); run->EnableProgressBar(); run->Init(); run->Run(); }
Rozpakować sobie np. drugi bin kT można następującym kodem:
Hal::AnaFile* files = new Hal::AnaFile("total.root"); auto cf = (Hal::FemtoCorrFuncKt*) files->GetMainAnaObject(); auto div = (Hal::Femto1DCF*) cf->GetCF(1);//drugi bin kt div->Draw();