]> git.uio.no Git - u/mrichter/AliRoot.git/blob - MUON/DecodeRecoCocktail.C
Some unused PDF are not compiled to reduce the memory consumption when loading liblha...
[u/mrichter/AliRoot.git] / MUON / DecodeRecoCocktail.C
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 /* $Id$ */
17
18 /// \ingroup macros
19 /// \file DecodeRecoCocktail.C
20 /// \brief add brief description
21 ///
22 /// \author A. De Falco, H. Woehri, INFN Cagliari, July 2006
23 ///
24 /// This macro reads the generation/reconstruction files in the 
25 /// input directories (recodir and simdir), 
26 /// builds a tree that contains, for each event, an array of muons and dimuons
27 /// (TClonesArrays of AliMUONTrackLight and AliMUONPairLight objects) 
28 /// and writes the tree in an output file (outFileName) 
29 /// Note that if the path for the output file is not explicitly specified, 
30 /// it will be written in the directory containing the generation/reconstruction
31 /// 27-Nov-2006: modified by in order to loop on files
32 ///
33 /// 13 Nov 2007:
34 /// Updated this macro to work with new version of AliMUONRecoCheck. Also, we are
35 /// now fetching reconstructed track data from ESD and not the track tree, because
36 /// the AliMUONTrack objects for reconstructed tracks are no longer stored on disk.
37 ///  - Artur Szostak <artursz@iafrica.com>
38
39 #if !defined(__CINT__) || defined(__MAKECINT__)
40 #include <Riostream.h>
41 #include <TClonesArray.h>
42 #include <TFile.h>
43 #include <TTree.h>
44 #include <TMath.h>
45 #include <TLorentzVector.h>
46 #include <TParticle.h>
47 #include <TSystem.h>
48 #include <TGeoManager.h>
49 #include "AliMUONRecoCheck.h"
50 #include "AliMUONTrack.h"
51 #include "AliMUONTrackParam.h"
52 #include "AliMUONTrackLight.h"
53 #include "AliMUONPairLight.h"
54 #include "AliMUONVTrackStore.h"
55 #include "AliMUONTrackExtrap.h"
56 #include "AliESDEvent.h"
57 #include "AliESDVertex.h"
58 #include "AliMCEventHandler.h"
59 #include "AliMCEvent.h"
60 #include "AliMagF.h"
61 /*TODO: need to update this with changes made to ITS
62 #include "AliITSVertexerPPZ.h"
63 #include "AliITSLoader.h"
64 */
65 #include "AliTracker.h"
66 #endif
67
68
69 void DecodeRecoCocktail(
70     char* recodir=".",          // The directory containing galice.root for reconstructed data.
71     char* simdir="generated/",  // The directory containing galice.root for simulated data.
72     char* outFileName = "MuonLight.root", // The output filename containing AliMUONTrackLight and AliMUONPairLight objects.
73     char* geoFilename = "geometry.root"  // The filename containing the geometry.
74   )
75 {
76 /// \param recodir      The directory containing galice.root for reconstructed data.
77 /// \param simdir       The directory containing galice.root for simulated data.
78 /// \param outFileName  The output filename containing AliMUONTrackLight and AliMUONPairLight objects.
79 /// \param geoFilename  The filename containing the geometry.
80
81   char startingDir[200]; 
82   sprintf (startingDir,"%s",gSystem->pwd()); 
83   gSystem->cd(recodir); 
84
85   TClonesArray *muonArray   = new TClonesArray("AliMUONTrackLight",10); 
86   TClonesArray *dimuonArray = new TClonesArray("AliMUONPairLight",10); 
87   TTree *treeOut = new TTree("tree","tree"); 
88
89   TFile *fout = new TFile(outFileName,"recreate"); 
90   fout->cd(); 
91
92   treeOut->Branch("muons",&muonArray); 
93   treeOut->Branch("dimuons",&dimuonArray); 
94   
95   // Import TGeo geometry (needed by AliMUONTrackExtrap::ExtrapToVertex)
96   if (!gGeoManager) {
97     TGeoManager::Import(geoFilename);
98     if (!gGeoManager) {
99       Error("MUONmass_ESD", "getting geometry from file %s failed", geoFilename);
100       return;
101     }
102   }
103   
104   // set  mag field 
105   // waiting for mag field in CDB 
106   if (!TGeoGlobalMagField::Instance()->GetField()) {
107     printf("Loading field map...\n");
108     AliMagF* field = new AliMagF("Maps","Maps",2,1.,1., 10.,AliMagF::k5kG);
109     TGeoGlobalMagField::Instance()->SetField(field);
110   }
111   // set the magnetic field for track extrapolations
112   AliMUONTrackExtrap::SetField();
113
114   AliMUONRecoCheck *rc = new AliMUONRecoCheck("AliESDs.root", simdir);
115   Int_t nev = rc->NumberOfEvents();
116   
117   /*TODO: need to update this with changes made to ITS
118   AliITSLoader* ITSloader =  (AliITSLoader*) runLoaderSim->GetLoader("ITSLoader");
119   AliITSVertexerPPZ *dovert = 0; 
120   if (ITSloader) { 
121     dovert = new AliITSVertexerPPZ("default",0,0);
122     // dovert->SetDebug(0);
123     dovert->SetDiffPhiMax(0.05);
124     dovert->SetWindow(3.);
125   }
126   AliESDVertex *vert = 0;
127   */
128   
129   TLorentzVector v; 
130  
131   for(Int_t ievent = 0; ievent < nev; ievent++){ // loop over events 
132     
133     /*TODO: need to update this with changes made to ITS
134     runLoaderSim->GetHeader();
135     if (ITSloader) { 
136       vert = dovert->FindVertexForCurrentEvent(ievent);
137     }
138     */
139     
140     //printf ("Event %d of %d\n",ievent,nev);
141     muonArray->Clear();     // clean muon and dimuon arrays 
142     dimuonArray->Clear(); 
143     
144     AliMUONVTrackStore* recoTracks = rc->ReconstructedTracks(ievent);  // Use tracks from actual reconstruction, but this does not work anymore.
145     //AliMUONVTrackStore* trackRefs = rc->ReconstructibleTracks(ievent);  // Only use reconstructible reference tracks.
146     AliMUONVTrackStore* trackRefs = rc->TrackRefs(ievent);
147     AliStack* pstack = (const_cast<AliMCEventHandler*>(rc->GetMCEventHandler()))->MCEvent()->Stack();
148     
149     TIter next(recoTracks->CreateIterator());
150     AliMUONTrack* trackReco = NULL;
151     
152     Int_t nTrackReco = recoTracks->GetSize();
153     Int_t nTracksESD = rc->GetESDEvent()->GetNumberOfMuonTracks();
154     if (nTrackReco != nTracksESD) printf ("Tracks in recoTracks (%d) and in ESD (%d) do not match!\n", nTrackReco, nTracksESD);
155     Int_t nreftracks = 0;
156     Int_t itrRec = 0;
157     while ( (trackReco = static_cast<AliMUONTrack*>(next())) != NULL )
158     {
159       // assign parameters concerning the reconstructed tracks
160       AliMUONTrackLight muLight;
161       
162       muLight.FillFromESD(rc->GetESDEvent()->GetMuonTrack(itrRec));
163       // muLight.FillFromAliMUONTrack(trackReco);
164       
165       // find the reference track and store further information 
166       TParticle *part = muLight.FindRefTrack(trackReco, trackRefs, pstack);
167       if (part) { 
168         v.SetPxPyPzE(part->Px(), part->Py(), part->Pz(), part->Energy());
169         muLight.SetPGen(v); 
170         muLight.FillMuonHistory(pstack, part);
171         //        muLight.PrintInfo("A");
172         //store the referenced track in the muonArray:
173         TClonesArray &muons = *muonArray;
174         new (muons[nreftracks++]) AliMUONTrackLight(muLight);
175       } 
176       
177       itrRec++;
178     }  // end reco track
179     
180     // now loop over muon pairs to build dimuons
181     Int_t nmuons = muonArray->GetEntriesFast(); 
182     Int_t ndimuons = 0; 
183     for(Int_t itrRec1 = 0; itrRec1 < nmuons-1; itrRec1++) { 
184       AliMUONTrackLight* mu1 = (AliMUONTrackLight*) muonArray->At(itrRec1); 
185       for(Int_t itrRec2 = itrRec1+1; itrRec2 < nmuons; itrRec2++){
186         AliMUONTrackLight* mu2 = (AliMUONTrackLight*) muonArray->At(itrRec2); 
187         AliMUONPairLight dimuLight;
188         dimuLight.SetMuons(*mu1, *mu2);
189         TClonesArray &dimuons = *dimuonArray;
190         new (dimuons[ndimuons++]) AliMUONPairLight(dimuLight);
191       }
192     }
193     
194     treeOut->Fill(); 
195   } 
196   
197   fout->cd(); 
198   treeOut->Write(); 
199   gSystem->cd(startingDir); 
200   fout->Close();
201   delete muonArray;
202   delete dimuonArray;
203   delete treeOut; 
204   delete fout;
205   delete rc;
206 }
207