4 #include "AliAnalysisTaskME.h"
5 #include "AliAnalysisManager.h"
7 #include "AliAODEvent.h"
8 #include "AliAODTrack.h"
9 #include "AliAODVertex.h"
10 #include "AliMultiEventInputHandler.h"
11 #include "AliAODHandler.h"
13 #include "AliAnalysisTaskCreateMixedDimuons.h"
14 #include "AliEventPoolMuon.h"
15 #include "TDatabasePDG.h"
18 // Example of an analysis task creating aod events filled with mixed muon pairs
20 // Authors Alessandro De Falco and Antonio Uras, INFN Cagliari
21 // alessandro.de.falco@ca.infn.it antonio.uras@ca.infn.it
23 #define AliAnalysisTaskCreateMixedDimuons_CXX
25 ClassImp(AliAnalysisTaskCreateMixedDimuons)
27 //=================================================================================
29 AliAnalysisTaskCreateMixedDimuons::AliAnalysisTaskCreateMixedDimuons(const char *name)
30 : AliAnalysisTaskME(name),
32 fOutputUserHandler(0x0),
34 fOutputUserAODTree(0X0),
41 // Default input and output containers
42 DefineInput (0, TChain::Class());
44 // User-defined input and output containers
45 DefineOutput(1, TTree::Class());
47 // ---------------------------------------------------------------
54 for (Int_t i=0; i<100; i++) fInputAOD[i] = 0;
56 fOutputUserHandler = 0;
58 fOutputUserAODTree = 0;
62 //=================================================================================
64 void AliAnalysisTaskCreateMixedDimuons::ConnectInputData(Option_t *) {
66 // Connect ESD or AOD here
69 printf("-> AliAnalysisTaskCreateMixedDimuons::ConnectInputData\n");
71 TTree* tree = (TTree*) GetInputData(0);
74 Printf("ERROR: Could not read chain from input slot 0");
78 fInputHandler = (AliMultiEventInputHandler*) AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
79 fPoolMuon = (AliEventPoolMuon*) AliAnalysisManager::GetAnalysisManager()->GetEventPool();
82 Printf("ERROR: Could not get AliMultiAODInputHandler");
85 fBufferSize = fInputHandler->GetBufferSize();
86 if (fBufferSize>100) {
87 printf("\n*** WARNING AliAnalysisTaskCreateMixedDimuons::ConnectInputData -> Trying to set fBufferSize>100, forcing fBufferSize=100 ***\n\n");
90 for (Int_t i=0; i<fBufferSize; i++) fInputAOD[i] = (AliAODEvent*) fInputHandler->GetEvent(i);
94 printf("<- AliAnalysisTaskCreateMixedDimuons::ConnectInputData\n");
98 //=================================================================================
100 void AliAnalysisTaskCreateMixedDimuons::UserCreateOutputObjects() {
102 // Here the user-defined output containers should be created!!!
105 fOutputUserHandler = new AliAODHandler();
107 fOutputUserHandler -> Init("");
109 fOutputUserAOD = fOutputUserHandler -> GetAOD();
111 fOutputUserAODTree = fOutputUserHandler -> GetTree();
115 //=================================================================================
117 void AliAnalysisTaskCreateMixedDimuons::UserExec(Option_t *) {
119 if (!fOutputUserAOD) {
120 Printf("ERROR: fOutputUserAOD not available\n");
124 printf("Calling USER EXEC\n\n");
126 for (Int_t iEv=0; iEv<fBufferSize; iEv++) {
127 for (Int_t jEv=0; jEv<iEv; jEv++) {
129 Int_t nTracksEv[2] = {0};
130 Int_t nFWMuonsEv[2] = {0};
132 nTracksEv[0] = fInputAOD[iEv]->GetNumberOfTracks();
133 nTracksEv[1] = fInputAOD[jEv]->GetNumberOfTracks();
135 for (Int_t i=0; i<nTracksEv[0]; i++) if(fInputAOD[iEv]->GetTrack(i)->IsMuonTrack()) nFWMuonsEv[0]++;
136 for (Int_t i=0; i<nTracksEv[1]; i++) if(fInputAOD[jEv]->GetTrack(i)->IsMuonTrack()) nFWMuonsEv[1]++;
138 // Muon track mixing to fill a mass spectrum
140 if (nFWMuonsEv[0] && nFWMuonsEv[1]) {
142 Int_t rndMuonTrack[2] = {0};
143 rndMuonTrack[0] = gRandom->Integer(nFWMuonsEv[0]);
144 rndMuonTrack[1] = gRandom->Integer(nFWMuonsEv[1]);
146 Int_t nFWMUonsAdded = 0;
147 Int_t nPosTracksAdded = 0;
148 Int_t nNegTracksAdded = 0;
150 AliAODVertex *vertex = new AliAODVertex();
153 vertex -> SetZ(fPoolMuon->GetMeanPrimaryVertexZ());
155 Int_t muonCounter[2] = {0};
157 // adding tracks and vertex to the output event...
159 for (Int_t i=0; i<nTracksEv[0]; i++) {
160 if(fInputAOD[iEv]->GetTrack(i)->IsMuonTrack()) {
161 if (fDebug) printf("fInputAOD[%d]->GetTrack(%d) = %p pt = %f uniqueID = %d\n",
162 iEv,i,fInputAOD[iEv]->GetTrack(i),fInputAOD[iEv]->GetTrack(i)->Pt(),
163 fInputAOD[iEv]->GetTrack(i)->GetUniqueID());
164 if (muonCounter[0]==rndMuonTrack[0]) {
165 fOutputUserAOD->AddTrack(fInputAOD[iEv]->GetTrack(i));
167 if (fInputAOD[iEv]->GetTrack(i)->Charge()>0) nPosTracksAdded++;
168 else nNegTracksAdded++;
174 for (Int_t i=0; i<nTracksEv[1]; i++) {
175 if(fInputAOD[jEv]->GetTrack(i)->IsMuonTrack()) {
176 if (fDebug) printf("fInputAOD[%d]->GetTrack(%d) = %p pt = %f uniqueID = %d\n",
177 jEv,i,fInputAOD[jEv]->GetTrack(i),fInputAOD[jEv]->GetTrack(i)->Pt(),
178 fInputAOD[jEv]->GetTrack(i)->GetUniqueID());
179 if (muonCounter[1]==rndMuonTrack[1]) {
180 fOutputUserAOD->AddTrack(fInputAOD[jEv]->GetTrack(i));
182 if (fInputAOD[jEv]->GetTrack(i)->Charge()>0) nPosTracksAdded++;
183 else nNegTracksAdded++;
189 fOutputUserAOD->AddVertex(vertex);
194 for (Int_t i=0; i<nFWMUonsAdded; i++) {
195 AliAODTrack *tr = (AliAODTrack*) fOutputUserAOD->GetTrack(i);
196 printf("fOutputUserAOD->GetTrack(%d) = %p pt = %f\n",i,tr,tr->Pt());
201 AliAODHeader * header = dynamic_cast<AliAODHeader*>(fOutputUserAOD->GetHeader());
202 if(!header) AliFatal("Not a standard AOD");
203 header->SetRefMultiplicity(nFWMUonsAdded);
204 header->SetRefMultiplicityPos(nPosTracksAdded);
205 header->SetRefMultiplicityNeg(nNegTracksAdded);
207 fOutputUserHandler -> FinishEvent();
211 PostData(1, fOutputUserAODTree);
219 //===================================================================================
221 void AliAnalysisTaskCreateMixedDimuons::Terminate(Option_t *) {
223 // Called once at the end of the query
225 printf("\n\nCalling TERMINATE \n\n\n");
227 fOutputUserHandler -> Terminate();
231 //===================================================================================