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