1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
17 ///////////////////////////////////////////////////////////////////////////////
19 // class for MUON reconstruction //
21 ///////////////////////////////////////////////////////////////////////////////
22 #include <TParticle.h>
25 #include "AliRunLoader.h"
26 #include "AliHeader.h"
27 #include "AliGenEventHeader.h"
29 #include "AliMUONReconstructor.h"
31 #include "AliMUONData.h"
32 #include "AliMUONTrackReconstructor.h"
33 #include "AliMUONClusterReconstructor.h"
34 #include "AliMUONClusterFinderVS.h"
35 #include "AliMUONClusterFinderAZ.h"
36 #include "AliMUONTrack.h"
37 #include "AliMUONTrackParam.h"
38 #include "AliMUONTriggerTrack.h"
39 #include "AliESDMuonTrack.h"
40 #include "AliMUONRawData.h"
42 #include "AliRawReader.h"
45 ClassImp(AliMUONReconstructor)
46 //_____________________________________________________________________________
47 AliMUONReconstructor::AliMUONReconstructor()
51 //_____________________________________________________________________________
52 AliMUONReconstructor::~AliMUONReconstructor()
55 //_____________________________________________________________________________
56 void AliMUONReconstructor::Reconstruct(AliRunLoader* runLoader) const
59 AliLoader* loader = runLoader->GetLoader("MUONLoader");
60 Int_t nEvents = runLoader->GetNumberOfEvents();
62 // used local container for each method
63 // passing fLoader as argument, could be avoided ???
64 AliMUONTrackReconstructor* recoEvent = new AliMUONTrackReconstructor(loader);
65 AliMUONData* dataEvent = recoEvent->GetMUONData();
66 recoEvent->SetTrackMethod(1); // 1 - original, 2 - Kalman
68 AliMUONClusterReconstructor* recoCluster = new AliMUONClusterReconstructor(loader);
69 AliMUONData* dataCluster = recoCluster->GetMUONData();
70 AliMUONClusterFinderVS *recModel = recoCluster->GetRecoModel();
71 //AZ If "AZ" clustering method is to be used the following 2 lines
72 // should be uncommented
73 //recModel = (AliMUONClusterFinderVS*) new AliMUONClusterFinderAZ(0,1);
74 //recoCluster->SetRecoModel(recModel);
75 recModel->SetGhostChi2Cut(10);
77 loader->LoadDigits("READ");
78 loader->LoadRecPoints("RECREATE");
79 loader->LoadTracks("RECREATE");
82 for(Int_t ievent = 0; ievent < nEvents; ievent++) {
83 printf("Event %d\n",ievent);
84 runLoader->GetEvent(ievent);
86 //----------------------- digit2cluster & Trigger2Trigger -------------------
87 if (!loader->TreeR()) loader->MakeRecPointsContainer();
90 dataCluster->MakeBranch("RC");
91 dataCluster->SetTreeAddress("D,RC");
92 recoCluster->Digits2Clusters();
93 dataCluster->Fill("RC");
96 dataCluster->MakeBranch("TC");
97 dataCluster->SetTreeAddress("TC");
98 recoCluster->Trigger2Trigger();
99 dataCluster->Fill("TC");
101 loader->WriteRecPoints("OVERWRITE");
103 //---------------------------- Track & TriggerTrack ---------------------
104 if (!loader->TreeT()) loader->MakeTracksContainer();
107 dataEvent->MakeBranch("RL"); //trigger track
108 dataEvent->SetTreeAddress("RL");
109 recoEvent->EventReconstructTrigger();
110 dataEvent->Fill("RL");
113 dataEvent->MakeBranch("RT"); //track
114 dataEvent->SetTreeAddress("RT");
115 recoEvent->EventReconstruct();
116 dataEvent->Fill("RT");
118 loader->WriteTracks("OVERWRITE");
120 //--------------------------- Resetting branches -----------------------
121 dataCluster->ResetDigits();
122 dataCluster->ResetRawClusters();
123 dataCluster->ResetTrigger();
125 dataEvent->ResetRawClusters();
126 dataEvent->ResetTrigger();
127 dataEvent->ResetRecTracks();
128 dataEvent->ResetRecTriggerTracks();
131 loader->UnloadDigits();
132 loader->UnloadRecPoints();
133 loader->UnloadTracks();
139 //_____________________________________________________________________________
140 void AliMUONReconstructor::Reconstruct(AliRunLoader* runLoader, AliRawReader* rawReader) const
143 AliLoader* loader = runLoader->GetLoader("MUONLoader");
145 // used local container for each method
146 // passing fLoader as argument, could be avoided ???
147 AliMUONTrackReconstructor* recoEvent = new AliMUONTrackReconstructor(loader);
148 AliMUONData* dataEvent = recoEvent->GetMUONData();
150 AliMUONRawData* rawData = new AliMUONRawData(loader);
151 AliMUONData* dataCluster = rawData->GetMUONData();
153 AliMUONClusterReconstructor* recoCluster = new AliMUONClusterReconstructor(loader, dataCluster);
154 AliMUONClusterFinderVS *recModel = recoCluster->GetRecoModel();
155 recModel->SetGhostChi2Cut(10);
157 loader->LoadRecPoints("RECREATE");
158 loader->LoadTracks("RECREATE");
159 loader->LoadDigits("RECREATE");
165 while (rawReader->NextEvent()) {
166 printf("Event %d\n",iEvent);
167 runLoader->GetEvent(iEvent++);
169 //----------------------- raw2digits & raw2trigger-------------------
170 if (!loader->TreeD()) loader->MakeDigitsContainer();
173 dataCluster->MakeBranch("D");
174 dataCluster->SetTreeAddress("D");
175 rawData->ReadTrackerDDL(rawReader);
176 dataCluster->Fill("D");
179 dataCluster->MakeBranch("GLT");
180 dataCluster->SetTreeAddress("GLT");
181 rawData->ReadTriggerDDL(rawReader);
182 dataCluster->Fill("GLT");
184 loader->WriteDigits("OVERWRITE");
186 //----------------------- digit2cluster & Trigger2Trigger -------------------
187 if (!loader->TreeR()) loader->MakeRecPointsContainer();
190 dataCluster->MakeBranch("RC");
191 dataCluster->SetTreeAddress("RC");
192 recoCluster->Digits2Clusters();
193 dataCluster->Fill("RC");
196 dataCluster->MakeBranch("TC");
197 dataCluster->SetTreeAddress("TC");
198 recoCluster->Trigger2Trigger();
199 dataCluster->Fill("TC");
201 loader->WriteRecPoints("OVERWRITE");
203 //---------------------------- Track & TriggerTrack ---------------------
204 if (!loader->TreeT()) loader->MakeTracksContainer();
207 dataEvent->MakeBranch("RL"); //trigger track
208 dataEvent->SetTreeAddress("RL");
209 recoEvent->EventReconstructTrigger();
210 dataEvent->Fill("RL");
213 dataEvent->MakeBranch("RT"); //track
214 dataEvent->SetTreeAddress("RT");
215 recoEvent->EventReconstruct();
216 dataEvent->Fill("RT");
218 loader->WriteTracks("OVERWRITE");
220 //--------------------------- Resetting branches -----------------------
221 dataCluster->ResetDigits();
222 dataCluster->ResetRawClusters();
223 dataCluster->ResetTrigger();
225 dataEvent->ResetRawClusters();
226 dataEvent->ResetTrigger();
227 dataEvent->ResetRecTracks();
228 dataEvent->ResetRecTriggerTracks();
231 loader->UnloadRecPoints();
232 loader->UnloadTracks();
233 loader->UnloadDigits();
239 //_____________________________________________________________________________
240 void AliMUONReconstructor::FillESD(AliRunLoader* runLoader, AliESD* esd) const
242 TClonesArray* recTracksArray = 0;
243 TClonesArray* recTrigTracksArray = 0;
245 AliLoader* loader = runLoader->GetLoader("MUONLoader");
246 loader->LoadTracks("READ");
247 AliMUONData* muonData = new AliMUONData(loader,"MUON","MUON");
250 Int_t iEvent;// nPart;
251 Int_t nTrackHits;// nPrimary;
255 Double_t bendingSlope, nonBendingSlope, inverseBendingMomentum;
256 Double_t xRec, yRec, zRec, chi2MatchTrigger;
259 // setting pointer for tracks, triggertracks & trackparam at vertex
260 AliMUONTrack* recTrack = 0;
261 AliMUONTrackParam* trackParam = 0;
262 AliMUONTriggerTrack* recTriggerTrack = 0;
263 // TParticle* particle = new TParticle();
264 // AliGenEventHeader* header = 0;
265 iEvent = runLoader->GetEventNumber();
266 runLoader->GetEvent(iEvent);
268 // vertex calculation (maybe it exists already somewhere else)
269 vertex[0] = vertex[1] = vertex[2] = 0.;
271 // if ( (header = runLoader->GetHeader()->GenEventHeader()) ) {
272 // header->PrimaryVertex(vertex);
274 // runLoader->LoadKinematics("READ");
275 // runLoader->TreeK()->GetBranch("Particles")->SetAddress(&particle);
276 // nPart = (Int_t)runLoader->TreeK()->GetEntries();
277 // for(Int_t iPart = 0; iPart < nPart; iPart++) {
278 // runLoader->TreeK()->GetEvent(iPart);
279 // if (particle->GetFirstMother() == -1) {
280 // vertex[0] += particle->Vx();
281 // vertex[1] += particle->Vy();
282 // vertex[2] += particle->Vz();
286 // vertex[0] /= (double)nPrimary;
287 // vertex[1] /= (double)nPrimary;
288 // vertex[2] /= (double)nPrimary;
292 // setting ESD MUON class
293 AliESDMuonTrack* theESDTrack = new AliESDMuonTrack() ;
295 //-------------------- trigger tracks-------------
297 muonData->SetTreeAddress("RL");
298 muonData->GetRecTriggerTracks();
299 recTrigTracksArray = muonData->RecTriggerTracks();
301 // ready global trigger pattern from first track
302 if (recTrigTracksArray)
303 recTriggerTrack = (AliMUONTriggerTrack*) recTrigTracksArray->First();
304 if (recTriggerTrack) trigPat = recTriggerTrack->GetGTPattern();
306 //printf(">>> Event %d Number of Recconstructed tracks %d \n",iEvent, nrectracks);
308 // -------------------- tracks-------------
309 muonData->SetTreeAddress("RT");
310 muonData->GetRecTracks();
311 recTracksArray = muonData->RecTracks();
313 Int_t nRecTracks = 0;
315 nRecTracks = (Int_t) recTracksArray->GetEntriesFast(); //
318 for (Int_t iRecTracks = 0; iRecTracks < nRecTracks; iRecTracks++) {
320 // reading info from tracks
321 recTrack = (AliMUONTrack*) recTracksArray->At(iRecTracks);
323 trackParam = (AliMUONTrackParam*) (recTrack->GetTrackParamAtHit())->First();
324 trackParam->ExtrapToVertex(vertex[0],vertex[1],vertex[2]);
326 bendingSlope = trackParam->GetBendingSlope();
327 nonBendingSlope = trackParam->GetNonBendingSlope();
328 inverseBendingMomentum = trackParam->GetInverseBendingMomentum();
329 xRec = trackParam->GetNonBendingCoor();
330 yRec = trackParam->GetBendingCoor();
331 zRec = trackParam->GetZ();
333 nTrackHits = recTrack->GetNTrackHits();
334 fitFmin = recTrack->GetFitFMin();
335 matchTrigger = recTrack->GetMatchTrigger();
336 chi2MatchTrigger = recTrack->GetChi2MatchTrigger();
338 // setting data member of ESD MUON
339 theESDTrack->SetInverseBendingMomentum(inverseBendingMomentum);
340 theESDTrack->SetThetaX(TMath::ATan(nonBendingSlope));
341 theESDTrack->SetThetaY(TMath::ATan(bendingSlope));
342 theESDTrack->SetZ(zRec);
343 theESDTrack->SetBendingCoor(yRec); // calculate vertex at ESD or Tracking level ?
344 theESDTrack->SetNonBendingCoor(xRec);
345 theESDTrack->SetChi2(fitFmin);
346 theESDTrack->SetNHit(nTrackHits);
347 theESDTrack->SetMatchTrigger(matchTrigger);
348 theESDTrack->SetChi2MatchTrigger(chi2MatchTrigger);
350 // storing ESD MUON Track into ESD Event
352 esd->AddMuonTrack(theESDTrack);
355 // add global trigger pattern
357 esd->SetTrigger(trigPat);
360 muonData->ResetRecTracks();
361 muonData->ResetRecTriggerTracks();
363 //} // end loop on event
364 loader->UnloadTracks();
366 // runLoader->UnloadKinematics();
370 }//_____________________________________________________________________________
371 void AliMUONReconstructor::FillESD(AliRunLoader* runLoader, AliRawReader* /*rawReader*/, AliESD* esd) const
373 // don't need rawReader ???
374 FillESD(runLoader, esd);