2 #include "TClonesArray.h"
3 #include "TLorentzVector.h"
8 #include "AliTracker.h"
10 #include "AliAnalysisTask.h"
11 #include "AliAnalysisManager.h"
13 #include "AliESDEvent.h"
14 #include "AliESDInputHandler.h"
15 #include "AliESDMuonTrack.h"
17 #include "AliMCEventHandler.h"
18 #include "AliMCEvent.h"
20 #include "AliAnalysisTaskRecoCheck.h"
22 #include "AliMUONTrackLight.h"
23 #include "AliMUONPairLight.h"
24 #include "AliMUONVTrackStore.h"
25 #include "AliMUONTrack.h"
26 #include "AliMUONRecoCheck.h"
27 #include "AliMUONTrackExtrap.h"
29 // analysis task for decoding reconstructed tracks and kinematics (AliMUONRecoCheck)
30 // Authors: Bogdan Vulpescu
32 ClassImp(AliAnalysisTaskRecoCheck)
34 //________________________________________________________________________
35 AliAnalysisTaskRecoCheck::AliAnalysisTaskRecoCheck(const char *name)
36 : AliAnalysisTask(name, ""), fESDEvent(0), fTree(0), fArray1Mu(0), fArray2Mu(0), fL3Current(30000.0)
40 // Define input and output slots here
41 // Input slot #0 works with a TChain
42 DefineInput(0, TChain::Class());
43 // Output slot #0 writes into a TTree container
44 DefineOutput(0, TTree::Class());
48 //________________________________________________________________________
49 void AliAnalysisTaskRecoCheck::ConnectInputData(Option_t *)
51 // Connect ESD or AOD here
54 TTree* tree = dynamic_cast<TTree*> (GetInputData(0));
56 Printf("ERROR: Could not read chain from input slot 0");
58 tree->SetBranchStatus("*", kFALSE);
59 tree->SetBranchStatus("MuonTracks.*", kTRUE);
60 tree->SetBranchStatus("AliESDHeader.*", kTRUE);
62 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
65 Printf("ERROR: Could not get ESDInputHandler");
67 fESDEvent = esdH->GetEvent();
70 // calculate the filed map in the L3 magnet using the current value
71 AliMUONTrackExtrap::SetField();
75 //________________________________________________________________________
76 void AliAnalysisTaskRecoCheck::CreateOutputObjects()
78 // Create output tree with branches of arrays
81 fArray1Mu = new TClonesArray("AliMUONTrackLight",0);
82 fArray2Mu = new TClonesArray("AliMUONPairLight",0);
83 fTree = new TTree("tree","tree",0);
84 fTree->Branch("muons", &fArray1Mu);
85 fTree->Branch("dimuons",&fArray2Mu);
86 fTree->SetDirectory(0);
90 //________________________________________________________________________
91 void AliAnalysisTaskRecoCheck::Exec(Option_t *)
94 // Called for each event
96 // Process MC truth, therefore we receive the AliAnalysisManager and ask it for the AliMCEventHandler
97 // This handler can return the current MC event
99 Int_t nTracks = fESDEvent->GetNumberOfMuonTracks();
100 if (nTracks == 0) return;
102 AliMCEventHandler* eventHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
104 Printf("ERROR: Could not retrieve MC event handler");
108 AliMCEvent* mcEvent = eventHandler->MCEvent();
110 Printf("ERROR: Could not retrieve MC event");
114 Int_t eventNumber = fESDEvent->GetEventNumberInFile();
121 AliMUONRecoCheck *rc = new AliMUONRecoCheck(fESDEvent, eventHandler);
123 AliMUONVTrackStore* trackRefs = rc->TrackRefs(eventNumber);
124 AliMUONVTrackStore* recoTracks = rc->ReconstructedTracks(eventNumber);
125 AliStack* pstack = mcEvent->Stack();
127 TIter next(recoTracks->CreateIterator());
128 AliMUONTrack* trackReco = NULL;
130 Int_t nTrackReco = recoTracks->GetSize();
131 Int_t nTracksESD = fESDEvent->GetNumberOfMuonTracks();
132 //printf("Tracks in recoTracks (%d) and in ESD (%d).\n", nTrackReco, nTracksESD);
134 if (nTrackReco != nTracksESD) printf ("Tracks in recoTracks (%d) and in ESD (%d) do not match!\n", nTrackReco, nTracksESD);
136 Int_t nreftracks = 0;
138 while ( (trackReco = static_cast<AliMUONTrack*>(next())) != NULL ) {
139 // assign parameters concerning the reconstructed tracks
140 AliMUONTrackLight muLight;
142 muLight.FillFromESD(fESDEvent->GetMuonTrack(itrRec));
144 // find the reference track and store further information
145 TParticle *part = muLight.FindRefTrack(trackReco, trackRefs, pstack);
147 v.SetPxPyPzE(part->Px(), part->Py(), part->Pz(), part->Energy());
149 muLight.FillMuonHistory(pstack, part);
150 //muLight.PrintInfo("A");
151 //store the referenced track in the muonArray:
152 TClonesArray &muons = *fArray1Mu;
153 new (muons[nreftracks++]) AliMUONTrackLight(muLight);
159 // now loop over muon pairs to build dimuons
160 Int_t nmuons = fArray1Mu->GetEntriesFast();
162 for(Int_t itrRec1 = 0; itrRec1 < nmuons-1; itrRec1++) {
163 AliMUONTrackLight* mu1 = (AliMUONTrackLight*) fArray1Mu->At(itrRec1);
164 for(Int_t itrRec2 = itrRec1+1; itrRec2 < nmuons; itrRec2++){
165 AliMUONTrackLight* mu2 = (AliMUONTrackLight*) fArray1Mu->At(itrRec2);
166 AliMUONPairLight dimuLight;
167 dimuLight.SetMuons(*mu1, *mu2);
168 //dimuLight.PrintInfo("A");
169 TClonesArray &dimuons = *fArray2Mu;
170 new (dimuons[ndimuons++]) AliMUONPairLight(dimuLight);
177 if (nreftracks != 0) {
186 //________________________________________________________________________
187 void AliAnalysisTaskRecoCheck::Terminate(Option_t *)