From 189ad6e0d0dbf1a7c92e40694c4863ee0517631a Mon Sep 17 00:00:00 2001 From: rspijkers Date: Thu, 1 Apr 2021 21:23:36 +0200 Subject: [PATCH 01/33] add X cand creator --- codeHF/config_tasks.sh | 3 +++ codeHF/dpl-config_run3.json | 8 ++++++++ codeHF/dpl-config_run5_hf.json | 10 +++++++++- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/codeHF/config_tasks.sh b/codeHF/config_tasks.sh index b8aae2de..dda81777 100644 --- a/codeHF/config_tasks.sh +++ b/codeHF/config_tasks.sh @@ -40,6 +40,7 @@ DOO2_PID_TOF_QA=0 # pid-tof-qa-mc DOO2_SKIM=0 # hf-track-index-skims-creator DOO2_CAND_2PRONG=0 # hf-candidate-creator-2prong DOO2_CAND_3PRONG=0 # hf-candidate-creator-3prong +DOO2_CAND_X=0 # hf-candidate-creator-x # Selectors DOO2_SEL_D0=0 # hf-d0-candidate-selector DOO2_SEL_DPLUS=0 # hf-dplus-topikpi-candidate-selector @@ -135,6 +136,7 @@ function MakeScriptO2 { [ $DOO2_SKIM -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-track-index-skims-creator" [ $DOO2_CAND_2PRONG -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-candidate-creator-2prong" [ $DOO2_CAND_3PRONG -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-candidate-creator-3prong" + [ $DOO2_CAND_X -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-candidate-creator-x" [ $DOO2_PID_TPC -eq 1 ] && WORKFLOWS+=" o2-analysis-pid-tpc-full" [ $DOO2_PID_TOF -eq 1 ] && WORKFLOWS+=" o2-analysis-pid-tof-full" [ $DOO2_PID_TOF_QA -eq 1 ] && WORKFLOWS+=" o2-analysis-pid-tof-qa-mc" @@ -211,6 +213,7 @@ function MakeScriptPostprocess { [ $DOO2_TASK_LC -eq 1 ] && PARTICLES+="-lc" [ $DOO2_TASK_XIC -eq 1 ] && PARTICLES+="-xic" [ $DOO2_TASK_JPSI -eq 1 ] && PARTICLES+="-jpsi" + [ $DOO2_TASK_X -eq 1 ] && PARTICLES+="-x" [ "$PARTICLES" ] && POSTEXEC+=" && root -b -q -l \"$DIR_TASKS/PlotEfficiency.C(\\\"\$FileO2\\\", \\\"$PARTICLES\\\")\"" } cat << EOF > "$SCRIPT_POSTPROCESS" diff --git a/codeHF/dpl-config_run3.json b/codeHF/dpl-config_run3.json index faaac23b..0944f514 100644 --- a/codeHF/dpl-config_run3.json +++ b/codeHF/dpl-config_run3.json @@ -384,10 +384,18 @@ "cutYCandMax": "0.8", "d_selectionFlagJpsi": "0" }, + "hf-candidate-creator-x": { + "cutYCandMax": "0.8", + "d_selectionFlagJpsi": "0" + }, "hf-task-x": { "cutYCandMax": "0.8", "d_selectionFlagJpsi": "0" }, + "hf-task-x-mc": { + "cutYCandMax": "0.8", + "d_selectionFlagJpsi": "0" + }, "qa-tracking-efficiency-electron": { "eta-min": "-3", "eta-max": "3", diff --git a/codeHF/dpl-config_run5_hf.json b/codeHF/dpl-config_run5_hf.json index bd8c545d..c867121d 100644 --- a/codeHF/dpl-config_run5_hf.json +++ b/codeHF/dpl-config_run5_hf.json @@ -66,7 +66,7 @@ "mPtJpsiToEEMin": "0.", "mInvMassJpsiToEEMin": "2.5", "mInvMassJpsiToEEMax": "4.1", - "mCPAJpsiToEEMin": "-2", + "mCPAJpsiToEEMin": ".8", "mImpParProductJpsiToEEMax": "1000.00", "mPtDPlusToPiKPiMin": "2.", "mInvMassDPlusToPiKPiMin": "1.67", @@ -390,10 +390,18 @@ "cutYCandMax": "1.44", "d_selectionFlagJpsi": "0" }, + "hf-candidate-creator-x": { + "cutYCandMax": "0.8", + "d_selectionFlagJpsi": "0" + }, "hf-task-x": { "cutYCandMax": "0.8", "d_selectionFlagJpsi": "0" }, + "hf-task-x-mc": { + "cutYCandMax": "0.8", + "d_selectionFlagJpsi": "0" + }, "qa-tracking-efficiency-electron": { "eta-min": "-3", "eta-max": "3", From 4d7796decc8dc7615ff108a850e193454c679423 Mon Sep 17 00:00:00 2001 From: rspijkers Date: Tue, 20 Apr 2021 11:50:14 +0200 Subject: [PATCH 02/33] Add first version of X selector add TOF pid for X selector to json files add pT dependent selection cuts to json files --- codeHF/config_tasks.sh | 11 +++++++- codeHF/dpl-config_run3.json | 42 ++++++++++++++++++++++++++-- codeHF/dpl-config_run5_hf.json | 50 ++++++++++++++++++++++++++++++---- 3 files changed, 94 insertions(+), 9 deletions(-) diff --git a/codeHF/config_tasks.sh b/codeHF/config_tasks.sh index dda81777..0f3ac9a8 100644 --- a/codeHF/config_tasks.sh +++ b/codeHF/config_tasks.sh @@ -47,6 +47,7 @@ DOO2_SEL_DPLUS=0 # hf-dplus-topikpi-candidate-selector DOO2_SEL_LC=0 # hf-lc-candidate-selector DOO2_SEL_XIC=0 # hf-xic-topkpi-candidate-selector DOO2_SEL_JPSI=0 # hf-jpsi-toee-candidate-selector +DOO2_SEL_X=0 # hf-xic-topkpi-candidate-selector # User tasks DOO2_TASK_D0=1 # hf-task-d0 DOO2_TASK_DPLUS=0 # hf-task-dplus @@ -65,6 +66,7 @@ APPLYCUTS_DPLUS=0 # Apply D+ selection cuts. APPLYCUTS_LC=0 # Apply Λc selection cuts. APPLYCUTS_XIC=0 # Apply Ξc selection cuts. APPLYCUTS_JPSI=0 # Apply J/ψ selection cuts. +APPLYCUTS_X=0 # Apply X selection cuts. SAVETREES=0 # Save O2 tables to trees. USEO2VERTEXER=0 # Use the O2 vertexer in AliPhysics. @@ -90,7 +92,7 @@ function Clean { function AdjustJson { # Make a copy of the default JSON file to modify it. JSON_EDIT="" - if [[ $APPLYCUTS_D0 -eq 1 || $APPLYCUTS_DPLUS -eq 1 || $APPLYCUTS_LC -eq 1 || $APPLYCUTS_XIC -eq 1 || $APPLYCUTS_JPSI -eq 1 ]]; then + if [[ $APPLYCUTS_D0 -eq 1 || $APPLYCUTS_DPLUS -eq 1 || $APPLYCUTS_LC -eq 1 || $APPLYCUTS_XIC -eq 1 || $APPLYCUTS_JPSI -eq 1 || $APPLYCUTS_X -eq 1 ]]; then JSON_EDIT="${JSON/.json/_edit.json}" cp "$JSON" "$JSON_EDIT" || ErrExit "Failed to cp $JSON $JSON_EDIT." JSON="$JSON_EDIT" @@ -126,6 +128,12 @@ function AdjustJson { MsgWarn "\nUsing J/ψ selection cuts" ReplaceString "\"d_selectionFlagJpsi\": \"0\"" "\"d_selectionFlagJpsi\": \"1\"" "$JSON" || ErrExit "Failed to edit $JSON." fi + + # Enable X(3872) selection. + if [ $APPLYCUTS_X -eq 1 ]; then + MsgWarn "\nUsing X(3872) selection cuts" + ReplaceString "\"d_selectionFlagX\": \"0\"" "\"d_selectionFlagX\": \"1\"" "$JSON" || ErrExit "Failed to edit $JSON." + fi } # Generate the O2 script containing the full workflow specification. @@ -145,6 +153,7 @@ function MakeScriptO2 { [ $DOO2_SEL_DPLUS -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-dplus-topikpi-candidate-selector" [ $DOO2_SEL_LC -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-lc-candidate-selector" [ $DOO2_SEL_XIC -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-xic-topkpi-candidate-selector" + [ $DOO2_SEL_X -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-x-tojpsipipi-candidate-selector" [ $DOO2_TASK_D0 -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-task-d0" [ $DOO2_TASK_JPSI -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-task-jpsi" [ $DOO2_TASK_DPLUS -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-task-dplus" diff --git a/codeHF/dpl-config_run3.json b/codeHF/dpl-config_run3.json index 0944f514..791f50eb 100644 --- a/codeHF/dpl-config_run3.json +++ b/codeHF/dpl-config_run3.json @@ -283,6 +283,44 @@ ] } }, + "hf-x-tojpsipipi-candidate-selector": { + "d_pTCandMin": "0.", + "d_pTCandMax": "50.", + "d_pidTPCMinpT": "1000.", + "d_pidTPCMaxpT": "2000.", + "d_pidTOFMinpT": "1000.", + "d_pidTOFMaxpT": "2000.", + "d_TPCNClsFindablePIDCut": "-9999", + "d_nSigmaTPC": "1000.", + "d_nSigmaTOF": "1000.", + "pTBins": { + "values": [ + "0", + "0.5", + "1", + "2", + "3", + "4", + "5", + "7", + "10", + "15" + ] + }, + "X_to_jpsipipi_cuts": { + "values": [ + ["0.5", "0.80", "0.001", "0.001", "3.0", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "3.0", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "3.0", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "3.0", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "3.0", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "3.0", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "3.0", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "3.0", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "3.0", "0.15"] + ] + } + }, "hf-task-d0": { "cutYCandMax": "0.8", "d_selectionFlagD0": "0", @@ -390,11 +428,11 @@ }, "hf-task-x": { "cutYCandMax": "0.8", - "d_selectionFlagJpsi": "0" + "d_selectionFlagX": "0" }, "hf-task-x-mc": { "cutYCandMax": "0.8", - "d_selectionFlagJpsi": "0" + "d_selectionFlagX": "0" }, "qa-tracking-efficiency-electron": { "eta-min": "-3", diff --git a/codeHF/dpl-config_run5_hf.json b/codeHF/dpl-config_run5_hf.json index c867121d..74c04ff1 100644 --- a/codeHF/dpl-config_run5_hf.json +++ b/codeHF/dpl-config_run5_hf.json @@ -66,7 +66,7 @@ "mPtJpsiToEEMin": "0.", "mInvMassJpsiToEEMin": "2.5", "mInvMassJpsiToEEMax": "4.1", - "mCPAJpsiToEEMin": ".8", + "mCPAJpsiToEEMin": "-2.", "mImpParProductJpsiToEEMax": "1000.00", "mPtDPlusToPiKPiMin": "2.", "mInvMassDPlusToPiKPiMin": "1.67", @@ -289,6 +289,44 @@ ] } }, + "hf-x-tojpsipipi-candidate-selector": { + "d_pTCandMin": "0.", + "d_pTCandMax": "50.", + "d_pidTPCMinpT": "1000.", + "d_pidTPCMaxpT": "2000.", + "d_pidTOFMinpT": "0.", + "d_pidTOFMaxpT": "10.", + "d_TPCNClsFindablePIDCut": "-9999", + "d_nSigmaTPC": "1000.", + "d_nSigmaTOF": "3.", + "pTBins": { + "values": [ + "0", + "0.5", + "1", + "2", + "3", + "4", + "5", + "7", + "10", + "15" + ] + }, + "X_to_jpsipipi_cuts": { + "values": [ + ["0.5", "0.80", "0.001", "0.001", "0.0", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "0.0", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "0.2", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "0.9", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "1.5", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "2.3", "0.15"], + ["0.5", "0.90", "0.001", "0.001", "3.0", "0.15"], + ["0.5", "0.90", "0.001", "0.001", "4.2", "0.15"], + ["0.5", "0.90", "0.001", "0.001", "6.2", "0.15"] + ] + } + }, "hf-task-d0": { "cutYCandMax": "0.8", "d_selectionFlagD0": "0", @@ -391,16 +429,16 @@ "d_selectionFlagJpsi": "0" }, "hf-candidate-creator-x": { - "cutYCandMax": "0.8", + "cutYCandMax": "1.44", "d_selectionFlagJpsi": "0" }, "hf-task-x": { - "cutYCandMax": "0.8", - "d_selectionFlagJpsi": "0" + "cutYCandMax": "1.44", + "d_selectionFlagX": "0" }, "hf-task-x-mc": { - "cutYCandMax": "0.8", - "d_selectionFlagJpsi": "0" + "cutYCandMax": "1.44", + "d_selectionFlagX": "0" }, "qa-tracking-efficiency-electron": { "eta-min": "-3", From 20c5032f3936beb29adab180aca1aab7162eaeaa Mon Sep 17 00:00:00 2001 From: rspijkers Date: Sat, 1 May 2021 19:16:52 +0200 Subject: [PATCH 03/33] propagate X options to all json files --- codeHF/dpl-config_run3.json | 25 ++++++++------- codeHF/dpl-config_run5_oniaX.json | 52 +++++++++++++++++++++++++++++-- 2 files changed, 62 insertions(+), 15 deletions(-) diff --git a/codeHF/dpl-config_run3.json b/codeHF/dpl-config_run3.json index 791f50eb..5da31e3d 100644 --- a/codeHF/dpl-config_run3.json +++ b/codeHF/dpl-config_run3.json @@ -288,11 +288,11 @@ "d_pTCandMax": "50.", "d_pidTPCMinpT": "1000.", "d_pidTPCMaxpT": "2000.", - "d_pidTOFMinpT": "1000.", - "d_pidTOFMaxpT": "2000.", + "d_pidTOFMinpT": "0.", + "d_pidTOFMaxpT": "10.", "d_TPCNClsFindablePIDCut": "-9999", "d_nSigmaTPC": "1000.", - "d_nSigmaTOF": "1000.", + "d_nSigmaTOF": "3.", "pTBins": { "values": [ "0", @@ -309,18 +309,19 @@ }, "X_to_jpsipipi_cuts": { "values": [ - ["0.5", "0.80", "0.001", "0.001", "3.0", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "3.0", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "3.0", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "3.0", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "3.0", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "3.0", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "3.0", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "3.0", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "3.0", "0.15"] + ["0.5", "0.80", "0.001", "0.001", "0.0", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "0.0", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "0.2", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "0.9", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "1.5", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "2.3", "0.15"], + ["0.5", "0.90", "0.001", "0.001", "3.0", "0.15"], + ["0.5", "0.90", "0.001", "0.001", "4.2", "0.15"], + ["0.5", "0.90", "0.001", "0.001", "6.2", "0.15"] ] } }, + "hf-task-d0": { "cutYCandMax": "0.8", "d_selectionFlagD0": "0", diff --git a/codeHF/dpl-config_run5_oniaX.json b/codeHF/dpl-config_run5_oniaX.json index 9db645b9..8aef7577 100644 --- a/codeHF/dpl-config_run5_oniaX.json +++ b/codeHF/dpl-config_run5_oniaX.json @@ -66,7 +66,7 @@ "mPtJpsiToEEMin": "0.", "mInvMassJpsiToEEMin": "2.5", "mInvMassJpsiToEEMax": "4.1", - "mCPAJpsiToEEMin": "-2", + "mCPAJpsiToEEMin": "-2.", "mImpParProductJpsiToEEMax": "1000.00", "mPtDPlusToPiKPiMin": "2.", "mInvMassDPlusToPiKPiMin": "1.67", @@ -289,6 +289,44 @@ ] } }, + "hf-x-tojpsipipi-candidate-selector": { + "d_pTCandMin": "0.", + "d_pTCandMax": "50.", + "d_pidTPCMinpT": "1000.", + "d_pidTPCMaxpT": "2000.", + "d_pidTOFMinpT": "0.", + "d_pidTOFMaxpT": "10.", + "d_TPCNClsFindablePIDCut": "-9999", + "d_nSigmaTPC": "1000.", + "d_nSigmaTOF": "3.", + "pTBins": { + "values": [ + "0", + "0.5", + "1", + "2", + "3", + "4", + "5", + "7", + "10", + "15" + ] + }, + "X_to_jpsipipi_cuts": { + "values": [ + ["0.5", "0.80", "0.001", "0.001", "0.0", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "0.0", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "0.2", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "0.9", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "1.5", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "2.3", "0.15"], + ["0.5", "0.90", "0.001", "0.001", "3.0", "0.15"], + ["0.5", "0.90", "0.001", "0.001", "4.2", "0.15"], + ["0.5", "0.90", "0.001", "0.001", "6.2", "0.15"] + ] + } + }, "hf-task-d0": { "cutYCandMax": "0.8", "d_selectionFlagD0": "0", @@ -390,10 +428,18 @@ "cutYCandMax": "1.44", "d_selectionFlagJpsi": "0" }, - "hf-task-x": { - "cutYCandMax": "0.8", + "hf-candidate-creator-x": { + "cutYCandMax": "1.44", "d_selectionFlagJpsi": "0" }, + "hf-task-x": { + "cutYCandMax": "1.44", + "d_selectionFlagX": "0" + }, + "hf-task-x-mc": { + "cutYCandMax": "1.44", + "d_selectionFlagX": "0" + }, "qa-tracking-efficiency-electron": { "eta-min": "-3", "eta-max": "3", From 916d47c9787371a4a3b23f68b7964f994f6c4613 Mon Sep 17 00:00:00 2001 From: DelloStritto <47105254+DelloStritto@users.noreply.github.com> Date: Thu, 3 Jun 2021 11:50:54 +0200 Subject: [PATCH 04/33] remove unused variables from json for LcpKpi (#227) Co-authored-by: Luigi --- codeHF/dpl-config_run3.json | 20 ++++++++++---------- codeHF/dpl-config_run5_hf.json | 20 ++++++++++---------- codeHF/dpl-config_run5_oniaX.json | 20 ++++++++++---------- 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/codeHF/dpl-config_run3.json b/codeHF/dpl-config_run3.json index 5da31e3d..18f8c49c 100644 --- a/codeHF/dpl-config_run3.json +++ b/codeHF/dpl-config_run3.json @@ -221,16 +221,16 @@ }, "Lc_to_p_K_pi_cuts": { "values": [ - [ "0.300", "0.4", "0.4", "0.4", "0.", "0.", "0.004", "0."], - [ "0.300", "0.4", "0.4", "0.4", "0.", "0.", "0.004", "0."], - [ "0.300", "0.4", "0.4", "0.4", "0.", "0.", "0.004", "0."], - [ "0.300", "0.4", "0.4", "0.4", "0.", "0.", "0.004", "0."], - [ "0.300", "0.4", "0.4", "0.4", "0.", "0.", "0.004", "0."], - [ "0.300", "0.4", "0.4", "0.4", "0.", "0.", "0.004", "0."], - [ "0.300", "0.4", "0.4", "0.4", "0.", "0.", "0.004", "0."], - [ "0.300", "0.4", "0.4", "0.4", "0.", "0.", "0.004", "0."], - [ "0.300", "0.4", "0.4", "0.4", "0.", "0.", "0.004", "0."], - [ "0.300", "0.4", "0.4", "0.4", "0.", "0.", "0.004", "0."] + [ "0.300", "0.4", "0.4", "0.4", "0.", "0.004", "0."], + [ "0.300", "0.4", "0.4", "0.4", "0.", "0.004", "0."], + [ "0.300", "0.4", "0.4", "0.4", "0.", "0.004", "0."], + [ "0.300", "0.4", "0.4", "0.4", "0.", "0.004", "0."], + [ "0.300", "0.4", "0.4", "0.4", "0.", "0.004", "0."], + [ "0.300", "0.4", "0.4", "0.4", "0.", "0.004", "0."], + [ "0.300", "0.4", "0.4", "0.4", "0.", "0.004", "0."], + [ "0.300", "0.4", "0.4", "0.4", "0.", "0.004", "0."], + [ "0.300", "0.4", "0.4", "0.4", "0.", "0.004", "0."], + [ "0.300", "0.4", "0.4", "0.4", "0.", "0.004", "0."] ] } }, diff --git a/codeHF/dpl-config_run5_hf.json b/codeHF/dpl-config_run5_hf.json index 74c04ff1..21421a63 100644 --- a/codeHF/dpl-config_run5_hf.json +++ b/codeHF/dpl-config_run5_hf.json @@ -221,16 +221,16 @@ }, "Lc_to_p_K_pi_cuts": { "values": [ - [ "0.400", "0.4", "0.4", "0.4", "5.e-5", "0.", "0.004", "0.85"], - [ "0.400", "0.4", "0.4", "0.4", "5.e-5", "0.", "0.004", "0.85"], - [ "0.400", "0.4", "0.4", "0.4", "5.e-5", "0.", "0.004", "0.85"], - [ "0.400", "0.4", "0.4", "0.4", "5.e-5", "0.", "0.004", "0.85"], - [ "0.400", "0.4", "0.4", "0.4", "5.e-5", "0.", "0.004", "0.85"], - [ "0.400", "0.4", "0.4", "0.4", "5.e-5", "0.", "0.004", "0.85"], - [ "0.400", "0.4", "0.4", "0.4", "5.e-5", "0.", "0.004", "0.85"], - [ "0.400", "0.4", "0.4", "0.4", "5.e-5", "0.", "0.004", "0.85"], - [ "0.400", "0.4", "0.4", "0.4", "5.e-5", "0.", "0.004", "0.85"], - [ "0.400", "0.4", "0.4", "0.4", "5.e-5", "0.", "0.004", "0.85"] + [ "0.300", "0.1", "0.1", "0.1", "5.e-5", "0.004", "0.8"], + [ "0.300", "0.1", "0.1", "0.1", "5.e-5", "0.004", "0.8"], + [ "0.300", "0.2", "0.2", "0.2", "5.e-5", "0.004", "0.8"], + [ "0.300", "0.3", "0.3", "0.3", "5.e-5", "0.004", "0.8"], + [ "0.300", "0.4", "0.4", "0.4", "5.e-5", "0.004", "0.8"], + [ "0.300", "0.4", "0.4", "0.4", "5.e-5", "0.004", "0.8"], + [ "0.300", "0.4", "0.4", "0.4", "5.e-5", "0.004", "0.8"], + [ "0.300", "0.4", "0.4", "0.4", "5.e-5", "0.004", "0.8"], + [ "0.300", "0.4", "0.4", "0.4", "5.e-5", "0.004", "0.8"], + [ "0.300", "0.4", "0.4", "0.4", "5.e-5", "0.004", "0.8"] ] } }, diff --git a/codeHF/dpl-config_run5_oniaX.json b/codeHF/dpl-config_run5_oniaX.json index 8aef7577..6605775d 100644 --- a/codeHF/dpl-config_run5_oniaX.json +++ b/codeHF/dpl-config_run5_oniaX.json @@ -221,16 +221,16 @@ }, "Lc_to_p_K_pi_cuts": { "values": [ - [ "0.400", "0.4", "0.4", "0.4", "5.e-5", "0.", "0.004", "0.85"], - [ "0.400", "0.4", "0.4", "0.4", "5.e-5", "0.", "0.004", "0.85"], - [ "0.400", "0.4", "0.4", "0.4", "5.e-5", "0.", "0.004", "0.85"], - [ "0.400", "0.4", "0.4", "0.4", "5.e-5", "0.", "0.004", "0.85"], - [ "0.400", "0.4", "0.4", "0.4", "5.e-5", "0.", "0.004", "0.85"], - [ "0.400", "0.4", "0.4", "0.4", "5.e-5", "0.", "0.004", "0.85"], - [ "0.400", "0.4", "0.4", "0.4", "5.e-5", "0.", "0.004", "0.85"], - [ "0.400", "0.4", "0.4", "0.4", "5.e-5", "0.", "0.004", "0.85"], - [ "0.400", "0.4", "0.4", "0.4", "5.e-5", "0.", "0.004", "0.85"], - [ "0.400", "0.4", "0.4", "0.4", "5.e-5", "0.", "0.004", "0.85"] + [ "0.300", "0.1", "0.1", "0.1", "5.e-5", "0.004", "0.8"], + [ "0.300", "0.1", "0.1", "0.1", "5.e-5", "0.004", "0.8"], + [ "0.300", "0.2", "0.2", "0.2", "5.e-5", "0.004", "0.8"], + [ "0.300", "0.3", "0.3", "0.3", "5.e-5", "0.004", "0.8"], + [ "0.300", "0.4", "0.4", "0.4", "5.e-5", "0.004", "0.8"], + [ "0.300", "0.4", "0.4", "0.4", "5.e-5", "0.004", "0.8"], + [ "0.300", "0.4", "0.4", "0.4", "5.e-5", "0.004", "0.8"], + [ "0.300", "0.4", "0.4", "0.4", "5.e-5", "0.004", "0.8"], + [ "0.300", "0.4", "0.4", "0.4", "5.e-5", "0.004", "0.8"], + [ "0.300", "0.4", "0.4", "0.4", "5.e-5", "0.004", "0.8"] ] } }, From 5da6ed55a17d93a546ffc9fcb1cd1d9431ac663c Mon Sep 17 00:00:00 2001 From: Gian Michele Innocenti Date: Thu, 3 Jun 2021 15:08:23 +0200 Subject: [PATCH 05/33] Fix formatting --- FirstAnalysis/efficiency_studies.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/FirstAnalysis/efficiency_studies.py b/FirstAnalysis/efficiency_studies.py index 70c9bb4d..0476a9b1 100755 --- a/FirstAnalysis/efficiency_studies.py +++ b/FirstAnalysis/efficiency_studies.py @@ -11,13 +11,7 @@ def saveCanvas(canvas, title): def efficiencytracking(var): # plots the efficiency vs pT, eta and phi for all the species(it extracts the # Efficiency from qa - tracking - efficiency if you have ran with-- make - eff) - hadron_list = [ - "pion", - "proton", - "kaon", - "electron", - "muon", - ] + hadron_list = ["pion", "proton", "kaon", "electron", "muon"] color_list = [1, 2, 4, 6, 8] marker_list = [20, 21, 22, 34, 45] fileo2 = TFile("../codeHF/AnalysisResults_O2.root") From 2ccc35d407105aa0ad2bfe587fe956ce9919992a Mon Sep 17 00:00:00 2001 From: Gian Michele Innocenti Date: Thu, 3 Jun 2021 15:15:44 +0200 Subject: [PATCH 06/33] Fix empty spaces --- codeHF/dpl-config_run3.json | 18 +++++++++--------- codeHF/dpl-config_run5_hf.json | 18 +++++++++--------- codeHF/dpl-config_run5_oniaX.json | 18 +++++++++--------- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/codeHF/dpl-config_run3.json b/codeHF/dpl-config_run3.json index 18f8c49c..fbc12134 100644 --- a/codeHF/dpl-config_run3.json +++ b/codeHF/dpl-config_run3.json @@ -309,15 +309,15 @@ }, "X_to_jpsipipi_cuts": { "values": [ - ["0.5", "0.80", "0.001", "0.001", "0.0", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "0.0", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "0.2", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "0.9", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "1.5", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "2.3", "0.15"], - ["0.5", "0.90", "0.001", "0.001", "3.0", "0.15"], - ["0.5", "0.90", "0.001", "0.001", "4.2", "0.15"], - ["0.5", "0.90", "0.001", "0.001", "6.2", "0.15"] + ["0.5", "0.80", "0.001", "0.001", "0.0", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "0.0", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "0.2", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "0.9", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "1.5", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "2.3", "0.15"], + ["0.5", "0.90", "0.001", "0.001", "3.0", "0.15"], + ["0.5", "0.90", "0.001", "0.001", "4.2", "0.15"], + ["0.5", "0.90", "0.001", "0.001", "6.2", "0.15"] ] } }, diff --git a/codeHF/dpl-config_run5_hf.json b/codeHF/dpl-config_run5_hf.json index 21421a63..77d75a3f 100644 --- a/codeHF/dpl-config_run5_hf.json +++ b/codeHF/dpl-config_run5_hf.json @@ -315,15 +315,15 @@ }, "X_to_jpsipipi_cuts": { "values": [ - ["0.5", "0.80", "0.001", "0.001", "0.0", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "0.0", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "0.2", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "0.9", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "1.5", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "2.3", "0.15"], - ["0.5", "0.90", "0.001", "0.001", "3.0", "0.15"], - ["0.5", "0.90", "0.001", "0.001", "4.2", "0.15"], - ["0.5", "0.90", "0.001", "0.001", "6.2", "0.15"] + ["0.5", "0.80", "0.001", "0.001", "0.0", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "0.0", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "0.2", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "0.9", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "1.5", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "2.3", "0.15"], + ["0.5", "0.90", "0.001", "0.001", "3.0", "0.15"], + ["0.5", "0.90", "0.001", "0.001", "4.2", "0.15"], + ["0.5", "0.90", "0.001", "0.001", "6.2", "0.15"] ] } }, diff --git a/codeHF/dpl-config_run5_oniaX.json b/codeHF/dpl-config_run5_oniaX.json index 6605775d..9de775a3 100644 --- a/codeHF/dpl-config_run5_oniaX.json +++ b/codeHF/dpl-config_run5_oniaX.json @@ -315,15 +315,15 @@ }, "X_to_jpsipipi_cuts": { "values": [ - ["0.5", "0.80", "0.001", "0.001", "0.0", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "0.0", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "0.2", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "0.9", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "1.5", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "2.3", "0.15"], - ["0.5", "0.90", "0.001", "0.001", "3.0", "0.15"], - ["0.5", "0.90", "0.001", "0.001", "4.2", "0.15"], - ["0.5", "0.90", "0.001", "0.001", "6.2", "0.15"] + ["0.5", "0.80", "0.001", "0.001", "0.0", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "0.0", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "0.2", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "0.9", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "1.5", "0.15"], + ["0.5", "0.80", "0.001", "0.001", "2.3", "0.15"], + ["0.5", "0.90", "0.001", "0.001", "3.0", "0.15"], + ["0.5", "0.90", "0.001", "0.001", "4.2", "0.15"], + ["0.5", "0.90", "0.001", "0.001", "6.2", "0.15"] ] } }, From d88f0237f2f62aeeae82004056db8703862ab7b1 Mon Sep 17 00:00:00 2001 From: Rik Spijkers <78484875+rspijkers@users.noreply.github.com> Date: Thu, 3 Jun 2021 19:02:04 +0200 Subject: [PATCH 07/33] add X(3872) to yaml database (#231) path to results still needed also fixed a typo in the Xi_cc histo list --- FirstAnalysis/database.yaml | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/FirstAnalysis/database.yaml b/FirstAnalysis/database.yaml index 40d39295..f24da5e9 100644 --- a/FirstAnalysis/database.yaml +++ b/FirstAnalysis/database.yaml @@ -8,7 +8,7 @@ Xi_cc: normalized: 1 varlist: ["mass", "d0Prong0", "d0Prong1", "CPA", "Y", "DecLength", "Ct", "Eta", "chi2PCA"] varlatex: ["inv. mass (GeV)", "d_{0} prong 0 (cm)", "d_{0} prong 1 (cm)", "cos(#theta_{p})", "rapidity", "dec. length (cm)", "c#tau (cm)", "#eta", "chi^{2} decay"] - histonamesig: ["hmassSig", "hd0Prong0Sig", "hd0Prong1Sig", "hCPASig", "hYSig", "hDecLengthSig", "hCtSig", "hEtaSig", "hChi2PCABg"] + histonamesig: ["hmassSig", "hd0Prong0Sig", "hd0Prong1Sig", "hCPASig", "hYSig", "hDecLengthSig", "hCtSig", "hEtaSig", "hChi2PCASig"] histonamebkg: ["hmassBg", "hd0Prong0Bg", "hd0Prong1Bg", "hCPABg", "hYBg", "hDecLengthBg", "hCtBg", "hEtaBg", "hChi2PCABg"] ymin: [0.0001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001] ymax: [0.4, 5., 5., 5., 5., 5., 10., 5., 5.] @@ -18,3 +18,24 @@ Xi_cc: dolog: [0, 1, 1, 1, 1, 1, 1, 1, 1] dologx: [0, 1, 0, 0, 0, 1, 0, 0, 1] legtoleft: [1, 1, 1, 1, 1, 1, 1, 1, 1] + +X3872: + pp14p0: + absy1p44: + latexcand: "X(3872)" + inputBkg: /data/Run5/... + inputSig: /data/Run5/... + dirname: hf-task-x-mc + normalized: 1 + varlist: ["mass", "d0Prong0", "d0Prong1", "CPA", "Y", "DecLength", "Ct", "Eta", "chi2PCA"] + varlatex: ["inv. mass (GeV)", "d_{0} prong 0 (cm)", "d_{0} prong 1 (cm)", "cos(#theta_{p})", "rapidity", "dec. length (cm)", "c#tau (cm)", "#eta", "chi^{2} decay"] + histonamesig: ["hMassRecSig", "hd0Prong0RecSig", "hd0Prong1RecSig", "hCPARecSig", "hYSig", "hDecLengthRecSig", "hCtSig", "hEtaRecSig", "hChi2PCASig"] + histonamebkg: ["hMassRecBg", "hd0Prong0RecBg", "hd0Prong1RecBg", "hCPARecBg", "hYBg", "hDecLengthRecBg", "hCtBg", "hEtaRecBg", "hChi2PCABg"] + ymin: [0.0001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001] + ymax: [0.4, 5., 5., 5., 5., 5., 10., 5., 5.] + xmin: [3.2, -0.01, -0.01, 0.5, -3., 0.00001, 0., -3., 0.] + xmax: [4., 0.04, 0.04, 1.1, 3., 3., 0.1, 3., 0.1] + rebin: [5, 2, 5, 2, 5, 5, 5, 5, 5] + dolog: [0, 1, 1, 1, 1, 1, 1, 1, 1] + dologx: [0, 1, 0, 0, 0, 1, 0, 0, 1] + legtoleft: [1, 1, 1, 1, 1, 1, 1, 1, 1] From 7f3d11e84887914df34a432542a4590d220b3a02 Mon Sep 17 00:00:00 2001 From: Gian Michele Innocenti Date: Thu, 3 Jun 2021 20:50:40 +0200 Subject: [PATCH 08/33] Fix workflow for X --- codeHF/workflows.yml | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/codeHF/workflows.yml b/codeHF/workflows.yml index 12d2b060..418811f1 100644 --- a/codeHF/workflows.yml +++ b/codeHF/workflows.yml @@ -50,6 +50,23 @@ workflows: <<: *selector_3prong activate: no + # Cascade candidate creators + + o2-analysis-hf-candidate-creator-x: &cand_creator_casc + activate: no + dependencies: [o2-analysis-hf-jpsi-toee-candidate-selector] + options: + mc: "--doMC" + tables: + default: [HFCANDXBASE, HFCANDXEXT] + mc: [HFCANDXMCREC, HFCANDXMCGEN] + + # Cascade candidate selectors + + o2-analysis-hf-x-tojpsipipi-candidate-selector: &selector_casc + activate: no + dependencies: [o2-analysis-hf-candidate-creator-x, o2-analysis-pid-tpc-full, o2-analysis-pid-tof-full] + # Analysis tasks o2-analysis-hf-task-d0: &task @@ -86,7 +103,7 @@ workflows: o2-analysis-hf-task-x: <<: *task activate: no - dependencies: o2-analysis-hf-jpsi-toee-candidate-selector + dependencies: o2-analysis-hf-x-tojpsipipi-candidate-selector # Tree creators From facbed954592fdb3ef392b7aab85290da64a4dd6 Mon Sep 17 00:00:00 2001 From: Gian Michele Innocenti Date: Thu, 3 Jun 2021 21:51:34 +0200 Subject: [PATCH 09/33] Update onia file --- codeHF/config_input.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codeHF/config_input.sh b/codeHF/config_input.sh index 5e499940..decf7987 100644 --- a/codeHF/config_input.sh +++ b/codeHF/config_input.sh @@ -67,7 +67,7 @@ case $INPUT_CASE in ISMC=1;; 9) INPUT_LABEL="Run 5, p-p MC 14 TeV OniaX-enriched, Scenario 3, oniaX analysis" - INPUT_DIR="/home/mmazzill/pp14TeV_oniaX_10M_sc3_werner_26042021" + INPUT_DIR="/home/mmazzill/pp14TeV_oniaX_10M_v1_eta4_12052021" INPUT_FILES="AODRun5.*.root" JSON="$JSONRUN5_ONIAX" ISINPUTO2=1 From 612f7128e2dbb339e4fd3cc554a1e48396b25371 Mon Sep 17 00:00:00 2001 From: Gian Michele Innocenti Date: Thu, 3 Jun 2021 21:59:39 +0200 Subject: [PATCH 10/33] lower pt min of electrons --- codeHF/dpl-config_run5_oniaX.json | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/codeHF/dpl-config_run5_oniaX.json b/codeHF/dpl-config_run5_oniaX.json index 9de775a3..ad736427 100644 --- a/codeHF/dpl-config_run5_oniaX.json +++ b/codeHF/dpl-config_run5_oniaX.json @@ -11,7 +11,7 @@ "d_bz": "5.", "doCutQuality": "false", "d_tpcnclsfound": "-999999", - "ptmintrack_2prong": "1.0", + "ptmintrack_2prong": "0.7", "ptbins_singletrack": { "values": [ "0.", @@ -23,7 +23,7 @@ "100." ] }, - "etamax_2prong": "1.44", + "etamax_2prong": "2.0", "cuts_singletrack_2prong": { "values": [ ["0.000", "10."], @@ -254,8 +254,8 @@ "d_pidTPCMinpT": "1000.", "d_pidTPCMaxpT": "2000.", "d_pidTOFMinpT": "0.15", - "d_pidTOFMaxpT": "15.", - "d_pidRICHMinpT": "0.15", + "d_pidTOFMaxpT": "1.", + "d_pidRICHMinpT": "0.5", "d_pidRICHMaxpT": "15.", "d_TPCNClsFindablePIDCut": "-9999", "d_nSigmaTPC": "1000.", @@ -277,15 +277,15 @@ }, "Jpsi_to_ee_cuts": { "values": [ - ["0.5", "0.2", "0.4", "1"], - ["0.5", "0.2", "0.4", "1"], - ["0.5", "0.2", "0.4", "1"], - ["0.5", "0.2", "0.4", "1"], - ["0.5", "0.2", "0.4", "1"], - ["0.5", "0.2", "0.4", "1"], - ["0.5", "0.2", "0.4", "1"], - ["0.5", "0.2", "0.4", "1"], - ["0.5", "0.2", "0.4", "1"] + ["0.5", "0.2", "0.4", "0.7"], + ["0.5", "0.2", "0.4", "0.7"], + ["0.5", "0.2", "0.4", "0.7"], + ["0.5", "0.2", "0.4", "0.7"], + ["0.5", "0.2", "0.4", "0.7"], + ["0.5", "0.2", "0.4", "0.7"], + ["0.5", "0.2", "0.4", "0.7"], + ["0.5", "0.2", "0.4", "0.7"], + ["0.5", "0.2", "0.4", "0.7"] ] } }, @@ -294,7 +294,7 @@ "d_pTCandMax": "50.", "d_pidTPCMinpT": "1000.", "d_pidTPCMaxpT": "2000.", - "d_pidTOFMinpT": "0.", + "d_pidTOFMinpT": "0.15", "d_pidTOFMaxpT": "10.", "d_TPCNClsFindablePIDCut": "-9999", "d_nSigmaTPC": "1000.", From e4e2cc275fa50bc8aac7854f4f7ab4f6793c6d5e Mon Sep 17 00:00:00 2001 From: Gian Michele Innocenti Date: Fri, 4 Jun 2021 05:10:43 +0200 Subject: [PATCH 11/33] Commit new cuts and improved plotting --- FirstAnalysis/database.yaml | 33 ++++++++++++++++++++++----- FirstAnalysis/distrib_studies.py | 14 +++++++----- codeHF/config_tasks.sh | 8 +++---- codeHF/dpl-config_run5_oniaX.json | 38 +++++++++++++++---------------- 4 files changed, 58 insertions(+), 35 deletions(-) diff --git a/FirstAnalysis/database.yaml b/FirstAnalysis/database.yaml index f24da5e9..517709eb 100644 --- a/FirstAnalysis/database.yaml +++ b/FirstAnalysis/database.yaml @@ -23,19 +23,40 @@ X3872: pp14p0: absy1p44: latexcand: "X(3872)" - inputBkg: /data/Run5/... - inputSig: /data/Run5/... + inputBkg: /home/ginnocen/Run3Analysisvalidation/codeHF/AnalysisResults_O2.root + inputSig: /home/ginnocen/Run3Analysisvalidation/codeHF/AnalysisResults_O2.root dirname: hf-task-x-mc normalized: 1 varlist: ["mass", "d0Prong0", "d0Prong1", "CPA", "Y", "DecLength", "Ct", "Eta", "chi2PCA"] varlatex: ["inv. mass (GeV)", "d_{0} prong 0 (cm)", "d_{0} prong 1 (cm)", "cos(#theta_{p})", "rapidity", "dec. length (cm)", "c#tau (cm)", "#eta", "chi^{2} decay"] - histonamesig: ["hMassRecSig", "hd0Prong0RecSig", "hd0Prong1RecSig", "hCPARecSig", "hYSig", "hDecLengthRecSig", "hCtSig", "hEtaRecSig", "hChi2PCASig"] - histonamebkg: ["hMassRecBg", "hd0Prong0RecBg", "hd0Prong1RecBg", "hCPARecBg", "hYBg", "hDecLengthRecBg", "hCtBg", "hEtaRecBg", "hChi2PCABg"] + histonamesig: ["hMassRecSig", "hd0Prong0RecSig", "hd0Prong1RecSig", "hCPARecSig", "hYSig", "hDeclengthRecSig", "hCtSig", "hEtaRecSig", "hChi2PCASig"] + histonamebkg: ["hMassRecBg", "hd0Prong0RecBg", "hd0Prong1RecBg", "hCPARecBg", "hYBg", "hDeclengthRecBg", "hCtBg", "hEtaRecBg", "hChi2PCABg"] ymin: [0.0001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001] ymax: [0.4, 5., 5., 5., 5., 5., 10., 5., 5.] - xmin: [3.2, -0.01, -0.01, 0.5, -3., 0.00001, 0., -3., 0.] + xmin: [3.2, -0.01, -0.01, 0.5, -3., 0.00001, 0., -3., 1.e-6] xmax: [4., 0.04, 0.04, 1.1, 3., 3., 0.1, 3., 0.1] - rebin: [5, 2, 5, 2, 5, 5, 5, 5, 5] + rebin: [5, 2, 5, 5, 5, 5, 5, 5, 5] dolog: [0, 1, 1, 1, 1, 1, 1, 1, 1] dologx: [0, 1, 0, 0, 0, 1, 0, 0, 1] legtoleft: [1, 1, 1, 1, 1, 1, 1, 1, 1] + +Jpsi: + pp14p0: + absy1p44: + latexcand: "Jpsi" + inputBkg: /home/ginnocen/Run3Analysisvalidation/codeHF/AnalysisResults_O2.root + inputSig: /home/ginnocen/Run3Analysisvalidation/codeHF/AnalysisResults_O2.root + dirname: hf-task-jpsi-mc + normalized: 1 + varlist: ["mass", "d0Prong0", "d0Prong1", "Y", "DecLength", "Ct", "d0xd0", "chi2PCA"] + varlatex: ["inv. mass (GeV)", "d_{0} prong 0 (cm)", "d_{0} prong 1 (cm)", "rapidity", "dec. length (cm)", "c#tau (cm)", "d_{0} x d_{1}", "chi^{2} decay"] + histonamesig: ["hmassSig", "hd0Prong0Sig", "hd0Prong1Sig", "hYSig", "hdeclengthSig", "hCtSig", "hd0d0Sig", "hChi2PCASig"] + histonamebkg: ["hmassBg", "hd0Prong0Bg", "hd0Prong1Bg", "hYBg", "hdeclengthBg", "hCtBg", "hd0d0Bg", "hChi2PCABg"] + ymin: [0.0001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001] + ymax: [0.4, 5., 5., 5., 5., 10., 5., 5.] + xmin: [3.2, -0.01, -0.01, -3., 0.00001, 0., -0.02, 1.e-6] + xmax: [4., 0.04, 0.04, 3., 3., 0.1, 0.02, 0.1] + rebin: [5, 5, 5, 5, 1, 5, 5, 1] + dolog: [0, 1, 1, 1, 1, 1, 1, 1] + dologx: [0, 1, 0, 0, 1, 0, 0, 1] + legtoleft: [1, 1, 1, 1, 1, 1, 1, 1] diff --git a/FirstAnalysis/distrib_studies.py b/FirstAnalysis/distrib_studies.py index 41183c29..0f8c81f0 100644 --- a/FirstAnalysis/distrib_studies.py +++ b/FirstAnalysis/distrib_studies.py @@ -17,7 +17,7 @@ def makeSavePaths(title, *fileFormats, outputdir="outputPlots"): return [outputdir + "/" + title + fileFormat for fileFormat in fileFormats] -def distr_studies(hadron="Xi_cc", collision="pp14p0", yrange="absy1p44"): +def distr_studies(hadron="X3872", collision="pp14p0", yrange="absy1p44"): """ Make distribution comparisons """ @@ -50,11 +50,11 @@ def distr_studies(hadron="Xi_cc", collision="pp14p0", yrange="absy1p44"): style_sig = ROOTStyle1D() style_sig.markercolor = 2 style_sig.markerstyle = 21 - style_sig.markersize = 1 + style_sig.markersize = 2 style_sig.draw_options = "P" style_bkg = ROOTStyle1D() style_bkg.markerstyle = 23 - style_bkg.markersize = 1 + style_bkg.markersize = 2 style_bkg.draw_options = "P" @@ -66,6 +66,7 @@ def distr_studies(hadron="Xi_cc", collision="pp14p0", yrange="absy1p44"): hbkg = fileBkg.Get(f"{dirname}/{lhistonamebkg[index]}") nPtBins = hsig.GetNbinsY() + print(var) for iptBin in range(nPtBins): # Collect the histogram projections in bins of pT for each variable hsig_px = hsig.ProjectionX(f"hsig_px_var{var}_pt{iptBin}", @@ -86,9 +87,10 @@ def distr_studies(hadron="Xi_cc", collision="pp14p0", yrange="absy1p44"): for index, var in enumerate(lvarlist): # sort out required number of columns and rows for a squared grid and create a figure n_cols_rows = ceil(sqrt(nPtBins)) - figure = ROOTFigure(n_cols_rows, n_cols_rows, row_margin=0.05, column_margin=0.05, size=(1500, 900)) + figure = ROOTFigure(n_cols_rows, n_cols_rows, row_margin=0.04, + column_margin=0.04, size=(1500, 1100)) # can adjust some axis properties globally - figure.axes(label_size=0.02, title_size=0.02) + figure.axes(label_size=0.015, title_size=0.015) # here we use the feature to only apply to certain axes figure.axes("x", title=lvarlatex[index]) figure.axes("y", title="Entries") @@ -126,7 +128,7 @@ def distr_studies(hadron="Xi_cc", collision="pp14p0", yrange="absy1p44"): figure.define_plot(x_log=ldologx[index], y_log=ldolog[index]) figure.add_object(hist_sig, style=style_sig, label=f"Sig before norm ({int(nSigEntries)} entries)") figure.add_object(hist_bkg, style=style_bkg, label=f"Bkg before norm ({int(nBkgEntries)} entries)") - figure.add_text(f"{lptMin[iptBin]:.1f} GeV < p_{{T}} ({latexcand}) < {lptMax[iptBin]:.1f} GeV", 0.1, 0.1) + figure.add_text(f"{lptMin[iptBin]:.1f} GeV < p_{{T}} ({latexcand}) < {lptMax[iptBin]:.1f} GeV", 0.1, 0.85) figure.create() for save_paths in makeSavePaths(f"distribution_{var}", *formats, outputdir=f"output_{hadron}"): diff --git a/codeHF/config_tasks.sh b/codeHF/config_tasks.sh index 0f3ac9a8..a1056e9a 100644 --- a/codeHF/config_tasks.sh +++ b/codeHF/config_tasks.sh @@ -53,9 +53,9 @@ DOO2_TASK_D0=1 # hf-task-d0 DOO2_TASK_DPLUS=0 # hf-task-dplus DOO2_TASK_LC=0 # hf-task-lc DOO2_TASK_XIC=0 # hf-task-xic -DOO2_TASK_JPSI=0 # hf-task-jpsi +DOO2_TASK_JPSI=1 # hf-task-jpsi DOO2_TASK_BPLUS=0 # hf-task-bplus -DOO2_TASK_X=0 # hf-task-x +DOO2_TASK_X=1 # hf-task-x # Tree creators DOO2_TREE_D0=0 # hf-tree-creator-d0-tokpi DOO2_TREE_LC=0 # hf-tree-creator-lc-topkpi @@ -65,8 +65,8 @@ APPLYCUTS_D0=0 # Apply D0 selection cuts. APPLYCUTS_DPLUS=0 # Apply D+ selection cuts. APPLYCUTS_LC=0 # Apply Λc selection cuts. APPLYCUTS_XIC=0 # Apply Ξc selection cuts. -APPLYCUTS_JPSI=0 # Apply J/ψ selection cuts. -APPLYCUTS_X=0 # Apply X selection cuts. +APPLYCUTS_JPSI=1 # Apply J/ψ selection cuts. +APPLYCUTS_X=1 # Apply X selection cuts. SAVETREES=0 # Save O2 tables to trees. USEO2VERTEXER=0 # Use the O2 vertexer in AliPhysics. diff --git a/codeHF/dpl-config_run5_oniaX.json b/codeHF/dpl-config_run5_oniaX.json index ad736427..e17f0d95 100644 --- a/codeHF/dpl-config_run5_oniaX.json +++ b/codeHF/dpl-config_run5_oniaX.json @@ -259,7 +259,7 @@ "d_pidRICHMaxpT": "15.", "d_TPCNClsFindablePIDCut": "-9999", "d_nSigmaTPC": "1000.", - "d_nSigmaTOF": "3.", + "d_nSigmaTOF": "2.", "d_nSigmaRICH": "3.", "pTBins": { "values": [ @@ -277,15 +277,15 @@ }, "Jpsi_to_ee_cuts": { "values": [ - ["0.5", "0.2", "0.4", "0.7"], - ["0.5", "0.2", "0.4", "0.7"], - ["0.5", "0.2", "0.4", "0.7"], - ["0.5", "0.2", "0.4", "0.7"], - ["0.5", "0.2", "0.4", "0.7"], - ["0.5", "0.2", "0.4", "0.7"], - ["0.5", "0.2", "0.4", "0.7"], - ["0.5", "0.2", "0.4", "0.7"], - ["0.5", "0.2", "0.4", "0.7"] + ["0.5", "0.2", "0.4", "0.5", "1."], + ["0.5", "0.2", "0.4", "0.5", "1."], + ["0.5", "0.2", "0.4", "0.5", "1."], + ["0.5", "0.2", "0.4", "0.5", "1."], + ["0.5", "0.2", "0.4", "0.5", "1."], + ["0.5", "0.2", "0.4", "0.5", "1."], + ["0.5", "0.2", "0.4", "0.5", "1."], + ["0.5", "0.2", "0.4", "0.5", "1."], + ["0.5", "0.2", "0.4", "0.5", "1."] ] } }, @@ -315,15 +315,15 @@ }, "X_to_jpsipipi_cuts": { "values": [ - ["0.5", "0.80", "0.001", "0.001", "0.0", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "0.0", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "0.2", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "0.9", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "1.5", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "2.3", "0.15"], - ["0.5", "0.90", "0.001", "0.001", "3.0", "0.15"], - ["0.5", "0.90", "0.001", "0.001", "4.2", "0.15"], - ["0.5", "0.90", "0.001", "0.001", "6.2", "0.15"] + ["0.5", "0.80", "0.001", "0.001", "0.0", "0.15", "1."], + ["0.5", "0.80", "0.001", "0.001", "0.0", "0.15", "1."], + ["0.5", "0.80", "0.001", "0.001", "0.2", "0.15", "1."], + ["0.5", "0.80", "0.001", "0.001", "0.9", "0.15", "1."], + ["0.5", "0.80", "0.001", "0.001", "1.5", "0.15", "1."], + ["0.5", "0.80", "0.001", "0.001", "2.3", "0.15", "1."], + ["0.5", "0.90", "0.001", "0.001", "3.0", "0.15", "1."], + ["0.5", "0.90", "0.001", "0.001", "4.2", "0.15", "1."], + ["0.5", "0.90", "0.001", "0.001", "6.2", "0.15", "1."] ] } }, From f08167bd2d23debcd4757c4cbad09ddeef35da2e Mon Sep 17 00:00:00 2001 From: Gian Michele Innocenti Date: Fri, 4 Jun 2021 05:11:57 +0200 Subject: [PATCH 12/33] Fix pylint --- FirstAnalysis/distrib_studies.py | 48 ++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/FirstAnalysis/distrib_studies.py b/FirstAnalysis/distrib_studies.py index 0f8c81f0..3c207ca4 100644 --- a/FirstAnalysis/distrib_studies.py +++ b/FirstAnalysis/distrib_studies.py @@ -8,6 +8,7 @@ from hfplot.plot_spec_root import ROOTFigure from hfplot.style import ROOTStyle1D + def makeSavePaths(title, *fileFormats, outputdir="outputPlots"): """ Saves the canvas as the desired output format in an output directory (default = outputPlots) @@ -57,7 +58,6 @@ def distr_studies(hadron="X3872", collision="pp14p0", yrange="absy1p44"): style_bkg.markersize = 2 style_bkg.draw_options = "P" - for index, var in enumerate(lvarlist): lhistosigvar = [] @@ -69,10 +69,12 @@ def distr_studies(hadron="X3872", collision="pp14p0", yrange="absy1p44"): print(var) for iptBin in range(nPtBins): # Collect the histogram projections in bins of pT for each variable - hsig_px = hsig.ProjectionX(f"hsig_px_var{var}_pt{iptBin}", - iptBin + 1, iptBin + 1) - hbkg_px = hbkg.ProjectionX(f"hbkg_px_var{var}_pt{iptBin}", - iptBin + 1, iptBin + 1) + hsig_px = hsig.ProjectionX( + f"hsig_px_var{var}_pt{iptBin}", iptBin + 1, iptBin + 1 + ) + hbkg_px = hbkg.ProjectionX( + f"hbkg_px_var{var}_pt{iptBin}", iptBin + 1, iptBin + 1 + ) lhistosigvar.append(hsig_px) lhistobkgvar.append(hbkg_px) if index == 0: @@ -87,8 +89,13 @@ def distr_studies(hadron="X3872", collision="pp14p0", yrange="absy1p44"): for index, var in enumerate(lvarlist): # sort out required number of columns and rows for a squared grid and create a figure n_cols_rows = ceil(sqrt(nPtBins)) - figure = ROOTFigure(n_cols_rows, n_cols_rows, row_margin=0.04, - column_margin=0.04, size=(1500, 1100)) + figure = ROOTFigure( + n_cols_rows, + n_cols_rows, + row_margin=0.04, + column_margin=0.04, + size=(1500, 1100), + ) # can adjust some axis properties globally figure.axes(label_size=0.015, title_size=0.015) # here we use the feature to only apply to certain axes @@ -111,7 +118,9 @@ def distr_studies(hadron="X3872", collision="pp14p0", yrange="absy1p44"): nBkgEntries = hist_bkg.Integral() if not nSigEntries or not nBkgEntries: - print(f"ERROR: Found empty signal or background distribution for variable={var} in pT bin={iptBin}") + print( + f"ERROR: Found empty signal or background distribution for variable={var} in pT bin={iptBin}" + ) continue if normalized: @@ -126,12 +135,27 @@ def distr_studies(hadron="X3872", collision="pp14p0", yrange="absy1p44"): hist_bkg.SetBinError(ibin + 1, 0.0) figure.define_plot(x_log=ldologx[index], y_log=ldolog[index]) - figure.add_object(hist_sig, style=style_sig, label=f"Sig before norm ({int(nSigEntries)} entries)") - figure.add_object(hist_bkg, style=style_bkg, label=f"Bkg before norm ({int(nBkgEntries)} entries)") - figure.add_text(f"{lptMin[iptBin]:.1f} GeV < p_{{T}} ({latexcand}) < {lptMax[iptBin]:.1f} GeV", 0.1, 0.85) + figure.add_object( + hist_sig, + style=style_sig, + label=f"Sig before norm ({int(nSigEntries)} entries)", + ) + figure.add_object( + hist_bkg, + style=style_bkg, + label=f"Bkg before norm ({int(nBkgEntries)} entries)", + ) + figure.add_text( + f"{lptMin[iptBin]:.1f} GeV < p_{{T}} ({latexcand}) < {lptMax[iptBin]:.1f} GeV", + 0.1, + 0.85, + ) figure.create() - for save_paths in makeSavePaths(f"distribution_{var}", *formats, outputdir=f"output_{hadron}"): + for save_paths in makeSavePaths( + f"distribution_{var}", *formats, outputdir=f"output_{hadron}" + ): figure.save(save_paths) + distr_studies() From 40be31b0702e4ff568b6245fd2728bf2406b8217 Mon Sep 17 00:00:00 2001 From: Gian Michele Innocenti Date: Fri, 4 Jun 2021 06:25:42 +0200 Subject: [PATCH 13/33] new datasets --- FirstAnalysis/database.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/FirstAnalysis/database.yaml b/FirstAnalysis/database.yaml index 517709eb..f1351137 100644 --- a/FirstAnalysis/database.yaml +++ b/FirstAnalysis/database.yaml @@ -23,8 +23,8 @@ X3872: pp14p0: absy1p44: latexcand: "X(3872)" - inputBkg: /home/ginnocen/Run3Analysisvalidation/codeHF/AnalysisResults_O2.root - inputSig: /home/ginnocen/Run3Analysisvalidation/codeHF/AnalysisResults_O2.root + inputBkg: /data/Run5/results/Xanalysis_0p7pt_RICHTOF/AnalysisResults_O2_MB.root + inputSig: /data/Run5/results/Xanalysis_0p7pt_RICHTOF/AnalysisResults_O2_enriched.root dirname: hf-task-x-mc normalized: 1 varlist: ["mass", "d0Prong0", "d0Prong1", "CPA", "Y", "DecLength", "Ct", "Eta", "chi2PCA"] @@ -44,8 +44,8 @@ Jpsi: pp14p0: absy1p44: latexcand: "Jpsi" - inputBkg: /home/ginnocen/Run3Analysisvalidation/codeHF/AnalysisResults_O2.root - inputSig: /home/ginnocen/Run3Analysisvalidation/codeHF/AnalysisResults_O2.root + inputBkg: /data/Run5/results/Xanalysis_0p7pt_RICHTOF/AnalysisResults_O2_MB.root + inputSig: /data/Run5/results/Xanalysis_0p7pt_RICHTOF/AnalysisResults_O2_enriched.root dirname: hf-task-jpsi-mc normalized: 1 varlist: ["mass", "d0Prong0", "d0Prong1", "Y", "DecLength", "Ct", "d0xd0", "chi2PCA"] From 608469d7689d627c37e1a1640b6789248e403c26 Mon Sep 17 00:00:00 2001 From: ginnocen Date: Fri, 4 Jun 2021 04:28:40 +0000 Subject: [PATCH 14/33] [Mega-Linter] Apply linters fixes --- FirstAnalysis/distrib_studies.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/FirstAnalysis/distrib_studies.py b/FirstAnalysis/distrib_studies.py index 3c207ca4..1b83fdbc 100644 --- a/FirstAnalysis/distrib_studies.py +++ b/FirstAnalysis/distrib_studies.py @@ -3,10 +3,9 @@ from math import ceil, sqrt import yaml -from ROOT import TFile - from hfplot.plot_spec_root import ROOTFigure from hfplot.style import ROOTStyle1D +from ROOT import TFile def makeSavePaths(title, *fileFormats, outputdir="outputPlots"): From 5be8d706c3d5cd857bb711d3e04c50f37b8ea592 Mon Sep 17 00:00:00 2001 From: Gian Michele Innocenti Date: Tue, 8 Jun 2021 10:58:30 +0200 Subject: [PATCH 15/33] Add input slot for MuonID sample --- codeHF/config_input.sh | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/codeHF/config_input.sh b/codeHF/config_input.sh index decf7987..1a2bf8ac 100644 --- a/codeHF/config_input.sh +++ b/codeHF/config_input.sh @@ -4,7 +4,7 @@ # Input specification for runtest.sh # (Modifies input parameters.) -INPUT_CASE=2 # Input case +INPUT_CASE=12 # Input case NFILESMAX=1 # Maximum number of processed input files. (Set to -0 to process all; to -N to process all but the last N files.) @@ -86,4 +86,11 @@ case $INPUT_CASE in JSON="$JSONRUN5_HF" ISINPUTO2=1 ISMC=1;; + 12) + INPUT_LABEL="Run 5, p-p MC 14 TeV OniaX-enriched, Scenario 3, oniaX analysis MUON ID" + INPUT_DIR="/home/auras/simulations/delphes/ONIA_X" + INPUT_FILES="AODRun5.*.root" + JSON="$JSONRUN5_ONIAX" + ISINPUTO2=1 + ISMC=1;; esac From 2d10d1131d63e87f54205a9f5d5216cc15d684e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Tue, 8 Jun 2021 18:46:06 +0200 Subject: [PATCH 16/33] Add ALICE 2/3 switch in Jpsi selector (#239) * Fix path to Onia MID production * Add ALICE 2/3 switch in Jpsi selector * Remove ee from Jpsi selector strings --- codeHF/config_input.sh | 2 +- codeHF/config_tasks.sh | 4 ++-- codeHF/dpl-config_run3.json | 2 +- codeHF/dpl-config_run5_hf.json | 2 +- codeHF/dpl-config_run5_oniaX.json | 3 ++- codeHF/workflows.yml | 7 ++++--- 6 files changed, 11 insertions(+), 9 deletions(-) diff --git a/codeHF/config_input.sh b/codeHF/config_input.sh index 1a2bf8ac..faf505df 100644 --- a/codeHF/config_input.sh +++ b/codeHF/config_input.sh @@ -88,7 +88,7 @@ case $INPUT_CASE in ISMC=1;; 12) INPUT_LABEL="Run 5, p-p MC 14 TeV OniaX-enriched, Scenario 3, oniaX analysis MUON ID" - INPUT_DIR="/home/auras/simulations/delphes/ONIA_X" + INPUT_DIR="/home/auras/simulations/delphes/ONIA_X/run_002" INPUT_FILES="AODRun5.*.root" JSON="$JSONRUN5_ONIAX" ISINPUTO2=1 diff --git a/codeHF/config_tasks.sh b/codeHF/config_tasks.sh index a1056e9a..cde64a5e 100644 --- a/codeHF/config_tasks.sh +++ b/codeHF/config_tasks.sh @@ -46,7 +46,7 @@ DOO2_SEL_D0=0 # hf-d0-candidate-selector DOO2_SEL_DPLUS=0 # hf-dplus-topikpi-candidate-selector DOO2_SEL_LC=0 # hf-lc-candidate-selector DOO2_SEL_XIC=0 # hf-xic-topkpi-candidate-selector -DOO2_SEL_JPSI=0 # hf-jpsi-toee-candidate-selector +DOO2_SEL_JPSI=0 # hf-jpsi-candidate-selector DOO2_SEL_X=0 # hf-xic-topkpi-candidate-selector # User tasks DOO2_TASK_D0=1 # hf-task-d0 @@ -149,7 +149,7 @@ function MakeScriptO2 { [ $DOO2_PID_TOF -eq 1 ] && WORKFLOWS+=" o2-analysis-pid-tof-full" [ $DOO2_PID_TOF_QA -eq 1 ] && WORKFLOWS+=" o2-analysis-pid-tof-qa-mc" [ $DOO2_SEL_D0 -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-d0-candidate-selector" - [ $DOO2_SEL_JPSI -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-jpsi-toee-candidate-selector" + [ $DOO2_SEL_JPSI -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-jpsi-candidate-selector" [ $DOO2_SEL_DPLUS -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-dplus-topikpi-candidate-selector" [ $DOO2_SEL_LC -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-lc-candidate-selector" [ $DOO2_SEL_XIC -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-xic-topkpi-candidate-selector" diff --git a/codeHF/dpl-config_run3.json b/codeHF/dpl-config_run3.json index fbc12134..1bd0895e 100644 --- a/codeHF/dpl-config_run3.json +++ b/codeHF/dpl-config_run3.json @@ -248,7 +248,7 @@ "d_nSigmaTOF": "3.", "d_nSigmaTOFCombined": "5." }, - "hf-jpsi-toee-candidate-selector": { + "hf-jpsi-candidate-selector": { "d_pTCandMin": "0.", "d_pTCandMax": "50.", "d_pidTPCMinpT": "0.15", diff --git a/codeHF/dpl-config_run5_hf.json b/codeHF/dpl-config_run5_hf.json index 77d75a3f..d88c0335 100644 --- a/codeHF/dpl-config_run5_hf.json +++ b/codeHF/dpl-config_run5_hf.json @@ -248,7 +248,7 @@ "d_nSigmaTOF": "3.", "d_nSigmaTOFCombined": "5." }, - "hf-jpsi-toee-candidate-selector": { + "hf-jpsi-candidate-selector": { "d_pTCandMin": "0.", "d_pTCandMax": "50.", "d_pidTPCMinpT": "1000.", diff --git a/codeHF/dpl-config_run5_oniaX.json b/codeHF/dpl-config_run5_oniaX.json index e17f0d95..acd7a183 100644 --- a/codeHF/dpl-config_run5_oniaX.json +++ b/codeHF/dpl-config_run5_oniaX.json @@ -248,7 +248,8 @@ "d_nSigmaTOF": "3.", "d_nSigmaTOFCombined": "5." }, - "hf-jpsi-toee-candidate-selector": { + "hf-jpsi-candidate-selector": { + "isALICE3": "true", "d_pTCandMin": "0.", "d_pTCandMax": "50.", "d_pidTPCMinpT": "1000.", diff --git a/codeHF/workflows.yml b/codeHF/workflows.yml index 418811f1..adfe76da 100644 --- a/codeHF/workflows.yml +++ b/codeHF/workflows.yml @@ -34,9 +34,10 @@ workflows: activate: no dependencies: [o2-analysis-hf-candidate-creator-2prong, o2-analysis-pid-tpc-full, o2-analysis-pid-tof-full] - o2-analysis-hf-jpsi-toee-candidate-selector: + o2-analysis-hf-jpsi-candidate-selector: <<: *selector_2prong activate: no + tables: HFSELJPSICAND o2-analysis-hf-dplus-topikpi-candidate-selector: &selector_3prong activate: no @@ -54,7 +55,7 @@ workflows: o2-analysis-hf-candidate-creator-x: &cand_creator_casc activate: no - dependencies: [o2-analysis-hf-jpsi-toee-candidate-selector] + dependencies: [o2-analysis-hf-jpsi-candidate-selector] options: mc: "--doMC" tables: @@ -78,7 +79,7 @@ workflows: o2-analysis-hf-task-jpsi: <<: *task activate: no - dependencies: o2-analysis-hf-jpsi-toee-candidate-selector + dependencies: o2-analysis-hf-jpsi-candidate-selector o2-analysis-hf-task-dplus: <<: *task From 4ce6b34afd3d10c7e9eab7168eb6ff971040e375 Mon Sep 17 00:00:00 2001 From: Gian Michele Innocenti Date: Thu, 10 Jun 2021 18:25:08 +0200 Subject: [PATCH 17/33] Update path onia --- codeHF/config_input.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codeHF/config_input.sh b/codeHF/config_input.sh index faf505df..f74df9a7 100644 --- a/codeHF/config_input.sh +++ b/codeHF/config_input.sh @@ -88,7 +88,7 @@ case $INPUT_CASE in ISMC=1;; 12) INPUT_LABEL="Run 5, p-p MC 14 TeV OniaX-enriched, Scenario 3, oniaX analysis MUON ID" - INPUT_DIR="/home/auras/simulations/delphes/ONIA_X/run_002" + INPUT_DIR="/home/auras/simulations/delphes/pp_ONIA_X_2021_06_10/run_002" INPUT_FILES="AODRun5.*.root" JSON="$JSONRUN5_ONIAX" ISINPUTO2=1 From 44f85c1b83c533fa9b4898a2004292b54bb331ae Mon Sep 17 00:00:00 2001 From: Gian Michele Innocenti Date: Thu, 10 Jun 2021 18:55:14 +0200 Subject: [PATCH 18/33] Add settings for muon analysis (#245) Co-authored-by: Gian Michele Innocenti --- FirstAnalysis/kinematic2D_run5.py | 59 +++++++++++++ FirstAnalysis/plotsinglevar.py | 136 ++++++++++++++++++++++++++++++ codeHF/PlotEfficiency.C | 4 +- codeHF/config_tasks.sh | 4 +- codeHF/dpl-config_run5_oniaX.json | 13 ++- 5 files changed, 210 insertions(+), 6 deletions(-) create mode 100644 FirstAnalysis/kinematic2D_run5.py create mode 100644 FirstAnalysis/plotsinglevar.py diff --git a/FirstAnalysis/kinematic2D_run5.py b/FirstAnalysis/kinematic2D_run5.py new file mode 100644 index 00000000..bd674fdd --- /dev/null +++ b/FirstAnalysis/kinematic2D_run5.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python +from ROOT import TCanvas, TFile, gPad, gStyle + +gStyle.SetOptStat(0) +gStyle.SetErrorX(0) +gStyle.SetFrameLineWidth(1) +gStyle.SetTitleSize(0.045, "x") +gStyle.SetTitleSize(0.045, "y") +gStyle.SetMarkerSize(1) +gStyle.SetLabelOffset(0.015, "x") +gStyle.SetLabelOffset(0.02, "y") +gStyle.SetTickLength(-0.02, "x") +gStyle.SetTickLength(-0.02, "y") +gStyle.SetTitleOffset(1.1, "x") +gStyle.SetTitleOffset(1.0, "y") + + +def saveCanvas(canvas, title): + format_list = ["png", ".pdf", ".root"] + for fileFormat in format_list: + canvas.SaveAs(title + fileFormat) + + +def kinematic_plots(var1): + fileo2 = TFile("../codeHF/AnalysisResults_O2.root") + cres = TCanvas("cres", "resolution distribution") + cres.SetCanvasSize(1600, 1200) + cres.Divide(1, 3) + sig = fileo2.Get("hf-task-jpsi-mc/h%sSig" % var1) + bkg = fileo2.Get("hf-task-jpsi-mc/h%sBg" % var1) + gen = fileo2.Get("hf-task-jpsi-mc/h%sGen" % var1) + cres.cd(1) + gPad.SetLogz() + sig.Draw("coltz") + sig.SetTitle("%s Signal distribution(Rec. Level)" % var1) + cres.cd(2) + gPad.SetLogz() + bkg.Draw("coltz") + bkg.SetTitle("%s Background distribution(Rec. Level)" % var1) + cres.cd(3) + gPad.SetLogz() + gen.Draw("coltz") + gen.SetTitle("%s Gen distribution(Gen. Level)" % var1) + saveCanvas(cres, "%s" % var1) + ceff = TCanvas("ceff", "2D efficiencies") + ceff.SetCanvasSize(1600, 1200) + ceff.cd() + eff = sig.Clone("eff") + den = gen.Clone("den") + eff.Divide(den) + eff.Draw("COLZ") + eff.SetTitle("%s Jpsi reco and sel. efficiency (Reco pt / Gen pt)" % var1) + saveCanvas(ceff, "efficiencyYpt") + + +var_list = ["Y"] + +for var in var_list: + kinematic_plots(var) diff --git a/FirstAnalysis/plotsinglevar.py b/FirstAnalysis/plotsinglevar.py new file mode 100644 index 00000000..decfb3f3 --- /dev/null +++ b/FirstAnalysis/plotsinglevar.py @@ -0,0 +1,136 @@ +#!/usr/bin/env python +import os + +from ROOT import TF1, TH2F, TCanvas, TFile, TLatex, gROOT, gStyle + + +def makeSavePaths(title, *fileFormats, outputdir="outputPlots"): + """ + Saves the canvas as the desired output format in an output directory (default = outputPlots) + """ + if not os.path.exists(outputdir): + os.makedirs(outputdir) + return [outputdir + "/" + title + fileFormat for fileFormat in fileFormats] + + +def plotsinglevar( + mode="MM", + filename="../codeHF/AnalysisResults_O2.root", + dirname="hf-task-xicc-mc", + latex="Xi_{cc}", + iptBin=2, + histonmasssig="hPtRecGenDiff", # hPtRecGenDiff hXSecVtxPosDiff + xmin=-2.0, + xmax=2.0, + ymin=0.1, + ymax=1.0e6, + rebin=4, + logx=1, + logy=1, + xminfit=-2.0, + xmaxfit=2.0, + title="", + xaxis="Xi_{cc} X vertex reco - gen (cm)", + dofit=0, +): + gStyle.SetOptStat(0) + gROOT.SetBatch(1) + + fileSig = TFile(filename) + histo2d = fileSig.Get("%s/%s" % (dirname, histonmasssig)) + hvar = histo2d.ProjectionX("hvar", iptBin + 1, iptBin + 1) + hvar.GetXaxis().SetRangeUser(xmin, xmax) + hvar.Draw() + ptMin = histo2d.GetYaxis().GetBinLowEdge(iptBin + 1) + ptMax = ptMin + histo2d.GetYaxis().GetBinWidth(iptBin + 1) + # ymax = hvar.GetMaximum() * 10 + # ymin = hvar.GetMinimum() + hempty = TH2F("hempty", ";%s; Entries" % xaxis, 100, xmin, xmax, 100, ymin, ymax) + hempty.GetXaxis().SetLabelFont(42) + hempty.GetXaxis().SetTitleOffset(1) + hempty.GetXaxis().SetLabelSize(0.03) + hempty.GetXaxis().SetTitleFont(42) + hempty.GetYaxis().SetLabelFont(42) + hempty.GetYaxis().SetTitleOffset(1.35) + hempty.GetYaxis().SetTitleFont(42) + hempty.GetZaxis().SetLabelFont(42) + hempty.GetZaxis().SetTitleOffset(1) + hempty.GetZaxis().SetTitleFont(42) + + canvas = TCanvas("canvas", "A Simple Graph Example", 881, 176, 668, 616) + gStyle.SetOptStat(0) + canvas.SetHighLightColor(2) + canvas.Range(-1.25, -4.625, 11.25, 11.625) + canvas.SetFillColor(0) + canvas.SetBorderMode(0) + canvas.SetBorderSize(2) + canvas.SetFrameBorderMode(0) + canvas.SetFrameBorderMode(0) + if logx == 1: + canvas.SetLogx() + if logy == 1: + canvas.SetLogy() + canvas.cd() + hempty.Draw("") + hvar.Draw("PEsame") + latexa = TLatex() + latexa.SetTextSize(0.04) + latexa.SetTextFont(42) + latexa.SetTextAlign(3) + xave = xmin + (xmax - xmin) / 4.0 + latexa.DrawLatex( + xave, ymax * 0.2, "%.1f < p_{T} (%s) < %.1f GeV" % (ptMin, latex, ptMax) + ) + if dofit: + f = TF1("f", "gaus") + hvar.Fit("f", "R", "", xminfit, xmaxfit) + latexb = TLatex() + latexb.SetTextSize(0.04) + latexb.SetTextFont(42) + latexb.SetTextAlign(3) + mean = f.GetParameter(1) + sigma = f.GetParameter(2) + latexb.DrawLatex(xave, ymax * 0.35, "#mu = %.5f, #sigma = %.5f" % (mean, sigma)) + canvas.SaveAs("%s%s.pdf" % (histonmasssig, mode)) + + +plotsinglevar( + "MuMu", + "../codeHF/AnalysisResults_O2.root", + "hf-task-x", + "J/#psi", + 5, + "hMass", + 2.7, + 4.2, + 0.1, + 5e3, + 4, + 0, + 1, + 2.0, + 4.0, + "", + "Xi_{cc} reco - gen p_{T}", + 0, +) +plotsinglevar( + "EE", + "../codeHF/AnalysisResults_O2_EE.root", + "hf-task-jpsi-mc", + "J/#psi", + 2, + "hmassBg", + 2.7, + 3.4, + 0.1, + 5e3, + 4, + 0, + 1, + 2.0, + 4.0, + "", + "Xi_{cc} reco - gen p_{T}", + 0, +) diff --git a/codeHF/PlotEfficiency.C b/codeHF/PlotEfficiency.C index 056bbe8a..39677eea 100644 --- a/codeHF/PlotEfficiency.C +++ b/codeHF/PlotEfficiency.C @@ -89,13 +89,13 @@ Int_t PlotEfficiency(TString pathFile = "AnalysisResults.root", TString particle // efficiency auto padR = canEff->cd(); TH1F* hEff = (TH1F*)hPtRec->Clone("hEff"); - hEff->Divide(hPtGen); + hEff->Divide(hEff, hPtGen, 1., 1., "B"); hEff->SetTitle(Form("Entries ratio: %g;#it{p}_{T} (GeV/#it{c});efficiency", (double)nRec / (double)nGen)); yMin = hEff->GetMinimum(0); yMax = hEff->GetMaximum(); SetHistogram(hEff, yMin, yMax, marginRLow, marginRHigh, logScaleR); SetPad(padR, logScaleR); - hEff->Draw(); + hEff->Draw("PE"); canPt->SaveAs(Form("MC_%s_pT.pdf", particle.Data())); canEff->SaveAs(Form("MC_%s_eff.pdf", particle.Data())); diff --git a/codeHF/config_tasks.sh b/codeHF/config_tasks.sh index cde64a5e..e22952fa 100644 --- a/codeHF/config_tasks.sh +++ b/codeHF/config_tasks.sh @@ -55,7 +55,7 @@ DOO2_TASK_LC=0 # hf-task-lc DOO2_TASK_XIC=0 # hf-task-xic DOO2_TASK_JPSI=1 # hf-task-jpsi DOO2_TASK_BPLUS=0 # hf-task-bplus -DOO2_TASK_X=1 # hf-task-x +DOO2_TASK_X=0 # hf-task-x # Tree creators DOO2_TREE_D0=0 # hf-tree-creator-d0-tokpi DOO2_TREE_LC=0 # hf-tree-creator-lc-topkpi @@ -66,7 +66,7 @@ APPLYCUTS_DPLUS=0 # Apply D+ selection cuts. APPLYCUTS_LC=0 # Apply Λc selection cuts. APPLYCUTS_XIC=0 # Apply Ξc selection cuts. APPLYCUTS_JPSI=1 # Apply J/ψ selection cuts. -APPLYCUTS_X=1 # Apply X selection cuts. +APPLYCUTS_X=0 # Apply X selection cuts. SAVETREES=0 # Save O2 tables to trees. USEO2VERTEXER=0 # Use the O2 vertexer in AliPhysics. diff --git a/codeHF/dpl-config_run5_oniaX.json b/codeHF/dpl-config_run5_oniaX.json index acd7a183..cadb7d0a 100644 --- a/codeHF/dpl-config_run5_oniaX.json +++ b/codeHF/dpl-config_run5_oniaX.json @@ -68,6 +68,11 @@ "mInvMassJpsiToEEMax": "4.1", "mCPAJpsiToEEMin": "-2.", "mImpParProductJpsiToEEMax": "1000.00", + "mPtJpsiToMuMuMin": "0", + "mInvMassJpsiToMuMuMin": "2.5", + "mInvMassJpsiToMuMuMax": "4.0", + "mCPAJpsiToMuMuMin": "-2", + "mImpParProductJpsiToMuMuMax": "1000", "mPtDPlusToPiKPiMin": "2.", "mInvMassDPlusToPiKPiMin": "1.67", "mInvMassDPlusToPiKPiMax": "2.07", @@ -256,11 +261,13 @@ "d_pidTPCMaxpT": "2000.", "d_pidTOFMinpT": "0.15", "d_pidTOFMaxpT": "1.", + "d_nSigmaTOFCombined": "0.", "d_pidRICHMinpT": "0.5", "d_pidRICHMaxpT": "15.", + "d_nSigmaRICHCombinedTOF": "0.", "d_TPCNClsFindablePIDCut": "-9999", "d_nSigmaTPC": "1000.", - "d_nSigmaTOF": "2.", + "d_nSigmaTOF": "3.", "d_nSigmaRICH": "3.", "pTBins": { "values": [ @@ -410,6 +417,7 @@ "hf-task-jpsi": { "cutYCandMax": "1.44", "d_selectionFlagJpsi": "0", + "d_modeJpsiToMuMu": false, "pTBins": { "values": [ "0", @@ -427,7 +435,8 @@ }, "hf-task-jpsi-mc": { "cutYCandMax": "1.44", - "d_selectionFlagJpsi": "0" + "d_selectionFlagJpsi": "0", + "d_modeJpsiToMuMu": false }, "hf-candidate-creator-x": { "cutYCandMax": "1.44", From 5c6dca98983eb937ecbd1f5b3c876e620a47d129 Mon Sep 17 00:00:00 2001 From: Gian Michele Innocenti Date: Sat, 12 Jun 2021 00:49:14 +0200 Subject: [PATCH 19/33] Fix eta and update input files (#247) Co-authored-by: Gian Michele Innocenti --- codeHF/config_input.sh | 4 ++-- codeHF/config_tasks.sh | 2 ++ codeHF/dpl-config_run5_oniaX.json | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/codeHF/config_input.sh b/codeHF/config_input.sh index f74df9a7..9f7e2beb 100644 --- a/codeHF/config_input.sh +++ b/codeHF/config_input.sh @@ -4,7 +4,7 @@ # Input specification for runtest.sh # (Modifies input parameters.) -INPUT_CASE=12 # Input case +INPUT_CASE=8 # Input case NFILESMAX=1 # Maximum number of processed input files. (Set to -0 to process all; to -N to process all but the last N files.) @@ -60,7 +60,7 @@ case $INPUT_CASE in ISMC=1;; 8) INPUT_LABEL="Run 5, p-p MC 14 TeV Inel, Scenario 3, onia analysis" - INPUT_DIR="/data/Run5/MC/pp_14TeV/Inel_v1" + INPUT_DIR="/home/auras/simulations/delphes/pp_MB_2021_06_10/run_001" INPUT_FILES="AODRun5.*.root" JSON="$JSONRUN5_ONIAX" ISINPUTO2=1 diff --git a/codeHF/config_tasks.sh b/codeHF/config_tasks.sh index e22952fa..48167768 100644 --- a/codeHF/config_tasks.sh +++ b/codeHF/config_tasks.sh @@ -29,6 +29,7 @@ MAKE_GRAPH=0 # Make topology graph. # Activation of O2 workflows # QA +DOO2_REJ_ALICE3=1 # qa-rejection DOO2_QA_EFF=0 # qa-efficiency DOO2_QA_SIM=0 # qa-simple DOO2_MC_VALID=0 # hf-mc-validation @@ -139,6 +140,7 @@ function AdjustJson { # Generate the O2 script containing the full workflow specification. function MakeScriptO2 { WORKFLOWS="" + [ $DOO2_REJ_ALICE3 -eq 1 ] && WORKFLOWS+=" o2-analysis-qa-rejection" [ $DOO2_QA_EFF -eq 1 ] && WORKFLOWS+=" o2-analysis-qa-efficiency" [ $DOO2_QA_SIM -eq 1 ] && WORKFLOWS+=" o2-analysis-qa-simple" [ $DOO2_SKIM -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-track-index-skims-creator" diff --git a/codeHF/dpl-config_run5_oniaX.json b/codeHF/dpl-config_run5_oniaX.json index cadb7d0a..34382b30 100644 --- a/codeHF/dpl-config_run5_oniaX.json +++ b/codeHF/dpl-config_run5_oniaX.json @@ -23,7 +23,7 @@ "100." ] }, - "etamax_2prong": "2.0", + "etamax_2prong": "1.44", "cuts_singletrack_2prong": { "values": [ ["0.000", "10."], From c78dc66362fefd373704eda6fee99b96a2e0ceca Mon Sep 17 00:00:00 2001 From: Gian Michele Innocenti Date: Sat, 12 Jun 2021 01:23:22 +0200 Subject: [PATCH 20/33] Add plotting macro for contamination (#248) Co-authored-by: Gian Michele Innocenti --- FirstAnalysis/contamination.py | 53 ++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 FirstAnalysis/contamination.py diff --git a/FirstAnalysis/contamination.py b/FirstAnalysis/contamination.py new file mode 100644 index 00000000..f389d0ed --- /dev/null +++ b/FirstAnalysis/contamination.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python +from ROOT import TCanvas, TFile, gStyle + +gStyle.SetOptStat(0) +gStyle.SetErrorX(0) +gStyle.SetFrameLineWidth(1) +gStyle.SetTitleSize(0.045, "x") +gStyle.SetTitleSize(0.045, "y") +gStyle.SetMarkerSize(1) +gStyle.SetLabelOffset(0.015, "x") +gStyle.SetLabelOffset(0.02, "y") +gStyle.SetTickLength(-0.02, "x") +gStyle.SetTickLength(-0.02, "y") +gStyle.SetTitleOffset(1.1, "x") +gStyle.SetTitleOffset(1.0, "y") + + +def saveCanvas(canvas, title): + format_list = [".pdf"] + for fileFormat in format_list: + canvas.SaveAs(title + fileFormat) + + +def kinematic_plots(var, particle, detector, hp): + fileo2 = TFile("../codeHF/AnalysisResults_O2.root") + cres = TCanvas("cres", "resolution distribution") + cres.SetCanvasSize(1600, 1000) + cres.cd() + num = fileo2.Get( + "qa-tracking-rejection-%s/tracking%ssel%s/%seta" % (particle, detector, hp, var) + ) + den = fileo2.Get("qa-tracking-rejection-%s/tracking/%seta" % (particle, var)) + # gPad.SetLogz() + num.Divide(den) + num.Draw("coltz") + num.GetYaxis().SetTitle("#eta") + num.GetYaxis().SetTitleOffset(1.0) + num.GetZaxis().SetRangeUser(0.01, 1) + num.SetTitle("Fraction of %s selected by %s as %s" % (particle, detector, hp)) + saveCanvas( + cres, "contamination/%seta_%sSelfrom%sas%s" % (var, particle, detector, hp) + ) + + +# kinematic_plots("p", "pion", "MID", "Muon") +# kinematic_plots("p", "mu", "MID", "Muon") +kinematic_plots("p", "pion", "TOF", "Electron") +kinematic_plots("p", "pion", "RICH", "Electron") +kinematic_plots("pt", "pion", "RICH", "Electron") +kinematic_plots("p", "kaon", "RICH", "Electron") +kinematic_plots("pt", "kaon", "RICH", "Electron") +# kinematic_plots("p", "pion", "TOF", "Kaon") +# kinematic_plots("p", "pion", "RICH", "Kaon") From 9cd009dd258dfd9abb2779df699dd7ed9614969f Mon Sep 17 00:00:00 2001 From: Gian Michele Innocenti Date: Sat, 12 Jun 2021 18:31:17 +0200 Subject: [PATCH 21/33] Add macro for contamination study (#249) --- FirstAnalysis/contamination.py | 56 ++++++++++++++++++++++++++++++---- 1 file changed, 50 insertions(+), 6 deletions(-) diff --git a/FirstAnalysis/contamination.py b/FirstAnalysis/contamination.py index f389d0ed..002711af 100644 --- a/FirstAnalysis/contamination.py +++ b/FirstAnalysis/contamination.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -from ROOT import TCanvas, TFile, gStyle +from ROOT import TCanvas, TFile, gStyle, gROOT gStyle.SetOptStat(0) gStyle.SetErrorX(0) @@ -42,12 +42,56 @@ def kinematic_plots(var, particle, detector, hp): ) +def ratioparticle( + var="pt", + numname="Electron", + selnum="RICHSelHpElLoose", + denname="Pion", + selden="RICHSelHpElLoose", + label="e/#pi", +): + fileo2 = TFile("../codeHF/AnalysisResults_O2.root") + cres = TCanvas("cres", "resolution distribution") + cres.SetCanvasSize(1600, 1000) + cres.cd() + # cres.SetLogy() + gStyle.SetOptStat(0) + gROOT.SetBatch(1) + + num2d = fileo2.Get("qa-rejection-general/h%s%s/%seta" % (numname, selnum, var)) + den2d = fileo2.Get("qa-rejection-general/h%s%s/%seta" % (denname, selden, var)) + num = num2d.ProjectionX("num", 1, num2d.GetXaxis().GetNbins()) + den = den2d.ProjectionX("den", 1, den2d.GetXaxis().GetNbins()) + num.Divide(den) + num.Draw("coltz") + num.GetYaxis().SetTitle(label) + num.GetXaxis().SetTitle("p_{T}") + num.SetMinimum(0.001) + num.SetMaximum(2.0) + num.GetYaxis().SetTitleOffset(1.0) + # num.GetZaxis().SetRangeUser(0.01, 1) + # nameresult = "Fraction of %s selected by %s over %s selected by %s" % (num,selnum,den,selden) + canvas = "Fractionof%s%sOver%s%s" % (numname, selnum, denname, selden) + # num.SetTitle(nameresult) + saveCanvas(cres, "rejection/%s" % (canvas)) + + # kinematic_plots("p", "pion", "MID", "Muon") # kinematic_plots("p", "mu", "MID", "Muon") -kinematic_plots("p", "pion", "TOF", "Electron") -kinematic_plots("p", "pion", "RICH", "Electron") -kinematic_plots("pt", "pion", "RICH", "Electron") -kinematic_plots("p", "kaon", "RICH", "Electron") -kinematic_plots("pt", "kaon", "RICH", "Electron") +# kinematic_plots("p", "pion", "TOF", "Electron") +# kinematic_plots("p", "pion", "RICH", "Electron") +# kinematic_plots("pt", "pion", "RICH", "Electron") +# kinematic_plots("p", "kaon", "RICH", "Electron") +# kinematic_plots("pt", "kaon", "RICH", "Electron") # kinematic_plots("p", "pion", "TOF", "Kaon") # kinematic_plots("p", "pion", "RICH", "Kaon") +ratioparticle( + "pt", "Electron", "RICHSelHpElTight", "Electron", "NoSel", "e/e RICHSelHpElTight" +) +ratioparticle("pt", "Electron", "NoSel", "Pion", "NoSel", "e/#pi No cuts") +ratioparticle( + "pt", "Electron", "RICHSelHpElTight", "Pion", "RICHSelHpElTight", "Tight e/#pi " +) +ratioparticle("pt", "Muon", "MID", "Pion", "MID", "MIDSel") +ratioparticle("pt", "Pion", "RICHSelHpElTight", "Pion", "NoSel", "Contamination") +ratioparticle("pt", "Pion", "MID", "Pion", "NoSel", "Contamination MID") \ No newline at end of file From 620aabf9dc94b5c7bfbd0451a25dfde15d1090a1 Mon Sep 17 00:00:00 2001 From: ginnocen Date: Sat, 12 Jun 2021 16:33:27 +0000 Subject: [PATCH 22/33] [Mega-Linter] Apply linters fixes --- FirstAnalysis/contamination.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FirstAnalysis/contamination.py b/FirstAnalysis/contamination.py index 002711af..6b85f593 100644 --- a/FirstAnalysis/contamination.py +++ b/FirstAnalysis/contamination.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -from ROOT import TCanvas, TFile, gStyle, gROOT +from ROOT import TCanvas, TFile, gROOT, gStyle gStyle.SetOptStat(0) gStyle.SetErrorX(0) @@ -94,4 +94,4 @@ def ratioparticle( ) ratioparticle("pt", "Muon", "MID", "Pion", "MID", "MIDSel") ratioparticle("pt", "Pion", "RICHSelHpElTight", "Pion", "NoSel", "Contamination") -ratioparticle("pt", "Pion", "MID", "Pion", "NoSel", "Contamination MID") \ No newline at end of file +ratioparticle("pt", "Pion", "MID", "Pion", "NoSel", "Contamination MID") From 15af2bb8755f3cb84d174feceeeb568e7dbce0fa Mon Sep 17 00:00:00 2001 From: Gian Michele Innocenti Date: Sat, 12 Jun 2021 18:42:14 +0200 Subject: [PATCH 23/33] Run5 dev (#250) From be5865dfd8860997813e5d13dcb4863f0def28b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Sat, 12 Jun 2021 23:28:45 +0200 Subject: [PATCH 24/33] Add qa-rejection (#251) --- codeHF/config_tasks.sh | 2 +- codeHF/workflows.yml | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/codeHF/config_tasks.sh b/codeHF/config_tasks.sh index 48167768..c7fbea3d 100644 --- a/codeHF/config_tasks.sh +++ b/codeHF/config_tasks.sh @@ -50,7 +50,7 @@ DOO2_SEL_XIC=0 # hf-xic-topkpi-candidate-selector DOO2_SEL_JPSI=0 # hf-jpsi-candidate-selector DOO2_SEL_X=0 # hf-xic-topkpi-candidate-selector # User tasks -DOO2_TASK_D0=1 # hf-task-d0 +DOO2_TASK_D0=0 # hf-task-d0 DOO2_TASK_DPLUS=0 # hf-task-dplus DOO2_TASK_LC=0 # hf-task-lc DOO2_TASK_XIC=0 # hf-task-xic diff --git a/codeHF/workflows.yml b/codeHF/workflows.yml index adfe76da..156cc5d4 100644 --- a/codeHF/workflows.yml +++ b/codeHF/workflows.yml @@ -131,6 +131,11 @@ workflows: activate: no requires_mc: yes + o2-analysis-qa-rejection: + activate: no + requires_mc: yes + dependencies: [o2-analysis-hf-track-index-skims-creator, o2-analysis-pid-tpc-full, o2-analysis-pid-tof-full] + o2-analysis-pid-tof-qa-mc: activate: no requires_mc: yes From ed272840016857847a3b9077f491486c951d0fbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Mon, 14 Jun 2021 19:53:13 +0200 Subject: [PATCH 25/33] Add is_e_not_pi_plots (#253) --- FirstAnalysis/contamination.py | 60 +++++++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 5 deletions(-) diff --git a/FirstAnalysis/contamination.py b/FirstAnalysis/contamination.py index 6b85f593..cd29eb1b 100644 --- a/FirstAnalysis/contamination.py +++ b/FirstAnalysis/contamination.py @@ -1,4 +1,5 @@ #!/usr/bin/env python + from ROOT import TCanvas, TFile, gROOT, gStyle gStyle.SetOptStat(0) @@ -14,9 +15,11 @@ gStyle.SetTitleOffset(1.1, "x") gStyle.SetTitleOffset(1.0, "y") +gROOT.SetBatch(True) + def saveCanvas(canvas, title): - format_list = [".pdf"] + format_list = [".pdf", ".png"] for fileFormat in format_list: canvas.SaveAs(title + fileFormat) @@ -55,8 +58,6 @@ def ratioparticle( cres.SetCanvasSize(1600, 1000) cres.cd() # cres.SetLogy() - gStyle.SetOptStat(0) - gROOT.SetBatch(1) num2d = fileo2.Get("qa-rejection-general/h%s%s/%seta" % (numname, selnum, var)) den2d = fileo2.Get("qa-rejection-general/h%s%s/%seta" % (denname, selden, var)) @@ -66,8 +67,8 @@ def ratioparticle( num.Draw("coltz") num.GetYaxis().SetTitle(label) num.GetXaxis().SetTitle("p_{T}") - num.SetMinimum(0.001) - num.SetMaximum(2.0) + # num.SetMinimum(0.001) + # num.SetMaximum(2.0) num.GetYaxis().SetTitleOffset(1.0) # num.GetZaxis().SetRangeUser(0.01, 1) # nameresult = "Fraction of %s selected by %s over %s selected by %s" % (num,selnum,den,selden) @@ -76,6 +77,33 @@ def ratioparticle( saveCanvas(cres, "rejection/%s" % (canvas)) +def is_e_not_pi_plots(particle): + fileo2 = TFile("../codeHF/AnalysisResults_O2.root") + task = "qa-rejection-general" + folder_gm = "h%sRICHSelHpElTight" % particle + folder_alt = "h%sRICHSelHpElTightAlt" % particle + folder_diff = "h%sRICHSelHpElTightAltDiff" % particle + hist = "pteta" + hist_gm = fileo2.Get("%s/%s/%s" % (task, folder_gm, hist)) + hist_gm.SetTitle("%s isRICHElTight" % particle) + hist_alt = fileo2.Get("%s/%s/%s" % (task, folder_alt, hist)) + hist_alt.SetTitle("%s isElectronAndNotPion" % particle) + hist_diff = fileo2.Get("%s/%s/%s" % (task, folder_diff, hist)) + hist_diff.SetTitle("%s isRICHElTight != isElectronAndNotPion" % particle) + cepi = TCanvas("cepi", "e not pi selection") + cepi.SetCanvasSize(1600, 1000) + cepi.Divide(2, 2) + cepi.cd(1) + hist_gm.Draw("colz") + cepi.cd(2) + hist_alt.Draw("colz") + cepi.cd(3) + hist_diff.Draw("colz") + # num.GetYaxis().SetTitleOffset(1.0) + # num.GetZaxis().SetRangeUser(0.01, 1) + saveCanvas(cepi, "contamination/is_e_not_pi_%s" % particle) + + # kinematic_plots("p", "pion", "MID", "Muon") # kinematic_plots("p", "mu", "MID", "Muon") # kinematic_plots("p", "pion", "TOF", "Electron") @@ -85,6 +113,7 @@ def ratioparticle( # kinematic_plots("pt", "kaon", "RICH", "Electron") # kinematic_plots("p", "pion", "TOF", "Kaon") # kinematic_plots("p", "pion", "RICH", "Kaon") + ratioparticle( "pt", "Electron", "RICHSelHpElTight", "Electron", "NoSel", "e/e RICHSelHpElTight" ) @@ -95,3 +124,24 @@ def ratioparticle( ratioparticle("pt", "Muon", "MID", "Pion", "MID", "MIDSel") ratioparticle("pt", "Pion", "RICHSelHpElTight", "Pion", "NoSel", "Contamination") ratioparticle("pt", "Pion", "MID", "Pion", "NoSel", "Contamination MID") + +ratioparticle( + "pt", + "Electron", + "RICHSelHpElTightAlt", + "Electron", + "RICHSelHpElTight", + "e isElectronAndNotPion/RICHSelHpElTight", +) +ratioparticle( + "pt", + "Electron", + "RICHSelHpElTightAlt", + "Pion", + "RICHSelHpElTightAlt", + "isElectronAndNotPion e/#pi", +) + + +for p in ("Electron", "Pion", "Kaon", "Muon"): + is_e_not_pi_plots(p) From 8599e67db0e8353d6b2292ddec5375b0c5d64f22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Tue, 15 Jun 2021 16:14:07 +0200 Subject: [PATCH 26/33] Use a single variable for input file path (#254) --- FirstAnalysis/contamination.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/FirstAnalysis/contamination.py b/FirstAnalysis/contamination.py index cd29eb1b..75bf1133 100644 --- a/FirstAnalysis/contamination.py +++ b/FirstAnalysis/contamination.py @@ -2,6 +2,8 @@ from ROOT import TCanvas, TFile, gROOT, gStyle +path_file = "../codeHF/AnalysisResults_O2.root" + gStyle.SetOptStat(0) gStyle.SetErrorX(0) gStyle.SetFrameLineWidth(1) @@ -25,7 +27,7 @@ def saveCanvas(canvas, title): def kinematic_plots(var, particle, detector, hp): - fileo2 = TFile("../codeHF/AnalysisResults_O2.root") + fileo2 = TFile(path_file) cres = TCanvas("cres", "resolution distribution") cres.SetCanvasSize(1600, 1000) cres.cd() @@ -53,11 +55,11 @@ def ratioparticle( selden="RICHSelHpElLoose", label="e/#pi", ): - fileo2 = TFile("../codeHF/AnalysisResults_O2.root") + fileo2 = TFile(path_file) cres = TCanvas("cres", "resolution distribution") cres.SetCanvasSize(1600, 1000) cres.cd() - # cres.SetLogy() + cres.SetLogy() num2d = fileo2.Get("qa-rejection-general/h%s%s/%seta" % (numname, selnum, var)) den2d = fileo2.Get("qa-rejection-general/h%s%s/%seta" % (denname, selden, var)) @@ -78,7 +80,7 @@ def ratioparticle( def is_e_not_pi_plots(particle): - fileo2 = TFile("../codeHF/AnalysisResults_O2.root") + fileo2 = TFile(path_file) task = "qa-rejection-general" folder_gm = "h%sRICHSelHpElTight" % particle folder_alt = "h%sRICHSelHpElTightAlt" % particle From 0fddfa7996a14bcb102ce4bf88673f6c663b4c18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Tue, 15 Jun 2021 16:25:51 +0200 Subject: [PATCH 27/33] Use full production for case 8 (#255) --- codeHF/config_input.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codeHF/config_input.sh b/codeHF/config_input.sh index 9f7e2beb..1ee0ffb4 100644 --- a/codeHF/config_input.sh +++ b/codeHF/config_input.sh @@ -60,7 +60,7 @@ case $INPUT_CASE in ISMC=1;; 8) INPUT_LABEL="Run 5, p-p MC 14 TeV Inel, Scenario 3, onia analysis" - INPUT_DIR="/home/auras/simulations/delphes/pp_MB_2021_06_10/run_001" + INPUT_DIR="/home/auras/simulations/delphes/pp_MB_2021_06_10" INPUT_FILES="AODRun5.*.root" JSON="$JSONRUN5_ONIAX" ISINPUTO2=1 From 64a59c470f9ce5cd788f4a0651542b778f29c26a Mon Sep 17 00:00:00 2001 From: Gian Michele Innocenti Date: Tue, 22 Jun 2021 12:17:32 +0200 Subject: [PATCH 28/33] use working input --- FirstAnalysis/plotsinglevar.py | 24 ++---------------------- 1 file changed, 2 insertions(+), 22 deletions(-) diff --git a/FirstAnalysis/plotsinglevar.py b/FirstAnalysis/plotsinglevar.py index decfb3f3..ce7660c1 100644 --- a/FirstAnalysis/plotsinglevar.py +++ b/FirstAnalysis/plotsinglevar.py @@ -96,27 +96,7 @@ def plotsinglevar( plotsinglevar( "MuMu", - "../codeHF/AnalysisResults_O2.root", - "hf-task-x", - "J/#psi", - 5, - "hMass", - 2.7, - 4.2, - 0.1, - 5e3, - 4, - 0, - 1, - 2.0, - 4.0, - "", - "Xi_{cc} reco - gen p_{T}", - 0, -) -plotsinglevar( - "EE", - "../codeHF/AnalysisResults_O2_EE.root", + "/home/auras/analysis/AnalysisResults_O2_Signal_PID_mumu.root", "hf-task-jpsi-mc", "J/#psi", 2, @@ -131,6 +111,6 @@ def plotsinglevar( 2.0, 4.0, "", - "Xi_{cc} reco - gen p_{T}", + "Inv. Mass (GeV/c2)", 0, ) From a8baacd54b4ea0393e9fbf4c2c6b274b462b4f2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Thu, 24 Jun 2021 00:40:47 +0200 Subject: [PATCH 29/33] Sync with master (#268) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Adjust plot sizes (#233) Co-authored-by: Benedikt Volkel * Update README (#234) Co-authored-by: Benedikt Volkel * Fix QA simple workflow (#236) * Add new features in make_command_o2 (#242) * Support real-data-only options/tables and workflow aliases * Print one workflow per line in script_o2 * Add tables of selectors * Detect duplicate workflows * Add Λc → K0S p (#243) * Add Lc -> K0S p workflows. * Add LcK0sp tables * Add Λc → K0S p, part 2 (#244) * Fix typo (#246) * Add code owners (#252) * Add event-selection task in runtest (#192) * Add event-selection tasks and adapt json files * Add entry for histo of event selection * fix conflicts * Update config_tasks.sh * Fix defaults * Fix comments * Update onia json * Use camel case * Update name of directory in O2 AnalysisResults * Remove unused entry * Fix conflict * Revert removal of entry * Make explicit the activation of the event selection * Trim trailing whitespace * fix workflow names * fix names * Add event seletion to workflows * Fix directory name * Remove wrong file * Modify list of dependencies in case of hf-track-index-skims-creator * Add possibility to run together 2/3-prongs and cascades * Implement Vit's suggestions * Implement Vit's suggestions (part 2) * Remove unneeded workflows Co-authored-by: Vít Kučera * Fix workflow database * Polish config_tasks.sh * Fix O2 command format and workflow duplication detection * Make "activate" key in workflow database optional * Make O2 exit with 1 for any error * Run postprocessing in ROOT environment * Fix postprocessing environment detection * Plot prompt/non-prompt efficiency * Add efficiency validation plots (#260) * Add efficiency validation plots * Adjust labels * Small updates for D+ analysis (#258) * Small update of Dplus comparison files * Update config file * Remove trailing whitespaces * Propagate changes to other .json files Co-authored-by: Vít Kučera * Add efficiency validation options * Fix analysis README * Fix Python * Remove table of content from README (generated automatically) * Update linter instructions * Add instructions for analysis code contributors * Update documentation * Simplify batch scripts * Catch more O2 errors * Update reference plots * Update clean.sh * Propagate MC switch in the AliPhysics task (#264) * Rename Style class (#266) Co-authored-by: Benedikt Volkel * Fix workflow configuration * Catch more O2 errors (#267) Co-authored-by: benedikt-voelkel Co-authored-by: Benedikt Volkel Co-authored-by: Fabrizio Co-authored-by: Fabio Catalano --- CODEOWNERS | 9 + FirstAnalysis/README.md | 28 +++- FirstAnalysis/distrib_studies.py | 6 +- README.md | 38 ++--- codeHF/Compare.C | 61 ++++--- codeHF/MC_d0_eff_ref.pdf | Bin 13880 -> 15255 bytes codeHF/MC_d0_pT_ref.pdf | Bin 13936 -> 15090 bytes codeHF/PlotEfficiency.C | 209 ++++++++++++++++++------ codeHF/RunHFTaskLocal.C | 2 +- codeHF/clean.sh | 3 + codeHF/comparison_histos_cand2_ref.pdf | Bin 16216 -> 15895 bytes codeHF/comparison_histos_d0_ref.pdf | Bin 33457 -> 31276 bytes codeHF/comparison_histos_skim_ref.pdf | Bin 28877 -> 25616 bytes codeHF/comparison_histos_tracks_ref.pdf | Bin 17133 -> 23120 bytes codeHF/config_tasks.sh | 90 +++++++--- codeHF/dpl-config_run3.json | 35 +++- codeHF/utils_plot.h | 9 + codeHF/versions_ref.txt | 8 +- codeHF/workflows.yml | 129 +++++++++------ exec/batch_ali.sh | 22 +-- exec/batch_convert.sh | 22 +-- exec/batch_o2.sh | 28 ++-- exec/check_spaces.sh | 2 +- exec/make_command_o2.py | 57 ++++--- exec/run_o2.sh | 2 +- exec/runtest.sh | 10 +- 26 files changed, 510 insertions(+), 260 deletions(-) create mode 100644 CODEOWNERS diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 00000000..59eceb91 --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1,9 @@ +# Code owners +# +# Lines starting with '#' are comments. +# Each line is a file pattern followed by one or more owners. + +# These owners will be the default owners for everything in the repo. +* @ginnocen @vkucera + +# Order is important. The last matching pattern has the most precedence. diff --git a/FirstAnalysis/README.md b/FirstAnalysis/README.md index be0f0f48..a426ca78 100644 --- a/FirstAnalysis/README.md +++ b/FirstAnalysis/README.md @@ -1,19 +1,29 @@ -# O2 First analysis utilities - -## Table of contents - -* [Introduction](#introduction) -* [Available samples ALICE3](#available-samples-alice3) - +# O2 first analysis utilities ## Introduction The main purpose of this folder is to provide analysis tools to perform analysis of O2 analysis task outputs. It includes for the moment a set of QA plotting macros to inspect `AnalysisResults.root` of MC and data samples. -It also includes some preliminary functionalities for performing efficiency corrections of HF analyses. It is currently being used -also for performing Run5 analysis. +It also includes some preliminary functionalities for performing efficiency corrections of HF analyses. +It is currently being used also for performing Run5 analysis. +## Instructions for contributors + +* Write documentation comments to make the code easy to understand. +* Every file should contain the following details at the top: + * what the code does, + * which input it needs (e.g. output of which O2 workflow), + * how to run it (in case simply executing the script is not enough), + * names of authors, contributors, maintainers (to contact in case of problems or questions). +* Follow [PEP 8 naming conventions](https://www.python.org/dev/peps/pep-0008/#naming-conventions) in Python code. +* Do not use hard-coded paths! A default path should point to a file directly produced by the framework (e.g. `../codeHF/AnalysisResults_O2.root`). ## Available samples ALICE3 * D2H KrKr production (X events): * AOD O2 tables: `/data/Run5data/EMBEDDING_KrKr_CCBARLc_scenario3/TEST` * Analysis result: `/data/Run5data_samples/EMBEDDING_KrKr_CCBARLc_scenario3_20210224/AnalysisResults_O2.root` + +## Plotting +The analyses validation is supposed to use the [HFPlot tool](https://github.com/benedikt-voelkel/HFPlot) for plotting purposes in the future. +It is basically a *pythonic* wrapper around `ROOT` with some automated features. +As a first use case it is implemented in [distrib_studies.py](distrib_studies.py). +A more extensive README can be found [here](https://github.com/benedikt-voelkel/HFPlot) and there are also some examples provided. diff --git a/FirstAnalysis/distrib_studies.py b/FirstAnalysis/distrib_studies.py index 1b83fdbc..9c2b0249 100644 --- a/FirstAnalysis/distrib_studies.py +++ b/FirstAnalysis/distrib_studies.py @@ -4,7 +4,7 @@ import yaml from hfplot.plot_spec_root import ROOTFigure -from hfplot.style import ROOTStyle1D +from hfplot.style import StyleObject1D from ROOT import TFile @@ -47,12 +47,12 @@ def distr_studies(hadron="X3872", collision="pp14p0", yrange="absy1p44"): lptMax = [] # Define some styles - style_sig = ROOTStyle1D() + style_sig = StyleObject1D() style_sig.markercolor = 2 style_sig.markerstyle = 21 style_sig.markersize = 2 style_sig.draw_options = "P" - style_bkg = ROOTStyle1D() + style_bkg = StyleObject1D() style_bkg.markerstyle = 23 style_bkg.markersize = 2 style_bkg.draw_options = "P" diff --git a/README.md b/README.md index 3a0f8ac8..4b921f23 100644 --- a/README.md +++ b/README.md @@ -3,24 +3,6 @@ [![GitHub Mega-Linter](https://github.com/AliceO2Group/Run3Analysisvalidation/workflows/Mega-Linter/badge.svg?branch=master)](https://github.com/marketplace/actions/mega-linter) [![GitHub Clang Format Linter](https://github.com/AliceO2Group/Run3Analysisvalidation/workflows/Clang%20Format%20Linter/badge.svg)](https://github.com/marketplace/actions/clang-format-lint) -## Table of contents - -* [Introduction](#introduction) -* [Overview](#overview) - * [Execution](#execution) - * [Configuration](#configuration) -* [Preparation](#preparation) - * [Build AliPhysics and O2](#build-aliphysics-and-o2) - * [Download the validation framework](#download-the-validation-framework) - * [Install parallelisation software](#install-parallelisation-software) -* [Run the framework](#run-the-framework) -* [Job debugging](#job-debugging) -* [Heavy-flavour analyses](#heavy-flavour-analyses) -* [Keep your repositories and installations up to date and clean](#keep-your-repositories-and-installations-up-to-date-and-clean) -* [Continuous integration tests](#continuous-integration-tests) - * [C++](#c) - * [Python](#python) - ## Introduction The main purpose of the Run 3 validation framework is to provide a compact and flexible tool for validation of the @@ -251,25 +233,25 @@ You can easily extend the script to include any other local Git repository and a ## Continuous integration tests Validity and quality of the code in the repository are checked on GitHub by several tools (linters) that support many coding languages. -Linters run automatically for every push or pull request. +Linters run automatically for every push or pull request event. **Please make sure that your code passes all the tests before making a pull request.** -Here are some tips how to check your code locally with the linters that usually complain the most. +It is possible to check your code locally (before even committing or pushing): -### C++ +### Space checker -* [ClangFormat](https://clang.llvm.org/docs/ClangFormat.html) - automatic reformatting of C++ sources files according to configurable style guides +```bash +bash /exec/check_spaces.sh +``` + +### [ClangFormat](https://clang.llvm.org/docs/ClangFormat.html) ```bash clang-format -style=file -i ``` -### Python - -* [Black](https://github.com/psf/black) - “uncompromising Python code formatter” -* [flake8](https://gitlab.com/pycqa/flake8) - “tool that glues together pep8, pyflakes, mccabe, and third-party plugins to check the style and quality of some python code” -* [isort](https://github.com/PyCQA/isort) - “utility to sort imports alphabetically, and automatically separated into sections and by type” +### [Mega-Linter](https://nvuillam.github.io/mega-linter/mega-linter-runner/) ```bash -black . && flake8 . && isort . +mega-linter-runner ``` diff --git a/codeHF/Compare.C b/codeHF/Compare.C index 444ffc0a..ee085338 100644 --- a/codeHF/Compare.C +++ b/codeHF/Compare.C @@ -37,15 +37,17 @@ Int_t Compare(TString filerun3 = "AnalysisResults_O2.root", TString filerun1 = " return 1; } + TString labelParticle = ""; + // Histogram specification: axis label, Run 1 name, Run 3 path/name, rebin, log scale histogram, log scale ratio VecSpecHis vecHisTracks; - AddHistogram(vecHisTracks, "#it{p}_{T} before selections (GeV/#it{c})", "hPtAllTracks", "hf-produce-sel-track/hpt_nocuts", 2, 1, 0); - AddHistogram(vecHisTracks, "#it{p}_{T} after selections (GeV/#it{c})", "hPtSelTracks", "hf-produce-sel-track/hpt_cuts_2prong", 2, 1, 0); - AddHistogram(vecHisTracks, "DCA XY to prim. vtx. (2-prong sel.) (cm)", "hImpParSelTracks2prong", "hf-produce-sel-track/hdcatoprimxy_cuts_2prong", 2, 1, 0); - AddHistogram(vecHisTracks, "DCA XY to prim. vtx. (3-prong sel.) (cm)", "hImpParSelTracks3prong", "hf-produce-sel-track/hdcatoprimxy_cuts_3prong", 2, 1, 0); - AddHistogram(vecHisTracks, "#it{#eta} (2-prong sel.)", "hEtaSelTracks2prong", "hf-produce-sel-track/heta_cuts_2prong", 2, 0, 0); - AddHistogram(vecHisTracks, "#it{#eta} (3-prong sel.)", "hEtaSelTracks3prong", "hf-produce-sel-track/heta_cuts_3prong", 2, 0, 0); + AddHistogram(vecHisTracks, "#it{p}_{T} before selections (GeV/#it{c})", "hPtAllTracks", "hf-tag-sel-tracks/hpt_nocuts", 2, 1, 0); + AddHistogram(vecHisTracks, "#it{p}_{T} after selections (GeV/#it{c})", "hPtSelTracks", "hf-tag-sel-tracks/hpt_cuts_2prong", 2, 1, 0); + AddHistogram(vecHisTracks, "DCA XY to prim. vtx. (2-prong sel.) (cm)", "hImpParSelTracks2prong", "hf-tag-sel-tracks/hdcatoprimxy_cuts_2prong", 2, 1, 0); + AddHistogram(vecHisTracks, "DCA XY to prim. vtx. (3-prong sel.) (cm)", "hImpParSelTracks3prong", "hf-tag-sel-tracks/hdcatoprimxy_cuts_3prong", 2, 1, 0); + AddHistogram(vecHisTracks, "#it{#eta} (2-prong sel.)", "hEtaSelTracks2prong", "hf-tag-sel-tracks/heta_cuts_2prong", 2, 0, 0); + AddHistogram(vecHisTracks, "#it{#eta} (3-prong sel.)", "hEtaSelTracks3prong", "hf-tag-sel-tracks/heta_cuts_3prong", 2, 0, 0); VecSpecHis vecHisSkim; AddHistogram(vecHisSkim, "secondary vtx x - 2prong (cm)", "h2ProngVertX", "hf-track-index-skims-creator/hvtx2_x", 5, 1, 0); @@ -76,7 +78,14 @@ Int_t Compare(TString filerun3 = "AnalysisResults_O2.root", TString filerun1 = " AddHistogram(vecHisD0, "decay length XY (cm)", "hDecLenXYD0", "hf-task-d0/hdeclengthxy", 2, 1, 0); AddHistogram(vecHisD0, "decay length error (cm)", "hDecLenErrD0", "hf-task-d0/hDecLenErr", 1, 1, 0); AddHistogram(vecHisD0, "decay length XY error (cm)", "hDecLenXYErrD0", "hf-task-d0/hDecLenXYErr", 1, 1, 0); - AddHistogram(vecHisD0, "cos. pointing angle", "hCosPointD0", "hf-task-d0/hCPA", 2, 1, 0); + AddHistogram(vecHisD0, "cos pointing angle", "hCosPointD0", "hf-task-d0/hCPA", 2, 1, 0); + + labelParticle = "D^{0} #rightarrow #pi K"; + VecSpecHis vecHisD0MC; + AddHistogram(vecHisD0MC, labelParticle + ", matched prompt: #it{p}_{T}^{rec} (GeV/#it{c})", "hPtRecoPromptD0Kpi", "hf-task-d0-mc/hPtRecSigPrompt", 2, 1, 0); + AddHistogram(vecHisD0MC, labelParticle + ", gen. prompt: #it{p}_{T}^{gen} (GeV/#it{c})", "hPtGenPromptD0Kpi", "hf-task-d0-mc/hPtGenPrompt", 2, 1, 0); + AddHistogram(vecHisD0MC, labelParticle + ", matched non-prompt: #it{p}_{T}^{rec} (GeV/#it{c})", "hPtRecoFeeddwD0Kpi", "hf-task-d0-mc/hPtRecSigNonPrompt", 2, 1, 0); + AddHistogram(vecHisD0MC, labelParticle + ", gen. non-prompt: #it{p}_{T}^{gen} (GeV/#it{c})", "hPtGenFeeddwD0Kpi", "hf-task-d0-mc/hPtGenNonPrompt", 2, 1, 0); VecSpecHis vecHisDPlus; AddHistogram(vecHisDPlus, "#it{p}_{T} prong 0 (GeV/#it{c})", "hPtDplusDau0", "hf-task-dplus/hPtProng0", 2, 1, 0); @@ -88,13 +97,14 @@ Int_t Compare(TString filerun3 = "AnalysisResults_O2.root", TString filerun1 = " AddHistogram(vecHisDPlus, "decay length (cm)", "hDecLenDplus", "hf-task-dplus/hDecayLength", 4, 1, 0); AddHistogram(vecHisDPlus, "decay length XY (cm)", "hDecLenXYDplus", "hf-task-dplus/hDecayLengthXY", 4, 1, 0); AddHistogram(vecHisDPlus, "norm. decay length XY", "hNormDecLenXYDplus", "hf-task-dplus/hNormalisedDecayLengthXY", 2, 1, 0); - AddHistogram(vecHisDPlus, "cos. pointing angle", "hCosPointDplus", "hf-task-dplus/hCPA", 2, 1, 0); - AddHistogram(vecHisDPlus, "cos. pointing angle XY", "hCosPointXYDplus", "hf-task-dplus/hCPAxy", 2, 1, 0); + AddHistogram(vecHisDPlus, "cos pointing angle", "hCosPointDplus", "hf-task-dplus/hCPA", 2, 1, 0); + AddHistogram(vecHisDPlus, "cos pointing angle XY", "hCosPointXYDplus", "hf-task-dplus/hCPAxy", 2, 1, 0); AddHistogram(vecHisDPlus, "norm. IP", "hNormIPDplus", "hf-task-dplus/hMaxNormalisedDeltaIP", 4, 1, 0); AddHistogram(vecHisDPlus, "decay length error (cm)", "hDecLenErrDplus", "hf-task-dplus/hDecayLengthError", 2, 1, 0); AddHistogram(vecHisDPlus, "decay length XY error (cm)", "hDecLenXYErrDplus", "hf-task-dplus/hDecayLengthXYError", 2, 1, 0); AddHistogram(vecHisDPlus, "prong 0 impact parameter (cm)", "hImpParDplusDau0", "hf-task-dplus/hd0Prong0", 2, 1, 0); AddHistogram(vecHisDPlus, "prong 1 impact parameter (cm)", "hImpParDplusDau1", "hf-task-dplus/hd0Prong1", 2, 1, 0); + AddHistogram(vecHisDPlus, "prong 2 impact parameter (cm)", "hImpParDplusDau2", "hf-task-dplus/hd0Prong2", 2, 1, 0); AddHistogram(vecHisDPlus, "prong impact parameter error (cm)", "hImpParErrDplusDau", "hf-task-dplus/hImpactParameterError", 2, 1, 0); AddHistogram(vecHisDPlus, "sq. sum of prong imp. par. (cm^{2})", "hSumSqImpParDplusDau", "hf-task-dplus/hImpactParameterProngSqSum", 2, 1, 0); @@ -105,7 +115,14 @@ Int_t Compare(TString filerun3 = "AnalysisResults_O2.root", TString filerun1 = " AddHistogram(vecHisLc, "#it{p}_{T} #Lambda_{c}^{#plus} (GeV/#it{c})", "hPtLc", "hf-task-lc/hptcand", 2, 1, 0); AddHistogram(vecHisLc, "3-prong mass (p K #pi) (GeV/#it{c}^{2})", "hInvMassLc", "hf-task-lc/hmass", 2, 0, 0); AddHistogram(vecHisLc, "decay length (cm)", "hDecLenLc", "hf-task-lc/hdeclength", 2, 1, 0); - AddHistogram(vecHisLc, "cos. pointing angle", "hCosPointLc", "hf-task-lc/hCPA", 2, 1, 0); + AddHistogram(vecHisLc, "cos pointing angle", "hCosPointLc", "hf-task-lc/hCPA", 2, 1, 0); + + labelParticle = "#Lambda_{c}^{#plus} #rightarrow p K #pi"; + VecSpecHis vecHisLcMC; + AddHistogram(vecHisLcMC, labelParticle + ", matched prompt: #it{p}_{T}^{rec} (GeV/#it{c})", "hPtRecoPromptLcpKpi", "hf-task-lc-mc/hPtRecSigPrompt", 2, 1, 0); + AddHistogram(vecHisLcMC, labelParticle + ", gen. prompt: #it{p}_{T}^{gen} (GeV/#it{c})", "hPtGenPromptLcpKpi", "hf-task-lc-mc/hPtGenPrompt", 2, 1, 0); + AddHistogram(vecHisLcMC, labelParticle + ", matched non-prompt: #it{p}_{T}^{rec} (GeV/#it{c})", "hPtRecoFeeddwLcpKpi", "hf-task-lc-mc/hPtRecSigNonPrompt", 2, 1, 0); + AddHistogram(vecHisLcMC, labelParticle + ", gen. non-prompt: #it{p}_{T}^{gen} (GeV/#it{c})", "hPtGenFeeddwLcpKpi", "hf-task-lc-mc/hPtGenNonPrompt", 2, 1, 0); VecSpecHis vecHisJpsi; AddHistogram(vecHisJpsi, "#it{p}_{T} prong 0 (GeV/#it{c})", "hPtJpsiDau0", "hf-task-jpsi/hptprong0", 2, 1, 0); @@ -117,7 +134,7 @@ Int_t Compare(TString filerun3 = "AnalysisResults_O2.root", TString filerun1 = " AddHistogram(vecHisJpsi, "d0 prong 1 (cm)", "hImpParJpsiDau1", "hf-task-jpsi/hd0Prong1", 2, 1, 0); AddHistogram(vecHisJpsi, "decay length (cm)", "hDecLenJpsi", "hf-task-jpsi/hdeclength", 2, 1, 0); AddHistogram(vecHisJpsi, "decay length XY (cm)", "hDecLenXYJpsi", "hf-task-jpsi/hdeclengthxy", 2, 1, 0); - AddHistogram(vecHisJpsi, "cos. pointing angle", "hCosPointJpsi", "hf-task-jpsi/hCPA", 2, 1, 0); + AddHistogram(vecHisJpsi, "cos pointing angle", "hCosPointJpsi", "hf-task-jpsi/hCPA", 2, 1, 0); AddHistogram(vecHisJpsi, "decay length error (cm)", "hDecLenErrJpsi", "hf-task-jpsi/hDecLenErr", 1, 1, 0); AddHistogram(vecHisJpsi, "decay length XY error (cm)", "hDecLenXYErrJpsi", "hf-task-jpsi/hDecLenXYErr", 1, 1, 0); @@ -125,21 +142,25 @@ Int_t Compare(TString filerun3 = "AnalysisResults_O2.root", TString filerun1 = " std::vector> vecSpecVecSpec; // Add vector specifications in the vector. - if (options.Contains("tracks")) + if (options.Contains(" tracks ")) vecSpecVecSpec.push_back(std::make_tuple("tracks", vecHisTracks, 5, 3)); - if (options.Contains("skim")) + if (options.Contains(" skim ")) vecSpecVecSpec.push_back(std::make_tuple("skim", vecHisSkim, 5, 3)); - if (options.Contains("cand2")) + if (options.Contains(" cand2 ")) vecSpecVecSpec.push_back(std::make_tuple("cand2", vecHisCand2, 5, 3)); - if (options.Contains("cand3")) + if (options.Contains(" cand3 ")) vecSpecVecSpec.push_back(std::make_tuple("cand3", vecHisCand3, 5, 3)); - if (options.Contains("d0")) + if (options.Contains(" d0 ")) vecSpecVecSpec.push_back(std::make_tuple("d0", vecHisD0, 5, 3)); - if (options.Contains("dplus")) - vecSpecVecSpec.push_back(std::make_tuple("dplus", vecHisDPlus, 6, 3)); - if (options.Contains("lc")) + if (options.Contains(" d0-mc ")) + vecSpecVecSpec.push_back(std::make_tuple("d0-mc", vecHisD0MC, 2, 2)); + if (options.Contains(" dplus ")) + vecSpecVecSpec.push_back(std::make_tuple("dplus", vecHisDPlus, 5, 4)); + if (options.Contains(" lc ")) vecSpecVecSpec.push_back(std::make_tuple("lc", vecHisLc, 5, 3)); - if (options.Contains("jpsi")) + if (options.Contains(" lc-mc ")) + vecSpecVecSpec.push_back(std::make_tuple("lc-mc", vecHisLcMC, 2, 2)); + if (options.Contains(" jpsi ")) vecSpecVecSpec.push_back(std::make_tuple("jpsi", vecHisJpsi, 5, 3)); // Histogram plot vertical margins diff --git a/codeHF/MC_d0_eff_ref.pdf b/codeHF/MC_d0_eff_ref.pdf index cab9a9cc688fc2f958b35ad25944394f60d1c8e0..7816765a3b5052cad9696e2a2361c9747aacc75f 100644 GIT binary patch delta 3037 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 delta 1664 zcmV-`27mdNcerejs0lJKG%ztRI5IM^u{0@v#hJ}>95oQd|CKo=R3Yo5^~DXSkTb*u z2f`s3CuNER;-re=zvpRJJ$kZdcRj^{^1-{md3xKUmAYHAZn5}tixju`7?+#(hqqt4 z1Gk6wCdcJ(!1njU%l_j2-EwvF#u;mucb}H4Z@<=;A2C3n|M?dT|LtHBQ!>@pMH0M! zq%8Nh%dcN7-#?VbWKxqwYf|w6axta&CFEedP3y2@WQgSW0+BpnLRY14+gB z6gNom##MW8F3FVi7*uOwaRI>FXaoy?;4yKSOlO;~_hRf8aK#+niZ@Bpqxa(ueR9T& zJ5O>oC8Q1FEhaijBefU_Zi6^Xm9HKoxNNM?8)P_#5KZ#_Ji)wrm(P=omzcH3#QTcR zY%3sCXT+8bGDeBB*hXQ42)+&POC!FRSjz^XQIhdZ%XyNb$)#=(axP**kqt6`Mn&t* z^x=)QSmklq^Uhcat9m_u7}2j4f>k2u zaM-E?)@aojA|T)W+klBdNWi?Sk>x1Cz}o?jn<&yq=Zyr(Ya0ebS13P>NQkK zCKZ|@>n2qvtm-vw1iw}}R)uUzo#Il$Dy@A(rG!))3b*T-|iWmksh`)yY&rbA zso!gg9T%-!a1A?M(P^0)>jhWY>xvaB?$VbPce)1jBmp((yldKj>xy0>*Gu14-svhR z<6bV!YuW3XTRy!suXU$u+ux;Lnpd}XZ=oES9NNJTJz|PviyROF&W6qQ_4B>9?KFq% z_s}*@wl{lcR?rofav|8|^|P0^KVI$iMz_`;o8Wk!#d^mRj8)Q}Jv8&{-AfFHXid*g z#9za8wkpa7{JP^Nxp4Kn`c8(4GLe_CHjda)wF?t8!?qeI=C=R<#q8 zpu!K85>{2LNr%pAsFZN@4jp;IDj6yz?B!g-H^cX+WKyByE1siQGO3VB=jfG8D)baJ z^V}<$qQ_Y%N@P_hlUG8A?55~DnN;YuQ<MhtSaH?y=%Q; zVpS)T7glM_ymFLGs^F27SabxFMsPZwR)msC710mXDfUjL*b{bSnqu!{^2&m{<~da| zsR~Yoj^|X#q{8y8g;#_URt1}I+dL6UIQn*iah_L%lF7?wT;%ALOsasBcIN1nOe!g+ z2+yjLNfj%9?we;-$rL?SZ!NqcluTX)XUxg!2qq1BB^P)_C}9=$CaNjNu4Gajx?lc4 zB^`THn1bSZ_QWHe`Ed ze9CxlAFctn$1~Z-)4sa{_E;u3#du`p;!Ydy?eR5#;DCJDozxjOk=T~UpEY9(05&oYK`xo-wtrQAnZe(+Ga%Ev{ z3T1AS4k!kbJ~apgF*PwXvr0Ao0T?nfH8UVEFfcGMAZ{QEFfcGMFflSUGdYuBHzWiy zG%_@^h&Olv1Tr-_IkN;gECLuZGBq?HFfcGMFd%Lq3NSD*FfcJPGB-7oNIOIeGB+?W K3MC~)Peuws3@E4o diff --git a/codeHF/MC_d0_pT_ref.pdf b/codeHF/MC_d0_pT_ref.pdf index 02c9e3c85a66fba9d0124cb927a883fb8d71baee..050f4909bece6b8787f5c5df6cbcd1f54f5ad9c0 100644 GIT binary patch delta 2890 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 delta 1727 zcmV;w20;1pb?|JEs0lJKG%ztRI5IM^u`?-ut(i@a95oPz|B8=H zL&5=;B?4t5k|6Q-dEM=Dm&e}eZ3*pRW}kjtUG283Ts1~5_%n)-F*KofBl331pV7zF#Pw`hz~($n-vAvqNF~5 z->cugQa@fwebAxE{Gvm$4sy~dS>>YBb_s3R<{3QMzQB_wjC`YvE|0-dXPhQTA5`?( zuHs5QG(wBjF&L2SV9)uh#2Bk7<|%LMZDH@{FXQjq!zqq;2ps zQXbGzA-I;p1h}9HpC6Qk7lfBSA^3EEITvC{FB4$1(ZSjR$m&30MsP!-@{~3hZOP0C zK7Cq8#jKMHGm;ja&FWuHnw*&tg6Fx+gfmeuHqHp%M^5GL&iU2Xkr>!>vE1Ex($>To z!4zb(l4x}@ZbF1*%nL1PLPFM#Yv6yF(DS!#kit^_c>#iCu zmr}9Z>TotyMNL39^Ld8U?A_89M{9+(V050m`GI( zvO>i~s^X%(lPj>1PPGMNsj5V(Qq~69MtEOIr>a3)*kU47ZizZt=~p9vQdNVyP%)7z zi_2E-j7FrYCV}01CY_29IOQ^BAT>2r2oV#h3Ql_?mrWy5Ra1&kF_EfdaTJiQZ=loE z#3L**5h_{`q`P?9h*Z@CB~(m06*AglI#nf7RTJ6nJd;l4qE5N#(oVAJ*WI6j@HEPcq#g6j}9awcIty=7VgzWQyRXS@GE0oO9 z%kn3!I-E%ya?o|F;jC4h6=FVmTk)h-LK?SpG_UEb)mY-`(Y)r9R?GfQ`Dk9v*}a8y zq$7^D25&6}FU%qaIJe~0?7Qb@%`WB0OoLh9nY}wZvxHMIimdC-s&~&`-T!oR);3OS zrAM;hbdDn5$O*=ODk+VIV*K{>5`#e;O|MVH-@DaG?NkW@E9NwBRS^ynspNkoc#rd! zsGTa2D!5h>=`N~Zt(@Rr$XuKzDXQej(VviGJ+?k>n==L;#%cC%D^}&RGLcWg<*HD% z0#>LJ9tas#s4D4Hwd@zF)(F^DTTw6X$fQ$QkBO4?E0a!t0RA;M_PKC2> z?o4f<)6{;N5Va25t|EAvNlq`5PK7-iyy>>yMh>U9wO36lO*fob%60chq`Lq3&*wky zznnc|VAUsoWG!;3EQd#IzuauUP_OUrUf?x*tZ|mdCnyLWYWWLWW9~iMacJ&@LUT*0J`Sv{bpu9Ecb-)QS@_ z)PPKcDe0Q&yJb9M>x6JS#ya3I53T19& zb98cLVQmU!Ze(v_Y6>+oATS_rVrmL8H8(M{r8NEl7&0_4IUq1FFfcG6ZXgOUFfcGM zF)}qdHIutGBm^=vI54y0Hh2L9GB!0evtKwY0vIwgF)$!7FfcGMAZ{QEFfcGMFflSS VGcl8+Iz$UHH#Ij3B_%~qMhZmmKO_JE diff --git a/codeHF/PlotEfficiency.C b/codeHF/PlotEfficiency.C index 39677eea..876db6a9 100644 --- a/codeHF/PlotEfficiency.C +++ b/codeHF/PlotEfficiency.C @@ -10,17 +10,22 @@ Int_t PlotEfficiency(TString pathFile = "AnalysisResults.root", TString particle gStyle->SetFrameFillColor(0); // vertical margins of the pT spectra plot - Float_t marginHigh = 0.05; - Float_t marginLow = 0.05; + float marginHigh = 0.05; + float marginLow = 0.05; bool logScaleH = true; // vertical margins of the efficiency plot - Float_t marginRHigh = 0.05; - Float_t marginRLow = 0.05; + float marginRHigh = 0.05; + float marginRLow = 0.05; bool logScaleR = false; - Float_t yMin, yMax; - Int_t nRec, nGen; + double yMin, yMax; + int nRec, nGen; + int colours[] = {1, 2, 4}; + int markers[] = {24, 25, 46}; + // binning Int_t iNRebin = 4; + //Double_t* dRebin = nullptr; + //const Int_t NRebin = 1; Double_t dRebin[] = {0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 5, 6, 8, 10}; const Int_t NRebin = sizeof(dRebin) / sizeof(dRebin[0]) - 1; @@ -30,8 +35,9 @@ Int_t PlotEfficiency(TString pathFile = "AnalysisResults.root", TString particle return 1; } + // get list of particles TObjArray* arrayParticle = 0; - arrayParticle = particles.Tokenize("-"); + arrayParticle = particles.Tokenize(" "); TString particle = ""; // loop over particles @@ -43,59 +49,166 @@ Int_t PlotEfficiency(TString pathFile = "AnalysisResults.root", TString particle } Printf("\nPlotting efficiency for: %s", particle.Data()); - TString histonameRec = Form("hf-task-%s-mc/hPtGenSig", particle.Data()); // Use hPtRecSig for reconstruction level pT. - TH1F* hPtRec = (TH1F*)file->Get(histonameRec.Data()); - if (!hPtRec) { - Printf("Error: Failed to load %s from %s", histonameRec.Data(), pathFile.Data()); + TString outputDir = Form("hf-task-%s-mc", particle.Data()); // analysis output directory with histograms + + // inclusive candidates + TString nameHistRec = outputDir + "/hPtRecSig"; // reconstruction level pT of matched candidates + //nameHistRec = outputDir + "/hPtGenSig"; // generator level pT of matched candidates (no pT smearing) + TString nameHistgen = outputDir + "/hPtGen"; // generator level pT of generated particles + TH1F* hPtRecIncl = (TH1F*)file->Get(nameHistRec.Data()); + if (!hPtRecIncl) { + Printf("Error: Failed to load %s from %s", nameHistRec.Data(), pathFile.Data()); return 1; } - - TString histonameGen = Form("hf-task-%s-mc/hPtGen", particle.Data()); - TH1F* hPtGen = (TH1F*)file->Get(histonameGen.Data()); - if (!hPtGen) { - Printf("Error: Failed to load %s from %s", histonameGen.Data(), pathFile.Data()); + TH1F* hPtGenIncl = (TH1F*)file->Get(nameHistgen.Data()); + if (!hPtGenIncl) { + Printf("Error: Failed to load %s from %s", nameHistgen.Data(), pathFile.Data()); return 1; } + // prompt candidates + bool okPrompt = true; + nameHistRec = outputDir + "/hPtRecSigPrompt"; + TH1F* hPtRecPrompt = (TH1F*)file->Get(nameHistRec.Data()); + if (!hPtRecPrompt) { + Printf("Warning: Failed to load %s from %s", nameHistRec.Data(), pathFile.Data()); + okPrompt = false; + } + nameHistgen = outputDir + "/hPtGenPrompt"; + TH1F* hPtGenPrompt = (TH1F*)file->Get(nameHistgen.Data()); + if (!hPtGenPrompt) { + Printf("Warning: Failed to load %s from %s", nameHistgen.Data(), pathFile.Data()); + okPrompt = false; + } + + // non-prompt candidates + bool okNonPrompt = true; + nameHistRec = outputDir + "/hPtRecSigNonPrompt"; + TH1F* hPtRecNonPrompt = (TH1F*)file->Get(nameHistRec.Data()); + if (!hPtRecNonPrompt) { + Printf("Warning: Failed to load %s from %s", nameHistRec.Data(), pathFile.Data()); + okNonPrompt = false; + } + nameHistgen = outputDir + "/hPtGenNonPrompt"; + TH1F* hPtGenNonPrompt = (TH1F*)file->Get(nameHistgen.Data()); + if (!hPtGenNonPrompt) { + Printf("Warning: Failed to load %s from %s", nameHistgen.Data(), pathFile.Data()); + okNonPrompt = false; + } + TCanvas* canPt = new TCanvas(Form("canPt_%s", particle.Data()), "Pt", 1200, 1000); + TLegend* legendPt = new TLegend(0.72, 0.72, 0.92, 0.92); TCanvas* canEff = new TCanvas(Form("canEff_%s", particle.Data()), "Eff", 1200, 1000); + TLegend* legendEff = new TLegend(0.1, 0.72, 0.3, 0.92); - nGen = hPtGen->GetEntries(); - nRec = hPtRec->GetEntries(); + nGen = hPtGenIncl->GetEntries(); + nRec = hPtRecIncl->GetEntries(); // pT spectra - auto padH = canPt->cd(); - hPtGen->Rebin(iNRebin); - hPtRec->Rebin(iNRebin); - //hPtRec = (TH1F*)hPtRec->Rebin(NRebin, "hPtRecR", dRebin); - //hPtGen = (TH1F*)hPtGen->Rebin(NRebin, "hPtGenR", dRebin); - hPtGen->SetLineColor(1); - hPtGen->SetLineWidth(2); - hPtRec->SetLineColor(2); - hPtRec->SetLineWidth(1); - hPtGen->SetTitle(Form("Entries: Rec: %d, Gen: %d;#it{p}_{T} (GeV/#it{c});entries", nRec, nGen)); - hPtGen->GetYaxis()->SetMaxDigits(3); - yMin = TMath::Min(hPtRec->GetMinimum(0), hPtGen->GetMinimum(0)); - yMax = TMath::Max(hPtRec->GetMaximum(), hPtGen->GetMaximum()); - SetHistogram(hPtGen, yMin, yMax, marginLow, marginHigh, logScaleH); - SetPad(padH, logScaleH); - hPtGen->Draw(); - hPtRec->Draw("same"); - TLegend* legend = new TLegend(0.72, 0.72, 0.92, 0.92); - legend->AddEntry(hPtRec, "Rec", "L"); - legend->AddEntry(hPtGen, "Gen", "L"); - legend->Draw(); + auto padPt = canPt->cd(); + // inclusive + if (iNRebin > 1) { + hPtGenIncl->Rebin(iNRebin); + hPtRecIncl->Rebin(iNRebin); + } else if (NRebin > 1) { + hPtGenIncl = (TH1F*)hPtGenIncl->Rebin(NRebin, "hPtGenInclR", dRebin); + hPtRecIncl = (TH1F*)hPtRecIncl->Rebin(NRebin, "hPtRecInclR", dRebin); + } + yMin = std::min(hPtRecIncl->GetMinimum(0), hPtGenIncl->GetMinimum(0)); + yMax = std::max(hPtRecIncl->GetMaximum(), hPtGenIncl->GetMaximum()); + SetHistogramStyle(hPtGenIncl, colours[0], markers[0], 1.5, 2); + SetHistogramStyle(hPtRecIncl, colours[0], markers[0], 1.5, 2); + hPtGenIncl->SetTitle(Form("Entries: Rec: %d, Gen: %d;#it{p}_{T} (GeV/#it{c});entries", nRec, nGen)); + hPtGenIncl->GetYaxis()->SetMaxDigits(3); + // prompt + if (okPrompt) { + if (iNRebin > 1) { + hPtGenPrompt->Rebin(iNRebin); + hPtRecPrompt->Rebin(iNRebin); + } else if (NRebin > 1) { + hPtGenPrompt = (TH1F*)hPtGenPrompt->Rebin(NRebin, "hPtGenPromptR", dRebin); + hPtRecPrompt = (TH1F*)hPtRecPrompt->Rebin(NRebin, "hPtRecPromptR", dRebin); + } + yMin = std::min({yMin, hPtRecPrompt->GetMinimum(0), hPtGenPrompt->GetMinimum(0)}); + yMax = std::max({yMax, hPtRecPrompt->GetMaximum(), hPtGenPrompt->GetMaximum()}); + SetHistogramStyle(hPtGenPrompt, colours[1], markers[1], 1.5, 2); + SetHistogramStyle(hPtRecPrompt, colours[1], markers[1], 1.5, 2); + } + // non-prompt + if (okNonPrompt) { + if (iNRebin > 1) { + hPtGenNonPrompt->Rebin(iNRebin); + hPtRecNonPrompt->Rebin(iNRebin); + } else if (NRebin > 1) { + hPtGenNonPrompt = (TH1F*)hPtGenNonPrompt->Rebin(NRebin, "hPtGenNonPromptR", dRebin); + hPtRecNonPrompt = (TH1F*)hPtRecNonPrompt->Rebin(NRebin, "hPtRecNonPromptR", dRebin); + } + yMin = std::min({yMin, hPtRecNonPrompt->GetMinimum(0), hPtGenNonPrompt->GetMinimum(0)}); + yMax = std::max({yMax, hPtRecNonPrompt->GetMaximum(), hPtGenNonPrompt->GetMaximum()}); + SetHistogramStyle(hPtGenNonPrompt, colours[2], markers[2], 1.5, 2); + SetHistogramStyle(hPtRecNonPrompt, colours[2], markers[2], 1.5, 2); + } + SetHistogram(hPtGenIncl, yMin, yMax, marginLow, marginHigh, logScaleH); + SetPad(padPt, logScaleH); + hPtGenIncl->Draw(); + hPtRecIncl->Draw("same EP"); + legendPt->AddEntry(hPtRecIncl, "inclusive rec", "P"); + legendPt->AddEntry(hPtGenIncl, "inclusive gen", "L"); + if (okPrompt) { + hPtGenPrompt->Draw("same"); + hPtRecPrompt->Draw("same EP"); + legendPt->AddEntry(hPtRecPrompt, "prompt rec", "P"); + legendPt->AddEntry(hPtGenPrompt, "prompt gen", "L"); + } + if (okNonPrompt) { + hPtGenNonPrompt->Draw("same"); + hPtRecNonPrompt->Draw("same EP"); + legendPt->AddEntry(hPtRecNonPrompt, "non-prompt rec", "P"); + legendPt->AddEntry(hPtGenNonPrompt, "non-prompt gen", "L"); + } + legendPt->Draw(); // efficiency - auto padR = canEff->cd(); - TH1F* hEff = (TH1F*)hPtRec->Clone("hEff"); - hEff->Divide(hEff, hPtGen, 1., 1., "B"); - hEff->SetTitle(Form("Entries ratio: %g;#it{p}_{T} (GeV/#it{c});efficiency", (double)nRec / (double)nGen)); - yMin = hEff->GetMinimum(0); - yMax = hEff->GetMaximum(); - SetHistogram(hEff, yMin, yMax, marginRLow, marginRHigh, logScaleR); - SetPad(padR, logScaleR); - hEff->Draw("PE"); + auto padEff = canEff->cd(); + TH1F* hEffIncl = nullptr; + TH1F* hEffPrompt = nullptr; + TH1F* hEffNonPrompt = nullptr; + // inclusive + hEffIncl = (TH1F*)hPtRecIncl->Clone("hEffIncl"); + hEffIncl->Divide(hEffIncl, hPtGenIncl, 1., 1., "B"); + yMin = hEffIncl->GetMinimum(0); + yMax = hEffIncl->GetMaximum(); + SetHistogramStyle(hEffIncl, colours[0], markers[0], 1.5, 2); + hEffIncl->SetTitle(Form("Entries ratio: %g;#it{p}_{T} (GeV/#it{c});reconstruction efficiency", (double)nRec / (double)nGen)); + // prompt + if (okPrompt) { + hEffPrompt = (TH1F*)hPtRecPrompt->Clone("hEffPrompt"); + hEffPrompt->Divide(hPtRecPrompt, hPtGenPrompt, 1., 1., "B"); + yMin = std::min(yMin, hEffPrompt->GetMinimum(0)); + yMax = std::max(yMax, hEffPrompt->GetMaximum()); + SetHistogramStyle(hEffPrompt, colours[1], markers[1], 1.5, 2); + } + // non-prompt + if (okNonPrompt) { + hEffNonPrompt = (TH1F*)hPtRecNonPrompt->Clone("hEffNonPrompt"); + hEffNonPrompt->Divide(hPtRecNonPrompt, hPtGenNonPrompt, 1., 1., "B"); + yMin = std::min(yMin, hEffNonPrompt->GetMinimum(0)); + yMax = std::max(yMax, hEffNonPrompt->GetMaximum()); + SetHistogramStyle(hEffNonPrompt, colours[2], markers[2], 1.5, 2); + } + SetHistogram(hEffIncl, yMin, yMax, marginRLow, marginRHigh, logScaleR); + SetPad(padEff, logScaleR); + hEffIncl->Draw("EP"); + legendEff->AddEntry(hEffIncl, "inclusive", "P"); + if (okPrompt) { + hEffPrompt->Draw("same EP"); + legendEff->AddEntry(hEffPrompt, "prompt", "P"); + } + if (okNonPrompt) { + hEffNonPrompt->Draw("same EP"); + legendEff->AddEntry(hEffNonPrompt, "non-prompt", "P"); + } + legendEff->Draw(); canPt->SaveAs(Form("MC_%s_pT.pdf", particle.Data())); canEff->SaveAs(Form("MC_%s_eff.pdf", particle.Data())); diff --git a/codeHF/RunHFTaskLocal.C b/codeHF/RunHFTaskLocal.C index aefc7ef2..13970929 100644 --- a/codeHF/RunHFTaskLocal.C +++ b/codeHF/RunHFTaskLocal.C @@ -40,7 +40,7 @@ Long64_t RunHFTaskLocal(TString txtfile = "./list_ali.txt", AliPhysicsSelectionTask* physSelTask = reinterpret_cast(gInterpreter->ProcessLine(Form(".x %s(%d)", gSystem->ExpandPathName("$ALICE_PHYSICS/OADB/macros/AddTaskPhysicsSelection.C"), isMC))); - AliAnalysisTaskHFSimpleVertices* tasktr3 = reinterpret_cast(gInterpreter->ProcessLine(Form(".x %s(\"\",\"%s\")", gSystem->ExpandPathName("$ALICE_PHYSICS/PWGHF/vertexingHF/macros/AddTaskHFSimpleVertices.C"), jsonfilename.Data()))); + AliAnalysisTaskHFSimpleVertices* tasktr3 = reinterpret_cast(gInterpreter->ProcessLine(Form(".x %s(\"\",\"%s\",%d)", gSystem->ExpandPathName("$ALICE_PHYSICS/PWGHF/vertexingHF/macros/AddTaskHFSimpleVertices.C"), jsonfilename.Data(), isMC))); if (useO2Vertexer) { tasktr3->SetUseO2Vertexer(); } diff --git a/codeHF/clean.sh b/codeHF/clean.sh index 7316819e..e8a6c872 100644 --- a/codeHF/clean.sh +++ b/codeHF/clean.sh @@ -9,14 +9,17 @@ comparison_histos_skim.pdf comparison_ratios_skim.pdf \ comparison_histos_cand2.pdf comparison_ratios_cand2.pdf \ comparison_histos_cand3.pdf comparison_ratios_cand3.pdf \ comparison_histos_d0.pdf comparison_ratios_d0.pdf \ +comparison_histos_d0-mc.pdf comparison_ratios_d0-mc.pdf \ comparison_histos_dplus.pdf comparison_ratios_dplus.pdf \ comparison_histos_lc.pdf comparison_ratios_lc.pdf \ +comparison_histos_lc-mc.pdf comparison_ratios_lc-mc.pdf \ comparison_histos_jpsi.pdf comparison_ratios_jpsi.pdf \ MC_d0_eff.pdf MC_d0_pT.pdf \ MC_dplus_eff.pdf MC_dplus_pT.pdf \ MC_lc_eff.pdf MC_lc_pT.pdf \ MC_xic_eff.pdf MC_xic_pT.pdf \ MC_jpsi_eff.pdf MC_jpsi_pT.pdf \ +MC_lc-tok0sP_eff.pdf MC_lc-tok0sP_pT.pdf \ ./*.log \ output_* \ || { echo "Error: Failed to delete files."; exit 1; } diff --git a/codeHF/comparison_histos_cand2_ref.pdf b/codeHF/comparison_histos_cand2_ref.pdf index facaf0891c732ff20de3434e7f485821c783a4e2..d4a05016a2047b9711ce7b1690cd264f1bf420fc 100644 GIT binary patch delta 3658 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 E03NEi82|tP delta 3982 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 Rxz8Xpw7FztEKrtQ{{!|Rg6aSO diff --git a/codeHF/comparison_histos_d0_ref.pdf b/codeHF/comparison_histos_d0_ref.pdf index 503f0fee63daf76b30321be8474d7518e0b3477f..b6232c30450e2dcee5ddf8e80938781460dbaa07 100644 GIT binary patch delta 19197 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 WHa9VoVuC~qFfchc3MC~)Peuv}I_O6L delta 21379 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 D`<_T! diff --git a/codeHF/comparison_histos_skim_ref.pdf b/codeHF/comparison_histos_skim_ref.pdf index 15aed5eea2fb5de47b3c3f69261cca1798e52a20..4defa5343927b6567c51e2742e88b0199732530b 100644 GIT binary patch delta 13469 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 F{{v7GjA;M> delta 16755 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 diff --git a/codeHF/comparison_histos_tracks_ref.pdf b/codeHF/comparison_histos_tracks_ref.pdf index ead033c26b0bed511da8499d82fbc6da87828ec6..a5e5fa3447b73019ee6e0ad57feb257ceb99a3c4 100644 GIT binary patch delta 10950 zcmZv?by!r-8#hds3M@#epe((Fgmg+b3M@!>cQ*%dkzGJ(q+4Ps>5!IA73l^6C09T~ z>OFja?{i(xAJ6`CX6~MyGc%vL&%GCc{k0A|u7p^KpO05mke6Smx>|t)P)U5&9G`uo z%Ak@)8$-0)`cAPx)G55E_lMZX3yr9nO4iS_hN0~Xkg%s%u=tk-HX1J-Brs*gW?XbK zo%CV2)r)#(%f13eO?zXDp{FS~my;>y={Kg~pRe4)&N_g9{fDuSZ`?2b9$W_)P5nKI z>{tlBItBD^&T*MP<=#BK0jLsg8Z%Kxp(;TwdmLO-k@K<3OV=A_i`OBXiy!RE{TjJH zvJ`sHPkq8G(LWrfZoF!<&M> (7rs>P2`*d+-He8p%`YqP~wk#*<#TB)kkG)MjXO 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 kT0g#K;8ITbPibgoFIavRbsF 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 Vy`?(4G(sLB$0{PCX?TbA{{j9Vhs^*0 diff --git a/codeHF/config_tasks.sh b/codeHF/config_tasks.sh index c7fbea3d..1fc131bd 100644 --- a/codeHF/config_tasks.sh +++ b/codeHF/config_tasks.sh @@ -28,10 +28,12 @@ DATABASE_O2="workflows.yml" MAKE_GRAPH=0 # Make topology graph. # Activation of O2 workflows +# Event selection +DOO2_EVSEL=0 # event-selection and timestamp # QA DOO2_REJ_ALICE3=1 # qa-rejection DOO2_QA_EFF=0 # qa-efficiency -DOO2_QA_SIM=0 # qa-simple +DOO2_QA_EVTRK=0 # qa-event-track DOO2_MC_VALID=0 # hf-mc-validation # PID DOO2_PID_TPC=0 # pid-tpc-full @@ -41,6 +43,7 @@ DOO2_PID_TOF_QA=0 # pid-tof-qa-mc DOO2_SKIM=0 # hf-track-index-skims-creator DOO2_CAND_2PRONG=0 # hf-candidate-creator-2prong DOO2_CAND_3PRONG=0 # hf-candidate-creator-3prong +DOO2_CAND_CASC=0 # hf-candidate-creator-cascade DOO2_CAND_X=0 # hf-candidate-creator-x # Selectors DOO2_SEL_D0=0 # hf-d0-candidate-selector @@ -49,6 +52,7 @@ DOO2_SEL_LC=0 # hf-lc-candidate-selector DOO2_SEL_XIC=0 # hf-xic-topkpi-candidate-selector DOO2_SEL_JPSI=0 # hf-jpsi-candidate-selector DOO2_SEL_X=0 # hf-xic-topkpi-candidate-selector +DOO2_SEL_LCK0SP=0 # hf-lc-tok0sp-candidate-selector # User tasks DOO2_TASK_D0=0 # hf-task-d0 DOO2_TASK_DPLUS=0 # hf-task-dplus @@ -57,6 +61,7 @@ DOO2_TASK_XIC=0 # hf-task-xic DOO2_TASK_JPSI=1 # hf-task-jpsi DOO2_TASK_BPLUS=0 # hf-task-bplus DOO2_TASK_X=0 # hf-task-x +DOO2_TASK_LCK0SP=0 # hf-task-lc-tok0sp # Tree creators DOO2_TREE_D0=0 # hf-tree-creator-d0-tokpi DOO2_TREE_LC=0 # hf-tree-creator-lc-topkpi @@ -68,6 +73,7 @@ APPLYCUTS_LC=0 # Apply Λc selection cuts. APPLYCUTS_XIC=0 # Apply Ξc selection cuts. APPLYCUTS_JPSI=1 # Apply J/ψ selection cuts. APPLYCUTS_X=0 # Apply X selection cuts. +APPLYCUTS_LCK0SP=0 # Apply Λc → K0S p selection cuts. SAVETREES=0 # Save O2 tables to trees. USEO2VERTEXER=0 # Use the O2 vertexer in AliPhysics. @@ -84,6 +90,7 @@ function Clean { [ "$1" -eq 2 ] && { rm -f "$LISTFILES_ALI" "$LISTFILES_O2" "$SCRIPT_ALI" "$SCRIPT_O2" "$SCRIPT_POSTPROCESS" || ErrExit "Failed to rm created files." [ "$JSON_EDIT" ] && { rm "$JSON_EDIT" || ErrExit "Failed to rm $JSON_EDIT."; } + [ "$DATABASE_O2_EDIT" ] && { rm "$DATABASE_O2_EDIT" || ErrExit "Failed to rm $DATABASE_O2_EDIT."; } } return 0 @@ -93,7 +100,7 @@ function Clean { function AdjustJson { # Make a copy of the default JSON file to modify it. JSON_EDIT="" - if [[ $APPLYCUTS_D0 -eq 1 || $APPLYCUTS_DPLUS -eq 1 || $APPLYCUTS_LC -eq 1 || $APPLYCUTS_XIC -eq 1 || $APPLYCUTS_JPSI -eq 1 || $APPLYCUTS_X -eq 1 ]]; then + if [[ $APPLYCUTS_D0 -eq 1 || $APPLYCUTS_DPLUS -eq 1 || $APPLYCUTS_LC -eq 1 || $APPLYCUTS_XIC -eq 1 || $APPLYCUTS_JPSI -eq 1 || $APPLYCUTS_X -eq 1 || $APPLYCUTS_LCK0SP -eq 1 ]]; then JSON_EDIT="${JSON/.json/_edit.json}" cp "$JSON" "$JSON_EDIT" || ErrExit "Failed to cp $JSON $JSON_EDIT." JSON="$JSON_EDIT" @@ -124,7 +131,7 @@ function AdjustJson { ReplaceString "\"d_selectionFlagXic\": \"0\"" "\"d_selectionFlagXic\": \"1\"" "$JSON" || ErrExit "Failed to edit $JSON." fi - # Enable J/ψ selection. + # Enable J/ψ selection. if [ $APPLYCUTS_JPSI -eq 1 ]; then MsgWarn "\nUsing J/ψ selection cuts" ReplaceString "\"d_selectionFlagJpsi\": \"0\"" "\"d_selectionFlagJpsi\": \"1\"" "$JSON" || ErrExit "Failed to edit $JSON." @@ -135,27 +142,48 @@ function AdjustJson { MsgWarn "\nUsing X(3872) selection cuts" ReplaceString "\"d_selectionFlagX\": \"0\"" "\"d_selectionFlagX\": \"1\"" "$JSON" || ErrExit "Failed to edit $JSON." fi + # Enable Λc → K0S p selection. + if [ $APPLYCUTS_LCK0SP -eq 1 ]; then + MsgWarn "\nUsing Λc → K0S p selection cuts" + ReplaceString "\"selectionFlagLcK0sp\": \"0\"" "\"selectionFlagLcK0sp\": \"1\"" "$JSON" || ErrExit "Failed to edit $JSON." + fi } # Generate the O2 script containing the full workflow specification. function MakeScriptO2 { + # Enable cascade reconstruction in case of Λc → K0S p tasks + [[ $DOO2_CAND_CASC -eq 1 || $DOO2_SEL_LCK0SP -eq 1 || $DOO2_TASK_LCK0SP -eq 1 ]] && DOO2_CASC=1 || DOO2_CASC=0 + # Cascade reconstruction + [ $DOO2_CASC -eq 1 ] && SUFFIX_CASC="-v0" || SUFFIX_CASC="" + # Event selection + [ $DOO2_EVSEL -eq 1 ] && SUFFIX_EVSEL="-evsel" || SUFFIX_EVSEL="" + WORKFLOWS="" + # QA [ $DOO2_REJ_ALICE3 -eq 1 ] && WORKFLOWS+=" o2-analysis-qa-rejection" [ $DOO2_QA_EFF -eq 1 ] && WORKFLOWS+=" o2-analysis-qa-efficiency" - [ $DOO2_QA_SIM -eq 1 ] && WORKFLOWS+=" o2-analysis-qa-simple" - [ $DOO2_SKIM -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-track-index-skims-creator" - [ $DOO2_CAND_2PRONG -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-candidate-creator-2prong" - [ $DOO2_CAND_3PRONG -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-candidate-creator-3prong" - [ $DOO2_CAND_X -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-candidate-creator-x" + [ $DOO2_QA_EVTRK -eq 1 ] && WORKFLOWS+=" o2-analysis-qa-event-track" + [ $DOO2_MC_VALID -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-mc-validation" + # PID [ $DOO2_PID_TPC -eq 1 ] && WORKFLOWS+=" o2-analysis-pid-tpc-full" [ $DOO2_PID_TOF -eq 1 ] && WORKFLOWS+=" o2-analysis-pid-tof-full" [ $DOO2_PID_TOF_QA -eq 1 ] && WORKFLOWS+=" o2-analysis-pid-tof-qa-mc" + # Vertexing + WF_SKIM="o2-analysis-hf-track-index-skims-creator${SUFFIX_EVSEL}${SUFFIX_CASC}" + [ $DOO2_SKIM -eq 1 ] && WORKFLOWS+=" $WF_SKIM" + [ $DOO2_CAND_2PRONG -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-candidate-creator-2prong" + [ $DOO2_CAND_3PRONG -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-candidate-creator-3prong" + [ $DOO2_CAND_X -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-candidate-creator-x" + [ $DOO2_CAND_CASC -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-candidate-creator-cascade" + # Selectors [ $DOO2_SEL_D0 -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-d0-candidate-selector" [ $DOO2_SEL_JPSI -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-jpsi-candidate-selector" [ $DOO2_SEL_DPLUS -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-dplus-topikpi-candidate-selector" [ $DOO2_SEL_LC -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-lc-candidate-selector" [ $DOO2_SEL_XIC -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-xic-topkpi-candidate-selector" [ $DOO2_SEL_X -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-x-tojpsipipi-candidate-selector" + [ $DOO2_SEL_LCK0SP -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-lc-tok0sp-candidate-selector" + # User tasks [ $DOO2_TASK_D0 -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-task-d0" [ $DOO2_TASK_JPSI -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-task-jpsi" [ $DOO2_TASK_DPLUS -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-task-dplus" @@ -163,9 +191,10 @@ function MakeScriptO2 { [ $DOO2_TASK_XIC -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-task-xic" [ $DOO2_TASK_BPLUS -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-task-bplus" [ $DOO2_TASK_X -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-task-x" + [ $DOO2_TASK_LCK0SP -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-task-lc-tok0sp" + # Tree creators [ $DOO2_TREE_D0 -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-tree-creator-d0-tokpi" [ $DOO2_TREE_LC -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-tree-creator-lc-topkpi" - [ $DOO2_MC_VALID -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-mc-validation" # Translate options into arguments of the generating script. OPT_MAKECMD="" @@ -174,6 +203,17 @@ function MakeScriptO2 { [ $SAVETREES -eq 1 ] && OPT_MAKECMD+=" -t" [ $MAKE_GRAPH -eq 1 ] && OPT_MAKECMD+=" -g" + # Make a copy of the default workflow database file before modifying it. + DATABASE_O2_EDIT="" + if [[ $DOO2_EVSEL -eq 1 || $DOO2_CASC -eq 1 ]]; then + DATABASE_O2_EDIT="${DATABASE_O2/.yml/_edit.yml}" + cp "$DATABASE_O2" "$DATABASE_O2_EDIT" || ErrExit "Failed to cp $DATABASE_O2 $DATABASE_O2_EDIT." + DATABASE_O2="$DATABASE_O2_EDIT" + + # Adjust workflow database in case of event selection or cascades enabled. + ReplaceString "- o2-analysis-hf-track-index-skims-creator" "- $WF_SKIM" "$DATABASE_O2" || ErrExit "Failed to edit $DATABASE_O2." + fi + # Generate the O2 command. MAKECMD="python3 $DIR_EXEC/make_command_o2.py $DATABASE_O2 $OPT_MAKECMD" O2EXEC=$($MAKECMD -w "$WORKFLOWS") @@ -185,8 +225,8 @@ function MakeScriptO2 { #!/bin/bash FileIn="\$1" JSON="\$2" -mkdir sockets && \ -$O2EXEC && \ +mkdir sockets && \\ +$O2EXEC && \\ rm -r sockets EOF } @@ -206,25 +246,25 @@ function MakeScriptPostprocess { # Compare AliPhysics and O2 histograms. [[ $DOALI -eq 1 && $DOO2 -eq 1 ]] && { OPT_COMPARE="" - [ $DOO2_SKIM -eq 1 ] && OPT_COMPARE+="-tracks-skim" - [ $DOO2_CAND_2PRONG -eq 1 ] && OPT_COMPARE+="-cand2" - [ $DOO2_CAND_3PRONG -eq 1 ] && OPT_COMPARE+="-cand3" - [ $DOO2_TASK_D0 -eq 1 ] && OPT_COMPARE+="-d0" - [ $DOO2_TASK_DPLUS -eq 1 ] && OPT_COMPARE+="-dplus" - [ $DOO2_TASK_LC -eq 1 ] && OPT_COMPARE+="-lc" - [ $DOO2_TASK_XIC -eq 1 ] && OPT_COMPARE+="-xic" - [ $DOO2_TASK_JPSI -eq 1 ] && OPT_COMPARE+="-jpsi" + [ $DOO2_SKIM -eq 1 ] && OPT_COMPARE+=" tracks skim " + [ $DOO2_CAND_2PRONG -eq 1 ] && OPT_COMPARE+=" cand2 " + [ $DOO2_CAND_3PRONG -eq 1 ] && OPT_COMPARE+=" cand3 " + [ $DOO2_TASK_D0 -eq 1 ] && { OPT_COMPARE+=" d0 "; [ "$ISMC" -eq 1 ] && OPT_COMPARE+=" d0-mc "; } + [ $DOO2_TASK_DPLUS -eq 1 ] && OPT_COMPARE+=" dplus " + [ $DOO2_TASK_LC -eq 1 ] && { OPT_COMPARE+=" lc "; [ "$ISMC" -eq 1 ] && OPT_COMPARE+=" lc-mc "; } + [ $DOO2_TASK_XIC -eq 1 ] && OPT_COMPARE+=" xic " + [ $DOO2_TASK_JPSI -eq 1 ] && OPT_COMPARE+=" jpsi " [ "$OPT_COMPARE" ] && POSTEXEC+=" && root -b -q -l \"$DIR_TASKS/Compare.C(\\\"\$FileO2\\\", \\\"\$FileAli\\\", \\\"$OPT_COMPARE\\\", $DORATIO)\"" } # Plot particle reconstruction efficiencies. [[ $DOO2 -eq 1 && $ISMC -eq 1 ]] && { PARTICLES="" - [ $DOO2_TASK_D0 -eq 1 ] && PARTICLES+="-d0" - [ $DOO2_TASK_DPLUS -eq 1 ] && PARTICLES+="-dplus" - [ $DOO2_TASK_LC -eq 1 ] && PARTICLES+="-lc" - [ $DOO2_TASK_XIC -eq 1 ] && PARTICLES+="-xic" - [ $DOO2_TASK_JPSI -eq 1 ] && PARTICLES+="-jpsi" - [ $DOO2_TASK_X -eq 1 ] && PARTICLES+="-x" + [ $DOO2_TASK_D0 -eq 1 ] && PARTICLES+=" d0 " + [ $DOO2_TASK_DPLUS -eq 1 ] && PARTICLES+=" dplus " + [ $DOO2_TASK_LC -eq 1 ] && PARTICLES+=" lc " + [ $DOO2_TASK_XIC -eq 1 ] && PARTICLES+=" xic " + [ $DOO2_TASK_JPSI -eq 1 ] && PARTICLES+=" jpsi " + [ $DOO2_TASK_LCK0SP -eq 1 ] && PARTICLES+=" lc-tok0sP " [ "$PARTICLES" ] && POSTEXEC+=" && root -b -q -l \"$DIR_TASKS/PlotEfficiency.C(\\\"\$FileO2\\\", \\\"$PARTICLES\\\")\"" } cat << EOF > "$SCRIPT_POSTPROCESS" diff --git a/codeHF/dpl-config_run3.json b/codeHF/dpl-config_run3.json index 1bd0895e..3afe3614 100644 --- a/codeHF/dpl-config_run3.json +++ b/codeHF/dpl-config_run3.json @@ -189,7 +189,40 @@ "d_pidTOFMaxpT": "-1.", "d_TPCNClsFindablePIDCut": "50.", "d_nSigmaTPC": "3.", - "d_nSigmaTOF": "3." + "d_nSigmaTOF": "3.", + "pTBins": { + "values": [ + "1.", + "2.", + "3.", + "4.", + "5.", + "6.", + "7.", + "8.", + "10.", + "12.", + "16.", + "24.", + "36." + ] + }, + "DPlus_to_Pi_K_Pi_cuts": { + "values": [ + ["0.2", "0.3", "0.3", "0.07", "6.", "0.96", "0.985", "2.5"], + ["0.2", "0.3", "0.3", "0.07", "5.", "0.96", "0.985", "2.5"], + ["0.2", "0.3", "0.3", "0.10", "5.", "0.96", "0.980", "2.5"], + ["0.2", "0.3", "0.3", "0.10", "5.", "0.96", "0.000", "2.5"], + ["0.2", "0.3", "0.3", "0.10", "5.", "0.96", "0.000", "2.5"], + ["0.2", "0.3", "0.3", "0.10", "5.", "0.96", "0.000", "2.5"], + ["0.2", "0.3", "0.3", "0.10", "5.", "0.96", "0.000", "2.5"], + ["0.2", "0.3", "0.3", "0.12", "5.", "0.96", "0.000", "2.5"], + ["0.2", "0.3", "0.3", "0.12", "5.", "0.96", "0.000", "2.5"], + ["0.2", "0.3", "0.3", "0.12", "5.", "0.96", "0.000", "2.5"], + ["0.2", "0.3", "0.3", "0.12", "5.", "0.96", "0.000", "2.5"], + ["0.2", "0.3", "0.3", "0.20", "5.", "0.94", "0.000", "2.5"] + ] + } }, "hf-lc-candidate-selector": { "d_pTCandMin": "0.", diff --git a/codeHF/utils_plot.h b/codeHF/utils_plot.h index 6500c28c..94f98bf3 100644 --- a/codeHF/utils_plot.h +++ b/codeHF/utils_plot.h @@ -34,3 +34,12 @@ void SetHistogram(TH1* his, Float_t yMin, Float_t yMax, Float_t marginLow, Float his->GetYaxis()->SetRangeUser(yMin - marginLow / k * yRange, yMax + marginHigh / k * yRange); } } + +void SetHistogramStyle(TH1* his, Int_t colour = 1, Int_t markerStyle = 1, Float_t markerSize = 1, Float_t lineWidth = 1) +{ + his->SetLineColor(colour); + his->SetLineWidth(lineWidth); + his->SetMarkerColor(colour); + his->SetMarkerStyle(markerStyle); + his->SetMarkerSize(markerSize); +} diff --git a/codeHF/versions_ref.txt b/codeHF/versions_ref.txt index b37a5d78..d859c446 100644 --- a/codeHF/versions_ref.txt +++ b/codeHF/versions_ref.txt @@ -1,4 +1,4 @@ -alidist: master 2021-02-03 22:10:18 +0100 c9b6c5a bump infologger (#2808) -AliPhysics: master 2021-02-03 23:01:26 +0100 64ee243e1d Merge pull request #16821 from fjonasALICE/master -O2: dev 2021-02-03 23:37:25 +0100 64d56ea416 Digits labels should be read via ConstMCTruthContainer -Run 3 validation: master 2021-02-04 00:54:48 +0100 3938aed Update input cases. +alidist: master 2021-06-19 20:37:59 +0200 a1f6ba0 Auto-update defaults-generators.sh and aligenerators.sh (#3116) +AliPhysics: master 2021-06-20 14:53:55 +0200 58e2b8e609c8 Merge pull request #17961 from jokonig/master +O2: dev 2021-06-21 00:54:13 +0200 e095f7dd17 Fix typo in PVertexer debris cleanup +Run 3 validation: master 2021-06-20 23:38:45 +0200 bd90f03 Catch more O2 errors diff --git a/codeHF/workflows.yml b/codeHF/workflows.yml index 156cc5d4..245ff11a 100644 --- a/codeHF/workflows.yml +++ b/codeHF/workflows.yml @@ -1,20 +1,54 @@ +--- options: global: "--fairmq-ipc-prefix sockets" - local: ["--aod-memory-rate-limit 2000000000", "--shm-segment-size 16000000000", "--configuration json://$JSON", "-b"] + local: + - "-b" + - "--configuration json://$JSON" + - "--aod-memory-rate-limit 2000000000" + - "--shm-segment-size 16000000000" + - "--min-failure-level error" workflows: + # Event selection + + o2-analysis-timestamp: + options: + mc: "--isMC 1" + + o2-analysis-event-selection: + options: + mc: "--isMC 1" + # Skimming - o2-analysis-hf-track-index-skims-creator: - activate: no + o2-analysis-hf-track-index-skims-creator: &skim_creator + executable: o2-analysis-hf-track-index-skims-creator tables: [HFSELTRACK, HFTRACKIDXP2, HFTRACKIDXP3] + o2-analysis-hf-track-index-skims-creator-evsel: + <<: *skim_creator + dependencies: [o2-analysis-timestamp, o2-analysis-event-selection] + options: "--doEvSel" + tables: [HFSELCOL, HFSELTRACK, HFTRACKIDXP2, HFTRACKIDXP3] + + o2-analysis-hf-track-index-skims-creator-v0: + <<: *skim_creator + dependencies: o2-analysis-lambdakzerobuilder + options: "--do-LcK0Sp" + tables: [HFSELTRACK, HFTRACKIDXCASC, HFTRACKIDXP2, HFTRACKIDXP3] + + o2-analysis-hf-track-index-skims-creator-evsel-v0: + <<: *skim_creator + dependencies: [o2-analysis-timestamp, o2-analysis-event-selection, o2-analysis-lambdakzerobuilder] + options: ["--doEvSel", "--do-LcK0Sp"] + tables: [HFSELCOL, HFSELTRACK, HFTRACKIDXCASC, HFTRACKIDXP2, HFTRACKIDXP3] + # Candidate creators o2-analysis-hf-candidate-creator-2prong: &cand_creator - activate: no - dependencies: [o2-analysis-hf-track-index-skims-creator] + dependencies: + - o2-analysis-hf-track-index-skims-creator options: mc: "--doMC" tables: @@ -23,99 +57,95 @@ workflows: o2-analysis-hf-candidate-creator-3prong: <<: *cand_creator - activate: no tables: default: [HFCANDP3BASE, HFCANDP3EXT] mc: [HFCANDP3MCREC, HFCANDP3MCGEN] + o2-analysis-hf-candidate-creator-cascade: + <<: *cand_creator + tables: + default: [HFCANDCASCBASE, HFCANDCASCEXT] + mc: [HFCANDCASCMCREC, HFCANDCASCMCGEN] + + o2-analysis-hf-candidate-creator-x: + <<: *cand_creator + dependencies: o2-analysis-hf-jpsi-candidate-selector + tables: + default: [HFCANDXBASE, HFCANDXEXT] + mc: [HFCANDXMCREC, HFCANDXMCGEN] + # Selectors o2-analysis-hf-d0-candidate-selector: &selector_2prong - activate: no dependencies: [o2-analysis-hf-candidate-creator-2prong, o2-analysis-pid-tpc-full, o2-analysis-pid-tof-full] + tables: HFSELD0CAND o2-analysis-hf-jpsi-candidate-selector: <<: *selector_2prong - activate: no tables: HFSELJPSICAND o2-analysis-hf-dplus-topikpi-candidate-selector: &selector_3prong - activate: no dependencies: [o2-analysis-hf-candidate-creator-3prong, o2-analysis-pid-tpc-full, o2-analysis-pid-tof-full] + tables: HFSELDPLUSCAND o2-analysis-hf-lc-candidate-selector: <<: *selector_3prong - activate: no + tables: HFSELLCCAND o2-analysis-hf-xic-topkpi-candidate-selector: <<: *selector_3prong - activate: no + tables: HFSELXICCAND - # Cascade candidate creators - - o2-analysis-hf-candidate-creator-x: &cand_creator_casc - activate: no - dependencies: [o2-analysis-hf-jpsi-candidate-selector] - options: - mc: "--doMC" - tables: - default: [HFCANDXBASE, HFCANDXEXT] - mc: [HFCANDXMCREC, HFCANDXMCGEN] + o2-analysis-hf-lc-tok0sp-candidate-selector: + dependencies: [o2-analysis-hf-candidate-creator-cascade, o2-analysis-pid-tpc-full, o2-analysis-pid-tof-full] + tables: HFSELLCK0SPCAND - # Cascade candidate selectors - - o2-analysis-hf-x-tojpsipipi-candidate-selector: &selector_casc - activate: no + o2-analysis-hf-x-tojpsipipi-candidate-selector: dependencies: [o2-analysis-hf-candidate-creator-x, o2-analysis-pid-tpc-full, o2-analysis-pid-tof-full] # Analysis tasks o2-analysis-hf-task-d0: &task - activate: no dependencies: o2-analysis-hf-d0-candidate-selector options: mc: "--doMC" o2-analysis-hf-task-jpsi: <<: *task - activate: no dependencies: o2-analysis-hf-jpsi-candidate-selector o2-analysis-hf-task-dplus: <<: *task - activate: no dependencies: o2-analysis-hf-dplus-topikpi-candidate-selector o2-analysis-hf-task-lc: <<: *task - activate: no dependencies: o2-analysis-hf-lc-candidate-selector o2-analysis-hf-task-xic: <<: *task - activate: no dependencies: o2-analysis-hf-xic-topkpi-candidate-selector o2-analysis-hf-task-bplus: <<: *task - activate: no dependencies: o2-analysis-hf-d0-candidate-selector o2-analysis-hf-task-x: <<: *task - activate: no dependencies: o2-analysis-hf-x-tojpsipipi-candidate-selector + o2-analysis-hf-task-lc-tok0sp: + <<: *task + dependencies: o2-analysis-hf-lc-tok0sp-candidate-selector + # Tree creators o2-analysis-hf-tree-creator-d0-tokpi: - activate: no requires_mc: yes dependencies: o2-analysis-hf-d0-candidate-selector tables: [HFCANDP2Full, HFCANDP2FullE, HFCANDP2FullP] o2-analysis-hf-tree-creator-lc-topkpi: - activate: no requires_mc: yes dependencies: o2-analysis-hf-lc-candidate-selector tables: [HFCANDP3Full, HFCANDP3FullE, HFCANDP3FullP] @@ -123,36 +153,41 @@ workflows: # QA o2-analysis-qa-efficiency: - activate: no requires_mc: yes options: "--eff-el 1 --eff-mu 1 --eff-pi 1 --eff-ka 1 --eff-pr 1" - o2-analysis-qa-simple: - activate: no + o2-analysis-qa-event-track: requires_mc: yes o2-analysis-qa-rejection: - activate: no requires_mc: yes - dependencies: [o2-analysis-hf-track-index-skims-creator, o2-analysis-pid-tpc-full, o2-analysis-pid-tof-full] + dependencies: + - o2-analysis-hf-track-index-skims-creator + - o2-analysis-pid-tpc-full + - o2-analysis-pid-tof-full o2-analysis-pid-tof-qa-mc: - activate: no requires_mc: yes dependencies: [o2-analysis-pid-tof-full, o2-analysis-pid-tof-beta] o2-analysis-hf-mc-validation: - activate: no requires_mc: yes dependencies: o2-analysis-hf-d0-candidate-selector # PID - o2-analysis-pid-tpc-full: - activate: no + o2-analysis-pid-tpc-full: {} + + o2-analysis-pid-tof-full: {} + + o2-analysis-pid-tof-beta: {} + + # LF + + o2-analysis-lambdakzerobuilder: + dependencies: [o2-analysis-trackextension, o2-analysis-weak-decay-indices] + options: "--v0radius 0.9" - o2-analysis-pid-tof-full: - activate: no + o2-analysis-trackextension: {} - o2-analysis-pid-tof-beta: - activate: no + o2-analysis-weak-decay-indices: {} diff --git a/exec/batch_ali.sh b/exec/batch_ali.sh index 072c1b6c..9bcbb4d6 100644 --- a/exec/batch_ali.sh +++ b/exec/batch_ali.sh @@ -27,13 +27,14 @@ JSON="$(realpath "$JSON")" LogFile="log_ali.log" ListIn="list_ali.txt" FilesToMerge="ListOutToMergeAli.txt" -DirBase="$PWD" IndexFile=0 -ListRunScripts="$DirBase/ListRunScriptsAli.txt" +IndexJob=0 DirOutMain="output_ali" +CMDPARALLEL="cd \"$DirOutMain/{}\" && bash \"$DIR_THIS/run_ali.sh\" \"$SCRIPT\" \"$ListIn\" \"$JSON\" \"$LogFile\"" + # Clean before running. -rm -rf "$ListRunScripts" "$FilesToMerge" "$FILEOUT" "$DirOutMain" || ErrExit "Failed to delete output files." +rm -rf "$FilesToMerge" "$FILEOUT" "$DirOutMain" || ErrExit "Failed to delete output files." CheckFile "$LISTINPUT" echo "Output directory: $DirOutMain (logfiles: $LogFile)" @@ -46,30 +47,25 @@ while read -r FileIn; do # New job if [ $((IndexFile % NFILESPERJOB)) -eq 0 ]; then mkdir -p $DirOut || ErrExit "Failed to mkdir $DirOut." - FileOut="$DirOut/$FILEOUT" - echo "$FileOut" >> "$DirBase/$FilesToMerge" || ErrExit "Failed to echo to $DirBase/$FilesToMerge." - # Add this job in the list of commands. - echo "cd \"$DirOut\" && bash \"$DIR_THIS/run_ali.sh\" \"$SCRIPT\" \"$ListIn\" \"$JSON\" \"$LogFile\"" >> "$ListRunScripts" || ErrExit "Failed to echo to $ListRunScripts." + echo "$DirOut/$FILEOUT" >> "$FilesToMerge" || ErrExit "Failed to echo to $FilesToMerge." fi echo "$FileIn" >> "$DirOut/$ListIn" || ErrExit "Failed to echo to $DirOut/$ListIn." [ "$DEBUG" -eq 1 ] && echo "Input file ($IndexFile, job $IndexJob): $FileIn" - ((IndexFile+=1)) + ((IndexFile++)) done < "$LISTINPUT" -CheckFile "$ListRunScripts" -echo "Running AliPhysics jobs... ($(wc -l < "$ListRunScripts") jobs, $NFILESPERJOB files/job)" +echo "Running AliPhysics jobs... ($((IndexJob+1)) jobs, $NFILESPERJOB files/job)" OPT_PARALLEL="--halt soon,fail=100%" if [ "$DEBUG" -eq 0 ]; then # shellcheck disable=SC2086 # Ignore unquoted options. - parallel $OPT_PARALLEL < "$ListRunScripts" > $LogFile 2>&1 + parallel $OPT_PARALLEL "$CMDPARALLEL" ::: $(seq 0 $IndexJob) > $LogFile 2>&1 else # shellcheck disable=SC2086 # Ignore unquoted options. - parallel $OPT_PARALLEL --will-cite --progress < "$ListRunScripts" > $LogFile + parallel $OPT_PARALLEL --will-cite --progress "$CMDPARALLEL" ::: $(seq 0 $IndexJob) > $LogFile fi || ErrExit "\nCheck $(realpath $LogFile)" grep -q -e '^'"W-" -e '^'"Warning" "$LogFile" && MsgWarn "There were warnings!\nCheck $(realpath $LogFile)" grep -q -e '^'"E-" -e '^'"Error" "$LogFile" && MsgErr "There were errors!\nCheck $(realpath $LogFile)" grep -q -e '^'"F-" -e '^'"Fatal" -e "segmentation" "$LogFile" && ErrExit "There were fatal errors!\nCheck $(realpath $LogFile)" -rm -f "$ListRunScripts" || ErrExit "Failed to rm $ListRunScripts." echo "Merging output files... (output file: $FILEOUT, logfile: $LogFile)" hadd "$FILEOUT" @"$FilesToMerge" >> $LogFile 2>&1 || \ diff --git a/exec/batch_convert.sh b/exec/batch_convert.sh index b67f616e..1ce7b273 100644 --- a/exec/batch_convert.sh +++ b/exec/batch_convert.sh @@ -21,13 +21,14 @@ source "$DIR_THIS/utilities.sh" || { echo "Error: Failed to load utilities."; ex LogFile="log_convert.log" ListIn="list_convert.txt" -DirBase="$PWD" IndexFile=0 -ListRunScripts="$DirBase/ListRunScriptsConversion.txt" +IndexJob=0 DirOutMain="output_conversion" +CMDPARALLEL="cd \"$DirOutMain/{}\" && bash \"$DIR_THIS/run_convert.sh\" \"$ListIn\" $ISMC \"$LogFile\"" + # Clean before running. -rm -rf "$ListRunScripts" "$LISTOUTPUT" "$DirOutMain" || ErrExit "Failed to delete output files." +rm -rf "$LISTOUTPUT" "$DirOutMain" || ErrExit "Failed to delete output files." CheckFile "$LISTINPUT" echo "Output directory: $DirOutMain (logfiles: $LogFile)" @@ -40,29 +41,24 @@ while read -r FileIn; do # New job if [ $((IndexFile % NFILESPERJOB)) -eq 0 ]; then mkdir -p $DirOut || ErrExit "Failed to mkdir $DirOut." - FileOut="$DirOut/$FILEOUT" - echo "$DirBase/$FileOut" >> "$DirBase/$LISTOUTPUT" || ErrExit "Failed to echo to $DirBase/$LISTOUTPUT." - # Add this job in the list of commands. - echo "cd \"$DirOut\" && bash \"$DIR_THIS/run_convert.sh\" \"$ListIn\" $ISMC \"$LogFile\"" >> "$ListRunScripts" || ErrExit "Failed to echo to $ListRunScripts." + echo "$DirOut/$FILEOUT" >> "$LISTOUTPUT" || ErrExit "Failed to echo to $LISTOUTPUT." fi echo "$FileIn" >> "$DirOut/$ListIn" || ErrExit "Failed to echo to $DirOut/$ListIn." [ "$DEBUG" -eq 1 ] && echo "Input file ($IndexFile, job $IndexJob): $FileIn" - ((IndexFile+=1)) + ((IndexFile++)) done < "$LISTINPUT" -CheckFile "$ListRunScripts" -echo "Running conversion jobs... ($(wc -l < "$ListRunScripts") jobs, $NFILESPERJOB files/job)" +echo "Running conversion jobs... ($((IndexJob+1)) jobs, $NFILESPERJOB files/job)" OPT_PARALLEL="--halt soon,fail=100%" if [ "$DEBUG" -eq 0 ]; then # shellcheck disable=SC2086 # Ignore unquoted options. - parallel $OPT_PARALLEL < "$ListRunScripts" > $LogFile 2>&1 + parallel $OPT_PARALLEL "$CMDPARALLEL" ::: $(seq 0 $IndexJob) > $LogFile 2>&1 else # shellcheck disable=SC2086 # Ignore unquoted options. - parallel $OPT_PARALLEL --will-cite --progress < "$ListRunScripts" > $LogFile + parallel $OPT_PARALLEL --will-cite --progress "$CMDPARALLEL" ::: $(seq 0 $IndexJob) > $LogFile fi || ErrExit "\nCheck $(realpath $LogFile)" grep -q -e '^'"W-" -e '^'"Warning" "$LogFile" && MsgWarn "There were warnings!\nCheck $(realpath $LogFile)" grep -q -e '^'"E-" -e '^'"Error" "$LogFile" && MsgErr "There were errors!\nCheck $(realpath $LogFile)" grep -q -e '^'"F-" -e '^'"Fatal" -e "segmentation" "$LogFile" && ErrExit "There were fatal errors!\nCheck $(realpath $LogFile)" -rm -f "$ListRunScripts" || ErrExit "Failed to rm $ListRunScripts." exit 0 diff --git a/exec/batch_o2.sh b/exec/batch_o2.sh index 8c66831e..b253a298 100644 --- a/exec/batch_o2.sh +++ b/exec/batch_o2.sh @@ -29,13 +29,14 @@ LogFile="log_o2.log" ListIn="list_o2.txt" FilesToMerge="ListOutToMergeO2.txt" FilesToMergeTree="ListOutToMergeO2Tree.txt" -DirBase="$PWD" IndexFile=0 -ListRunScripts="$DirBase/ListRunScriptsO2.txt" +IndexJob=0 DirOutMain="output_o2" +CMDPARALLEL="cd \"$DirOutMain/{}\" && bash \"$DIR_THIS/run_o2.sh\" \"$SCRIPT\" \"$ListIn\" \"$JSON\" \"$LogFile\"" + # Clean before running. -rm -rf "$ListRunScripts" "$FilesToMerge" "$FilesToMergeTree" "$FILEOUT" "$FILEOUT_TREE" "$DirOutMain" || ErrExit "Failed to delete output files." +rm -rf "$FilesToMerge" "$FilesToMergeTree" "$FILEOUT" "$FILEOUT_TREE" "$DirOutMain" || ErrExit "Failed to delete output files." CheckFile "$LISTINPUT" echo "Output directory: $DirOutMain (logfiles: $LogFile)" @@ -48,33 +49,26 @@ while read -r FileIn; do # New job if [ $((IndexFile % NFILESPERJOB)) -eq 0 ]; then mkdir -p $DirOut || ErrExit "Failed to mkdir $DirOut." - FileOut="$DirOut/$FILEOUT" - echo "$FileOut" >> "$DirBase/$FilesToMerge" || ErrExit "Failed to echo to $DirBase/$FilesToMerge." - [ "$FILEOUT_TREE" ] && { - FileOutTree="$DirOut/$FILEOUT_TREE" - echo "$FileOutTree" >> "$DirBase/$FilesToMergeTree" || ErrExit "Failed to echo to $DirBase/$FilesToMergeTree." - } - # Add this job in the list of commands. - echo "cd \"$DirOut\" && bash \"$DIR_THIS/run_o2.sh\" \"$SCRIPT\" \"$ListIn\" \"$JSON\" \"$LogFile\"" >> "$ListRunScripts" || ErrExit "Failed to echo to $ListRunScripts." + echo "$DirOut/$FILEOUT" >> "$FilesToMerge" || ErrExit "Failed to echo to $FilesToMerge." + [ "$FILEOUT_TREE" ] && \ + { echo "$DirOut/$FILEOUT_TREE" >> "$FilesToMergeTree" || ErrExit "Failed to echo to $FilesToMergeTree."; } fi echo "$FileIn" >> "$DirOut/$ListIn" || ErrExit "Failed to echo to $DirOut/$ListIn." [ "$DEBUG" -eq 1 ] && echo "Input file ($IndexFile, job $IndexJob): $FileIn" - ((IndexFile+=1)) + ((IndexFile++)) done < "$LISTINPUT" -CheckFile "$ListRunScripts" -echo "Running O2 jobs... ($(wc -l < "$ListRunScripts") jobs, $NJOBSPARALLEL parallel, $NFILESPERJOB files/job)" +echo "Running O2 jobs... ($((IndexJob+1)) jobs, $NJOBSPARALLEL parallel, $NFILESPERJOB files/job)" OPT_PARALLEL="--halt soon,fail=100% --jobs $NJOBSPARALLEL" if [ "$DEBUG" -eq 0 ]; then # shellcheck disable=SC2086 # Ignore unquoted options. - parallel $OPT_PARALLEL < "$ListRunScripts" > $LogFile 2>&1 + parallel $OPT_PARALLEL "$CMDPARALLEL" ::: $(seq 0 $IndexJob) > $LogFile 2>&1 else # shellcheck disable=SC2086 # Ignore unquoted options. - parallel $OPT_PARALLEL --will-cite --progress < "$ListRunScripts" > $LogFile + parallel $OPT_PARALLEL --will-cite --progress "$CMDPARALLEL" ::: $(seq 0 $IndexJob) > $LogFile fi || ErrExit "\nCheck $(realpath $LogFile)" grep -q "\\[WARN\\]" "$LogFile" && MsgWarn "There were warnings!\nCheck $(realpath $LogFile)" grep -q -e "\\[ERROR\\]" -e "segmentation" "$LogFile" && MsgErr "There were errors!\nCheck $(realpath $LogFile)" -rm -f "$ListRunScripts" || ErrExit "Failed to rm $ListRunScripts." echo "Merging output files... (output file: $FILEOUT, logfile: $LogFile)" hadd $FILEOUT @"$FilesToMerge" >> $LogFile 2>&1 || \ diff --git a/exec/check_spaces.sh b/exec/check_spaces.sh index 39ca7678..654ba83a 100644 --- a/exec/check_spaces.sh +++ b/exec/check_spaces.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Find tabs in text files +# Find tabs and trailing whitespaces in text files # This directory DIR_THIS="$(dirname "$(realpath "$0")")" diff --git a/exec/make_command_o2.py b/exec/make_command_o2.py index 8cfeeb93..bcfe1290 100644 --- a/exec/make_command_o2.py +++ b/exec/make_command_o2.py @@ -88,20 +88,15 @@ def healthy_structure(dic_full: dict): if not isinstance(dic_wf, dict): msg_err('"workflows" is not a dictionary.') return False - # Check mandatory workflow keys. + # Check workflow keys. for wf in dic_wf: dic_wf_single = dic_wf[wf] if not isinstance(dic_wf_single, dict): msg_err("%s is not a dictionary." % wf) return False - good = True - for key in ["activate"]: - if key not in dic_wf_single: - msg_err('Key "%s" not found in workflow %s.' % (key, wf)) - good = False - if not good: - return False - if not isinstance(dic_wf_single["activate"], bool): + if "activate" in dic_wf_single and not isinstance( + dic_wf_single["activate"], bool + ): msg_err('"activate" in workflow %s is not a boolean.' % wf) return False return True @@ -123,7 +118,7 @@ def activate_workflow(wf: str, dic_wf: dict, mc=False, level=0, debug=False): dic_wf_single["activate"] = False return # Activate. - if not dic_wf_single["activate"]: + if "activate" not in dic_wf_single or not dic_wf_single["activate"]: dic_wf_single["activate"] = True # Activate dependencies recursively. if "dependencies" in dic_wf_single: @@ -197,11 +192,13 @@ def main(): # Get list of primary workflows to run. # already activated in the database - list_wf_activated = [wf for wf in dic_wf if dic_wf[wf]["activate"]] + list_wf_activated = [ + wf for wf in dic_wf if "activate" in dic_wf[wf] and dic_wf[wf]["activate"] + ] if debug and list_wf_activated: eprint("\nWorkflows activated in the database:") eprint("\n".join(" " + wf for wf in list_wf_activated)) - # requested at command line + # requested on command line if workflows_add: if debug: eprint("\nWorkflows specified on command line:") @@ -223,7 +220,7 @@ def main(): if save_tables: tables = [] # list of all tables of activated workflows for wf, dic_wf_single in dic_wf.items(): - if not dic_wf_single["activate"]: + if "activate" not in dic_wf_single or not dic_wf_single["activate"]: continue if "tables" not in dic_wf_single: continue @@ -233,6 +230,8 @@ def main(): elif isinstance(tab_wf, dict): if "default" in tab_wf: join_to_list(tab_wf["default"], tables) + if not mc_mode and "real" in tab_wf: + join_to_list(tab_wf["real"], tables) if mc_mode and "mc" in tab_wf: join_to_list(tab_wf["mc"], tables) else: @@ -251,11 +250,23 @@ def main(): command = "" eprint("\nActivated workflows:") for wf, dic_wf_single in dic_wf.items(): - if not dic_wf_single["activate"]: + if "activate" not in dic_wf_single or not dic_wf_single["activate"]: continue msg_bold(" " + wf) - string_wf = wf - # Process options + # Determine the workflow executable. + if "executable" in dic_wf_single: + exec_wf = dic_wf_single["executable"] + if not isinstance(exec_wf, str): + msg_err('"executable" in %s must be str, is %s' % (wf, type(exec_wf))) + sys.exit(1) + string_wf = exec_wf + else: + string_wf = wf + # Detect duplicate workflows. + if string_wf + " " in command: + msg_err("Workflow %s is already present." % string_wf) + sys.exit(1) + # Process options. if "options" in dic_wf_single: opt_wf = dic_wf_single["options"] if isinstance(opt_wf, (str, list)): @@ -263,6 +274,8 @@ def main(): elif isinstance(opt_wf, dict): if "default" in opt_wf: string_wf += " " + join_strings(opt_wf["default"]) + if not mc_mode and "real" in opt_wf: + string_wf += " " + join_strings(opt_wf["real"]) if mc_mode and "mc" in opt_wf: string_wf += " " + join_strings(opt_wf["mc"]) else: @@ -273,12 +286,12 @@ def main(): sys.exit(1) if opt_local: string_wf += " " + opt_local - command += " | " + string_wf + command += "| \\\n" + string_wf + " " if not command: msg_err("Nothing to do!") sys.exit(1) - # Remove the leading " | ". - command = command[3:] + # Remove the leading "| \\\n". + command = command[4:] # Append global options. if opt_global: command += " " + opt_global @@ -299,11 +312,11 @@ def main(): dot += " ranksep=2 // vertical node separation\n" dot += ' node [shape=box, style="filled,rounded", fillcolor=papayawhip, fontname=Courier, fontsize=20]\n' for wf, dic_wf_single in dic_wf.items(): - if not dic_wf_single["activate"]: + if "activate" not in dic_wf_single or not dic_wf_single["activate"]: continue - # hyphens are not allowed in node names + # Hyphens are not allowed in node names. node_wf = wf.replace("-", "_") - # replace hyphens with line breaks to save horizontal space + # Replace hyphens with line breaks to save horizontal space. label_wf = wf.replace("-", "\\n") dot += ' %s [label="%s"]\n' % (node_wf, label_wf) if "dependencies" in dic_wf_single: diff --git a/exec/run_o2.sh b/exec/run_o2.sh index ca690ffe..5d8090a9 100644 --- a/exec/run_o2.sh +++ b/exec/run_o2.sh @@ -10,6 +10,6 @@ bash "$SCRIPT" "$FILEIN" "$JSON" > "$LOGFILE" 2>&1 ExitCode=$? # Show warnings and errors in the log file. -grep -e "\\[WARN\\]" -e "\\[ERROR\\]" -e "segmentation" "$LOGFILE" | sort -u +grep -e "\\[WARN\\]" -e "\\[ERROR\\]" -e "\\[FATAL\\]" -e "segmentation" -e "command not found" -e "Error:" "$LOGFILE" | sort -u exit $ExitCode diff --git a/exec/runtest.sh b/exec/runtest.sh index e4dc5303..c73f223f 100644 --- a/exec/runtest.sh +++ b/exec/runtest.sh @@ -59,8 +59,7 @@ FILEOUT_TREES_O2="AnalysisResults_trees_O2.root" # Steering commands ENVALI="alienv setenv AliPhysics/latest -c" ENVO2="alienv setenv O2/latest -c" -#ENVALIO2="alienv setenv AliPhysics/latest,O2/latest -c" -ENVPOST="$ENVALI" +ENVPOST="alienv setenv ROOT/latest -c" # Step scripts SCRIPT_O2="script_o2.sh" @@ -158,8 +157,6 @@ if [ $DOALI -eq 1 ]; then [ "$O2_ROOT" ] && { MsgWarn "O2 environment is loaded - expect errors!"; } [ "$ALICE_PHYSICS" ] && { MsgWarn "AliPhysics environment is already loaded."; ENVALI=""; } $ENVALI bash "$DIR_EXEC/batch_ali.sh" "$LISTFILES_ALI" "$JSON" "$SCRIPT_ALI" $DEBUG "$NFILESPERJOB_ALI" || exit 1 - # Run the batch script in the ALI+O2 environment. - #$ENVALIO2 bash "$DIR_EXEC/batch_ali.sh" $LISTFILES_ALI $JSON $SCRIPT_ALI $DEBUG || exit 1 mv "$FILEOUT" "$FILEOUT_ALI" || ErrExit "Failed to mv $FILEOUT $FILEOUT_ALI." fi @@ -189,10 +186,9 @@ if [ $DOPOSTPROCESS -eq 1 ]; then MsgStep "Postprocessing... (logfile: $LogFile)" MakeScriptPostprocess || ErrExit "MakeScriptPostprocess failed." CheckFile "$SCRIPT_POSTPROCESS" - [ $DEBUG -eq 1 ] && echo "Loading AliPhysics..." + [ $DEBUG -eq 1 ] && echo "Loading ROOT..." # Run the batch script in the postprocessing environment. - [ "$O2_ROOT" ] && { MsgWarn "O2 environment is loaded - expect errors!"; } - [ "$ALICE_PHYSICS" ] && { MsgWarn "AliPhysics environment is already loaded."; ENVALI=""; } + [ "$ROOTSYS" ] && { MsgWarn "ROOT environment is already loaded."; ENVPOST=""; } $ENVPOST bash "$SCRIPT_POSTPROCESS" "$FILEOUT_O2" "$FILEOUT_ALI" > $LogFile 2>&1 || ErrExit "\nCheck $(realpath $LogFile)" grep -q -e '^'"W-" -e '^'"Warning" -e "warning" "$LogFile" && MsgWarn "There were warnings!\nCheck $(realpath $LogFile)" grep -q -e '^'"E-" -e '^'"Error" "$LogFile" && MsgErr "There were errors!\nCheck $(realpath $LogFile)" From 020d302742512e9b2e1cb7b62ffcd5836c118136 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Sun, 27 Jun 2021 22:49:24 +0200 Subject: [PATCH 30/33] Add ALICE3 switch (#269) --- codeHF/config_input.sh | 6 ++++++ codeHF/config_tasks.sh | 20 +++++++++++++++----- codeHF/workflows.yml | 13 ++++++++++--- exec/runtest.sh | 1 + 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/codeHF/config_input.sh b/codeHF/config_input.sh index 1ee0ffb4..af4539e4 100644 --- a/codeHF/config_input.sh +++ b/codeHF/config_input.sh @@ -57,6 +57,7 @@ case $INPUT_CASE in INPUT_FILES="AODRun5.*.root" JSON="$JSONRUN5_HF" ISINPUTO2=1 + ISALICE3=1 ISMC=1;; 8) INPUT_LABEL="Run 5, p-p MC 14 TeV Inel, Scenario 3, onia analysis" @@ -64,6 +65,7 @@ case $INPUT_CASE in INPUT_FILES="AODRun5.*.root" JSON="$JSONRUN5_ONIAX" ISINPUTO2=1 + ISALICE3=1 ISMC=1;; 9) INPUT_LABEL="Run 5, p-p MC 14 TeV OniaX-enriched, Scenario 3, oniaX analysis" @@ -71,6 +73,7 @@ case $INPUT_CASE in INPUT_FILES="AODRun5.*.root" JSON="$JSONRUN5_ONIAX" ISINPUTO2=1 + ISALICE3=1 ISMC=1;; 10) INPUT_LABEL="Run 5, p-p MC 14 TeV LctopKpi-enriched, Scenario 3, HF analysis" @@ -78,6 +81,7 @@ case $INPUT_CASE in INPUT_FILES="AODRun5.*.root" JSON="$JSONRUN5_HF" ISINPUTO2=1 + ISALICE3=1 ISMC=1;; 11) INPUT_LABEL="Run 5, Kr-Kr MC 6.460 TeV Inel, Scenario 3, HF analysis" @@ -85,6 +89,7 @@ case $INPUT_CASE in INPUT_FILES="AODRun5.*.root" JSON="$JSONRUN5_HF" ISINPUTO2=1 + ISALICE3=1 ISMC=1;; 12) INPUT_LABEL="Run 5, p-p MC 14 TeV OniaX-enriched, Scenario 3, oniaX analysis MUON ID" @@ -92,5 +97,6 @@ case $INPUT_CASE in INPUT_FILES="AODRun5.*.root" JSON="$JSONRUN5_ONIAX" ISINPUTO2=1 + ISALICE3=1 ISMC=1;; esac diff --git a/codeHF/config_tasks.sh b/codeHF/config_tasks.sh index 1fc131bd..f0a4dc8a 100644 --- a/codeHF/config_tasks.sh +++ b/codeHF/config_tasks.sh @@ -157,6 +157,8 @@ function MakeScriptO2 { [ $DOO2_CASC -eq 1 ] && SUFFIX_CASC="-v0" || SUFFIX_CASC="" # Event selection [ $DOO2_EVSEL -eq 1 ] && SUFFIX_EVSEL="-evsel" || SUFFIX_EVSEL="" + # ALICE 3 input + [ "$ISALICE3" -eq 1 ] && SUFFIX_ALICE3="-alice3" || SUFFIX_ALICE3="" WORKFLOWS="" # QA @@ -169,15 +171,16 @@ function MakeScriptO2 { [ $DOO2_PID_TOF -eq 1 ] && WORKFLOWS+=" o2-analysis-pid-tof-full" [ $DOO2_PID_TOF_QA -eq 1 ] && WORKFLOWS+=" o2-analysis-pid-tof-qa-mc" # Vertexing - WF_SKIM="o2-analysis-hf-track-index-skims-creator${SUFFIX_EVSEL}${SUFFIX_CASC}" - [ $DOO2_SKIM -eq 1 ] && WORKFLOWS+=" $WF_SKIM" + WF_SKIM="o2-analysis-hf-track-index-skims-creator" + [ $DOO2_SKIM -eq 1 ] && WORKFLOWS+=" ${WF_SKIM}${SUFFIX_EVSEL}${SUFFIX_CASC}" [ $DOO2_CAND_2PRONG -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-candidate-creator-2prong" [ $DOO2_CAND_3PRONG -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-candidate-creator-3prong" [ $DOO2_CAND_X -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-candidate-creator-x" [ $DOO2_CAND_CASC -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-candidate-creator-cascade" # Selectors [ $DOO2_SEL_D0 -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-d0-candidate-selector" - [ $DOO2_SEL_JPSI -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-jpsi-candidate-selector" + WF_SEL_JPSI="o2-analysis-hf-jpsi-candidate-selector" + [ $DOO2_SEL_JPSI -eq 1 ] && WORKFLOWS+=" ${WF_SEL_JPSI}${SUFFIX_ALICE3}" [ $DOO2_SEL_DPLUS -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-dplus-topikpi-candidate-selector" [ $DOO2_SEL_LC -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-lc-candidate-selector" [ $DOO2_SEL_XIC -eq 1 ] && WORKFLOWS+=" o2-analysis-hf-xic-topkpi-candidate-selector" @@ -205,13 +208,20 @@ function MakeScriptO2 { # Make a copy of the default workflow database file before modifying it. DATABASE_O2_EDIT="" - if [[ $DOO2_EVSEL -eq 1 || $DOO2_CASC -eq 1 ]]; then + if [[ $DOO2_EVSEL -eq 1 || $DOO2_CASC -eq 1 || "$ISALICE3" -eq 1 ]]; then DATABASE_O2_EDIT="${DATABASE_O2/.yml/_edit.yml}" cp "$DATABASE_O2" "$DATABASE_O2_EDIT" || ErrExit "Failed to cp $DATABASE_O2 $DATABASE_O2_EDIT." DATABASE_O2="$DATABASE_O2_EDIT" + # Adjust workflow database in case of ALICE 3 input. + [ "$ISALICE3" -eq 1 ] && { + ReplaceString "- $WF_SEL_JPSI" "- ${WF_SEL_JPSI}${SUFFIX_ALICE3}" "$DATABASE_O2" || ErrExit "Failed to edit $DATABASE_O2." + } + # Adjust workflow database in case of event selection or cascades enabled. - ReplaceString "- o2-analysis-hf-track-index-skims-creator" "- $WF_SKIM" "$DATABASE_O2" || ErrExit "Failed to edit $DATABASE_O2." + [[ $DOO2_EVSEL -eq 1 || $DOO2_CASC -eq 1 ]] && { + ReplaceString "- $WF_SKIM" "- ${WF_SKIM}${SUFFIX_EVSEL}${SUFFIX_CASC}" "$DATABASE_O2" || ErrExit "Failed to edit $DATABASE_O2." + } fi # Generate the O2 command. diff --git a/codeHF/workflows.yml b/codeHF/workflows.yml index 245ff11a..2d92d0bf 100644 --- a/codeHF/workflows.yml +++ b/codeHF/workflows.yml @@ -69,7 +69,8 @@ workflows: o2-analysis-hf-candidate-creator-x: <<: *cand_creator - dependencies: o2-analysis-hf-jpsi-candidate-selector + dependencies: + - o2-analysis-hf-jpsi-candidate-selector tables: default: [HFCANDXBASE, HFCANDXEXT] mc: [HFCANDXMCREC, HFCANDXMCGEN] @@ -80,10 +81,15 @@ workflows: dependencies: [o2-analysis-hf-candidate-creator-2prong, o2-analysis-pid-tpc-full, o2-analysis-pid-tof-full] tables: HFSELD0CAND - o2-analysis-hf-jpsi-candidate-selector: + o2-analysis-hf-jpsi-candidate-selector: &selector_jpsi <<: *selector_2prong + executable: o2-analysis-hf-jpsi-candidate-selector tables: HFSELJPSICAND + o2-analysis-hf-jpsi-candidate-selector-alice3: + <<: *selector_jpsi + options: --isAlice3 + o2-analysis-hf-dplus-topikpi-candidate-selector: &selector_3prong dependencies: [o2-analysis-hf-candidate-creator-3prong, o2-analysis-pid-tpc-full, o2-analysis-pid-tof-full] tables: HFSELDPLUSCAND @@ -112,7 +118,8 @@ workflows: o2-analysis-hf-task-jpsi: <<: *task - dependencies: o2-analysis-hf-jpsi-candidate-selector + dependencies: + - o2-analysis-hf-jpsi-candidate-selector o2-analysis-hf-task-dplus: <<: *task diff --git a/exec/runtest.sh b/exec/runtest.sh index c73f223f..465fb9d3 100644 --- a/exec/runtest.sh +++ b/exec/runtest.sh @@ -25,6 +25,7 @@ INPUT_FILES="AliESDs.root" # Input file pattern JSON="dpl-config.json" # Tasks parameters ISINPUTO2=0 # Input files are in O2 format. ISMC=0 # Input files are MC data. +ISALICE3=0 # Input data from the ALICE 3 detectors. TRIGGERSTRINGRUN2="" # Run 2 trigger (not used) TRIGGERBITRUN3=-1 # Run 3 trigger (not used) NFILESMAX=1 # Maximum number of processed input files. (Set to -0 to process all; to -N to process all but the last N files.) From c26429a220badd8c2a1a8710c466addbd4f3a3e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Tue, 20 Jul 2021 22:44:59 +0200 Subject: [PATCH 31/33] Fixes --- FirstAnalysis/distrib_studies.py | 2 +- codeHF/config_input.sh | 2 +- codeHF/dpl-config_run3.json | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/FirstAnalysis/distrib_studies.py b/FirstAnalysis/distrib_studies.py index ab279741..294ec1b5 100644 --- a/FirstAnalysis/distrib_studies.py +++ b/FirstAnalysis/distrib_studies.py @@ -22,7 +22,7 @@ def distr_studies(hadron="Xi_cc", collision="pp14p0", yrange="absy1p44"): Make distribution comparisons """ with open(r"database.yaml") as database: - param = yaml.load(database, Loader=yaml.FullLoader) + param = yaml.safe_load(database) latexcand = param[hadron][collision][yrange]["latexcand"] inputBkg = param[hadron][collision][yrange]["inputBkg"] inputSig = param[hadron][collision][yrange]["inputSig"] diff --git a/codeHF/config_input.sh b/codeHF/config_input.sh index af4539e4..5d49fc91 100644 --- a/codeHF/config_input.sh +++ b/codeHF/config_input.sh @@ -4,7 +4,7 @@ # Input specification for runtest.sh # (Modifies input parameters.) -INPUT_CASE=8 # Input case +INPUT_CASE=2 # Input case NFILESMAX=1 # Maximum number of processed input files. (Set to -0 to process all; to -N to process all but the last N files.) diff --git a/codeHF/dpl-config_run3.json b/codeHF/dpl-config_run3.json index 26138c87..8c1a76e1 100644 --- a/codeHF/dpl-config_run3.json +++ b/codeHF/dpl-config_run3.json @@ -409,7 +409,6 @@ ] } }, - "hf-task-d0": { "cutYCandMax": "0.8", "d_selectionFlagD0": "0", From 5e6878276c7c0caeaa2a10b00b7859c1091fb797 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Wed, 21 Jul 2021 17:37:28 +0200 Subject: [PATCH 32/33] Add Jpsi -> mumu preselection cuts in JSON --- codeHF/dpl-config_run3.json | 14 ++++++++++++++ codeHF/dpl-config_run5_hf.json | 14 ++++++++++++++ codeHF/dpl-config_run5_oniaX.json | 14 ++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/codeHF/dpl-config_run3.json b/codeHF/dpl-config_run3.json index 8c1a76e1..18b22624 100644 --- a/codeHF/dpl-config_run3.json +++ b/codeHF/dpl-config_run3.json @@ -89,6 +89,20 @@ ] }, + "pTBinsJpsiToMuMu": { + "values": [ + "0.", + "5.", + "1000." + ] + }, + "cutsJpsiToMuMu": { + "values": [ + ["2.5", "4.1", "-2.", "1000.00"], + ["2.5", "4.1", "-2.", "1000.00"] + ] + }, + "pTBinsDPlusToPiKPi": { "values": [ "1.", diff --git a/codeHF/dpl-config_run5_hf.json b/codeHF/dpl-config_run5_hf.json index 072a4a3b..173a0a0b 100644 --- a/codeHF/dpl-config_run5_hf.json +++ b/codeHF/dpl-config_run5_hf.json @@ -89,6 +89,20 @@ ] }, + "pTBinsJpsiToMuMu": { + "values": [ + "0.", + "5.", + "1000." + ] + }, + "cutsJpsiToMuMu": { + "values": [ + ["2.5", "4.1", "-2.", "1000.00"], + ["2.5", "4.1", "-2.", "1000.00"] + ] + }, + "pTBinsDPlusToPiKPi": { "values": [ "2.", diff --git a/codeHF/dpl-config_run5_oniaX.json b/codeHF/dpl-config_run5_oniaX.json index e7755073..40c5962c 100644 --- a/codeHF/dpl-config_run5_oniaX.json +++ b/codeHF/dpl-config_run5_oniaX.json @@ -89,6 +89,20 @@ ] }, + "pTBinsJpsiToMuMu": { + "values": [ + "0.", + "5.", + "1000." + ] + }, + "cutsJpsiToMuMu": { + "values": [ + ["2.5", "4.1", "-2.", "1000.00"], + ["2.5", "4.1", "-2.", "1000.00"] + ] + }, + "pTBinsDPlusToPiKPi": { "values": [ "2.", From b6a9dffb7e66a3bf391dbc4e23f39dee57265a5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Wed, 21 Jul 2021 20:06:08 +0200 Subject: [PATCH 33/33] Fix missing columns in JSON --- codeHF/dpl-config_run3.json | 36 +++++++++++++++++----------------- codeHF/dpl-config_run5_hf.json | 36 +++++++++++++++++----------------- 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/codeHF/dpl-config_run3.json b/codeHF/dpl-config_run3.json index 18b22624..52a36037 100644 --- a/codeHF/dpl-config_run3.json +++ b/codeHF/dpl-config_run3.json @@ -373,15 +373,15 @@ }, "Jpsi_to_ee_cuts": { "values": [ - ["0.5", "0.2", "0.4", "1"], - ["0.5", "0.2", "0.4", "1"], - ["0.5", "0.2", "0.4", "1"], - ["0.5", "0.2", "0.4", "1"], - ["0.5", "0.2", "0.4", "1"], - ["0.5", "0.2", "0.4", "1"], - ["0.5", "0.2", "0.4", "1"], - ["0.5", "0.2", "0.4", "1"], - ["0.5", "0.2", "0.4", "1"] + ["0.5", "0.2", "0.4", "0.5", "1."], + ["0.5", "0.2", "0.4", "0.5", "1."], + ["0.5", "0.2", "0.4", "0.5", "1."], + ["0.5", "0.2", "0.4", "0.5", "1."], + ["0.5", "0.2", "0.4", "0.5", "1."], + ["0.5", "0.2", "0.4", "0.5", "1."], + ["0.5", "0.2", "0.4", "0.5", "1."], + ["0.5", "0.2", "0.4", "0.5", "1."], + ["0.5", "0.2", "0.4", "0.5", "1."] ] } }, @@ -411,15 +411,15 @@ }, "X_to_jpsipipi_cuts": { "values": [ - ["0.5", "0.80", "0.001", "0.001", "0.0", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "0.0", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "0.2", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "0.9", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "1.5", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "2.3", "0.15"], - ["0.5", "0.90", "0.001", "0.001", "3.0", "0.15"], - ["0.5", "0.90", "0.001", "0.001", "4.2", "0.15"], - ["0.5", "0.90", "0.001", "0.001", "6.2", "0.15"] + ["0.5", "0.80", "0.001", "0.001", "0.0", "0.15", "1."], + ["0.5", "0.80", "0.001", "0.001", "0.0", "0.15", "1."], + ["0.5", "0.80", "0.001", "0.001", "0.2", "0.15", "1."], + ["0.5", "0.80", "0.001", "0.001", "0.9", "0.15", "1."], + ["0.5", "0.80", "0.001", "0.001", "1.5", "0.15", "1."], + ["0.5", "0.80", "0.001", "0.001", "2.3", "0.15", "1."], + ["0.5", "0.90", "0.001", "0.001", "3.0", "0.15", "1."], + ["0.5", "0.90", "0.001", "0.001", "4.2", "0.15", "1."], + ["0.5", "0.90", "0.001", "0.001", "6.2", "0.15", "1."] ] } }, diff --git a/codeHF/dpl-config_run5_hf.json b/codeHF/dpl-config_run5_hf.json index 173a0a0b..650254b3 100644 --- a/codeHF/dpl-config_run5_hf.json +++ b/codeHF/dpl-config_run5_hf.json @@ -379,15 +379,15 @@ }, "Jpsi_to_ee_cuts": { "values": [ - ["0.5", "0.2", "0.4", "1"], - ["0.5", "0.2", "0.4", "1"], - ["0.5", "0.2", "0.4", "1"], - ["0.5", "0.2", "0.4", "1"], - ["0.5", "0.2", "0.4", "1"], - ["0.5", "0.2", "0.4", "1"], - ["0.5", "0.2", "0.4", "1"], - ["0.5", "0.2", "0.4", "1"], - ["0.5", "0.2", "0.4", "1"] + ["0.5", "0.2", "0.4", "0.5", "1."], + ["0.5", "0.2", "0.4", "0.5", "1."], + ["0.5", "0.2", "0.4", "0.5", "1."], + ["0.5", "0.2", "0.4", "0.5", "1."], + ["0.5", "0.2", "0.4", "0.5", "1."], + ["0.5", "0.2", "0.4", "0.5", "1."], + ["0.5", "0.2", "0.4", "0.5", "1."], + ["0.5", "0.2", "0.4", "0.5", "1."], + ["0.5", "0.2", "0.4", "0.5", "1."] ] } }, @@ -417,15 +417,15 @@ }, "X_to_jpsipipi_cuts": { "values": [ - ["0.5", "0.80", "0.001", "0.001", "0.0", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "0.0", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "0.2", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "0.9", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "1.5", "0.15"], - ["0.5", "0.80", "0.001", "0.001", "2.3", "0.15"], - ["0.5", "0.90", "0.001", "0.001", "3.0", "0.15"], - ["0.5", "0.90", "0.001", "0.001", "4.2", "0.15"], - ["0.5", "0.90", "0.001", "0.001", "6.2", "0.15"] + ["0.5", "0.80", "0.001", "0.001", "0.0", "0.15", "1."], + ["0.5", "0.80", "0.001", "0.001", "0.0", "0.15", "1."], + ["0.5", "0.80", "0.001", "0.001", "0.2", "0.15", "1."], + ["0.5", "0.80", "0.001", "0.001", "0.9", "0.15", "1."], + ["0.5", "0.80", "0.001", "0.001", "1.5", "0.15", "1."], + ["0.5", "0.80", "0.001", "0.001", "2.3", "0.15", "1."], + ["0.5", "0.90", "0.001", "0.001", "3.0", "0.15", "1."], + ["0.5", "0.90", "0.001", "0.001", "4.2", "0.15", "1."], + ["0.5", "0.90", "0.001", "0.001", "6.2", "0.15", "1."] ] } },