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