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();