|
42 | 42 | #include <TDatabasePDG.h> |
43 | 43 |
|
44 | 44 | using namespace o2; |
| 45 | +using namespace o2::soa; |
45 | 46 | using namespace o2::constants::math; |
46 | 47 | using namespace o2::framework; |
47 | 48 | using namespace o2::framework::expressions; |
@@ -75,6 +76,7 @@ struct cascadeSelector { |
75 | 76 | Configurable<float> tpcNsigmaPion{"tpcNsigmaPion", 3, "TPC NSigma pion <- lambda"}; |
76 | 77 | Configurable<int> minTPCCrossedRows{"minTPCCrossedRows", 80, "min N TPC crossed rows"}; // TODO: finetune! 80 > 159/2, so no split tracks? |
77 | 78 | Configurable<int> minITSClusters{"minITSClusters", 4, "minimum number of ITS clusters"}; |
| 79 | + // Configurable<float> etaTracks{"etaTracks", 0.8, "min/max of eta for tracks"} |
78 | 80 |
|
79 | 81 | // Selection criteria - compatible with core wagon autodetect - copied from cascadeanalysis.cxx |
80 | 82 | //*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+* |
@@ -261,6 +263,9 @@ struct cascadeSelector { |
261 | 263 | }; // struct |
262 | 264 |
|
263 | 265 | struct cascadeCorrelations { |
| 266 | + |
| 267 | + Configurable<float> zVertexCut{"zVertexCut", 10, "Cut on PV position"}; |
| 268 | + |
264 | 269 | AxisSpec invMassAxis = {2000, 1.0f, 3.0f, "Inv. Mass (GeV/c^{2})"}; |
265 | 270 | AxisSpec deltaPhiAxis = {100, -PI / 2, 1.5 * PI, "#Delta#varphi"}; |
266 | 271 | AxisSpec deltaEtaAxis = {40, -2, 2, "#Delta#eta"}; |
@@ -310,12 +315,39 @@ struct cascadeCorrelations { |
310 | 315 | {"hOmXiSS", "hOmXiSS", {HistType::kTHnSparseF, {deltaPhiAxis, deltaEtaAxis, ptAxis, ptAxis, invMassAxis, invMassAxis, selectionFlagAxis, selectionFlagAxis, vertexAxis, multiplicityAxis}}}, |
311 | 316 | {"hOmOmOS", "hOmOmOS", {HistType::kTHnSparseF, {deltaPhiAxis, deltaEtaAxis, ptAxis, ptAxis, invMassAxis, invMassAxis, selectionFlagAxis, selectionFlagAxis, vertexAxis, multiplicityAxis}}}, |
312 | 317 | {"hOmOmSS", "hOmOmSS", {HistType::kTHnSparseF, {deltaPhiAxis, deltaEtaAxis, ptAxis, ptAxis, invMassAxis, invMassAxis, selectionFlagAxis, selectionFlagAxis, vertexAxis, multiplicityAxis}}}, |
| 318 | + |
| 319 | + // ad hoc mixed events |
| 320 | + {"MixedEvents/hMEVz1", "hMEVz1", {HistType::kTH1F, {vertexAxis}}}, |
| 321 | + {"MixedEvents/hMEVz2", "hMEVz2", {HistType::kTH1F, {vertexAxis}}}, |
| 322 | + {"MixedEvents/hMEDeltaPhiSS", "hMEDeltaPhiSS", {HistType::kTH1F, {deltaPhiAxis}}}, |
| 323 | + {"MixedEvents/hMEDeltaPhiOS", "hMEDeltaPhiOS", {HistType::kTH1F, {deltaPhiAxis}}}, |
| 324 | + {"MixedEvents/hMEXiXiOS", "hMEXiXiOS", {HistType::kTHnSparseF, {deltaPhiAxis, deltaEtaAxis, ptAxis, ptAxis, invMassAxis, invMassAxis, selectionFlagAxis, selectionFlagAxis, vertexAxis, multiplicityAxis}}}, |
| 325 | + {"MixedEvents/hMEXiXiSS", "hMEXiXiSS", {HistType::kTHnSparseF, {deltaPhiAxis, deltaEtaAxis, ptAxis, ptAxis, invMassAxis, invMassAxis, selectionFlagAxis, selectionFlagAxis, vertexAxis, multiplicityAxis}}}, |
| 326 | + {"MixedEvents/hMEXiOmOS", "hMEXiOmOS", {HistType::kTHnSparseF, {deltaPhiAxis, deltaEtaAxis, ptAxis, ptAxis, invMassAxis, invMassAxis, selectionFlagAxis, selectionFlagAxis, vertexAxis, multiplicityAxis}}}, |
| 327 | + {"MixedEvents/hMEXiOmSS", "hMEXiOmSS", {HistType::kTHnSparseF, {deltaPhiAxis, deltaEtaAxis, ptAxis, ptAxis, invMassAxis, invMassAxis, selectionFlagAxis, selectionFlagAxis, vertexAxis, multiplicityAxis}}}, |
| 328 | + {"MixedEvents/hMEOmXiOS", "hMEOmXiOS", {HistType::kTHnSparseF, {deltaPhiAxis, deltaEtaAxis, ptAxis, ptAxis, invMassAxis, invMassAxis, selectionFlagAxis, selectionFlagAxis, vertexAxis, multiplicityAxis}}}, |
| 329 | + {"MixedEvents/hMEOmXiSS", "hMEOmXiSS", {HistType::kTHnSparseF, {deltaPhiAxis, deltaEtaAxis, ptAxis, ptAxis, invMassAxis, invMassAxis, selectionFlagAxis, selectionFlagAxis, vertexAxis, multiplicityAxis}}}, |
| 330 | + {"MixedEvents/hMEOmOmOS", "hMEOmOmOS", {HistType::kTHnSparseF, {deltaPhiAxis, deltaEtaAxis, ptAxis, ptAxis, invMassAxis, invMassAxis, selectionFlagAxis, selectionFlagAxis, vertexAxis, multiplicityAxis}}}, |
| 331 | + {"MixedEvents/hMEOmOmSS", "hMEOmOmSS", {HistType::kTHnSparseF, {deltaPhiAxis, deltaEtaAxis, ptAxis, ptAxis, invMassAxis, invMassAxis, selectionFlagAxis, selectionFlagAxis, vertexAxis, multiplicityAxis}}}, |
313 | 332 | }, |
314 | 333 | }; |
315 | 334 |
|
| 335 | + // cascade filter |
316 | 336 | Filter Selector = aod::cascadeflags::isSelected > 0; |
317 | 337 |
|
318 | | - void process(soa::Join<aod::Collisions, aod::EvSels, aod::FT0Mults>::iterator const& collision, soa::Filtered<aod::CascDataExtSelected> const& Cascades, aod::V0sLinked const&, aod::V0Datas const&, FullTracksExtIU const&) |
| 338 | + // Mixed events setup: |
| 339 | + using myCascades = soa::Filtered<aod::CascDataExtSelected>; |
| 340 | + using myCollisions = soa::Join<aod::Collisions, aod::EvSels, aod::FT0Mults>; |
| 341 | + |
| 342 | + SliceCache cache; |
| 343 | + ConfigurableAxis axisVtxZ{"axisVtxZ", {VARIABLE_WIDTH, -10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}, "Mixing bins - z-vertex"}; |
| 344 | + ConfigurableAxis axisMult{"axisMult", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 100, 1000}, "Mixing bins - multiplicity"}; |
| 345 | + using BinningType = ColumnBinningPolicy<aod::collision::PosZ, aod::mult::MultFT0M<aod::mult::MultFT0A, aod::mult::MultFT0C>>; |
| 346 | + BinningType colBinning{{axisVtxZ, axisMult}, true}; // true is for 'ignore overflows' (true by default). Underflows and overflows will have bin -1. |
| 347 | + // Preslice<aod::CascDataExtSelected> collisionSliceCascades = aod::CascDataExtSelected::collisionId; |
| 348 | + SameKindPair<myCollisions, myCascades, BinningType> pair{colBinning, 5, -1, &cache}; |
| 349 | + |
| 350 | + void processSameEvent(myCollisions::iterator const& collision, myCascades const& Cascades, aod::V0sLinked const&, aod::V0Datas const&, FullTracksExtIU const&) |
319 | 351 | { |
320 | 352 | if (!collision.sel8()) { |
321 | 353 | return; |
@@ -380,6 +412,8 @@ struct cascadeCorrelations { |
380 | 412 | double invMassXiAssoc = assoc.mXi(); |
381 | 413 | double invMassOmAssoc = assoc.mOmega(); |
382 | 414 |
|
| 415 | + double weight = 1.; // Will be changed by Efficiency-correction |
| 416 | + |
383 | 417 | // Fill the correct histograms based on same-sign or opposite-sign |
384 | 418 | if (trigger.sign() * assoc.sign() < 0) { // opposite-sign |
385 | 419 | // check for autocorrelations between mis-identified kaons (omega bach) and protons (lambda daughter) TODO: improve logic? |
@@ -409,10 +443,10 @@ struct cascadeCorrelations { |
409 | 443 | } |
410 | 444 |
|
411 | 445 | registry.fill(HIST("hDeltaPhiOS"), dphi); |
412 | | - registry.fill(HIST("hXiXiOS"), dphi, deta, trigger.pt(), assoc.pt(), invMassXiTrigg, invMassXiAssoc, trigger.isSelected(), assoc.isSelected(), collision.posZ(), collision.multFT0M()); |
413 | | - registry.fill(HIST("hXiOmOS"), dphi, deta, trigger.pt(), assoc.pt(), invMassXiTrigg, invMassOmAssoc, trigger.isSelected(), assoc.isSelected(), collision.posZ(), collision.multFT0M()); |
414 | | - registry.fill(HIST("hOmXiOS"), dphi, deta, trigger.pt(), assoc.pt(), invMassOmTrigg, invMassXiAssoc, trigger.isSelected(), assoc.isSelected(), collision.posZ(), collision.multFT0M()); |
415 | | - registry.fill(HIST("hOmOmOS"), dphi, deta, trigger.pt(), assoc.pt(), invMassOmTrigg, invMassOmAssoc, trigger.isSelected(), assoc.isSelected(), collision.posZ(), collision.multFT0M()); |
| 446 | + registry.fill(HIST("hXiXiOS"), dphi, deta, trigger.pt(), assoc.pt(), invMassXiTrigg, invMassXiAssoc, trigger.isSelected(), assoc.isSelected(), collision.posZ(), collision.multFT0M(), weight); |
| 447 | + registry.fill(HIST("hXiOmOS"), dphi, deta, trigger.pt(), assoc.pt(), invMassXiTrigg, invMassOmAssoc, trigger.isSelected(), assoc.isSelected(), collision.posZ(), collision.multFT0M(), weight); |
| 448 | + registry.fill(HIST("hOmXiOS"), dphi, deta, trigger.pt(), assoc.pt(), invMassOmTrigg, invMassXiAssoc, trigger.isSelected(), assoc.isSelected(), collision.posZ(), collision.multFT0M(), weight); |
| 449 | + registry.fill(HIST("hOmOmOS"), dphi, deta, trigger.pt(), assoc.pt(), invMassOmTrigg, invMassOmAssoc, trigger.isSelected(), assoc.isSelected(), collision.posZ(), collision.multFT0M(), weight); |
416 | 450 | } else { // same-sign |
417 | 451 | // make sure to check for autocorrelations - only possible in same-sign correlations (if PID is correct) |
418 | 452 | if (posIdTrigg == posIdAssoc && negIdTrigg == negIdAssoc) { |
@@ -448,13 +482,68 @@ struct cascadeCorrelations { |
448 | 482 | } |
449 | 483 | } |
450 | 484 | registry.fill(HIST("hDeltaPhiSS"), dphi); |
451 | | - registry.fill(HIST("hXiXiSS"), dphi, deta, trigger.pt(), assoc.pt(), invMassXiTrigg, invMassXiAssoc, trigger.isSelected(), assoc.isSelected(), collision.posZ(), collision.multFT0M()); |
452 | | - registry.fill(HIST("hXiOmSS"), dphi, deta, trigger.pt(), assoc.pt(), invMassXiTrigg, invMassOmAssoc, trigger.isSelected(), assoc.isSelected(), collision.posZ(), collision.multFT0M()); |
453 | | - registry.fill(HIST("hOmXiSS"), dphi, deta, trigger.pt(), assoc.pt(), invMassOmTrigg, invMassXiAssoc, trigger.isSelected(), assoc.isSelected(), collision.posZ(), collision.multFT0M()); |
454 | | - registry.fill(HIST("hOmOmSS"), dphi, deta, trigger.pt(), assoc.pt(), invMassOmTrigg, invMassOmAssoc, trigger.isSelected(), assoc.isSelected(), collision.posZ(), collision.multFT0M()); |
| 485 | + registry.fill(HIST("hXiXiSS"), dphi, deta, trigger.pt(), assoc.pt(), invMassXiTrigg, invMassXiAssoc, trigger.isSelected(), assoc.isSelected(), collision.posZ(), collision.multFT0M(), weight); |
| 486 | + registry.fill(HIST("hXiOmSS"), dphi, deta, trigger.pt(), assoc.pt(), invMassXiTrigg, invMassOmAssoc, trigger.isSelected(), assoc.isSelected(), collision.posZ(), collision.multFT0M(), weight); |
| 487 | + registry.fill(HIST("hOmXiSS"), dphi, deta, trigger.pt(), assoc.pt(), invMassOmTrigg, invMassXiAssoc, trigger.isSelected(), assoc.isSelected(), collision.posZ(), collision.multFT0M(), weight); |
| 488 | + registry.fill(HIST("hOmOmSS"), dphi, deta, trigger.pt(), assoc.pt(), invMassOmTrigg, invMassOmAssoc, trigger.isSelected(), assoc.isSelected(), collision.posZ(), collision.multFT0M(), weight); |
455 | 489 | } |
456 | 490 | } // correlations |
457 | | - } // process |
| 491 | + } // process same event |
| 492 | + |
| 493 | + void processMixedEvent(myCollisions const& collisions, myCascades const& Cascades, |
| 494 | + aod::V0sLinked const&, aod::V0Datas const&, FullTracksExtIU const&) |
| 495 | + { |
| 496 | + // mixed events |
| 497 | + |
| 498 | + for (auto& [col1, cascades1, col2, cascades2] : pair) { |
| 499 | + if (!col1.sel8() || !col2.sel8()) |
| 500 | + continue; |
| 501 | + if (TMath::Abs(col1.posZ()) > zVertexCut || TMath::Abs(col2.posZ()) > zVertexCut) |
| 502 | + continue; |
| 503 | + |
| 504 | + registry.fill(HIST("MixedEvents/hMEVz1"), col1.posZ()); |
| 505 | + registry.fill(HIST("MixedEvents/hMEVz2"), col2.posZ()); |
| 506 | + |
| 507 | + for (auto& [casc1, casc2] : combinations(CombinationsFullIndexPolicy(cascades1, cascades2))) { |
| 508 | + // specify FullIndexPolicy since the cascades are from different collisions |
| 509 | + auto* triggerAddress = &casc1; |
| 510 | + auto* assocAddress = &casc2; |
| 511 | + if (assocAddress->pt() > triggerAddress->pt()) { |
| 512 | + std::swap(triggerAddress, assocAddress); |
| 513 | + } |
| 514 | + auto trigger = *triggerAddress; |
| 515 | + auto assoc = *assocAddress; |
| 516 | + |
| 517 | + double deta = trigger.eta() - assoc.eta(); |
| 518 | + double dphi = RecoDecay::constrainAngle(trigger.phi() - assoc.phi(), -0.5 * PI); |
| 519 | + |
| 520 | + double invMassXiTrigg = trigger.mXi(); |
| 521 | + double invMassOmTrigg = trigger.mOmega(); |
| 522 | + double invMassXiAssoc = assoc.mXi(); |
| 523 | + double invMassOmAssoc = assoc.mOmega(); |
| 524 | + |
| 525 | + double weight = 1.; // Will be changed by Efficiency-correction |
| 526 | + |
| 527 | + if (trigger.sign() * assoc.sign() < 0) { // opposite-sign |
| 528 | + registry.fill(HIST("MixedEvents/hMEDeltaPhiOS"), dphi); |
| 529 | + registry.fill(HIST("MixedEvents/hMEXiXiOS"), dphi, deta, trigger.pt(), assoc.pt(), invMassXiTrigg, invMassXiAssoc, trigger.isSelected(), assoc.isSelected(), col1.posZ(), col1.multFT0M(), weight); |
| 530 | + registry.fill(HIST("MixedEvents/hMEXiOmOS"), dphi, deta, trigger.pt(), assoc.pt(), invMassXiTrigg, invMassOmAssoc, trigger.isSelected(), assoc.isSelected(), col1.posZ(), col1.multFT0M(), weight); |
| 531 | + registry.fill(HIST("MixedEvents/hMEOmXiOS"), dphi, deta, trigger.pt(), assoc.pt(), invMassOmTrigg, invMassXiAssoc, trigger.isSelected(), assoc.isSelected(), col1.posZ(), col1.multFT0M(), weight); |
| 532 | + registry.fill(HIST("MixedEvents/hMEOmOmOS"), dphi, deta, trigger.pt(), assoc.pt(), invMassOmTrigg, invMassOmAssoc, trigger.isSelected(), assoc.isSelected(), col1.posZ(), col1.multFT0M(), weight); |
| 533 | + } else { // same sign |
| 534 | + registry.fill(HIST("MixedEvents/hMEDeltaPhiSS"), dphi); |
| 535 | + registry.fill(HIST("MixedEvents/hMEXiXiSS"), dphi, deta, trigger.pt(), assoc.pt(), invMassXiTrigg, invMassXiAssoc, trigger.isSelected(), assoc.isSelected(), col1.posZ(), col1.multFT0M(), weight); |
| 536 | + registry.fill(HIST("MixedEvents/hMEXiOmSS"), dphi, deta, trigger.pt(), assoc.pt(), invMassXiTrigg, invMassOmAssoc, trigger.isSelected(), assoc.isSelected(), col1.posZ(), col1.multFT0M(), weight); |
| 537 | + registry.fill(HIST("MixedEvents/hMEOmXiSS"), dphi, deta, trigger.pt(), assoc.pt(), invMassOmTrigg, invMassXiAssoc, trigger.isSelected(), assoc.isSelected(), col1.posZ(), col1.multFT0M(), weight); |
| 538 | + registry.fill(HIST("MixedEvents/hMEOmOmSS"), dphi, deta, trigger.pt(), assoc.pt(), invMassOmTrigg, invMassOmAssoc, trigger.isSelected(), assoc.isSelected(), col1.posZ(), col1.multFT0M(), weight); |
| 539 | + } |
| 540 | + } // correlations |
| 541 | + } // collisions |
| 542 | + } // process mixed events |
| 543 | + |
| 544 | + PROCESS_SWITCH(cascadeCorrelations, processSameEvent, "Process same events", true); |
| 545 | + PROCESS_SWITCH(cascadeCorrelations, processMixedEvent, "Process mixed events", true); |
| 546 | + |
458 | 547 | }; // struct |
459 | 548 |
|
460 | 549 | WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) |
|
0 commit comments