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