]> git.uio.no Git - u/mrichter/AliRoot.git/blob - MUON/AliMUONReconstructor.cxx
Added virtual destructor (I. Hrivnacova)
[u/mrichter/AliRoot.git] / MUON / AliMUONReconstructor.cxx
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 ///////////////////////////////////////////////////////////////////////////////
19 //                                                                           //
20 // class for MUON reconstruction                                              //
21 //                                                                           //
22 ///////////////////////////////////////////////////////////////////////////////
23
24 #include "AliRunLoader.h"
25 #include "AliRun.h"
26 #include "AliESD.h"
27 #include "AliMUONData.h"
28 #include "AliMUONEventReconstructor.h"
29 #include "AliMUONClusterReconstructor.h"
30 #include "AliMUONTriggerDecision.h"
31 #include "AliMUONClusterFinderVS.h"
32 #include "AliMUONTrack.h"
33 #include "AliMUONTrackParam.h"
34 #include "AliMUONTriggerTrack.h"
35 #include "AliESDMuonTrack.h"
36 #include "AliMUONReconstructor.h"
37
38 ClassImp(AliMUONReconstructor)
39 //_____________________________________________________________________________
40 AliMUONReconstructor::AliMUONReconstructor()
41 {
42 }
43 //_____________________________________________________________________________
44 AliMUONReconstructor::~AliMUONReconstructor()
45 {
46 }
47 //_____________________________________________________________________________
48 void AliMUONReconstructor::Reconstruct(AliRunLoader* runLoader) const
49 {
50 //  AliLoader
51   AliLoader* loader = runLoader->GetLoader("MUONLoader");
52   Int_t nEvents = runLoader->GetNumberOfEvents();
53
54 // used local container for each method
55 // passing fLoader as argument, could be avoided ???
56   AliMUONEventReconstructor* recoEvent = new AliMUONEventReconstructor(loader);
57   AliMUONData* dataEvent = recoEvent->GetMUONData();
58
59   AliMUONClusterReconstructor* recoCluster = new AliMUONClusterReconstructor(loader);
60   AliMUONData* dataCluster = recoCluster->GetMUONData();
61
62   AliMUONTriggerDecision* trigDec = new AliMUONTriggerDecision(loader);
63   AliMUONData* dataTrig = trigDec->GetMUONData();
64
65
66   for (Int_t i = 0; i < 10; i++) {
67     AliMUONClusterFinderVS *RecModel = new AliMUONClusterFinderVS();
68     RecModel->SetGhostChi2Cut(10);
69     recoCluster->SetReconstructionModel(i,RecModel);
70   } 
71
72   loader->LoadDigits("READ");
73   loader->LoadRecPoints("RECREATE");
74   loader->LoadTracks("RECREATE");
75   
76   //   Loop over events              
77   for(Int_t ievent = 0; ievent < nEvents; ievent++) {
78     printf("Event %d\n",ievent);
79     runLoader->GetEvent(ievent);
80
81     //----------------------- digit2cluster & Digits2Trigger -------------------
82     if (!loader->TreeR()) loader->MakeRecPointsContainer();
83      
84     // tracking branch
85     dataCluster->MakeBranch("RC");
86     dataCluster->SetTreeAddress("D,RC");
87     recoCluster->Digits2Clusters(); 
88     dataCluster->Fill("RC"); 
89
90     // trigger branch
91     dataTrig->MakeBranch("GLT");
92     dataTrig->SetTreeAddress("D,GLT");
93     trigDec->Digits2Trigger(); 
94     dataTrig->Fill("GLT");
95
96     loader->WriteRecPoints("OVERWRITE");
97
98     //---------------------------- Track & TriggerTrack ---------------------
99     if (!loader->TreeT()) loader->MakeTracksContainer();
100
101     // trigger branch
102     dataEvent->MakeBranch("RL"); //trigger track
103     dataEvent->SetTreeAddress("RL");
104     recoEvent->EventReconstructTrigger();
105     dataEvent->Fill("RL");
106
107     // tracking branch
108     dataEvent->MakeBranch("RT"); //track
109     dataEvent->SetTreeAddress("RT");
110     recoEvent->EventReconstruct();
111     dataEvent->Fill("RT");
112
113     loader->WriteTracks("OVERWRITE");  
114   
115     //--------------------------- Resetting branches -----------------------
116     dataCluster->ResetDigits();
117     dataCluster->ResetRawClusters();
118
119     dataTrig->ResetDigits();
120     dataTrig->ResetTrigger();
121
122     dataEvent->ResetRawClusters();
123     dataEvent->ResetTrigger();
124     dataEvent->ResetRecTracks();
125     dataEvent->ResetRecTriggerTracks();
126   
127   }
128   loader->UnloadDigits();
129   loader->UnloadRecPoints();
130   loader->UnloadTracks();
131
132   delete recoCluster;
133   delete recoEvent;
134   delete trigDec;
135 }
136 //_____________________________________________________________________________
137 void AliMUONReconstructor::FillESD(AliRunLoader* runLoader, AliESD* esd) const
138 {
139   TClonesArray* recTracksArray = 0;
140   TClonesArray* recTrigTracksArray = 0;
141   
142   AliLoader* loader = runLoader->GetLoader("MUONLoader");
143   loader->LoadTracks("READ");
144
145   AliMUONData* muonData = new AliMUONData(loader,"MUON","MUON");
146
147    // declaration  
148   Int_t iEvent;
149   Int_t nTrackHits;
150   Double_t fitFmin;
151  
152
153   Double_t bendingSlope, nonBendingSlope, inverseBendingMomentum;
154   Double_t xRec, yRec, zRec, chi2MatchTrigger;
155   Bool_t matchTrigger;
156
157   // setting pointer for tracks, triggertracks& trackparam at vertex
158   AliMUONTrack* recTrack = 0;
159   AliMUONTrackParam* trackParam = 0;
160   AliMUONTriggerTrack* recTriggerTrack = 0;
161
162   iEvent = runLoader->GetEventNumber(); 
163   runLoader->GetEvent(iEvent);
164
165   // setting ESD MUON class
166   AliESDMuonTrack* ESDTrack = new  AliESDMuonTrack() ;
167
168   //-------------------- trigger tracks-------------
169   Long_t trigPat = 0;
170   muonData->SetTreeAddress("RL");
171   muonData->GetRecTriggerTracks();
172   recTrigTracksArray = muonData->RecTriggerTracks();
173
174   // ready global trigger pattern from first track
175   if (recTrigTracksArray) 
176     recTriggerTrack = (AliMUONTriggerTrack*) recTrigTracksArray->First();
177   if (recTriggerTrack) trigPat = recTriggerTrack->GetGTPattern();
178
179   //printf(">>> Event %d Number of Recconstructed tracks %d \n",iEvent, nrectracks);
180  
181   // -------------------- tracks-------------
182   muonData->SetTreeAddress("RT");
183   muonData->GetRecTracks();
184   recTracksArray = muonData->RecTracks();
185         
186   Int_t nRecTracks = 0;
187   if (recTracksArray)
188     nRecTracks = (Int_t) recTracksArray->GetEntriesFast(); //
189   
190   // loop over tracks
191   for (Int_t iRecTracks = 0; iRecTracks <  nRecTracks;  iRecTracks++) {
192
193     // reading info from tracks
194     recTrack = (AliMUONTrack*) recTracksArray->At(iRecTracks);
195
196     trackParam = recTrack->GetTrackParamAtVertex();
197
198     bendingSlope            = trackParam->GetBendingSlope();
199     nonBendingSlope         = trackParam->GetNonBendingSlope();
200     inverseBendingMomentum = trackParam->GetInverseBendingMomentum();
201     xRec  = trackParam->GetNonBendingCoor();
202     yRec  = trackParam->GetBendingCoor();
203     zRec  = trackParam->GetZ();
204
205     nTrackHits       = recTrack->GetNTrackHits();
206     fitFmin          = recTrack->GetFitFMin();
207     matchTrigger     = recTrack->GetMatchTrigger();
208     chi2MatchTrigger = recTrack->GetChi2MatchTrigger();
209
210     // setting data member of ESD MUON
211     ESDTrack->SetInverseBendingMomentum(inverseBendingMomentum);
212     ESDTrack->SetThetaX(TMath::ATan(nonBendingSlope));
213     ESDTrack->SetThetaY(TMath::ATan(bendingSlope));
214     ESDTrack->SetZ(zRec);
215     ESDTrack->SetBendingCoor(yRec);
216     ESDTrack->SetNonBendingCoor(xRec);
217     ESDTrack->SetChi2(fitFmin);
218     ESDTrack->SetNHit(nTrackHits);
219     ESDTrack->SetMatchTrigger(matchTrigger);
220     ESDTrack->SetChi2MatchTrigger(chi2MatchTrigger);
221
222     // storing ESD MUON Track into ESD Event 
223     if (nRecTracks != 0)  
224       esd->AddMuonTrack(ESDTrack);
225   } // end loop tracks
226
227   // add global trigger pattern
228   if (nRecTracks != 0)  
229     esd->SetTrigger(trigPat);
230
231   // reset muondata
232   muonData->ResetRecTracks();
233   muonData->ResetRecTriggerTracks();
234
235   //} // end loop on event  
236   loader->UnloadTracks(); 
237   delete ESDTrack;
238   delete muonData;
239 }