16 #include "AliAnalysisManager.h"
17 #include "AliVEventHandler.h"
18 #include "AliMCEventHandler.h"
48 fReconstructed.Set(reco);
56 fGenerated.Set(truth);
69 fReconstructed.Reset();
77 fReconstructed.Set(reco);
85 fGenerated.Set(truth);
99 fMaxJetDmesonDistance(0),
103 fCurrentJetInfoReco(0),
104 fCurrentJetInfoTruth(0),
117 fCandidateType(type),
119 fMaxJetDmesonDistance(1),
123 fCurrentJetInfoReco(0),
124 fCurrentJetInfoTruth(0),
137 fCandidateType(source.fCandidateType),
138 fInhibit(source.fInhibit),
139 fMaxJetDmesonDistance(1),
143 fCurrentJetInfoReco(0),
144 fCurrentJetInfoTruth(0),
145 fDataSlotNumber(source.fDataSlotNumber),
146 fRecontructed(source.fRecontructed),
147 fGenerated(source.fGenerated)
165 fInhibit = (fRecontructed == 0 || fGenerated == 0);
166 fName = fRecontructed->GetCandidateName();
183 switch (fCandidateType) {
186 classname =
"AliAnalysisTaskDmesonJetsDetectorResponse::AliD0MatchInfoSummary";
190 classname =
"AliAnalysisTaskDmesonJetsDetectorResponse::AliDStarMatchInfoSummary";
194 TString treeName = TString::Format(
"%s_%s", taskName, GetName());
195 fTree =
new TTree(treeName, treeName);
196 fTree->Branch(
"DmesonJet", classname, &fCurrentDmeson);
198 fCurrentJetInfoTruth =
new AliJetInfoSummary*[fGenerated->GetJetDefinitions().size()];
199 for (
Int_t i = 0; i < fGenerated->GetJetDefinitions().size(); i++) {
200 if (fGenerated->GetJetDefinitions()[i].GetRhoName().IsNull()) {
202 TString bname = TString::Format(
"%s_truth", fGenerated->GetJetDefinitions()[i].GetName());
203 fTree->Branch(bname,
"AliAnalysisTaskDmesonJets::AliJetInfoSummary", &fCurrentJetInfoTruth[i]);
207 TString bname = TString::Format(
"%s_truth", fGenerated->GetJetDefinitions()[i].GetName());
208 fTree->Branch(bname,
"AliAnalysisTaskDmesonJets::AliJetInfoPbPbSummary", &fCurrentJetInfoTruth[i]);
212 fCurrentJetInfoReco =
new AliJetInfoSummary*[fRecontructed->GetJetDefinitions().size()];
213 for (
Int_t i = 0; i < fRecontructed->GetJetDefinitions().size(); i++) {
214 if (fGenerated->GetJetDefinitions()[i].GetRhoName().IsNull()) {
216 TString bname = TString::Format(
"%s_reco", fRecontructed->GetJetDefinitions()[i].GetName());
217 fTree->Branch(bname,
"AliAnalysisTaskDmesonJets::AliJetInfoSummary", &fCurrentJetInfoReco[i]);
221 TString bname = TString::Format(
"%s_reco", fRecontructed->GetJetDefinitions()[i].GetName());
222 fTree->Branch(bname,
"AliAnalysisTaskDmesonJets::AliJetInfoPbPbSummary", &fCurrentJetInfoReco[i]);
235 fRecontructed->FillQA(applyKinCuts);
236 fGenerated->FillQA(applyKinCuts);
238 std::map<int, AliDmesonJetInfo>& recoDmesons = fRecontructed->GetDmesons();
239 std::map<int, AliDmesonJetInfo>& truthDmesons = fGenerated->GetDmesons();
242 for (
auto& dmeson_reco : recoDmesons) {
244 fCurrentDmeson->Reset();
245 for (
UInt_t ij = 0; ij < fRecontructed->GetJetDefinitions().size(); ij++) {
246 fCurrentJetInfoReco[ij]->Reset();
248 for (
UInt_t ij = 0; ij < fGenerated->GetJetDefinitions().size(); ij++) {
249 fCurrentJetInfoTruth[ij]->Reset();
253 fCurrentDmeson->SetReconstructed(dmeson_reco.second);
255 Int_t accRecJets = 0;
256 Int_t accGenJets = 0;
259 for (
UInt_t ij = 0; ij < fRecontructed->GetJetDefinitions().size(); ij++) {
260 AliJetInfo* jet = dmeson_reco.second.GetJet(fRecontructed->GetJetDefinitions()[ij].GetName());
262 if (applyKinCuts && !fRecontructed->GetJetDefinitions()[ij].IsJetInAcceptance(*jet))
continue;
263 fCurrentJetInfoReco[ij]->Set(dmeson_reco.second, fRecontructed->GetJetDefinitions()[ij].GetName());
268 if (dmeson_reco.second.fMCLabel >= 0) {
269 std::map<int, AliDmesonJetInfo>::iterator it = truthDmesons.find(dmeson_reco.second.fMCLabel);
270 if (it != truthDmesons.end()) {
271 std::pair<const int, AliDmesonJetInfo>& dmeson_truth = (*it);
273 dmeson_truth.second.fReconstructed = kTRUE;
275 fCurrentDmeson->SetGenerated((*it).second);
278 for (
UInt_t ij = 0; ij < fGenerated->GetJetDefinitions().size(); ij++) {
279 AliJetInfo* jet = dmeson_truth.second.GetJet(fGenerated->GetJetDefinitions()[ij].GetName());
281 if (!applyKinCuts || fGenerated->GetJetDefinitions()[ij].IsJetInAcceptance(*jet)) accGenJets++;
282 fCurrentJetInfoTruth[ij]->Set(dmeson_truth.second, fGenerated->GetJetDefinitions()[ij].GetName());
288 if (accRecJets > 0 || accGenJets > 0) fTree->Fill();
292 for (
UInt_t ij = 0; ij < fRecontructed->GetJetDefinitions().size(); ij++) fCurrentJetInfoReco[ij]->Reset();
293 for (
UInt_t ij = 0; ij < fGenerated->GetJetDefinitions().size(); ij++) fCurrentJetInfoTruth[ij]->Reset();
296 for (
auto& dmeson_truth : truthDmesons) {
298 fCurrentDmeson->Reset();
300 if (dmeson_truth.second.fReconstructed)
continue;
302 fCurrentDmeson->SetGenerated(dmeson_truth.second);
304 Int_t accRecJets = 0;
305 Int_t accGenJets = 0;
308 for (
UInt_t ij = 0; ij < fGenerated->GetJetDefinitions().size(); ij++) {
309 fCurrentJetInfoTruth[ij]->Reset();
310 AliJetInfo* jet = dmeson_truth.second.GetJet(fGenerated->GetJetDefinitions()[ij].GetName());
312 if (applyKinCuts && !fGenerated->GetJetDefinitions()[ij].IsJetInAcceptance(*jet))
continue;
313 fCurrentJetInfoTruth[ij]->Set(dmeson_truth.second, fGenerated->GetJetDefinitions()[ij].GetName());
318 if (accRecJets > 0 || accGenJets > 0) fTree->Fill();
351 ::Info(
"UserCreateOutputObjects",
"CreateOutputObjects of task %s", GetName());
356 if (param.IsInhibit())
continue;
359 std::map<ECandidateType_t, ResponseEngine>::iterator it =
fResponseEngines.find(param.GetCandidateType());
362 it = (
fResponseEngines.insert(std::pair<const ECandidateType_t, ResponseEngine>(param.GetCandidateType(),
ResponseEngine(param.GetCandidateType())))).first;
365 if (param.GetMCMode() ==
kMCTruth) {
366 (*it).second.SetGeneratedAnalysisEngine(¶m);
369 (*it).second.SetReconstructedAnalysisEngine(¶m);
376 if (!resp.second.CheckInit())
continue;
378 resp.second.BuildTree(GetName());
380 resp.second.AssignDataSlot(treeSlot+2);
385 AliError(Form(
"Number of data output slots %d not sufficient. Tree of response engine %s will not be posted!",
fNOutputTrees, resp.second.GetName()));
411 if (resp.second.IsInhibit())
continue;
429 AliWarning(
"This class only provides a tree output.");
465 ::Error(
"AddTaskDmesonJetsDetectorResponse",
"No analysis manager to connect to.");
470 AliVEventHandler* handler = mgr->GetInputEventHandler();
472 ::Error(
"AddTaskDmesonJetsDetectorResponse",
"This task requires an input event handler");
478 if (handler->InheritsFrom(
"AliESDInputHandler")) {
481 else if (handler->InheritsFrom(
"AliAODInputHandler")) {
486 if (trackName ==
"usedefault") {
487 if (dataType ==
kESD) {
488 trackName =
"Tracks";
490 else if (dataType ==
kAOD) {
491 trackName =
"tracks";
498 if (clusName ==
"usedefault") {
499 if (dataType ==
kESD) {
500 clusName =
"CaloClusters";
502 else if (dataType ==
kAOD) {
503 clusName =
"caloClusters";
510 if (mcPartName ==
"usedefault") {
511 mcPartName =
"mcparticles";
514 TString name(
"AliAnalysisTaskDmesonJetsDetectorResponse");
515 if (!suffix.IsNull()) {
516 name += TString::Format(
"_%s", suffix.Data());
521 if (!trackName.IsNull()) {
526 if (!mcPartName.IsNull()) {
528 partCont->SetEtaLimits(-1.5, 1.5);
529 partCont->SetPtLimits(0, 1000);
536 mgr->AddTask(jetTask);
539 AliAnalysisDataContainer* cinput1 = mgr->GetCommonInputContainer();
541 contname1 +=
"_histos";
542 AliAnalysisDataContainer* coutput1 = mgr->CreateContainer(contname1.Data(),
543 TList::Class(), AliAnalysisManager::kOutputContainer,
544 Form(
"%s", AliAnalysisManager::GetCommonFileName()));
546 mgr->ConnectInput(jetTask, 0, cinput1);
547 mgr->ConnectOutput(jetTask, 1, coutput1);
549 for (
Int_t i = 0; i < nMaxTrees; i++) {
550 TString contname = TString::Format(
"%s_tree_%d", name.Data(), i);
551 AliAnalysisDataContainer *coutput = mgr->CreateContainer(contname.Data(),
552 TTree::Class(),AliAnalysisManager::kOutputContainer,
553 Form(
"%s", AliAnalysisManager::GetCommonFileName()));
554 mgr->ConnectOutput(jetTask, 2+i, coutput);
virtual void SetGenerated(const AliDmesonJetInfo &truth)
AliClusterContainer * AddClusterContainer(std::string branchName, std::string contName="")
std::list< AnalysisEngine > fAnalysisEngines
Array of analysis parameters.
static AliAnalysisTaskDmesonJetsDetectorResponse * AddTaskDmesonJetsDetectorResponse(TString trackName, TString clusName, TString mcPartName, Int_t nMaxTrees, TString suffix)
Int_t PostDataFromResponseEngine(const ResponseEngine &eng)
Analysis task for D meson jets.
Lightweight class that encapsulates matching between reconstructed and generated D0 mesons...
virtual void Reset()
Reset the object.
EDataType_t
Switch for the data type.
Analysis task used to build a detector response for D meson jets.
Bool_t FillTree(Bool_t applyKinCuts)
Lightweight class that encapsulates D meson jets.
AliHFAODMCParticleContainer * fMCContainer
! MC particle container
AliD0InfoSummary fReconstructed
Reconstructed D meson.
std::map< ECandidateType_t, ResponseEngine > fResponseEngines
! Response engines
virtual void SetReconstructed(const AliDmesonJetInfo &reco)
Analysis engine to produce detector response matrix in the D meson jet analysis.
virtual void UserCreateOutputObjects()
Creates the output containers.
void FillPartonLevelHistograms()
Fill histograms with parton-level information.
virtual void Reset()
Reset the object.
virtual void Reset()
Reset the object.
virtual void UserCreateOutputObjects()
Creates the output containers.
TTree * BuildTree(const char *taskName)
AliAnalysisTaskDmesonJetsDetectorResponse()
This is the default constructor, used for ROOT I/O purposes.
Lightweight class that encapsulates matching between reconstructed and generated D mesons...
Select tracks based on specific prescriptions of HF analysis.
Lightweight class that encapsulates D meson jets for PbPb analysis.
virtual void SetReconstructed(const AliDmesonJetInfo &reco)
ResponseEngine()
Default constructor, for ROOT I/O.
Select MC particles based on specific prescriptions of HF analysis.
Lightweight class that encapsulates matching between reconstructed and generated D* mesons...
ClassImp(AliAnalysisTaskDeltaPt) AliAnalysisTaskDeltaPt
virtual void SetOutputTypeInternal(EOutputType_t b)
ResponseEngine & operator=(const ResponseEngine &source)
AliDmesonMCInfoSummary fGenerated
Generated D meson.
Int_t GetDataSlotNumber() const
Class that encapsulates jets.
Bool_t fApplyKinematicCuts
Apply jet kinematic cuts.
virtual void Reset()
Reset the object.
EOutputType_t fOutputType
Output type: none, TTree or THnSparse.
Int_t fNOutputTrees
Maximum number of output trees.
Container for MC-true particles within the EMCAL framework.
virtual Bool_t FillHistograms()
void AdoptParticleContainer(AliParticleContainer *cont)
void RunAnalysis()
Run the requested analysis for the current event.
virtual void SetGenerated(const AliDmesonJetInfo &truth)