ROOT logo
#define AliAnalysisTaskMuonAODfromGeneral_cxx

/* $Id$ */

// 19 Nov 2007
// Class implementation for the specific muon AOD generation
// Extracts only muon tracks from a general AOD and builds dimuons
// Livio Bianchi, Universita' di Torino


#include "TTree.h"
#include "TROOT.h"
#include "TH1.h"
#include "TCanvas.h"
#include "TSystem.h"
#include "TRandom.h"

#include "AliAODEvent.h"
#include "AliAnalysisTask.h"
#include "AliAnalysisTaskMuonAODfromGeneral.h"
#include "AliAODHandler.h"
#include "AliAnalysisManager.h"
#include "AliAODEventInfo.h"
#include "AliAODDimuon.h"

ClassImp(AliAnalysisTaskMuonAODfromGeneral)

//________________________________________________________________________
AliAnalysisTaskMuonAODfromGeneral::AliAnalysisTaskMuonAODfromGeneral(const char *name, Double_t BeamEnergy):
	AliAnalysisTask(name, "AnalysisTaskMuonAODfromGeneral"),
	fInfos(0),
	fDimuons(0),
        fChain(0),
        fOrgAOD(0), 
	fNewAOD(0), 
	ft(0),
	fBeamEnergy(0)
{  // Constructor.
  // Input slot #0 works with an Ntuple
  SetBeamEnergy(BeamEnergy);
  DefineInput(0, TChain::Class());
  // Output slot #0 writes into a TTree container
  DefineOutput(0, TTree::Class());
}

//________________________________________________________________________
void AliAnalysisTaskMuonAODfromGeneral::ConnectInputData(Option_t *) {
  printf("   ConnectInputData %s\n", GetName());
  // New connection to the AOD
  fChain = (TChain*)GetInputData(0);
  fOrgAOD = new AliAODEvent();
  fOrgAOD->ReadFromTree(fChain); // This checks also if the branch address is already set
}

//________________________________________________________________________
void AliAnalysisTaskMuonAODfromGeneral::CreateOutputObjects() {
  printf("Creating output objects\n");
  if(!fNewAOD)fNewAOD=new AliAODEvent();
  fNewAOD->CreateStdContent();
 
  if (!ft) {
    ft = new TTree("AOD","Muon AOD tree",0);
    ft->BranchRef();
    ft->Branch(fNewAOD->GetList());
    //ft->Print();
 }
 
  //Add new Objects: MuonInfos & Dimuons
   fInfos = new AliAODEventInfo();
   fNewAOD->AddObject(fInfos);
   const char *nameInfos = "MuonInfos";
   fInfos->SetName(nameInfos);
   ft->Branch(nameInfos, &fInfos);
   fDimuons = new TClonesArray("AliAODDimuon",0);
   fNewAOD->AddObject(fDimuons);
   const char *nameDimuons = "Dimuons";
   fDimuons->SetName(nameDimuons);
   ft->Branch(nameDimuons, &fDimuons);
      
}

