Skip to content

Commit 3df07e7

Browse files
zjxiongOvOalibuild
andauthored
[PWGDQ] add mixed event method for polarization (#12765)
Co-authored-by: ALICE Action Bot <alibuild@cern.ch>
1 parent 0042403 commit 3df07e7

File tree

2 files changed

+131
-1
lines changed

2 files changed

+131
-1
lines changed

PWGDQ/Core/VarManager.h

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3202,6 +3202,125 @@ void VarManager::FillPairME(T1 const& t1, T2 const& t2, float* values)
32023202
values[kDeltaEtaPair2] = v1.Eta() - v2.Eta();
32033203
}
32043204

3205+
// polarization parameters
3206+
bool useHE = fgUsedVars[kCosThetaHE] || fgUsedVars[kPhiHE]; // helicity frame
3207+
bool useCS = fgUsedVars[kCosThetaCS] || fgUsedVars[kPhiCS]; // Collins-Soper frame
3208+
bool usePP = fgUsedVars[kCosThetaPP]; // production plane frame
3209+
bool useRM = fgUsedVars[kCosThetaRM]; // Random frame
3210+
3211+
if (useHE || useCS || usePP || useRM) {
3212+
ROOT::Math::Boost boostv12{v12.BoostToCM()};
3213+
ROOT::Math::XYZVectorF v1_CM{(boostv12(v1).Vect()).Unit()};
3214+
ROOT::Math::XYZVectorF v2_CM{(boostv12(v2).Vect()).Unit()};
3215+
ROOT::Math::XYZVectorF Beam1_CM{(boostv12(fgBeamA).Vect()).Unit()};
3216+
ROOT::Math::XYZVectorF Beam2_CM{(boostv12(fgBeamC).Vect()).Unit()};
3217+
3218+
// using positive sign convention for the first track
3219+
ROOT::Math::XYZVectorF v_CM = (t1.sign() > 0 ? v1_CM : v2_CM);
3220+
3221+
if (useHE) {
3222+
ROOT::Math::XYZVectorF zaxis_HE{(v12.Vect()).Unit()};
3223+
ROOT::Math::XYZVectorF yaxis_HE{(Beam1_CM.Cross(Beam2_CM)).Unit()};
3224+
ROOT::Math::XYZVectorF xaxis_HE{(yaxis_HE.Cross(zaxis_HE)).Unit()};
3225+
if (fgUsedVars[kCosThetaHE])
3226+
values[kCosThetaHE] = zaxis_HE.Dot(v_CM);
3227+
if (fgUsedVars[kPhiHE]) {
3228+
values[kPhiHE] = TMath::ATan2(yaxis_HE.Dot(v_CM), xaxis_HE.Dot(v_CM));
3229+
if (values[kPhiHE] < 0) {
3230+
values[kPhiHE] += 2 * TMath::Pi(); // ensure phi is in [0, 2pi]
3231+
}
3232+
}
3233+
if (fgUsedVars[kPhiTildeHE]) {
3234+
if (fgUsedVars[kCosThetaHE] && fgUsedVars[kPhiHE]) {
3235+
if (values[kCosThetaHE] > 0) {
3236+
values[kPhiTildeHE] = values[kPhiHE] - 0.25 * TMath::Pi(); // phi_tilde = phi - pi/4
3237+
if (values[kPhiTildeHE] < 0) {
3238+
values[kPhiTildeHE] += 2 * TMath::Pi(); // ensure phi_tilde is in [0, 2pi]
3239+
}
3240+
} else {
3241+
values[kPhiTildeHE] = values[kPhiHE] - 0.75 * TMath::Pi(); // phi_tilde = phi - 3pi/4
3242+
if (values[kPhiTildeHE] < 0) {
3243+
values[kPhiTildeHE] += 2 * TMath::Pi(); // ensure phi_tilde is in [0, 2pi]
3244+
}
3245+
}
3246+
} else {
3247+
values[kPhiTildeHE] = -999; // not computable
3248+
}
3249+
}
3250+
}
3251+
3252+
if (useCS) {
3253+
ROOT::Math::XYZVectorF zaxis_CS{(Beam1_CM - Beam2_CM).Unit()};
3254+
ROOT::Math::XYZVectorF yaxis_CS{(Beam1_CM.Cross(Beam2_CM)).Unit()};
3255+
ROOT::Math::XYZVectorF xaxis_CS{(yaxis_CS.Cross(zaxis_CS)).Unit()};
3256+
if (fgUsedVars[kCosThetaCS])
3257+
values[kCosThetaCS] = zaxis_CS.Dot(v_CM);
3258+
if (fgUsedVars[kPhiCS]) {
3259+
values[kPhiCS] = TMath::ATan2(yaxis_CS.Dot(v_CM), xaxis_CS.Dot(v_CM));
3260+
if (values[kPhiCS] < 0) {
3261+
values[kPhiCS] += 2 * TMath::Pi(); // ensure phi is in [0, 2pi]
3262+
}
3263+
}
3264+
if (fgUsedVars[kPhiTildeCS]) {
3265+
if (fgUsedVars[kCosThetaCS] && fgUsedVars[kPhiCS]) {
3266+
if (values[kCosThetaCS] > 0) {
3267+
values[kPhiTildeCS] = values[kPhiCS] - 0.25 * TMath::Pi(); // phi_tilde = phi - pi/4
3268+
if (values[kPhiTildeCS] < 0) {
3269+
values[kPhiTildeCS] += 2 * TMath::Pi(); // ensure phi_tilde is in [0, 2pi]
3270+
}
3271+
} else {
3272+
values[kPhiTildeCS] = values[kPhiCS] - 0.75 * TMath::Pi(); // phi_tilde = phi - 3pi/4
3273+
if (values[kPhiTildeCS] < 0) {
3274+
values[kPhiTildeCS] += 2 * TMath::Pi(); // ensure phi_tilde is in [0, 2pi]
3275+
}
3276+
}
3277+
} else {
3278+
values[kPhiTildeCS] = -999; // not computable
3279+
}
3280+
}
3281+
}
3282+
3283+
if (usePP) {
3284+
ROOT::Math::XYZVector zaxis_PP = ROOT::Math::XYZVector(v12.Py(), -v12.Px(), 0.f);
3285+
ROOT::Math::XYZVector yaxis_PP{(v12.Vect()).Unit()};
3286+
ROOT::Math::XYZVector xaxis_PP{(yaxis_PP.Cross(zaxis_PP)).Unit()};
3287+
if (fgUsedVars[kCosThetaPP]) {
3288+
values[kCosThetaPP] = zaxis_PP.Dot(v_CM) / std::sqrt(zaxis_PP.Mag2());
3289+
}
3290+
if (fgUsedVars[kPhiPP]) {
3291+
values[kPhiPP] = TMath::ATan2(yaxis_PP.Dot(v_CM), xaxis_PP.Dot(v_CM));
3292+
if (values[kPhiPP] < 0) {
3293+
values[kPhiPP] += 2 * TMath::Pi(); // ensure phi is in [0, 2pi]
3294+
}
3295+
}
3296+
if (fgUsedVars[kPhiTildePP]) {
3297+
if (fgUsedVars[kCosThetaPP] && fgUsedVars[kPhiPP]) {
3298+
if (values[kCosThetaPP] > 0) {
3299+
values[kPhiTildePP] = values[kPhiPP] - 0.25 * TMath::Pi(); // phi_tilde = phi - pi/4
3300+
if (values[kPhiTildePP] < 0) {
3301+
values[kPhiTildePP] += 2 * TMath::Pi(); // ensure phi_tilde is in [0, 2pi]
3302+
}
3303+
} else {
3304+
values[kPhiTildePP] = values[kPhiPP] - 0.75 * TMath::Pi(); // phi_tilde = phi - 3pi/4
3305+
if (values[kPhiTildePP] < 0) {
3306+
values[kPhiTildePP] += 2 * TMath::Pi(); // ensure phi_tilde is in [0, 2pi]
3307+
}
3308+
}
3309+
} else {
3310+
values[kPhiTildePP] = -999; // not computable
3311+
}
3312+
}
3313+
}
3314+
3315+
if (useRM) {
3316+
double randomCostheta = gRandom->Uniform(-1., 1.);
3317+
double randomPhi = gRandom->Uniform(0., 2. * TMath::Pi());
3318+
ROOT::Math::XYZVectorF zaxis_RM(randomCostheta, std::sqrt(1 - randomCostheta * randomCostheta) * std::cos(randomPhi), std::sqrt(1 - randomCostheta * randomCostheta) * std::sin(randomPhi));
3319+
if (fgUsedVars[kCosThetaRM])
3320+
values[kCosThetaRM] = zaxis_RM.Dot(v_CM);
3321+
}
3322+
}
3323+
32053324
if constexpr ((fillMap & ReducedEventQvector) > 0 || (fillMap & CollisionQvect) > 0) {
32063325
// TODO: provide different computations for vn
32073326
// Compute the scalar product UQ for two muon from different event using Q-vector from A, for second and third harmonic

PWGDQ/Tasks/tableReader_withAssoc.cxx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ using MyEventsQvector = soa::Join<aod::ReducedEvents, aod::ReducedEventsExtended
197197
using MyEventsHashSelectedQvector = soa::Join<aod::ReducedEvents, aod::ReducedEventsExtended, aod::EventCuts, aod::MixingHashes, aod::ReducedEventsQvector>;
198198
using MyEventsQvectorCentr = soa::Join<aod::ReducedEvents, aod::ReducedEventsExtended, aod::ReducedEventsQvectorCentr, aod::ReducedEventsMultPV, aod::ReducedEventsMultAll>;
199199
using MyEventsQvectorCentrSelected = soa::Join<aod::ReducedEvents, aod::ReducedEventsExtended, aod::ReducedEventsQvectorCentr, aod::ReducedEventsMultPV, aod::ReducedEventsMultAll, aod::EventCuts>;
200+
using MyEventsHashSelectedQvectorCentr = soa::Join<aod::ReducedEvents, aod::ReducedEventsExtended, aod::EventCuts, aod::MixingHashes, aod::ReducedEventsQvectorCentr, aod::ReducedEventsMultPV, aod::ReducedEventsMultAll>;
200201

201202
using MyBarrelTracks = soa::Join<aod::ReducedTracks, aod::ReducedTracksBarrel, aod::ReducedTracksBarrelPID>;
202203
using MyBarrelTracksWithAmbiguities = soa::Join<aod::ReducedTracks, aod::ReducedTracksBarrel, aod::ReducedTracksBarrelPID, aod::BarrelAmbiguities>;
@@ -1307,7 +1308,7 @@ struct AnalysisSameEventPairing {
13071308
{
13081309
LOG(info) << "Starting initialization of AnalysisSameEventPairing (idstoreh)";
13091310
fEnableBarrelHistos = context.mOptions.get<bool>("processAllSkimmed") || context.mOptions.get<bool>("processBarrelOnlySkimmed") || context.mOptions.get<bool>("processBarrelOnlyWithCollSkimmed") || context.mOptions.get<bool>("processBarrelOnlySkimmedNoCov") || context.mOptions.get<bool>("processBarrelOnlySkimmedNoCovWithMultExtra") || context.mOptions.get<bool>("processBarrelOnlyWithQvectorCentrSkimmedNoCov");
1310-
fEnableBarrelMixingHistos = context.mOptions.get<bool>("processMixingAllSkimmed") || context.mOptions.get<bool>("processMixingBarrelSkimmed") || context.mOptions.get<bool>("processMixingBarrelSkimmedFlow");
1311+
fEnableBarrelMixingHistos = context.mOptions.get<bool>("processMixingAllSkimmed") || context.mOptions.get<bool>("processMixingBarrelSkimmed") || context.mOptions.get<bool>("processMixingBarrelSkimmedFlow") || context.mOptions.get<bool>("processMixingBarrelWithQvectorCentrSkimmedNoCov");
13111312
fEnableMuonHistos = context.mOptions.get<bool>("processAllSkimmed") || context.mOptions.get<bool>("processMuonOnlySkimmed") || context.mOptions.get<bool>("processMuonOnlySkimmedMultExtra") || context.mOptions.get<bool>("processMixingMuonSkimmed");
13121313
fEnableMuonMixingHistos = context.mOptions.get<bool>("processMixingAllSkimmed") || context.mOptions.get<bool>("processMixingMuonSkimmed");
13131314

@@ -2069,6 +2070,9 @@ struct AnalysisSameEventPairing {
20692070
if constexpr ((TEventFillMap & VarManager::ObjTypes::ReducedEventQvector) > 0) {
20702071
VarManager::FillPairVn<TEventFillMap, TPairType>(t1, t2);
20712072
}
2073+
if constexpr ((TEventFillMap & VarManager::ObjTypes::CollisionQvect) > 0) {
2074+
VarManager::FillPairVn<TEventFillMap, TPairType>(t1, t2);
2075+
}
20722076
pairSign = t1.sign() + t2.sign();
20732077
ncuts = fNCutsBarrel;
20742078
}
@@ -2307,6 +2311,12 @@ struct AnalysisSameEventPairing {
23072311
runSameSideMixing<pairTypeEE, gkEventFillMapWithMultExtraWithQVector>(events, trackAssocs, tracks, trackAssocsPerCollision);
23082312
}
23092313

2314+
void processMixingBarrelWithQvectorCentrSkimmedNoCov(soa::Filtered<MyEventsHashSelectedQvectorCentr>& events,
2315+
soa::Join<aod::ReducedTracksAssoc, aod::BarrelTrackCuts, aod::Prefilter> const& trackAssocs, MyBarrelTracksWithAmbiguities const& tracks)
2316+
{
2317+
runSameSideMixing<pairTypeEE, gkEventFillMapWithQvectorCentr>(events, trackAssocs, tracks, trackAssocsPerCollision);
2318+
}
2319+
23102320
void processMixingMuonSkimmed(soa::Filtered<MyEventsHashSelected>& events,
23112321
soa::Join<aod::ReducedMuonsAssoc, aod::MuonTrackCuts> const& muonAssocs, MyMuonTracksWithCovWithAmbiguities const& muons)
23122322
{
@@ -2330,6 +2340,7 @@ struct AnalysisSameEventPairing {
23302340
PROCESS_SWITCH(AnalysisSameEventPairing, processMixingAllSkimmed, "Run all types of mixed pairing, with skimmed tracks/muons", false);
23312341
PROCESS_SWITCH(AnalysisSameEventPairing, processMixingBarrelSkimmed, "Run barrel type mixing pairing, with skimmed tracks", false);
23322342
PROCESS_SWITCH(AnalysisSameEventPairing, processMixingBarrelSkimmedFlow, "Run barrel type mixing pairing, with flow, with skimmed tracks", false);
2343+
PROCESS_SWITCH(AnalysisSameEventPairing, processMixingBarrelWithQvectorCentrSkimmedNoCov, "Run barrel type mixing pairing, with skimmed tracks and with Qvector from central framework", false);
23332344
PROCESS_SWITCH(AnalysisSameEventPairing, processMixingMuonSkimmed, "Run muon type mixing pairing, with skimmed muons", false);
23342345
PROCESS_SWITCH(AnalysisSameEventPairing, processDummy, "Dummy function, enabled only if none of the others are enabled", false);
23352346
};

0 commit comments

Comments
 (0)