]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG/muon/AliAnalysisTaskCreateMixedDimuons.cxx
Merge branch 'master' of https://git.cern.ch/reps/AliRoot
[u/mrichter/AliRoot.git] / PWG / muon / AliAnalysisTaskCreateMixedDimuons.cxx
1 #include "TChain.h"
2 #include "TTree.h"
3
4 #include "AliAnalysisTaskME.h"
5 #include "AliAnalysisManager.h"
6
7 #include "AliAODEvent.h"
8 #include "AliAODTrack.h"
9 #include "AliAODVertex.h"
10 #include "AliMultiEventInputHandler.h"
11 #include "AliAODHandler.h"
12
13 #include "AliAnalysisTaskCreateMixedDimuons.h"
14 #include "AliEventPoolMuon.h"
15 #include "TDatabasePDG.h"
16 #include "TRandom.h"
17
18 // Example of an analysis task creating aod events filled with mixed muon pairs
19 //
20 // Authors Alessandro De Falco and Antonio Uras, INFN Cagliari
21 // alessandro.de.falco@ca.infn.it  antonio.uras@ca.infn.it
22
23 #define AliAnalysisTaskCreateMixedDimuons_CXX
24
25 ClassImp(AliAnalysisTaskCreateMixedDimuons)
26
27 //=================================================================================
28
29 AliAnalysisTaskCreateMixedDimuons::AliAnalysisTaskCreateMixedDimuons(const char *name) 
30 : AliAnalysisTaskME(name),
31   fBufferSize(0),
32   fOutputUserHandler(0x0),
33   fOutputUserAOD(0X0),
34   fOutputUserAODTree(0X0),
35   fPoolMuon(0X0),
36   fDebug(0X0)
37 {
38
39   // Constructor
40
41   // Default input and output containers
42   DefineInput (0, TChain::Class());
43
44   // User-defined input and output containers
45   DefineOutput(1, TTree::Class());
46
47   // ---------------------------------------------------------------
48
49   fDebug = kFALSE;
50   fBufferSize = 0;
51
52   RequireFreshBuffer();
53
54   for (Int_t i=0; i<100; i++) fInputAOD[i] = 0;
55
56   fOutputUserHandler = 0;
57   fOutputUserAOD     = 0;
58   fOutputUserAODTree = 0;  
59
60 }
61
62 //=================================================================================
63
64 void AliAnalysisTaskCreateMixedDimuons::ConnectInputData(Option_t *) {
65
66   // Connect ESD or AOD here
67   // Called once
68
69   printf("-> AliAnalysisTaskCreateMixedDimuons::ConnectInputData\n");
70
71   TTree* tree = (TTree*) GetInputData(0);
72
73   if (!tree) {
74     Printf("ERROR: Could not read chain from input slot 0");
75   } 
76   else {
77
78     fInputHandler = (AliMultiEventInputHandler*) AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
79     fPoolMuon     = (AliEventPoolMuon*)          AliAnalysisManager::GetAnalysisManager()->GetEventPool();
80
81     if (!fInputHandler) {
82       Printf("ERROR: Could not get AliMultiAODInputHandler");
83     }
84     else {  
85       fBufferSize = fInputHandler->GetBufferSize();
86       if (fBufferSize>100) {
87         printf("\n*** WARNING AliAnalysisTaskCreateMixedDimuons::ConnectInputData -> Trying to set fBufferSize>100, forcing fBufferSize=100 ***\n\n");
88         fBufferSize = 100;
89       }
90       for (Int_t i=0; i<fBufferSize; i++) fInputAOD[i] = (AliAODEvent*) fInputHandler->GetEvent(i);
91     }
92   }
93
94   printf("<- AliAnalysisTaskCreateMixedDimuons::ConnectInputData\n");
95
96 }
97
98 //=================================================================================
99
100 void AliAnalysisTaskCreateMixedDimuons::UserCreateOutputObjects() {
101
102   // Here the user-defined output containers should be created!!!
103   // Called once
104
105   fOutputUserHandler = new AliAODHandler();
106
107   fOutputUserHandler -> Init("");
108
109   fOutputUserAOD = fOutputUserHandler -> GetAOD();
110
111   fOutputUserAODTree = fOutputUserHandler -> GetTree();
112
113 }
114
115 //=================================================================================
116
117 void AliAnalysisTaskCreateMixedDimuons::UserExec(Option_t *) {
118
119   if (!fOutputUserAOD) {
120     Printf("ERROR: fOutputUserAOD not available\n");
121     return;
122   }
123
124   printf("Calling USER EXEC\n\n");
125
126   for (Int_t iEv=0; iEv<fBufferSize; iEv++) {
127     for (Int_t jEv=0; jEv<iEv; jEv++) {
128
129       Int_t nTracksEv[2]  = {0};
130       Int_t nFWMuonsEv[2] = {0};
131       
132       nTracksEv[0] = fInputAOD[iEv]->GetNumberOfTracks();
133       nTracksEv[1] = fInputAOD[jEv]->GetNumberOfTracks();
134       // Check if both events contain std aod tracks
135       if (!dynamic_cast<AliAODTrack*>(fInputAOD[iEv]->GetTrack(0)) || dynamic_cast<AliAODTrack*>(fInputAOD[jEv]->GetTrack(0))){
136         AliFatal("Not a standard AOD");
137       }
138
139       for (Int_t i=0; i<nTracksEv[0]; i++) if(((AliAODTrack*)fInputAOD[iEv]->GetTrack(i))->IsMuonTrack()) nFWMuonsEv[0]++;
140       for (Int_t i=0; i<nTracksEv[1]; i++) if(((AliAODTrack*)fInputAOD[jEv]->GetTrack(i))->IsMuonTrack()) nFWMuonsEv[1]++;
141       
142       // Muon track mixing to fill a mass spectrum
143       
144       if (nFWMuonsEv[0] && nFWMuonsEv[1]) {
145         
146         Int_t rndMuonTrack[2] = {0};
147         rndMuonTrack[0] = gRandom->Integer(nFWMuonsEv[0]);
148         rndMuonTrack[1] = gRandom->Integer(nFWMuonsEv[1]);
149         
150         Int_t nFWMUonsAdded = 0;
151         Int_t nPosTracksAdded = 0;
152         Int_t nNegTracksAdded = 0;
153         
154         AliAODVertex *vertex = new AliAODVertex();
155         vertex -> SetX(0.0);
156         vertex -> SetY(0.0);
157         vertex -> SetZ(fPoolMuon->GetMeanPrimaryVertexZ());
158         
159         Int_t muonCounter[2] = {0};
160         
161         // adding tracks and vertex to the output event...
162         
163         for (Int_t i=0; i<nTracksEv[0]; i++) {
164           if(((AliAODTrack*)fInputAOD[iEv]->GetTrack(i))->IsMuonTrack()) {
165             if (fDebug) printf("fInputAOD[%d]->GetTrack(%d) = %p    pt = %f     uniqueID = %d\n",
166                                iEv,i,fInputAOD[iEv]->GetTrack(i),fInputAOD[iEv]->GetTrack(i)->Pt(),
167                                fInputAOD[iEv]->GetTrack(i)->GetUniqueID());
168             if (muonCounter[0]==rndMuonTrack[0]) {
169               fOutputUserAOD->AddTrack((AliAODTrack*)fInputAOD[iEv]->GetTrack(i));
170               nFWMUonsAdded++;
171               if (fInputAOD[iEv]->GetTrack(i)->Charge()>0) nPosTracksAdded++;
172               else nNegTracksAdded++;
173             }
174             muonCounter[0]++;
175           }
176         }
177         
178         for (Int_t i=0; i<nTracksEv[1]; i++) {
179           if(((AliAODTrack*)fInputAOD[jEv]->GetTrack(i))->IsMuonTrack()) {
180             if (fDebug) printf("fInputAOD[%d]->GetTrack(%d) = %p    pt = %f     uniqueID = %d\n",
181                                jEv,i,fInputAOD[jEv]->GetTrack(i),fInputAOD[jEv]->GetTrack(i)->Pt(),
182                                fInputAOD[jEv]->GetTrack(i)->GetUniqueID());
183             if (muonCounter[1]==rndMuonTrack[1]) {
184               fOutputUserAOD->AddTrack((AliAODTrack*)fInputAOD[jEv]->GetTrack(i));
185               nFWMUonsAdded++;
186               if (fInputAOD[jEv]->GetTrack(i)->Charge()>0) nPosTracksAdded++;
187               else nNegTracksAdded++;
188             }
189             muonCounter[1]++;   
190           }
191         }
192         
193         fOutputUserAOD->AddVertex(vertex);
194         
195         // ... done!
196         
197         if (fDebug) {
198           for (Int_t i=0; i<nFWMUonsAdded; i++) {
199             AliAODTrack *tr = dynamic_cast<AliAODTrack*>( fOutputUserAOD->GetTrack(i));
200             if(!tr) AliFatal("Not a standard AOD");
201             printf("fOutputUserAOD->GetTrack(%d) = %p    pt = %f\n",i,tr,tr->Pt());
202           }
203         }
204         
205
206         AliAODHeader * header = dynamic_cast<AliAODHeader*>(fOutputUserAOD->GetHeader());
207         if(!header) AliFatal("Not a standard AOD");
208         header->SetRefMultiplicity(nFWMUonsAdded); 
209         header->SetRefMultiplicityPos(nPosTracksAdded);
210         header->SetRefMultiplicityNeg(nNegTracksAdded);
211         
212         fOutputUserHandler -> FinishEvent();
213         
214       }
215
216       PostData(1, fOutputUserAODTree);
217       
218     }
219     
220   }
221   
222 }      
223
224 //===================================================================================
225
226 void AliAnalysisTaskCreateMixedDimuons::Terminate(Option_t *) {
227
228   // Called once at the end of the query
229
230   printf("\n\nCalling TERMINATE \n\n\n");
231
232   fOutputUserHandler -> Terminate();
233
234 }
235
236 //===================================================================================