//________________________________________________________________________
void AliAnalysisTaskMuonAODfromGeneral::Exec(Option_t *) {
  static int ncall=0;
  // Task making a Muon AOD
  // Get input data
  TChain *chain = (TChain*)GetInputData(0);
  Long64_t ientry = chain->GetReadEntry();
  ientry=ientry;

  if (!fOrgAOD) return;
  
  Int_t nTracks=fOrgAOD->GetNumberOfTracks();
  Int_t nMuTracks=0;
  Int_t nPosTracks = 0;
  Int_t mutrNumb[10]; for (Int_t i=0; i<10; mutrNumb[i++]=0) {}
  for (Int_t iTrack=0; iTrack<nTracks; iTrack++){
       const Double_t *trackpid=fOrgAOD->GetTrack(iTrack)->PID();
       if (trackpid[AliAODTrack::kMuon]==1.) {
       		mutrNumb[nMuTracks]=iTrack;
		nMuTracks++;
		}
       if (fOrgAOD->GetTrack(iTrack)->Charge()> 0) nPosTracks++;
       }
  
  Bool_t ExistMuon=kFALSE;
  if (nMuTracks>0) ExistMuon=kTRUE;
  
  //--------------------------------------------------------------------
  // set arrays and pointers
  Double_t pos[3];
  Double_t covVtx[6];
  
  // Access to the header
  AliAODHeader *header = dynamic_cast<AliAODHeader*>(fNewAOD->GetHeader());
  if(!header) AliFatal("Not a standard AOD");

  // fill the header
  header->SetRunNumber       (fOrgAOD->GetRunNumber()       );
  header->SetBunchCrossNumber(fOrgAOD->GetBunchCrossNumber());
  header->SetOrbitNumber     (fOrgAOD->GetOrbitNumber()     );
  header->SetPeriodNumber    (fOrgAOD->GetPeriodNumber()    );
  header->SetTriggerMask     (fOrgAOD->GetTriggerMask()     ); 
  header->SetTriggerCluster  (fOrgAOD->GetTriggerCluster()  );
  header->SetEventType       (fOrgAOD->GetEventType()       );
  header->SetMagneticField   (fOrgAOD->GetMagneticField()   );
  header->SetZDCN1Energy     (fOrgAOD->GetZDCN1Energy()     );
  header->SetZDCP1Energy     (fOrgAOD->GetZDCP1Energy()     );
  header->SetZDCN2Energy     (fOrgAOD->GetZDCN2Energy()     );
  header->SetZDCP2Energy     (fOrgAOD->GetZDCP2Energy()     );
  header->SetZDCEMEnergy     (0,fOrgAOD->GetZDCEMEnergy(0)  );
  header->SetZDCEMEnergy     (1,fOrgAOD->GetZDCEMEnergy(1)  );
  header->SetRefMultiplicity   (nTracks);
  header->SetRefMultiplicityPos(nPosTracks);
  header->SetRefMultiplicityNeg(nTracks - nPosTracks);
  header->SetMuonMagFieldScale(-999.); // FIXME
  header->SetCentrality(0);            // FIXME

  const AliAODVertex *vtx = fOrgAOD->GetPrimaryVertex();
  if ( !vtx) {
    // CHECK Gines
    AliError("Primary vertex is not defined");
    return;
  }  

  Int_t nDimuons=nMuTracks*(nMuTracks-1)/2;
  
  // Access to the AOD container of vertices
  TClonesArray &vertices = *(fNewAOD->GetVertices());
  Int_t jVertices=0;

  // Access to the AOD container of tracks
   TClonesArray &tracks = *(fNewAOD->GetTracks());
   tracks.Delete();
   Int_t jTracks=0; 


  vtx->GetCovMatrix(covVtx); //covariance matrix

  AliAODVertex * primary = new(vertices[jVertices++])
      AliAODVertex(pos, covVtx, vtx->GetChi2perNDF(), NULL, AliAODVertex::kPrimary);

  static int ncal=0;
  static int numtracks=0;
  for (Int_t iTrack=0; iTrack<nMuTracks; iTrack++) {
        AliAODTrack * track = dynamic_cast<AliAODTrack*>((fOrgAOD->GetTrack(mutrNumb[iTrack])));
        if(!track) AliFatal("Not a standard AOD");
	primary->AddDaughter(new(tracks[jTracks++])
	AliAODTrack((*track)));
        ncal++;
  }
  numtracks+=jTracks;

  fDimuons->Delete();
  fDimuons->Expand(nDimuons);
  TClonesArray &rDimuons = *fDimuons;
    
  Int_t jDimuons=0;
  for(Int_t i=0; i<nMuTracks; i++){
     for(Int_t j=i+1; j<nMuTracks; j++){
       new(rDimuons[jDimuons++]) AliAODDimuon(tracks[i],tracks[j]);
     } 
  }
  
  fInfos->SetBeamEnergy(fBeamEnergy);
  fInfos->SetEv(fNewAOD);
  fInfos->SetHe(header);
  fInfos->SetTr(fNewAOD->GetTracks());
  fInfos->SetDi(fDimuons);
  fInfos->SelectTriggerBits(0,1,2,3,4,5);
  if(ExistMuon) ft->Fill();
  ncall++;

  // Post final data. It will be written to a file with option "RECREATE"
  PostData(0, ft);
}      

