ROOT logo
void AnalysisTrainMuonLocal(char* filein = "AliESDs.root", 
                            char* fileout = "AliAODs.root", 
			    Int_t nev=123456789)

// Macro to produce a generic AOD starting from an ESD file. 
// The AOD is filled with two tasks: 
// 1- with the first one (AliAnalysisTaskESDfilter), 
//    all the branches of the AOD are filled apart from the muons. 
// 2- with the second task (AliAnalysisTaskESDMuonFilter) 
//    muons tracks are added to the tracks branch 
// 3- with a third task (AliAnalysisTaskTagCreator) 
//    aod tags are created 
// There is the possibility to apply cuts on the tracks and muon tracks in 
// order to reject them before filling the AOD
// This macro works locally

{
    gSystem->Load("libTree.so");
    gSystem->Load("libGeom.so");
    gSystem->Load("libVMC.so");
    gSystem->Load("libPhysics.so");
    gSystem->Load("${ALICE_ROOT}/lib/tgt_${ALICE_TARGET}/libPWGmuon.so");  // for aliroot based analysis

    // Par files for a par based analysis 
    // SetupPar("STEERBase");
    // SetupPar("ESD");
    // SetupPar("AOD");
    // SetupPar("ANALYSIS");
    // SetupPar("ANALYSISalice");
    // SetupPar("PWG3muon");   

    // Creating ESD Tags on the fly
    // The recreation of the ESD tag file is only needed in order to copy the infos on
    // run/LHC parameters into the AOD tag file. If the ESD tag file is not recreated, the
    // run/LHC info in the AOD tag file will be empty.
    AliESDTagCreator *t = new AliESDTagCreator();
    t->SetStorage(0);
    t->ReadLocalCollection("."); 

    // Input ESD file
    TChain* chain = new TChain("esdTree");  
    chain->Add(filein);
   
    // Define the analysis manager
    AliAnalysisManager *mgr  = new AliAnalysisManager("Analysis Train", "Analysis train");
    
    // ESD input handler
    AliESDInputHandler *esdHandler = new AliESDInputHandler();
    esdHandler->SetReadTags();
    
    // AOD output handler
    AliAODHandler* aodHandler   = new AliAODHandler();
    aodHandler->SetOutputFileName(fileout);

    mgr->SetInputEventHandler(esdHandler);
    mgr->SetOutputEventHandler(aodHandler);
    
    // Set of cuts for the ESD filters. 
    // Only tracks surviving the cuts will be copied into the AOD
    // 
    // standard cut for non-muon tracks
    AliESDtrackCuts* esdTrackCutsL = new AliESDtrackCuts("AliESDtrackCuts", "Loose");
    esdTrackCutsL->SetMinNClustersTPC(50);
    esdTrackCutsL->SetMaxChi2PerClusterTPC(3.5);
    esdTrackCutsL->SetMaxCovDiagonalElements(2,2,0.5,0.5,2);
    esdTrackCutsL->SetRequireTPCRefit(kTRUE);
    esdTrackCutsL->SetMinNsigmaToVertex(3);
    esdTrackCutsL->SetRequireSigmaToVertex(kTRUE);
    esdTrackCutsL->SetAcceptKingDaughters(kFALSE);
    //
    // hard cuts for non-muon tracks
    AliESDtrackCuts* esdTrackCutsH = new AliESDtrackCuts("AliESDtrackCuts", "Hard");
    esdTrackCutsH->SetMinNClustersTPC(100);
    esdTrackCutsH->SetMaxChi2PerClusterTPC(2.0);
    esdTrackCutsH->SetMaxCovDiagonalElements(2,2,0.5,0.5,2);
    esdTrackCutsH->SetRequireTPCRefit(kTRUE);
    esdTrackCutsH->SetMinNsigmaToVertex(2);
    esdTrackCutsH->SetRequireSigmaToVertex(kTRUE);
    esdTrackCutsH->SetAcceptKingDaughters(kFALSE);
    esdTrackCutsH->SetPRange(0.,2.);
    //
    //  muon cuts
    AliESDMuonTrackCuts* esdMuonTrackCuts = new AliESDMuonTrackCuts("AliESDMuonTrackCuts", "test");
    esdMuonTrackCuts->SetPRange(0.,12.);
    esdMuonTrackCuts->SetPtRange(0.,2.);   // examples of kinematic cuts that can be applied
    esdMuonTrackCuts->SetHistogramsOn(kTRUE);  // methods to draw control histos
    esdMuonTrackCuts->DefineHistograms();
    esdMuonTrackCuts->DrawHistograms();
    
    // track filter (to reject tracks not surviving the previously defined cuts - 
    // refers to all particles apart from muons)
    AliAnalysisFilter* trackFilter = new AliAnalysisFilter("trackFilter");
    trackFilter->AddCuts(esdTrackCutsH);
    
    // muon track filter  (to reject muon tracks not surviving the previously defined cuts)
    AliAnalysisFilter* trackMuonFilter = new AliAnalysisFilter("trackMuonFilter");
    trackMuonFilter->AddCuts(esdMuonTrackCuts);

    // ESD filter task to fill standard info in the output generic AOD 
    AliAnalysisTaskESDfilter *esdfilter = new AliAnalysisTaskESDfilter("ESD Filter");
    //esdfilter->SetTrackFilter(trackFilter); //uncomment to apply cuts on the tracks
    esdfilter->SetDebugLevel(10);
    mgr->AddTask(esdfilter);
    
    // ESD filter task filling muon info in the output generic AOD 
    AliAnalysisTaskESDMuonFilter *esdmuonfilter = new AliAnalysisTaskESDMuonFilter("ESD Muon Filter");
    //esdmuonfilter->SetTrackFilter(trackMuonFilter); //uncomment to apply cuts on the muon tracks
    mgr->AddTask(esdmuonfilter);

    // Tag Creator
    AliAnalysisTaskTagCreator* tagTask = new AliAnalysisTaskTagCreator("AOD Tag Creator");
    mgr->AddTask(tagTask);
    
    // Input container
    AliAnalysisDataContainer *cin_esd = mgr->GetCommonInputContainer();
    // Output AOD container. 
    AliAnalysisDataContainer *cout_aod = mgr->GetCommonOutputContainer();
    // Tag container							      
    AliAnalysisDataContainer *cout_tags = mgr->CreateContainer("cTag",TTree::Class(), 
                                                               AliAnalysisManager::kOutputContainer, "AOD.tag.root");
    
    // Connect containers to tasks slots
    mgr->ConnectInput  (esdfilter,  0, cin_esd  );
    mgr->ConnectOutput (esdfilter,  0, cout_aod );

    mgr->ConnectInput  (esdmuonfilter,  0, cin_esd);
    mgr->ConnectOutput (esdmuonfilter,  0, cout_aod );
 
    mgr->ConnectInput  (tagTask, 0, cin_esd);
    mgr->ConnectOutput (tagTask, 1, cout_tags);

    //
    // Run the analysis
    //    
    if (mgr->InitAnalysis()) {
        mgr->PrintStatus();
        mgr->StartAnalysis("local",chain,nev);
    }   
}

