]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG/muon/AliAnalysisTaskMuonAODfromGeneral.cxx
Merge branch 'feature-movesplit'
[u/mrichter/AliRoot.git] / PWG / muon / AliAnalysisTaskMuonAODfromGeneral.cxx
CommitLineData
71b7d225 1#define AliAnalysisTaskMuonAODfromGeneral_cxx
2
27de2dfb 3/* $Id$ */
4
71b7d225 5// 19 Nov 2007
aba89748 6// Class implementation for the specific muon AOD generation
7// Extracts only muon tracks from a general AOD and builds dimuons
8// Livio Bianchi, Universita' di Torino
9
71b7d225 10
11#include "TTree.h"
12#include "TROOT.h"
13#include "TH1.h"
14#include "TCanvas.h"
15#include "TSystem.h"
16#include "TRandom.h"
17
18#include "AliAODEvent.h"
aba89748 19#include "AliAnalysisTask.h"
71b7d225 20#include "AliAnalysisTaskMuonAODfromGeneral.h"
21#include "AliAODHandler.h"
22#include "AliAnalysisManager.h"
23#include "AliAODEventInfo.h"
24#include "AliAODDimuon.h"
25
26ClassImp(AliAnalysisTaskMuonAODfromGeneral)
27
28//________________________________________________________________________
29AliAnalysisTaskMuonAODfromGeneral::AliAnalysisTaskMuonAODfromGeneral(const char *name, Double_t BeamEnergy):
30 AliAnalysisTask(name, "AnalysisTaskMuonAODfromGeneral"),
31 fInfos(0),
32 fDimuons(0),
8b8b0b7a 33 fChain(0),
34 fOrgAOD(0),
71b7d225 35 fNewAOD(0),
36 ft(0),
37 fBeamEnergy(0)
38{ // Constructor.
39 // Input slot #0 works with an Ntuple
40 SetBeamEnergy(BeamEnergy);
41 DefineInput(0, TChain::Class());
42 // Output slot #0 writes into a TTree container
43 DefineOutput(0, TTree::Class());
44}
45
46//________________________________________________________________________
47void AliAnalysisTaskMuonAODfromGeneral::ConnectInputData(Option_t *) {
48 printf(" ConnectInputData %s\n", GetName());
49 // New connection to the AOD
50 fChain = (TChain*)GetInputData(0);
51 fOrgAOD = new AliAODEvent();
52 fOrgAOD->ReadFromTree(fChain); // This checks also if the branch address is already set
53}
54
55//________________________________________________________________________
56void AliAnalysisTaskMuonAODfromGeneral::CreateOutputObjects() {
57 printf("Creating output objects\n");
58 if(!fNewAOD)fNewAOD=new AliAODEvent();
59 fNewAOD->CreateStdContent();
60
61 if (!ft) {
62 ft = new TTree("AOD","Muon AOD tree",0);
63 ft->BranchRef();
64 ft->Branch(fNewAOD->GetList());
65 //ft->Print();
66 }
67
68 //Add new Objects: MuonInfos & Dimuons
69 fInfos = new AliAODEventInfo();
70 fNewAOD->AddObject(fInfos);
71 const char *nameInfos = "MuonInfos";
72 fInfos->SetName(nameInfos);
73 ft->Branch(nameInfos, &fInfos);
74 fDimuons = new TClonesArray("AliAODDimuon",0);
75 fNewAOD->AddObject(fDimuons);
76 const char *nameDimuons = "Dimuons";
77 fDimuons->SetName(nameDimuons);
78 ft->Branch(nameDimuons, &fDimuons);
79
80}
81
82//________________________________________________________________________
83void AliAnalysisTaskMuonAODfromGeneral::Exec(Option_t *) {
84 static int ncall=0;
85 // Task making a Muon AOD
86 // Get input data
87 TChain *chain = (TChain*)GetInputData(0);
88 Long64_t ientry = chain->GetReadEntry();
89 ientry=ientry;
90
91 if (!fOrgAOD) return;
92
93 Int_t nTracks=fOrgAOD->GetNumberOfTracks();
94 Int_t nMuTracks=0;
95 Int_t nPosTracks = 0;
a6e0ebfe 96 Int_t mutrNumb[10]; for (Int_t i=0; i<10; mutrNumb[i++]=0) {}
71b7d225 97 for (Int_t iTrack=0; iTrack<nTracks; iTrack++){
98 const Double_t *trackpid=fOrgAOD->GetTrack(iTrack)->PID();
99 if (trackpid[AliAODTrack::kMuon]==1.) {
100 mutrNumb[nMuTracks]=iTrack;
101 nMuTracks++;
102 }
103 if (fOrgAOD->GetTrack(iTrack)->Charge()> 0) nPosTracks++;
104 }
105
106 Bool_t ExistMuon=kFALSE;
107 if (nMuTracks>0) ExistMuon=kTRUE;
108
109 //--------------------------------------------------------------------
110 // set arrays and pointers
111 Double_t pos[3];
112 Double_t covVtx[6];
113
f15c1f69 114 // Access to the header
115 AliAODHeader *header = dynamic_cast<AliAODHeader*>(fNewAOD->GetHeader());
116 if(!header) AliFatal("Not a standard AOD");
71b7d225 117
118 // fill the header
119 header->SetRunNumber (fOrgAOD->GetRunNumber() );
120 header->SetBunchCrossNumber(fOrgAOD->GetBunchCrossNumber());
121 header->SetOrbitNumber (fOrgAOD->GetOrbitNumber() );
122 header->SetPeriodNumber (fOrgAOD->GetPeriodNumber() );
123 header->SetTriggerMask (fOrgAOD->GetTriggerMask() );
124 header->SetTriggerCluster (fOrgAOD->GetTriggerCluster() );
125 header->SetEventType (fOrgAOD->GetEventType() );
126 header->SetMagneticField (fOrgAOD->GetMagneticField() );
127 header->SetZDCN1Energy (fOrgAOD->GetZDCN1Energy() );
128 header->SetZDCP1Energy (fOrgAOD->GetZDCP1Energy() );
129 header->SetZDCN2Energy (fOrgAOD->GetZDCN2Energy() );
130 header->SetZDCP2Energy (fOrgAOD->GetZDCP2Energy() );
131 header->SetZDCEMEnergy (0,fOrgAOD->GetZDCEMEnergy(0) );
132 header->SetZDCEMEnergy (1,fOrgAOD->GetZDCEMEnergy(1) );
133 header->SetRefMultiplicity (nTracks);
134 header->SetRefMultiplicityPos(nPosTracks);
135 header->SetRefMultiplicityNeg(nTracks - nPosTracks);
136 header->SetMuonMagFieldScale(-999.); // FIXME
4649c75b 137 header->SetCentrality(0); // FIXME
71b7d225 138
71b7d225 139 const AliAODVertex *vtx = fOrgAOD->GetPrimaryVertex();
b0c84a07 140 if ( !vtx) {
141 // CHECK Gines
142 AliError("Primary vertex is not defined");
143 return;
144 }
71b7d225 145
146 Int_t nDimuons=nMuTracks*(nMuTracks-1)/2;
147
148 // Access to the AOD container of vertices
149 TClonesArray &vertices = *(fNewAOD->GetVertices());
150 Int_t jVertices=0;
151
152 // Access to the AOD container of tracks
153 TClonesArray &tracks = *(fNewAOD->GetTracks());
154 tracks.Delete();
155 Int_t jTracks=0;
156
157
158 vtx->GetCovMatrix(covVtx); //covariance matrix
159
160 AliAODVertex * primary = new(vertices[jVertices++])
161 AliAODVertex(pos, covVtx, vtx->GetChi2perNDF(), NULL, AliAODVertex::kPrimary);
162
163 static int ncal=0;
164 static int numtracks=0;
165 for (Int_t iTrack=0; iTrack<nMuTracks; iTrack++) {
f15c1f69 166 AliAODTrack * track = dynamic_cast<AliAODTrack*>((fOrgAOD->GetTrack(mutrNumb[iTrack])));
167 if(!track) AliFatal("Not a standard AOD");
b0c84a07 168 primary->AddDaughter(new(tracks[jTracks++])
f15c1f69 169 AliAODTrack((*track)));
71b7d225 170 ncal++;
171 }
172 numtracks+=jTracks;
173
174 fDimuons->Delete();
175 fDimuons->Expand(nDimuons);
176 TClonesArray &rDimuons = *fDimuons;
177
178 Int_t jDimuons=0;
179 for(Int_t i=0; i<nMuTracks; i++){
180 for(Int_t j=i+1; j<nMuTracks; j++){
866d8d78 181 new(rDimuons[jDimuons++]) AliAODDimuon(tracks[i],tracks[j]);
71b7d225 182 }
183 }
184
185 fInfos->SetBeamEnergy(fBeamEnergy);
aba89748 186 fInfos->SetEv(fNewAOD);
aba89748 187 fInfos->SetHe(header);
188 fInfos->SetTr(fNewAOD->GetTracks());
189 fInfos->SetDi(fDimuons);
190 fInfos->SelectTriggerBits(0,1,2,3,4,5);
71b7d225 191 if(ExistMuon) ft->Fill();
192 ncall++;
193
194 // Post final data. It will be written to a file with option "RECREATE"
195 PostData(0, ft);
196}
197
198//________________________________________________________________________
199void AliAnalysisTaskMuonAODfromGeneral::Terminate(Option_t *) {
200 // Draw some histogram at the end.
201 ft->GetUserInfo()->Add(fNewAOD);
202 ft->Write("",TObject::kOverwrite);
203 ft->ResetBranchAddresses();
204 if (!gROOT->IsBatch()) {
205 TCanvas *c1 = new TCanvas("c1","Pt",10,10,310,310);
206 c1->SetFillColor(10);
207 c1->SetHighLightColor(10);
208
209 c1->cd(1)->SetLeftMargin(0.15);
210 c1->cd(1)->SetBottomMargin(0.15);
211 c1->cd(1)->SetLogy();
212 ft->Draw("tracks.Pt()");
213 //ft->Draw("dimuons.M()");
214 }
215}