2 #include "TClonesArray.h"
3 #include "TLorentzVector.h"
8 #include "AliAnalysisTask.h"
9 #include "AliAnalysisManager.h"
11 #include "AliESDEvent.h"
12 #include "AliESDInputHandler.h"
13 #include "AliESDMuonTrack.h"
15 #include "AliMCEventHandler.h"
16 #include "AliMCEvent.h"
18 #include "AliAnalysisTaskRecoCheck.h"
20 #include "AliMUONTrackLight.h"
21 #include "AliMUONPairLight.h"
22 #include "AliMUONVTrackStore.h"
23 #include "AliMUONTrack.h"
24 #include "AliMUONESDInterface.h"
25 #include "AliMUONRecoCheck.h"
27 // analysis task for decoding reconstructed tracks and kinematics (AliMUONRecoCheck)
28 // Authors: Bogdan Vulpescu
30 ClassImp(AliAnalysisTaskRecoCheck)
32 //________________________________________________________________________
33 AliAnalysisTaskRecoCheck::AliAnalysisTaskRecoCheck(const char *name)
34 : AliAnalysisTask(name, ""), fESDEvent(0), fTree(0), fArray1Mu(0), fArray2Mu(0), fL3Current(30000.0)
38 // Define input and output slots here
39 // Input slot #0 works with a TChain
40 DefineInput(0, TChain::Class());
41 // Output slot #0 writes into a TTree container
42 DefineOutput(0, TTree::Class());
46 //________________________________________________________________________
47 void AliAnalysisTaskRecoCheck::ConnectInputData(Option_t *)
49 // Connect ESD or AOD here
52 TTree* tree = dynamic_cast<TTree*> (GetInputData(0));
54 Printf("ERROR: Could not read chain from input slot 0");
56 tree->SetBranchStatus("*", kFALSE);
57 tree->SetBranchStatus("MuonTracks.*", kTRUE);
58 tree->SetBranchStatus("AliESDHeader.*", kTRUE);
60 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
63 Printf("ERROR: Could not get ESDInputHandler");
65 fESDEvent = esdH->GetEvent();
70 //________________________________________________________________________
71 void AliAnalysisTaskRecoCheck::CreateOutputObjects()
73 // Create output tree with branches of arrays
76 fArray1Mu = new TClonesArray("AliMUONTrackLight",0);
77 fArray2Mu = new TClonesArray("AliMUONPairLight",0);
78 fTree = new TTree("tree","tree",0);
79 fTree->Branch("muons", &fArray1Mu);
80 fTree->Branch("dimuons",&fArray2Mu);
81 fTree->SetDirectory(0);
85 //________________________________________________________________________
86 void AliAnalysisTaskRecoCheck::Exec(Option_t *)
89 // Called for each event
91 // Process MC truth, therefore we receive the AliAnalysisManager and ask it for the AliMCEventHandler
92 // This handler can return the current MC event
94 Int_t nTracks = fESDEvent->GetNumberOfMuonTracks();
95 if (nTracks == 0) return;
97 AliMCEventHandler* eventHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
99 Printf("ERROR: Could not retrieve MC event handler");
103 AliMCEvent* mcEvent = eventHandler->MCEvent();
105 Printf("ERROR: Could not retrieve MC event");
114 AliMUONRecoCheck *rc = new AliMUONRecoCheck(fESDEvent, eventHandler);
116 AliMUONVTrackStore* trackRefs = rc->TrackRefs(-1);
117 AliStack* pstack = mcEvent->Stack();
119 // loop over ESD tracks
120 Int_t nreftracks = 0;
121 for (Int_t iTrack = 0; iTrack < nTracks; iTrack++) {
123 AliESDMuonTrack* esdTrack = fESDEvent->GetMuonTrack(iTrack);
126 if (!esdTrack->ContainTrackerData()) continue;
128 // convert ESD track to MUON track (without recomputing track parameters at each clusters)
129 AliMUONTrack muonTrack;
130 AliMUONESDInterface::ESDToMUON(*esdTrack, muonTrack, kFALSE);
132 // try to match the reconstructed track with a simulated one
133 Int_t nMatchClusters = 0;
134 AliMUONTrack* matchedTrackRef = rc->FindCompatibleTrack(muonTrack, *trackRefs, nMatchClusters, kFALSE, 10.);
136 if (matchedTrackRef) {
138 //store new referenced track in the muonArray with parameters from the reconstructed tracks
139 AliMUONTrackLight* muLight = new ((*fArray1Mu)[nreftracks++]) AliMUONTrackLight(esdTrack);
141 // store further information related to the simulated track
142 muLight->SetTrackPythiaLine(matchedTrackRef->GetUniqueID());
143 TParticle *part = pstack->Particle(matchedTrackRef->GetUniqueID());
144 muLight->SetTrackPDGCode(part->GetPdgCode());
145 v.SetPxPyPzE(part->Px(), part->Py(), part->Pz(), part->Energy());
147 muLight->FillMuonHistory(pstack, part);
153 // now loop over muon pairs to build dimuons
154 Int_t nmuons = fArray1Mu->GetEntriesFast();
156 for(Int_t itrRec1 = 0; itrRec1 < nmuons-1; itrRec1++) {
157 AliMUONTrackLight* mu1 = (AliMUONTrackLight*) fArray1Mu->At(itrRec1);
158 for(Int_t itrRec2 = itrRec1+1; itrRec2 < nmuons; itrRec2++){
159 AliMUONTrackLight* mu2 = (AliMUONTrackLight*) fArray1Mu->At(itrRec2);
160 AliMUONPairLight dimuLight;
161 dimuLight.SetMuons(*mu1, *mu2);
162 //dimuLight.PrintInfo("A");
163 TClonesArray &dimuons = *fArray2Mu;
164 new (dimuons[ndimuons++]) AliMUONPairLight(dimuLight);
171 if (nreftracks != 0) {
180 //________________________________________________________________________
181 void AliAnalysisTaskRecoCheck::Terminate(Option_t *)