ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

/* $Id$ */

/// \ingroup macros
/// \file DecodeRecoCocktail.C
/// \brief add brief description
///
/// \author A. De Falco, H. Woehri, INFN Cagliari, July 2006
///
/// This macro reads the generation/reconstruction files in the 
/// input directories (recodir and simdir), 
/// builds a tree that contains, for each event, an array of muons and dimuons
/// (TClonesArrays of AliMUONTrackLight and AliMUONPairLight objects) 
/// and writes the tree in an output file (outFileName) 
/// Note that if the path for the output file is not explicitly specified, 
/// it will be written in the directory containing the generation/reconstruction
/// 27-Nov-2006: modified by in order to loop on files
///
/// 13 Nov 2007:
/// Updated this macro to work with new version of AliMUONRecoCheck. Also, we are
/// now fetching reconstructed track data from ESD and not the track tree, because
/// the AliMUONTrack objects for reconstructed tracks are no longer stored on disk.
///  - Artur Szostak <artursz@iafrica.com>

#if !defined(__CINT__) || defined(__MAKECINT__)
#include <Riostream.h>
#include <TClonesArray.h>
#include <TFile.h>
#include <TTree.h>
#include <TMath.h>
#include <TLorentzVector.h>
#include <TParticle.h>
#include <TSystem.h>
#include "AliMUONRecoCheck.h"
#include "AliMUONTrack.h"
#include "AliMUONTrackLight.h"
#include "AliMUONPairLight.h"
#include "AliMUONVTrackStore.h"
#include "AliESDEvent.h"
#include "AliESDVertex.h"
#include "AliESDMuonTrack.h"
#include "AliMCEventHandler.h"
#include "AliMCEvent.h"
#include "AliStack.h"
/*TODO: need to update this with changes made to ITS
#include "AliITSVertexerPPZ.h"
#include "AliITSLoader.h"
*/
#endif