//______________________________________________________________________________
void SetupPar(char* pararchivename)
{
    if (pararchivename) {
	char processline[1024];
	sprintf(processline,".! tar xvzf %s.par",pararchivename);
	gROOT->ProcessLine(processline);
	TString ocwd = gSystem->WorkingDirectory();
	gSystem->ChangeDirectory(pararchivename);
	
	// check for BUILD.sh and execute
	if (!gSystem->AccessPathName("PROOF-INF/BUILD.sh")) {
	    printf("*******************************\n");
	    printf("*** Building PAR archive    ***\n");
	    printf("*******************************\n");
	    
	    if (gSystem->Exec("PROOF-INF/BUILD.sh")) {
		Error("runProcess","Cannot Build the PAR Archive! - Abort!");
		return -1;
	    }
	}
	// check for SETUP.C and execute
	if (!gSystem->AccessPathName("PROOF-INF/SETUP.C")) {
	    printf("*******************************\n");
	    printf("*** Setup PAR archive       ***\n");
	    printf("*******************************\n");
	    gROOT->Macro("PROOF-INF/SETUP.C");
	}
	
	gSystem->ChangeDirectory(ocwd.Data());
   printf("Current dir: %s\n", ocwd.Data());
    } 
}
 AnalysisTrainMuonLocal.C:1
 AnalysisTrainMuonLocal.C:2
 AnalysisTrainMuonLocal.C:3
 AnalysisTrainMuonLocal.C:4
 AnalysisTrainMuonLocal.C:5
 AnalysisTrainMuonLocal.C:6
 AnalysisTrainMuonLocal.C:7
 AnalysisTrainMuonLocal.C:8
 AnalysisTrainMuonLocal.C:9
 AnalysisTrainMuonLocal.C:10
 AnalysisTrainMuonLocal.C:11
 AnalysisTrainMuonLocal.C:12
 AnalysisTrainMuonLocal.C:13
 AnalysisTrainMuonLocal.C:14
 AnalysisTrainMuonLocal.C:15
 AnalysisTrainMuonLocal.C:16
 AnalysisTrainMuonLocal.C:17
 AnalysisTrainMuonLocal.C:18
 AnalysisTrainMuonLocal.C:19
 AnalysisTrainMuonLocal.C:20
 AnalysisTrainMuonLocal.C:21
 AnalysisTrainMuonLocal.C:22
 AnalysisTrainMuonLocal.C:23
 AnalysisTrainMuonLocal.C:24
 AnalysisTrainMuonLocal.C:25
 AnalysisTrainMuonLocal.C:26
 AnalysisTrainMuonLocal.C:27
 AnalysisTrainMuonLocal.C:28
 AnalysisTrainMuonLocal.C:29
 AnalysisTrainMuonLocal.C:30
 AnalysisTrainMuonLocal.C:31
 AnalysisTrainMuonLocal.C:32
 AnalysisTrainMuonLocal.C:33
 AnalysisTrainMuonLocal.C:34
 AnalysisTrainMuonLocal.C:35
 AnalysisTrainMuonLocal.C:36
 AnalysisTrainMuonLocal.C:37
 AnalysisTrainMuonLocal.C:38
 AnalysisTrainMuonLocal.C:39
 AnalysisTrainMuonLocal.C:40
 AnalysisTrainMuonLocal.C:41
 AnalysisTrainMuonLocal.C:42
 AnalysisTrainMuonLocal.C:43
 AnalysisTrainMuonLocal.C:44
 AnalysisTrainMuonLocal.C:45
 AnalysisTrainMuonLocal.C:46
 AnalysisTrainMuonLocal.C:47
 AnalysisTrainMuonLocal.C:48
 AnalysisTrainMuonLocal.C:49
 AnalysisTrainMuonLocal.C:50
 AnalysisTrainMuonLocal.C:51
 AnalysisTrainMuonLocal.C:52
 AnalysisTrainMuonLocal.C:53
 AnalysisTrainMuonLocal.C:54
 AnalysisTrainMuonLocal.C:55
 AnalysisTrainMuonLocal.C:56
 AnalysisTrainMuonLocal.C:57
 AnalysisTrainMuonLocal.C:58
 AnalysisTrainMuonLocal.C:59
 AnalysisTrainMuonLocal.C:60
 AnalysisTrainMuonLocal.C:61
 AnalysisTrainMuonLocal.C:62
 AnalysisTrainMuonLocal.C:63
 AnalysisTrainMuonLocal.C:64
 AnalysisTrainMuonLocal.C:65
 AnalysisTrainMuonLocal.C:66
 AnalysisTrainMuonLocal.C:67
 AnalysisTrainMuonLocal.C:68
 AnalysisTrainMuonLocal.C:69
 AnalysisTrainMuonLocal.C:70
 AnalysisTrainMuonLocal.C:71
 AnalysisTrainMuonLocal.C:72
 AnalysisTrainMuonLocal.C:73
 AnalysisTrainMuonLocal.C:74
 AnalysisTrainMuonLocal.C:75
 AnalysisTrainMuonLocal.C:76
 AnalysisTrainMuonLocal.C:77
 AnalysisTrainMuonLocal.C:78
 AnalysisTrainMuonLocal.C:79
 AnalysisTrainMuonLocal.C:80
 AnalysisTrainMuonLocal.C:81
 AnalysisTrainMuonLocal.C:82
 AnalysisTrainMuonLocal.C:83
 AnalysisTrainMuonLocal.C:84
 AnalysisTrainMuonLocal.C:85
 AnalysisTrainMuonLocal.C:86
 AnalysisTrainMuonLocal.C:87
 AnalysisTrainMuonLocal.C:88
 AnalysisTrainMuonLocal.C:89
 AnalysisTrainMuonLocal.C:90
 AnalysisTrainMuonLocal.C:91
 AnalysisTrainMuonLocal.C:92
 AnalysisTrainMuonLocal.C:93
 AnalysisTrainMuonLocal.C:94
 AnalysisTrainMuonLocal.C:95
 AnalysisTrainMuonLocal.C:96
 AnalysisTrainMuonLocal.C:97
 AnalysisTrainMuonLocal.C:98
 AnalysisTrainMuonLocal.C:99
 AnalysisTrainMuonLocal.C:100
 AnalysisTrainMuonLocal.C:101
 AnalysisTrainMuonLocal.C:102
 AnalysisTrainMuonLocal.C:103
 AnalysisTrainMuonLocal.C:104
 AnalysisTrainMuonLocal.C:105
 AnalysisTrainMuonLocal.C:106
 AnalysisTrainMuonLocal.C:107
 AnalysisTrainMuonLocal.C:108
 AnalysisTrainMuonLocal.C:109
 AnalysisTrainMuonLocal.C:110
 AnalysisTrainMuonLocal.C:111
 AnalysisTrainMuonLocal.C:112
 AnalysisTrainMuonLocal.C:113
 AnalysisTrainMuonLocal.C:114
 AnalysisTrainMuonLocal.C:115
 AnalysisTrainMuonLocal.C:116
 AnalysisTrainMuonLocal.C:117
 AnalysisTrainMuonLocal.C:118
 AnalysisTrainMuonLocal.C:119
 AnalysisTrainMuonLocal.C:120
 AnalysisTrainMuonLocal.C:121
 AnalysisTrainMuonLocal.C:122
 AnalysisTrainMuonLocal.C:123
 AnalysisTrainMuonLocal.C:124
 AnalysisTrainMuonLocal.C:125
 AnalysisTrainMuonLocal.C:126
 AnalysisTrainMuonLocal.C:127
 AnalysisTrainMuonLocal.C:128
 AnalysisTrainMuonLocal.C:129
 AnalysisTrainMuonLocal.C:130
 AnalysisTrainMuonLocal.C:131
 AnalysisTrainMuonLocal.C:132
 AnalysisTrainMuonLocal.C:133
 AnalysisTrainMuonLocal.C:134
 AnalysisTrainMuonLocal.C:135
 AnalysisTrainMuonLocal.C:136
 AnalysisTrainMuonLocal.C:137
 AnalysisTrainMuonLocal.C:138
 AnalysisTrainMuonLocal.C:139
 AnalysisTrainMuonLocal.C:140
 AnalysisTrainMuonLocal.C:141
 AnalysisTrainMuonLocal.C:142
 AnalysisTrainMuonLocal.C:143
 AnalysisTrainMuonLocal.C:144
 AnalysisTrainMuonLocal.C:145
 AnalysisTrainMuonLocal.C:146
 AnalysisTrainMuonLocal.C:147
 AnalysisTrainMuonLocal.C:148
 AnalysisTrainMuonLocal.C:149
 AnalysisTrainMuonLocal.C:150
 AnalysisTrainMuonLocal.C:151
 AnalysisTrainMuonLocal.C:152
 AnalysisTrainMuonLocal.C:153
 AnalysisTrainMuonLocal.C:154
 AnalysisTrainMuonLocal.C:155
 AnalysisTrainMuonLocal.C:156
 AnalysisTrainMuonLocal.C:157
 AnalysisTrainMuonLocal.C:158
 AnalysisTrainMuonLocal.C:159
 AnalysisTrainMuonLocal.C:160
 AnalysisTrainMuonLocal.C:161
 AnalysisTrainMuonLocal.C:162
 AnalysisTrainMuonLocal.C:163
 AnalysisTrainMuonLocal.C:164
 AnalysisTrainMuonLocal.C:165
 AnalysisTrainMuonLocal.C:166
 AnalysisTrainMuonLocal.C:167
 AnalysisTrainMuonLocal.C:168
 AnalysisTrainMuonLocal.C:169
 AnalysisTrainMuonLocal.C:170
 AnalysisTrainMuonLocal.C:171
 AnalysisTrainMuonLocal.C:172
 AnalysisTrainMuonLocal.C:173
 AnalysisTrainMuonLocal.C:174