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