void DecodeRecoCocktail(
    char* recodir=".",          // The directory containing galice.root for reconstructed data.
    char* simdir="generated/",  // The directory containing galice.root for simulated data.
    char* outFileName = "MuonLight.root" // The output filename containing AliMUONTrackLight and AliMUONPairLight objects.
  )
{
/// \param recodir      The directory containing galice.root for reconstructed data.
/// \param simdir       The directory containing galice.root for simulated data.
/// \param outFileName  The output filename containing AliMUONTrackLight and AliMUONPairLight objects.

  char startingDir[200]; 
  sprintf (startingDir,"%s",gSystem->pwd()); 
  gSystem->cd(recodir); 

  TClonesArray *muonArray   = new TClonesArray("AliMUONTrackLight",10); 
  TClonesArray *dimuonArray = new TClonesArray("AliMUONPairLight",10); 
  TTree *treeOut = new TTree("tree","tree"); 

  TFile *fout = new TFile(outFileName,"recreate"); 
  fout->cd(); 

  treeOut->Branch("muons",&muonArray); 
  treeOut->Branch("dimuons",&dimuonArray); 
  
  AliMUONRecoCheck *rc = new AliMUONRecoCheck("AliESDs.root", simdir);
  
  /*TODO: need to update this with changes made to ITS
  AliITSLoader* ITSloader =  (AliITSLoader*) runLoaderSim->GetLoader("ITSLoader");
  AliITSVertexerPPZ *dovert = 0; 
  if (ITSloader) { 
    dovert = new AliITSVertexerPPZ("default",0,0);
    // dovert->SetDebug(0);
    dovert->SetDiffPhiMax(0.05);
    dovert->SetWindow(3.);
  }
  AliESDVertex *vert = 0;
  */
  
  TLorentzVector v; 
 
  Int_t nev = rc->NumberOfEvents();
  for(Int_t ievent = 0; ievent < nev; ievent++){ // loop over events 
    
    /*TODO: need to update this with changes made to ITS
    runLoaderSim->GetHeader();
    if (ITSloader) { 
      vert = dovert->FindVertexForCurrentEvent(ievent);
    }
    */
    
    //printf ("Event %d of %d\n",ievent,nev);
    muonArray->Clear();     // clean muon and dimuon arrays 
    dimuonArray->Clear(); 
    
    AliMUONVTrackStore* recoTracks = rc->ReconstructedTracks(ievent, kFALSE);  // Use tracks from actual reconstruction.
    //AliMUONVTrackStore* trackRefs = rc->ReconstructibleTracks(ievent);  // Only use reconstructible reference tracks.
    AliMUONVTrackStore* trackRefs = rc->TrackRefs(ievent);
    AliStack* pstack = (const_cast<AliMCEventHandler*>(rc->GetMCEventHandler()))->MCEvent()->Stack();
    
    // loop over ESD tracks
    Int_t nreftracks = 0;
    const AliESDEvent* esd = rc->GetESDEvent();
    Int_t nTracks = (Int_t)esd->GetNumberOfMuonTracks() ;
    for (Int_t iTrack = 0; iTrack <  nTracks;  iTrack++) {
      
      AliESDMuonTrack* esdTrack = esd->GetMuonTrack(iTrack);
      
      // skip ghosts
      if (!esdTrack->ContainTrackerData()) continue;
      
      // find the corresponding MUON track
      AliMUONTrack* trackReco = (AliMUONTrack*) recoTracks->FindObject(esdTrack->GetUniqueID());
      
      // try to match the reconstructed track with a simulated one
      Int_t nMatchClusters = 0;
      AliMUONTrack* matchedTrackRef = rc->FindCompatibleTrack(*trackReco, *trackRefs, nMatchClusters, kFALSE, 10.);
      
      if (matchedTrackRef) {
	
	//store new referenced track in the muonArray
	AliMUONTrackLight* muLight = new ((*muonArray)[nreftracks++]) AliMUONTrackLight();
	
	// assign parameters concerning the reconstructed tracks
	muLight->FillFromESD(esdTrack);
	// muLight->FillFromAliMUONTrack(trackReco);
	
	// store further information related to the simulated track
	muLight->SetTrackPythiaLine(matchedTrackRef->GetUniqueID());
	TParticle *part = pstack->Particle(matchedTrackRef->GetUniqueID());
	muLight->SetTrackPDGCode(part->GetPdgCode());
	v.SetPxPyPzE(part->Px(), part->Py(), part->Pz(), part->Energy());
	muLight->SetPGen(v); 
	muLight->FillMuonHistory(pstack, part);
	// 	  muLight.PrintInfo("A");
	
      }
      
    } // end esd track
    
    // now loop over muon pairs to build dimuons
    Int_t nmuons = muonArray->GetEntriesFast(); 
    Int_t ndimuons = 0; 
    for(Int_t itrRec1 = 0; itrRec1 < nmuons-1; itrRec1++) { 
      AliMUONTrackLight* mu1 = (AliMUONTrackLight*) muonArray->At(itrRec1); 
      for(Int_t itrRec2 = itrRec1+1; itrRec2 < nmuons; itrRec2++){
	AliMUONTrackLight* mu2 = (AliMUONTrackLight*) muonArray->At(itrRec2); 
	AliMUONPairLight dimuLight;
	dimuLight.SetMuons(*mu1, *mu2);
	TClonesArray &dimuons = *dimuonArray;
	new (dimuons[ndimuons++]) AliMUONPairLight(dimuLight);
      }
    }
    
    treeOut->Fill(); 
  } 
  
  fout->cd(); 
  treeOut->Write(); 
  gSystem->cd(startingDir); 
  fout->Close();
  delete muonArray;
  delete dimuonArray;
  delete treeOut; 
  delete fout;
  delete rc;
}

 DecodeRecoCocktail.C:1
 DecodeRecoCocktail.C:2
 DecodeRecoCocktail.C:3
 DecodeRecoCocktail.C:4
 DecodeRecoCocktail.C:5
 DecodeRecoCocktail.C:6
 DecodeRecoCocktail.C:7
 DecodeRecoCocktail.C:8
 DecodeRecoCocktail.C:9
 DecodeRecoCocktail.C:10
 DecodeRecoCocktail.C:11
 DecodeRecoCocktail.C:12
 DecodeRecoCocktail.C:13
 DecodeRecoCocktail.C:14
 DecodeRecoCocktail.C:15
 DecodeRecoCocktail.C:16
 DecodeRecoCocktail.C:17
 DecodeRecoCocktail.C:18
 DecodeRecoCocktail.C:19
 DecodeRecoCocktail.C:20
 DecodeRecoCocktail.C:21
 DecodeRecoCocktail.C:22
 DecodeRecoCocktail.C:23
 DecodeRecoCocktail.C:24
 DecodeRecoCocktail.C:25
 DecodeRecoCocktail.C:26
 DecodeRecoCocktail.C:27
 DecodeRecoCocktail.C:28
 DecodeRecoCocktail.C:29
 DecodeRecoCocktail.C:30
 DecodeRecoCocktail.C:31
 DecodeRecoCocktail.C:32
 DecodeRecoCocktail.C:33
 DecodeRecoCocktail.C:34
 DecodeRecoCocktail.C:35
 DecodeRecoCocktail.C:36
 DecodeRecoCocktail.C:37
 DecodeRecoCocktail.C:38
 DecodeRecoCocktail.C:39
 DecodeRecoCocktail.C:40
 DecodeRecoCocktail.C:41
 DecodeRecoCocktail.C:42
 DecodeRecoCocktail.C:43
 DecodeRecoCocktail.C:44
 DecodeRecoCocktail.C:45
 DecodeRecoCocktail.C:46
 DecodeRecoCocktail.C:47
 DecodeRecoCocktail.C:48
 DecodeRecoCocktail.C:49
 DecodeRecoCocktail.C:50
 DecodeRecoCocktail.C:51
 DecodeRecoCocktail.C:52
 DecodeRecoCocktail.C:53
 DecodeRecoCocktail.C:54
 DecodeRecoCocktail.C:55
 DecodeRecoCocktail.C:56
 DecodeRecoCocktail.C:57
 DecodeRecoCocktail.C:58
 DecodeRecoCocktail.C:59
 DecodeRecoCocktail.C:60
 DecodeRecoCocktail.C:61
 DecodeRecoCocktail.C:62
 DecodeRecoCocktail.C:63
 DecodeRecoCocktail.C:64
 DecodeRecoCocktail.C:65
 DecodeRecoCocktail.C:66
 DecodeRecoCocktail.C:67
 DecodeRecoCocktail.C:68
 DecodeRecoCocktail.C:69
 DecodeRecoCocktail.C:70
 DecodeRecoCocktail.C:71
 DecodeRecoCocktail.C:72
 DecodeRecoCocktail.C:73
 DecodeRecoCocktail.C:74
 DecodeRecoCocktail.C:75
 DecodeRecoCocktail.C:76
 DecodeRecoCocktail.C:77
 DecodeRecoCocktail.C:78
 DecodeRecoCocktail.C:79
 DecodeRecoCocktail.C:80
 DecodeRecoCocktail.C:81
 DecodeRecoCocktail.C:82
 DecodeRecoCocktail.C:83
 DecodeRecoCocktail.C:84
 DecodeRecoCocktail.C:85
 DecodeRecoCocktail.C:86
 DecodeRecoCocktail.C:87
 DecodeRecoCocktail.C:88
 DecodeRecoCocktail.C:89
 DecodeRecoCocktail.C:90
 DecodeRecoCocktail.C:91
 DecodeRecoCocktail.C:92
 DecodeRecoCocktail.C:93
 DecodeRecoCocktail.C:94
 DecodeRecoCocktail.C:95
 DecodeRecoCocktail.C:96
 DecodeRecoCocktail.C:97
 DecodeRecoCocktail.C:98
 DecodeRecoCocktail.C:99
 DecodeRecoCocktail.C:100
 DecodeRecoCocktail.C:101
 DecodeRecoCocktail.C:102
 DecodeRecoCocktail.C:103
 DecodeRecoCocktail.C:104
 DecodeRecoCocktail.C:105
 DecodeRecoCocktail.C:106
 DecodeRecoCocktail.C:107
 DecodeRecoCocktail.C:108
 DecodeRecoCocktail.C:109
 DecodeRecoCocktail.C:110
 DecodeRecoCocktail.C:111
 DecodeRecoCocktail.C:112
 DecodeRecoCocktail.C:113
 DecodeRecoCocktail.C:114
 DecodeRecoCocktail.C:115
 DecodeRecoCocktail.C:116
 DecodeRecoCocktail.C:117
 DecodeRecoCocktail.C:118
 DecodeRecoCocktail.C:119
 DecodeRecoCocktail.C:120
 DecodeRecoCocktail.C:121
 DecodeRecoCocktail.C:122
 DecodeRecoCocktail.C:123
 DecodeRecoCocktail.C:124
 DecodeRecoCocktail.C:125
 DecodeRecoCocktail.C:126
 DecodeRecoCocktail.C:127
 DecodeRecoCocktail.C:128
 DecodeRecoCocktail.C:129
 DecodeRecoCocktail.C:130
 DecodeRecoCocktail.C:131
 DecodeRecoCocktail.C:132
 DecodeRecoCocktail.C:133
 DecodeRecoCocktail.C:134
 DecodeRecoCocktail.C:135
 DecodeRecoCocktail.C:136
 DecodeRecoCocktail.C:137
 DecodeRecoCocktail.C:138
 DecodeRecoCocktail.C:139
 DecodeRecoCocktail.C:140
 DecodeRecoCocktail.C:141
 DecodeRecoCocktail.C:142
 DecodeRecoCocktail.C:143
 DecodeRecoCocktail.C:144
 DecodeRecoCocktail.C:145
 DecodeRecoCocktail.C:146
 DecodeRecoCocktail.C:147
 DecodeRecoCocktail.C:148
 DecodeRecoCocktail.C:149
 DecodeRecoCocktail.C:150
 DecodeRecoCocktail.C:151
 DecodeRecoCocktail.C:152
 DecodeRecoCocktail.C:153
 DecodeRecoCocktail.C:154
 DecodeRecoCocktail.C:155
 DecodeRecoCocktail.C:156
 DecodeRecoCocktail.C:157
 DecodeRecoCocktail.C:158
 DecodeRecoCocktail.C:159
 DecodeRecoCocktail.C:160
 DecodeRecoCocktail.C:161
 DecodeRecoCocktail.C:162
 DecodeRecoCocktail.C:163
 DecodeRecoCocktail.C:164
 DecodeRecoCocktail.C:165
 DecodeRecoCocktail.C:166
 DecodeRecoCocktail.C:167
 DecodeRecoCocktail.C:168
 DecodeRecoCocktail.C:169
 DecodeRecoCocktail.C:170
 DecodeRecoCocktail.C:171
 DecodeRecoCocktail.C:172
 DecodeRecoCocktail.C:173
 DecodeRecoCocktail.C:174
 DecodeRecoCocktail.C:175
 DecodeRecoCocktail.C:176
 DecodeRecoCocktail.C:177
 DecodeRecoCocktail.C:178
 DecodeRecoCocktail.C:179
 DecodeRecoCocktail.C:180
 DecodeRecoCocktail.C:181
 DecodeRecoCocktail.C:182
 DecodeRecoCocktail.C:183
 DecodeRecoCocktail.C:184
 DecodeRecoCocktail.C:185
 DecodeRecoCocktail.C:186
 DecodeRecoCocktail.C:187
 DecodeRecoCocktail.C:188
 DecodeRecoCocktail.C:189
 DecodeRecoCocktail.C:190
 DecodeRecoCocktail.C:191
 DecodeRecoCocktail.C:192
 DecodeRecoCocktail.C:193