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