]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MUON/AliMUONReconstructor.cxx
- Added new functions:
[u/mrichter/AliRoot.git] / MUON / AliMUONReconstructor.cxx
CommitLineData
cac2eb58 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 **************************************************************************/
cac2eb58 15/* $Id$ */
16
37827b29 17//-----------------------------
18// Class AliMUONReconstructor
19//-----------------------------
9265505b 20// Class for the
21// MUON track reconstruction
30178c30 22
cf464691 23#include "AliMUONReconstructor.h"
b2d7df0b 24
25#include "AliESD.h"
26#include "AliESDMuonTrack.h"
94f6fba9 27#include "AliLog.h"
96fdfe9a 28#include "AliMUONConstants.h"
b2d7df0b 29#include "AliMUONCalibrationData.h"
346fb008 30#include "AliMUONClusterFinderAZ.h"
b2d7df0b 31#include "AliMUONClusterReconstructor.h"
32#include "AliMUONData.h"
33#include "AliMUONDigitCalibrator.h"
cc87ebcd 34#include "AliMUONEventRecoCombi.h"
2cf44ef3 35#include "AliMUONDigitMaker.h"
cac2eb58 36#include "AliMUONTrack.h"
37#include "AliMUONTrackParam.h"
37827b29 38#include "AliMUONTrackExtrap.h"
2457f726 39#include "AliMUONVTrackReconstructor.h"
b2d7df0b 40#include "AliMUONTrackReconstructor.h"
2457f726 41#include "AliMUONTrackReconstructorK.h"
cac2eb58 42#include "AliMUONTriggerTrack.h"
e1a10d41 43#include "AliMUONTriggerCircuit.h"
96fdfe9a 44#include "AliMUONTriggerCrateStore.h"
6a518391 45#include "AliMUONSegFactory.h"
46#include "AliMUONSegmentation.h"
9265505b 47
48#include "AliMpSegmentation.h"
96fdfe9a 49
f9247068 50#include "AliMUONPreClusterFinder.h"
51#include "AliMUONClusterFinderCOG.h"
52#include "AliMUONClusterFinderSimpleFit.h"
53#include "AliMUONClusterFinderMLEM.h"
54
cf464691 55#include "AliRawReader.h"
b2d7df0b 56#include "AliRun.h"
57#include "AliRunLoader.h"
58#include "TTask.h"
94f6fba9 59#include "TStopwatch.h"
29f1b13a 60
9265505b 61/// \cond CLASSIMP
cac2eb58 62ClassImp(AliMUONReconstructor)
9265505b 63/// \endcond
b2d7df0b 64
cac2eb58 65//_____________________________________________________________________________
66AliMUONReconstructor::AliMUONReconstructor()
aa6ecf89 67 : AliReconstructor(),
68 fRunLoader(0x0),
69 fDigitMaker(new AliMUONDigitMaker()),
96fdfe9a 70 fCalibrationData(0x0),
71 fCrateManager(new AliMUONTriggerCrateStore()),
e1a10d41 72 fTriggerCircuit(new TClonesArray("AliMUONTriggerCircuit", 234)),
6a518391 73 fTransformer(new AliMUONGeometryTransformer(kTRUE)),
74 fSegmentation(0x0)
9c4b1ee7 75
8789635b 76{
d19b6003 77/// Default constructor
78
94f6fba9 79 AliDebug(1,"");
96fdfe9a 80 // Crate manager
81 fCrateManager->ReadFromFile();
82
83 // set to digit maker
84 fDigitMaker->SetCrateManager(fCrateManager);
85
9c4b1ee7 86 // transformater
87 fTransformer->ReadGeometryData("volpath.dat", "geometry.root");
6a518391 88
89 // create segmentation and pass it to EventRecoCombi
90 AliMUONSegFactory factory(fTransformer);
91 fSegmentation = factory.CreateSegmentation();
92 AliMUONEventRecoCombi::Instance(fSegmentation);
9c4b1ee7 93
96fdfe9a 94 // trigger circuit
95 for (Int_t i = 0; i < AliMUONConstants::NTriggerCircuit(); i++) {
e1a10d41 96 AliMUONTriggerCircuit* c = new AliMUONTriggerCircuit();
9c4b1ee7 97 c->SetTransformer(fTransformer);
96fdfe9a 98 c->Init(i,*fCrateManager);
99 TClonesArray& circuit = *fTriggerCircuit;
e1a10d41 100 new(circuit[circuit.GetEntriesFast()])AliMUONTriggerCircuit(*c);
96fdfe9a 101 delete c;
9c4b1ee7 102 }
103
104
8789635b 105}
94f6fba9 106
8789635b 107//_____________________________________________________________________________
108AliMUONReconstructor::~AliMUONReconstructor()
cac2eb58 109{
d19b6003 110/// Destructor
111
94f6fba9 112 AliDebug(1,"");
b2d7df0b 113 delete fCalibrationData;
aa6ecf89 114 delete fDigitMaker;
96fdfe9a 115 delete fCrateManager;
116 delete fTriggerCircuit;
9c4b1ee7 117 delete fTransformer;
6a518391 118 delete fSegmentation;
cac2eb58 119}
b2d7df0b 120
121//_____________________________________________________________________________
122TTask*
123AliMUONReconstructor::GetCalibrationTask(AliMUONData* data) const
124{
d19b6003 125/// Create the calibration task(s).
b2d7df0b 126
127 const AliRun* run = fRunLoader->GetAliRun();
9f9729c3 128
129 AliInfo("Calibration will occur.");
130 Int_t runNumber = run->GetRunNumber();
131 fCalibrationData = new AliMUONCalibrationData(runNumber);
132 if ( !fCalibrationData->IsValid() )
b2d7df0b 133 {
134 AliError("Could not retrieve calibrations !");
135 delete fCalibrationData;
136 fCalibrationData = 0x0;
137 return 0x0;
138 }
9f9729c3 139 TTask* calibration = new TTask("MUONCalibrator","MUON Digit calibrator");
140 calibration->Add(new AliMUONDigitCalibrator(data,fCalibrationData));
141 //FIXME: calibration->Add(something about dead channels should go here).
142 return calibration;
143
b2d7df0b 144}
145
146//_____________________________________________________________________________
147void
148AliMUONReconstructor::Init(AliRunLoader* runLoader)
149{
d19b6003 150/// Initialize
151
b2d7df0b 152 fRunLoader = runLoader;
153}
154
f9247068 155//_____________________________________________________________________________
156AliMUONClusterReconstructor*
157AliMUONReconstructor::CreateClusterReconstructor(AliMUONData* data) const
158{
06ca6d7b 159/// Create cluster reconstructor
160
f9247068 161 AliMUONVClusterFinder* clusterFinder(0x0);
162
163 TString opt(GetOption());
164 opt.ToUpper();
165
166 if ( strstr(opt,"PRECLUSTER") )
167 {
168 clusterFinder = new AliMUONPreClusterFinder;
169 }
170 else if ( strstr(opt,"COG") )
171 {
172 clusterFinder = new AliMUONClusterFinderCOG;
173 }
174 else if ( strstr(opt,"SIMPLEFIT") )
175 {
176 clusterFinder = new AliMUONClusterFinderSimpleFit;
177 }
178 else if ( strstr(opt,"MLEM:DRAW") )
179 {
180 clusterFinder = new AliMUONClusterFinderMLEM(kTRUE);
181 }
182 else if ( strstr(opt,"MLEM") )
183 {
184 clusterFinder = new AliMUONClusterFinderMLEM(kFALSE);
185 }
186
187 if ( clusterFinder)
188 {
189 AliInfo(Form("Will use %s for clusterizing",clusterFinder->ClassName()));
190 }
191
192 AliMUONClusterReconstructor* clusterReco =
193 new AliMUONClusterReconstructor(data,clusterFinder,fTransformer);
194 return clusterReco;
195}
196
cac2eb58 197//_____________________________________________________________________________
198void AliMUONReconstructor::Reconstruct(AliRunLoader* runLoader) const
199{
d19b6003 200/// Reconstruct
201/// \todo add more
202
cac2eb58 203 AliLoader* loader = runLoader->GetLoader("MUONLoader");
d2f8e464 204 Int_t nEvents = runLoader->GetNumberOfEvents();
205 Int_t evtNumber = runLoader->GetEventNumber();
cac2eb58 206
3bc8b580 207 AliMUONData* data = new AliMUONData(loader,"MUON","MUON");
208
209// passing loader as argument.
2457f726 210 AliMUONVTrackReconstructor* recoEvent;
211 if (strstr(GetOption(),"Original")) recoEvent = new AliMUONTrackReconstructor(data);
212 else if (strstr(GetOption(),"Combi")) recoEvent = new AliMUONTrackReconstructorK(data,"Combi");
213 else recoEvent = new AliMUONTrackReconstructorK(data,"Kalman");
214
96fdfe9a 215 recoEvent->SetTriggerCircuit(fTriggerCircuit);
3bc8b580 216
f9247068 217 AliMUONClusterReconstructor* recoCluster = CreateClusterReconstructor(data);
3bc8b580 218
7e4a628d 219 AliMUONClusterFinderVS *recModel = recoCluster->GetRecoModel();
3bc8b580 220
8e0ae46c 221 if (!strstr(GetOption(),"VS")) {
1af223d7 222 recModel = (AliMUONClusterFinderVS*) new AliMUONClusterFinderAZ();
9ffe3ef4 223 recoCluster->SetRecoModel(recModel);
9ffe3ef4 224 }
7e4a628d 225 recModel->SetGhostChi2Cut(10);
d2f8e464 226 recModel->SetEventNumber(evtNumber);
cac2eb58 227
228 loader->LoadDigits("READ");
229 loader->LoadRecPoints("RECREATE");
230 loader->LoadTracks("RECREATE");
cc87ebcd 231
b2d7df0b 232 TTask* calibration = GetCalibrationTask(data);
233
2457f726 234 Int_t chBeg = (strstr(GetOption(),"Combi") ? 6 : 0);
9c4b1ee7 235
cc87ebcd 236 // Loop over events
cac2eb58 237 for(Int_t ievent = 0; ievent < nEvents; ievent++) {
94f6fba9 238
239 AliDebug(1,Form("Event %d",ievent));
240
cac2eb58 241 runLoader->GetEvent(ievent);
242
8210cb40 243 //----------------------- digit2cluster & Trigger2Trigger -------------------
cac2eb58 244 if (!loader->TreeR()) loader->MakeRecPointsContainer();
cc87ebcd 245
cac2eb58 246 // tracking branch
2457f726 247 if (!strstr(GetOption(),"Combi")) {
3bc8b580 248 data->MakeBranch("RC");
249 data->SetTreeAddress("D,RC");
cc87ebcd 250 } else {
3bc8b580 251 data->SetTreeAddress("D");
252 data->SetTreeAddress("RCC");
cc87ebcd 253 }
addbf88a 254 // Important for avoiding a memory leak when reading digits ( to be investigated more in detail)
cc87ebcd 255 // In any case the reading of GLT is needed for the Trigger2Tigger method below
3bc8b580 256 data->SetTreeAddress("GLT");
cc87ebcd 257
3bc8b580 258 data->GetDigits();
b2d7df0b 259
260 if ( calibration )
261 {
262 calibration->ExecuteTask();
263 }
264
cc87ebcd 265 recoCluster->Digits2Clusters(chBeg);
b2d7df0b 266
2457f726 267 if (strstr(GetOption(),"Combi")) {
cc87ebcd 268 // Combined cluster / track finder
3bc8b580 269 AliMUONEventRecoCombi::Instance()->FillEvent(data, (AliMUONClusterFinderAZ*)recModel);
cc87ebcd 270 ((AliMUONClusterFinderAZ*) recModel)->SetReco(2);
271 }
3bc8b580 272 else data->Fill("RC");
cac2eb58 273
274 // trigger branch
3bc8b580 275 data->MakeBranch("TC");
276 data->SetTreeAddress("TC");
cc87ebcd 277 recoCluster->Trigger2Trigger();
3bc8b580 278 data->Fill("TC");
cac2eb58 279
cc87ebcd 280 //AZ loader->WriteRecPoints("OVERWRITE");
cac2eb58 281
282 //---------------------------- Track & TriggerTrack ---------------------
283 if (!loader->TreeT()) loader->MakeTracksContainer();
284
285 // trigger branch
3bc8b580 286 data->MakeBranch("RL"); //trigger track
287 data->SetTreeAddress("RL");
cac2eb58 288 recoEvent->EventReconstructTrigger();
3bc8b580 289 data->Fill("RL");
cac2eb58 290
291 // tracking branch
3bc8b580 292 data->MakeBranch("RT"); //track
293 data->SetTreeAddress("RT");
cac2eb58 294 recoEvent->EventReconstruct();
3bc8b580 295 data->Fill("RT");
cac2eb58 296
cc87ebcd 297 loader->WriteTracks("OVERWRITE");
298
2457f726 299 if (strstr(GetOption(),"Combi")) {
cc87ebcd 300 // Combined cluster / track
301 ((AliMUONClusterFinderAZ*) recModel)->SetReco(1);
3bc8b580 302 data->MakeBranch("RC");
303 data->SetTreeAddress("RC");
2457f726 304 AliMUONEventRecoCombi::Instance()->FillRecP(data, (AliMUONTrackReconstructorK*)recoEvent);
3bc8b580 305 data->Fill("RC");
cc87ebcd 306 }
307 loader->WriteRecPoints("OVERWRITE");
308
cac2eb58 309 //--------------------------- Resetting branches -----------------------
3bc8b580 310 data->ResetDigits();
3bc8b580 311 data->ResetRawClusters();
312 data->ResetTrigger();
313 data->ResetRecTracks();
314 data->ResetRecTriggerTracks();
29f1b13a 315
cac2eb58 316 }
317 loader->UnloadDigits();
318 loader->UnloadRecPoints();
319 loader->UnloadTracks();
320
321 delete recoCluster;
322 delete recoEvent;
3bc8b580 323 delete data;
b2d7df0b 324 delete calibration;
cac2eb58 325}
cf464691 326
327//_____________________________________________________________________________
f9247068 328void AliMUONReconstructor::Reconstruct(AliRunLoader* runLoader,
329 AliRawReader* rawReader) const
cf464691 330{
d19b6003 331/// Recontruct
332/// \todo add more
333
94f6fba9 334 // AliLoader
cf464691 335 AliLoader* loader = runLoader->GetLoader("MUONLoader");
d2f8e464 336 Int_t evtNumber = runLoader->GetEventNumber();
337
94f6fba9 338 AliMUONData data(loader,"MUON","MUON");
cf464691 339
94f6fba9 340 // passing loader as argument.
aa6ecf89 341 fDigitMaker->SetMUONData(&data);
1197ff51 342
f9247068 343 AliMUONClusterReconstructor* recoCluster = CreateClusterReconstructor(&data);
30eabfb8 344
2457f726 345 AliMUONVTrackReconstructor *recoEvent;
346 if (strstr(GetOption(),"Original")) recoEvent = new AliMUONTrackReconstructor(&data);
347 else if (strstr(GetOption(),"Combi")) recoEvent = new AliMUONTrackReconstructorK(&data,"Combi");
348 else recoEvent = new AliMUONTrackReconstructorK(&data,"Kalman");
f9247068 349
2457f726 350 recoEvent->SetTriggerCircuit(fTriggerCircuit);
351
f9247068 352 AliMUONClusterFinderVS *recModel = recoCluster->GetRecoModel();
353
94f6fba9 354 if (!strstr(GetOption(),"VS"))
355 {
30eabfb8 356 recModel = (AliMUONClusterFinderVS*) new AliMUONClusterFinderAZ();
f9247068 357 recoCluster->SetRecoModel(recModel);
30eabfb8 358 }
7e4a628d 359 recModel->SetGhostChi2Cut(10);
d2f8e464 360 recModel->SetEventNumber(evtNumber);
cf464691 361
94f6fba9 362 TTask* calibration = GetCalibrationTask(&data);
b2d7df0b 363
cf464691 364 loader->LoadRecPoints("RECREATE");
365 loader->LoadTracks("RECREATE");
64b056bc 366
367 // Digits are not stored on disk and created on flight from rawdata.
368 // In order to write digits on disk the following line should be uncommented
369 // loader->LoadDigits("RECREATE");
370
cc87ebcd 371 // Loop over events
8210cb40 372 Int_t iEvent = 0;
94f6fba9 373
374 TStopwatch totalTimer;
375 TStopwatch rawTimer;
376 TStopwatch calibTimer;
377 TStopwatch clusterTimer;
378 TStopwatch trackingTimer;
379
380 rawTimer.Start(kTRUE); rawTimer.Stop();
381 calibTimer.Start(kTRUE); calibTimer.Stop();
382 clusterTimer.Start(kTRUE); clusterTimer.Stop();
383 trackingTimer.Start(kTRUE); trackingTimer.Stop();
384
385 totalTimer.Start(kTRUE);
386
387 while (rawReader->NextEvent())
388 {
389 AliDebug(1,Form("Event %d",iEvent));
390
cf464691 391 runLoader->GetEvent(iEvent++);
ce6a659c 392
393 //----------------------- raw2digits & raw2trigger-------------------
64b056bc 394// if (!loader->TreeD())
395// {
396// AliDebug(1,Form("Making Digit Container for event %d",iEvent));
397// loader->MakeDigitsContainer();
398// }
399 // Digits are not stored on disk and created on flight from rawdata.
400 // In order to write digits on disk the following lines should be uncommented
401 // data.MakeBranch("D,GLT");
402 // data.SetTreeAddress("D,GLT");
403 data.SetDataContainer("D, GLT");
94f6fba9 404 rawTimer.Start(kFALSE);
aa6ecf89 405 fDigitMaker->Raw2Digits(rawReader);
94f6fba9 406 rawTimer.Stop();
407
b2d7df0b 408 if ( calibration )
409 {
94f6fba9 410 calibTimer.Start(kFALSE);
b2d7df0b 411 calibration->ExecuteTask();
94f6fba9 412 calibTimer.Stop();
b2d7df0b 413 }
64b056bc 414 // Digits are not stored on disk and created on flight from rawdata.
415 // In order to write digits on disk the following lines should be uncommented
416 // data.Fill("D,GLT");
417 // loader->WriteDigits("OVERWRITE");
8210cb40 418 //----------------------- digit2cluster & Trigger2Trigger -------------------
94f6fba9 419 clusterTimer.Start(kFALSE);
420
cf464691 421 if (!loader->TreeR()) loader->MakeRecPointsContainer();
cc87ebcd 422
cf464691 423 // tracking branch
94f6fba9 424 data.MakeBranch("RC");
425 data.SetTreeAddress("RC");
f9247068 426 recoCluster->Digits2Clusters();
94f6fba9 427 data.Fill("RC");
cf464691 428
429 // trigger branch
94f6fba9 430 data.MakeBranch("TC");
431 data.SetTreeAddress("TC");
94f6fba9 432 data.Fill("TC");
433
cf464691 434 loader->WriteRecPoints("OVERWRITE");
435
94f6fba9 436 clusterTimer.Stop();
437
cf464691 438 //---------------------------- Track & TriggerTrack ---------------------
94f6fba9 439 trackingTimer.Start(kFALSE);
cf464691 440 if (!loader->TreeT()) loader->MakeTracksContainer();
441
442 // trigger branch
94f6fba9 443 data.MakeBranch("RL"); //trigger track
444 data.SetTreeAddress("RL");
2457f726 445 recoEvent->EventReconstructTrigger();
94f6fba9 446 data.Fill("RL");
cf464691 447
448 // tracking branch
94f6fba9 449 data.MakeBranch("RT"); //track
450 data.SetTreeAddress("RT");
2457f726 451 recoEvent->EventReconstruct();
94f6fba9 452 data.Fill("RT");
cf464691 453
cc87ebcd 454 loader->WriteTracks("OVERWRITE");
94f6fba9 455 trackingTimer.Stop();
456
cf464691 457 //--------------------------- Resetting branches -----------------------
94f6fba9 458 data.ResetDigits();
94f6fba9 459 data.ResetRawClusters();
460 data.ResetTrigger();
461 data.ResetRecTracks();
462 data.ResetRecTriggerTracks();
cc87ebcd 463
cf464691 464 }
94f6fba9 465
466 totalTimer.Stop();
467
cf464691 468 loader->UnloadRecPoints();
469 loader->UnloadTracks();
ce6a659c 470 loader->UnloadDigits();
2457f726 471
472 delete recoEvent;
cf464691 473
f9247068 474 delete recoCluster;
475
94f6fba9 476 AliInfo(Form("Execution time for converting RAW data to digits in MUON : R:%.2fs C:%.2fs",
477 rawTimer.RealTime(),rawTimer.CpuTime()));
478 AliInfo(Form("Execution time for calibrating MUON : R:%.2fs C:%.2fs",
479 calibTimer.RealTime(),calibTimer.CpuTime()));
480 AliInfo(Form("Execution time for clusterizing MUON : R:%.2fs C:%.2fs",
481 clusterTimer.RealTime(),clusterTimer.CpuTime()));
482 AliInfo(Form("Execution time for tracking MUON : R:%.2fs C:%.2fs",
483 trackingTimer.RealTime(),trackingTimer.CpuTime()));
484 AliInfo(Form("Total Execution time for Reconstruct(from raw) MUON : R:%.2fs C:%.2fs",
485 totalTimer.RealTime(),totalTimer.CpuTime()));
cf464691 486}
487
cac2eb58 488//_____________________________________________________________________________
489void AliMUONReconstructor::FillESD(AliRunLoader* runLoader, AliESD* esd) const
490{
d19b6003 491/// Fill ESD
492/// \todo add more
493
cac2eb58 494 TClonesArray* recTracksArray = 0;
495 TClonesArray* recTrigTracksArray = 0;
cc87ebcd 496
cac2eb58 497 AliLoader* loader = runLoader->GetLoader("MUONLoader");
498 loader->LoadTracks("READ");
cac2eb58 499 AliMUONData* muonData = new AliMUONData(loader,"MUON","MUON");
500
cc87ebcd 501 // declaration
a2da7817 502 Int_t iEvent;// nPart;
503 Int_t nTrackHits;// nPrimary;
cac2eb58 504 Double_t fitFmin;
cac2eb58 505
506 Double_t bendingSlope, nonBendingSlope, inverseBendingMomentum;
507 Double_t xRec, yRec, zRec, chi2MatchTrigger;
508 Bool_t matchTrigger;
509
b002ac70 510 // setting pointer for tracks, triggertracks & trackparam at vertex
cac2eb58 511 AliMUONTrack* recTrack = 0;
512 AliMUONTrackParam* trackParam = 0;
513 AliMUONTriggerTrack* recTriggerTrack = 0;
2cf44ef3 514
cc87ebcd 515 iEvent = runLoader->GetEventNumber();
cac2eb58 516 runLoader->GetEvent(iEvent);
517
94f6fba9 518 // Get vertex
519 Double_t vertex[3] = {0};
520 const AliESDVertex *esdVert = esd->GetVertex();
43939bd8 521 if (esdVert->GetNContributors()) {
522 esdVert->GetXYZ(vertex);
523 printf("find vertex\n");
524 }
cac2eb58 525 // setting ESD MUON class
30178c30 526 AliESDMuonTrack* theESDTrack = new AliESDMuonTrack() ;
cac2eb58 527
528 //-------------------- trigger tracks-------------
529 Long_t trigPat = 0;
530 muonData->SetTreeAddress("RL");
531 muonData->GetRecTriggerTracks();
532 recTrigTracksArray = muonData->RecTriggerTracks();
533
534 // ready global trigger pattern from first track
cc87ebcd 535 if (recTrigTracksArray)
cac2eb58 536 recTriggerTrack = (AliMUONTriggerTrack*) recTrigTracksArray->First();
537 if (recTriggerTrack) trigPat = recTriggerTrack->GetGTPattern();
538
539 //printf(">>> Event %d Number of Recconstructed tracks %d \n",iEvent, nrectracks);
cc87ebcd 540
cac2eb58 541 // -------------------- tracks-------------
542 muonData->SetTreeAddress("RT");
543 muonData->GetRecTracks();
544 recTracksArray = muonData->RecTracks();
cc87ebcd 545
cac2eb58 546 Int_t nRecTracks = 0;
547 if (recTracksArray)
548 nRecTracks = (Int_t) recTracksArray->GetEntriesFast(); //
cc87ebcd 549
cac2eb58 550 // loop over tracks
551 for (Int_t iRecTracks = 0; iRecTracks < nRecTracks; iRecTracks++) {
552
553 // reading info from tracks
554 recTrack = (AliMUONTrack*) recTracksArray->At(iRecTracks);
555
889a0215 556 trackParam = (AliMUONTrackParam*) (recTrack->GetTrackParamAtHit())->First();
211c52eb 557
43939bd8 558 if (esdVert->GetNContributors())
37827b29 559 AliMUONTrackExtrap::ExtrapToVertex(trackParam, vertex[0],vertex[1],vertex[2]);
cac2eb58 560
561 bendingSlope = trackParam->GetBendingSlope();
562 nonBendingSlope = trackParam->GetNonBendingSlope();
211c52eb 563 inverseBendingMomentum = trackParam->GetInverseBendingMomentum();
cac2eb58 564 xRec = trackParam->GetNonBendingCoor();
565 yRec = trackParam->GetBendingCoor();
566 zRec = trackParam->GetZ();
567
568 nTrackHits = recTrack->GetNTrackHits();
569 fitFmin = recTrack->GetFitFMin();
570 matchTrigger = recTrack->GetMatchTrigger();
571 chi2MatchTrigger = recTrack->GetChi2MatchTrigger();
572
573 // setting data member of ESD MUON
30178c30 574 theESDTrack->SetInverseBendingMomentum(inverseBendingMomentum);
575 theESDTrack->SetThetaX(TMath::ATan(nonBendingSlope));
576 theESDTrack->SetThetaY(TMath::ATan(bendingSlope));
889a0215 577 theESDTrack->SetZ(zRec);
578 theESDTrack->SetBendingCoor(yRec); // calculate vertex at ESD or Tracking level ?
579 theESDTrack->SetNonBendingCoor(xRec);
30178c30 580 theESDTrack->SetChi2(fitFmin);
581 theESDTrack->SetNHit(nTrackHits);
582 theESDTrack->SetMatchTrigger(matchTrigger);
583 theESDTrack->SetChi2MatchTrigger(chi2MatchTrigger);
cac2eb58 584
cc87ebcd 585 // storing ESD MUON Track into ESD Event
586 if (nRecTracks != 0)
30178c30 587 esd->AddMuonTrack(theESDTrack);
cac2eb58 588 } // end loop tracks
589
cac2eb58 590 // reset muondata
591 muonData->ResetRecTracks();
592 muonData->ResetRecTriggerTracks();
593
cc87ebcd 594 //} // end loop on event
595 loader->UnloadTracks();
2cf44ef3 596
30178c30 597 delete theESDTrack;
cac2eb58 598 delete muonData;
a2da7817 599}//_____________________________________________________________________________
600void AliMUONReconstructor::FillESD(AliRunLoader* runLoader, AliRawReader* /*rawReader*/, AliESD* esd) const
601{
d19b6003 602/// Fill ESD
603/// \todo add more
604
a2da7817 605 // don't need rawReader ???
606 FillESD(runLoader, esd);
cac2eb58 607}