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