//________________________________________________________________________
void AliAnalysisTaskMuonAODfromGeneral::Terminate(Option_t *) {
  // Draw some histogram at the end.
  ft->GetUserInfo()->Add(fNewAOD);
  ft->Write("",TObject::kOverwrite);
  ft->ResetBranchAddresses();
  if (!gROOT->IsBatch()) {
    TCanvas *c1 = new TCanvas("c1","Pt",10,10,310,310);
    c1->SetFillColor(10);
    c1->SetHighLightColor(10);
    
    c1->cd(1)->SetLeftMargin(0.15);
    c1->cd(1)->SetBottomMargin(0.15);  
    c1->cd(1)->SetLogy();
    ft->Draw("tracks.Pt()");
    //ft->Draw("dimuons.M()");
  }
}
 AliAnalysisTaskMuonAODfromGeneral.cxx:1
 AliAnalysisTaskMuonAODfromGeneral.cxx:2
 AliAnalysisTaskMuonAODfromGeneral.cxx:3
 AliAnalysisTaskMuonAODfromGeneral.cxx:4
 AliAnalysisTaskMuonAODfromGeneral.cxx:5
 AliAnalysisTaskMuonAODfromGeneral.cxx:6
 AliAnalysisTaskMuonAODfromGeneral.cxx:7
 AliAnalysisTaskMuonAODfromGeneral.cxx:8
 AliAnalysisTaskMuonAODfromGeneral.cxx:9
 AliAnalysisTaskMuonAODfromGeneral.cxx:10
 AliAnalysisTaskMuonAODfromGeneral.cxx:11
 AliAnalysisTaskMuonAODfromGeneral.cxx:12
 AliAnalysisTaskMuonAODfromGeneral.cxx:13
 AliAnalysisTaskMuonAODfromGeneral.cxx:14
 AliAnalysisTaskMuonAODfromGeneral.cxx:15
 AliAnalysisTaskMuonAODfromGeneral.cxx:16
 AliAnalysisTaskMuonAODfromGeneral.cxx:17
 AliAnalysisTaskMuonAODfromGeneral.cxx:18
 AliAnalysisTaskMuonAODfromGeneral.cxx:19
 AliAnalysisTaskMuonAODfromGeneral.cxx:20
 AliAnalysisTaskMuonAODfromGeneral.cxx:21
 AliAnalysisTaskMuonAODfromGeneral.cxx:22
 AliAnalysisTaskMuonAODfromGeneral.cxx:23
 AliAnalysisTaskMuonAODfromGeneral.cxx:24
 AliAnalysisTaskMuonAODfromGeneral.cxx:25
 AliAnalysisTaskMuonAODfromGeneral.cxx:26
 AliAnalysisTaskMuonAODfromGeneral.cxx:27
 AliAnalysisTaskMuonAODfromGeneral.cxx:28
 AliAnalysisTaskMuonAODfromGeneral.cxx:29
 AliAnalysisTaskMuonAODfromGeneral.cxx:30
 AliAnalysisTaskMuonAODfromGeneral.cxx:31
 AliAnalysisTaskMuonAODfromGeneral.cxx:32
 AliAnalysisTaskMuonAODfromGeneral.cxx:33
 AliAnalysisTaskMuonAODfromGeneral.cxx:34
 AliAnalysisTaskMuonAODfromGeneral.cxx:35
 AliAnalysisTaskMuonAODfromGeneral.cxx:36
 AliAnalysisTaskMuonAODfromGeneral.cxx:37
 AliAnalysisTaskMuonAODfromGeneral.cxx:38
 AliAnalysisTaskMuonAODfromGeneral.cxx:39
 AliAnalysisTaskMuonAODfromGeneral.cxx:40
 AliAnalysisTaskMuonAODfromGeneral.cxx:41
 AliAnalysisTaskMuonAODfromGeneral.cxx:42
 AliAnalysisTaskMuonAODfromGeneral.cxx:43
 AliAnalysisTaskMuonAODfromGeneral.cxx:44
 AliAnalysisTaskMuonAODfromGeneral.cxx:45
 AliAnalysisTaskMuonAODfromGeneral.cxx:46
 AliAnalysisTaskMuonAODfromGeneral.cxx:47
 AliAnalysisTaskMuonAODfromGeneral.cxx:48
 AliAnalysisTaskMuonAODfromGeneral.cxx:49
 AliAnalysisTaskMuonAODfromGeneral.cxx:50
 AliAnalysisTaskMuonAODfromGeneral.cxx:51
 AliAnalysisTaskMuonAODfromGeneral.cxx:52
 AliAnalysisTaskMuonAODfromGeneral.cxx:53
 AliAnalysisTaskMuonAODfromGeneral.cxx:54
 AliAnalysisTaskMuonAODfromGeneral.cxx:55
 AliAnalysisTaskMuonAODfromGeneral.cxx:56
 AliAnalysisTaskMuonAODfromGeneral.cxx:57
 AliAnalysisTaskMuonAODfromGeneral.cxx:58
 AliAnalysisTaskMuonAODfromGeneral.cxx:59
 AliAnalysisTaskMuonAODfromGeneral.cxx:60
 AliAnalysisTaskMuonAODfromGeneral.cxx:61
 AliAnalysisTaskMuonAODfromGeneral.cxx:62
 AliAnalysisTaskMuonAODfromGeneral.cxx:63
 AliAnalysisTaskMuonAODfromGeneral.cxx:64
 AliAnalysisTaskMuonAODfromGeneral.cxx:65
 AliAnalysisTaskMuonAODfromGeneral.cxx:66
 AliAnalysisTaskMuonAODfromGeneral.cxx:67
 AliAnalysisTaskMuonAODfromGeneral.cxx:68
 AliAnalysisTaskMuonAODfromGeneral.cxx:69
 AliAnalysisTaskMuonAODfromGeneral.cxx:70
 AliAnalysisTaskMuonAODfromGeneral.cxx:71
 AliAnalysisTaskMuonAODfromGeneral.cxx:72
 AliAnalysisTaskMuonAODfromGeneral.cxx:73
 AliAnalysisTaskMuonAODfromGeneral.cxx:74
 AliAnalysisTaskMuonAODfromGeneral.cxx:75
 AliAnalysisTaskMuonAODfromGeneral.cxx:76
 AliAnalysisTaskMuonAODfromGeneral.cxx:77
 AliAnalysisTaskMuonAODfromGeneral.cxx:78
 AliAnalysisTaskMuonAODfromGeneral.cxx:79
 AliAnalysisTaskMuonAODfromGeneral.cxx:80
 AliAnalysisTaskMuonAODfromGeneral.cxx:81
 AliAnalysisTaskMuonAODfromGeneral.cxx:82
 AliAnalysisTaskMuonAODfromGeneral.cxx:83
 AliAnalysisTaskMuonAODfromGeneral.cxx:84
 AliAnalysisTaskMuonAODfromGeneral.cxx:85
 AliAnalysisTaskMuonAODfromGeneral.cxx:86
 AliAnalysisTaskMuonAODfromGeneral.cxx:87
 AliAnalysisTaskMuonAODfromGeneral.cxx:88
 AliAnalysisTaskMuonAODfromGeneral.cxx:89
 AliAnalysisTaskMuonAODfromGeneral.cxx:90
 AliAnalysisTaskMuonAODfromGeneral.cxx:91
 AliAnalysisTaskMuonAODfromGeneral.cxx:92
 AliAnalysisTaskMuonAODfromGeneral.cxx:93
 AliAnalysisTaskMuonAODfromGeneral.cxx:94
 AliAnalysisTaskMuonAODfromGeneral.cxx:95
 AliAnalysisTaskMuonAODfromGeneral.cxx:96
 AliAnalysisTaskMuonAODfromGeneral.cxx:97
 AliAnalysisTaskMuonAODfromGeneral.cxx:98
 AliAnalysisTaskMuonAODfromGeneral.cxx:99
 AliAnalysisTaskMuonAODfromGeneral.cxx:100
 AliAnalysisTaskMuonAODfromGeneral.cxx:101
 AliAnalysisTaskMuonAODfromGeneral.cxx:102
 AliAnalysisTaskMuonAODfromGeneral.cxx:103
 AliAnalysisTaskMuonAODfromGeneral.cxx:104
 AliAnalysisTaskMuonAODfromGeneral.cxx:105
 AliAnalysisTaskMuonAODfromGeneral.cxx:106
 AliAnalysisTaskMuonAODfromGeneral.cxx:107
 AliAnalysisTaskMuonAODfromGeneral.cxx:108
 AliAnalysisTaskMuonAODfromGeneral.cxx:109
 AliAnalysisTaskMuonAODfromGeneral.cxx:110
 AliAnalysisTaskMuonAODfromGeneral.cxx:111
 AliAnalysisTaskMuonAODfromGeneral.cxx:112
 AliAnalysisTaskMuonAODfromGeneral.cxx:113
 AliAnalysisTaskMuonAODfromGeneral.cxx:114
 AliAnalysisTaskMuonAODfromGeneral.cxx:115
 AliAnalysisTaskMuonAODfromGeneral.cxx:116
 AliAnalysisTaskMuonAODfromGeneral.cxx:117
 AliAnalysisTaskMuonAODfromGeneral.cxx:118
 AliAnalysisTaskMuonAODfromGeneral.cxx:119
 AliAnalysisTaskMuonAODfromGeneral.cxx:120
 AliAnalysisTaskMuonAODfromGeneral.cxx:121
 AliAnalysisTaskMuonAODfromGeneral.cxx:122
 AliAnalysisTaskMuonAODfromGeneral.cxx:123
 AliAnalysisTaskMuonAODfromGeneral.cxx:124
 AliAnalysisTaskMuonAODfromGeneral.cxx:125
 AliAnalysisTaskMuonAODfromGeneral.cxx:126
 AliAnalysisTaskMuonAODfromGeneral.cxx:127
 AliAnalysisTaskMuonAODfromGeneral.cxx:128
 AliAnalysisTaskMuonAODfromGeneral.cxx:129
 AliAnalysisTaskMuonAODfromGeneral.cxx:130
 AliAnalysisTaskMuonAODfromGeneral.cxx:131
 AliAnalysisTaskMuonAODfromGeneral.cxx:132
 AliAnalysisTaskMuonAODfromGeneral.cxx:133
 AliAnalysisTaskMuonAODfromGeneral.cxx:134
 AliAnalysisTaskMuonAODfromGeneral.cxx:135
 AliAnalysisTaskMuonAODfromGeneral.cxx:136
 AliAnalysisTaskMuonAODfromGeneral.cxx:137
 AliAnalysisTaskMuonAODfromGeneral.cxx:138
 AliAnalysisTaskMuonAODfromGeneral.cxx:139
 AliAnalysisTaskMuonAODfromGeneral.cxx:140
 AliAnalysisTaskMuonAODfromGeneral.cxx:141
 AliAnalysisTaskMuonAODfromGeneral.cxx:142
 AliAnalysisTaskMuonAODfromGeneral.cxx:143
 AliAnalysisTaskMuonAODfromGeneral.cxx:144
 AliAnalysisTaskMuonAODfromGeneral.cxx:145
 AliAnalysisTaskMuonAODfromGeneral.cxx:146
 AliAnalysisTaskMuonAODfromGeneral.cxx:147
 AliAnalysisTaskMuonAODfromGeneral.cxx:148
 AliAnalysisTaskMuonAODfromGeneral.cxx:149
 AliAnalysisTaskMuonAODfromGeneral.cxx:150
 AliAnalysisTaskMuonAODfromGeneral.cxx:151
 AliAnalysisTaskMuonAODfromGeneral.cxx:152
 AliAnalysisTaskMuonAODfromGeneral.cxx:153
 AliAnalysisTaskMuonAODfromGeneral.cxx:154
 AliAnalysisTaskMuonAODfromGeneral.cxx:155
 AliAnalysisTaskMuonAODfromGeneral.cxx:156
 AliAnalysisTaskMuonAODfromGeneral.cxx:157
 AliAnalysisTaskMuonAODfromGeneral.cxx:158
 AliAnalysisTaskMuonAODfromGeneral.cxx:159
 AliAnalysisTaskMuonAODfromGeneral.cxx:160
 AliAnalysisTaskMuonAODfromGeneral.cxx:161
 AliAnalysisTaskMuonAODfromGeneral.cxx:162
 AliAnalysisTaskMuonAODfromGeneral.cxx:163
 AliAnalysisTaskMuonAODfromGeneral.cxx:164
 AliAnalysisTaskMuonAODfromGeneral.cxx:165
 AliAnalysisTaskMuonAODfromGeneral.cxx:166
 AliAnalysisTaskMuonAODfromGeneral.cxx:167
 AliAnalysisTaskMuonAODfromGeneral.cxx:168
 AliAnalysisTaskMuonAODfromGeneral.cxx:169
 AliAnalysisTaskMuonAODfromGeneral.cxx:170
 AliAnalysisTaskMuonAODfromGeneral.cxx:171
 AliAnalysisTaskMuonAODfromGeneral.cxx:172
 AliAnalysisTaskMuonAODfromGeneral.cxx:173
 AliAnalysisTaskMuonAODfromGeneral.cxx:174
 AliAnalysisTaskMuonAODfromGeneral.cxx:175
 AliAnalysisTaskMuonAODfromGeneral.cxx:176
 AliAnalysisTaskMuonAODfromGeneral.cxx:177
 AliAnalysisTaskMuonAODfromGeneral.cxx:178
 AliAnalysisTaskMuonAODfromGeneral.cxx:179
 AliAnalysisTaskMuonAODfromGeneral.cxx:180
 AliAnalysisTaskMuonAODfromGeneral.cxx:181
 AliAnalysisTaskMuonAODfromGeneral.cxx:182
 AliAnalysisTaskMuonAODfromGeneral.cxx:183
 AliAnalysisTaskMuonAODfromGeneral.cxx:184
 AliAnalysisTaskMuonAODfromGeneral.cxx:185
 AliAnalysisTaskMuonAODfromGeneral.cxx:186
 AliAnalysisTaskMuonAODfromGeneral.cxx:187
 AliAnalysisTaskMuonAODfromGeneral.cxx:188
 AliAnalysisTaskMuonAODfromGeneral.cxx:189
 AliAnalysisTaskMuonAODfromGeneral.cxx:190
 AliAnalysisTaskMuonAODfromGeneral.cxx:191
 AliAnalysisTaskMuonAODfromGeneral.cxx:192
 AliAnalysisTaskMuonAODfromGeneral.cxx:193
 AliAnalysisTaskMuonAODfromGeneral.cxx:194
 AliAnalysisTaskMuonAODfromGeneral.cxx:195
 AliAnalysisTaskMuonAODfromGeneral.cxx:196
 AliAnalysisTaskMuonAODfromGeneral.cxx:197
 AliAnalysisTaskMuonAODfromGeneral.cxx:198
 AliAnalysisTaskMuonAODfromGeneral.cxx:199
 AliAnalysisTaskMuonAODfromGeneral.cxx:200
 AliAnalysisTaskMuonAODfromGeneral.cxx:201
 AliAnalysisTaskMuonAODfromGeneral.cxx:202
 AliAnalysisTaskMuonAODfromGeneral.cxx:203
 AliAnalysisTaskMuonAODfromGeneral.cxx:204
 AliAnalysisTaskMuonAODfromGeneral.cxx:205
 AliAnalysisTaskMuonAODfromGeneral.cxx:206
 AliAnalysisTaskMuonAODfromGeneral.cxx:207
 AliAnalysisTaskMuonAODfromGeneral.cxx:208
 AliAnalysisTaskMuonAODfromGeneral.cxx:209
 AliAnalysisTaskMuonAODfromGeneral.cxx:210
 AliAnalysisTaskMuonAODfromGeneral.cxx:211
 AliAnalysisTaskMuonAODfromGeneral.cxx:212
 AliAnalysisTaskMuonAODfromGeneral.cxx:213
 AliAnalysisTaskMuonAODfromGeneral.cxx:214
 AliAnalysisTaskMuonAODfromGeneral.cxx:215