1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
17 ///////////////////////////////////////////////////////////////////////////////
19 // class for MUON reconstruction //
21 ///////////////////////////////////////////////////////////////////////////////
23 #include "AliMUONReconstructor.h"
26 #include "AliESDMuonTrack.h"
29 #include "AliMUONCalibrationData.h"
30 #include "AliMUONClusterFinderAZ.h"
31 #include "AliMUONClusterFinderVS.h"
32 #include "AliMUONClusterReconstructor.h"
33 #include "AliMUONData.h"
34 #include "AliMUONDigitCalibrator.h"
35 #include "AliMUONEventRecoCombi.h"
36 #include "AliMUONDigitMaker.h"
37 #include "AliMUONTrack.h"
38 #include "AliMUONTrackParam.h"
39 #include "AliMUONTrackReconstructor.h"
40 #include "AliMUONTriggerTrack.h"
41 #include "AliRawReader.h"
43 #include "AliRunLoader.h"
45 #include "TStopwatch.h"
47 ClassImp(AliMUONReconstructor)
49 //_____________________________________________________________________________
50 AliMUONReconstructor::AliMUONReconstructor()
53 fDigitMaker(new AliMUONDigitMaker()),
56 /// Default constructor
61 //_____________________________________________________________________________
62 AliMUONReconstructor::~AliMUONReconstructor()
67 delete fCalibrationData;
71 //_____________________________________________________________________________
73 AliMUONReconstructor::GetCalibrationTask(AliMUONData* data) const
75 /// Create the calibration task(s).
77 const AliRun* run = fRunLoader->GetAliRun();
79 // Not really clean, but for the moment we must check whether the
80 // simulation has decalibrated the data or not...
81 const AliMUON* muon = static_cast<AliMUON*>(run->GetModule("MUON"));
82 if ( muon->DigitizerType().Contains("NewDigitizer") )
84 AliInfo("Calibration will occur.");
85 Int_t runNumber = run->GetRunNumber();
86 fCalibrationData = new AliMUONCalibrationData(runNumber);
87 if ( !fCalibrationData->IsValid() )
89 AliError("Could not retrieve calibrations !");
90 delete fCalibrationData;
91 fCalibrationData = 0x0;
94 TTask* calibration = new TTask("MUONCalibrator","MUON Digit calibrator");
95 calibration->Add(new AliMUONDigitCalibrator(data,fCalibrationData));
96 //FIXME: calibration->Add(something about dead channels should go here).
101 AliInfo("Detected the usage of old digitizer (w/o decalibration). "
102 "Will not calibrate then.");
107 //_____________________________________________________________________________
109 AliMUONReconstructor::Init(AliRunLoader* runLoader)
113 fRunLoader = runLoader;
116 //_____________________________________________________________________________
117 void AliMUONReconstructor::Reconstruct(AliRunLoader* runLoader) const
122 AliLoader* loader = runLoader->GetLoader("MUONLoader");
123 Int_t nEvents = runLoader->GetNumberOfEvents();
125 AliMUONData* data = new AliMUONData(loader,"MUON","MUON");
127 // passing loader as argument.
128 AliMUONTrackReconstructor* recoEvent = new AliMUONTrackReconstructor(loader, data);
130 if (strstr(GetOption(),"Original"))
131 recoEvent->SetTrackMethod(1); // Original tracking
132 else if (strstr(GetOption(),"Combi"))
133 recoEvent->SetTrackMethod(3); // Combined cluster / track
135 recoEvent->SetTrackMethod(2); // Kalman
137 AliMUONClusterReconstructor* recoCluster = new AliMUONClusterReconstructor(data);
139 AliMUONClusterFinderVS *recModel = recoCluster->GetRecoModel();
141 if (!strstr(GetOption(),"VS")) {
142 recModel = (AliMUONClusterFinderVS*) new AliMUONClusterFinderAZ();
143 recoCluster->SetRecoModel(recModel);
145 recModel->SetGhostChi2Cut(10);
147 loader->LoadDigits("READ");
148 loader->LoadRecPoints("RECREATE");
149 loader->LoadTracks("RECREATE");
151 TTask* calibration = GetCalibrationTask(data);
153 Int_t chBeg = recoEvent->GetTrackMethod() == 3 ? 6 : 0;
155 for(Int_t ievent = 0; ievent < nEvents; ievent++) {
157 AliDebug(1,Form("Event %d",ievent));
159 runLoader->GetEvent(ievent);
161 //----------------------- digit2cluster & Trigger2Trigger -------------------
162 if (!loader->TreeR()) loader->MakeRecPointsContainer();
165 if (recoEvent->GetTrackMethod() != 3) {
166 data->MakeBranch("RC");
167 data->SetTreeAddress("D,RC");
169 data->SetTreeAddress("D");
170 data->SetTreeAddress("RCC");
172 // Important for avoiding a memory leak when reading digits ( to be investigated more in detail)
173 // In any case the reading of GLT is needed for the Trigger2Tigger method below
174 data->SetTreeAddress("GLT");
180 calibration->ExecuteTask();
183 recoCluster->Digits2Clusters(chBeg);
185 if (recoEvent->GetTrackMethod() == 3) {
186 // Combined cluster / track finder
187 AliMUONEventRecoCombi::Instance()->FillEvent(data, (AliMUONClusterFinderAZ*)recModel);
188 ((AliMUONClusterFinderAZ*) recModel)->SetReco(2);
190 else data->Fill("RC");
193 data->MakeBranch("TC");
194 data->SetTreeAddress("TC");
195 recoCluster->Trigger2Trigger();
198 //AZ loader->WriteRecPoints("OVERWRITE");
200 //---------------------------- Track & TriggerTrack ---------------------
201 if (!loader->TreeT()) loader->MakeTracksContainer();
204 data->MakeBranch("RL"); //trigger track
205 data->SetTreeAddress("RL");
206 recoEvent->EventReconstructTrigger();
210 data->MakeBranch("RT"); //track
211 data->SetTreeAddress("RT");
212 recoEvent->EventReconstruct();
215 loader->WriteTracks("OVERWRITE");
217 if (recoEvent->GetTrackMethod() == 3) {
218 // Combined cluster / track
219 ((AliMUONClusterFinderAZ*) recModel)->SetReco(1);
220 data->MakeBranch("RC");
221 data->SetTreeAddress("RC");
222 AliMUONEventRecoCombi::Instance()->FillRecP(data, recoEvent);
225 loader->WriteRecPoints("OVERWRITE");
227 //--------------------------- Resetting branches -----------------------
229 data->ResetRawClusters();
230 data->ResetTrigger();
232 data->ResetRawClusters();
233 data->ResetTrigger();
234 data->ResetRecTracks();
235 data->ResetRecTriggerTracks();
238 loader->UnloadDigits();
239 loader->UnloadRecPoints();
240 loader->UnloadTracks();
248 //_____________________________________________________________________________
249 void AliMUONReconstructor::Reconstruct(AliRunLoader* runLoader, AliRawReader* rawReader) const
255 AliLoader* loader = runLoader->GetLoader("MUONLoader");
256 AliMUONData data(loader,"MUON","MUON");
258 // passing loader as argument.
259 AliMUONTrackReconstructor recoEvent(loader, &data);
261 fDigitMaker->SetMUONData(&data);
263 AliMUONClusterReconstructor recoCluster(&data);
265 if (strstr(GetOption(),"Original"))
267 recoEvent.SetTrackMethod(1); // Original tracking
271 recoEvent.SetTrackMethod(2); // Kalman
274 AliMUONClusterFinderVS *recModel = recoCluster.GetRecoModel();
275 if (!strstr(GetOption(),"VS"))
277 recModel = (AliMUONClusterFinderVS*) new AliMUONClusterFinderAZ();
278 recoCluster.SetRecoModel(recModel);
280 recModel->SetGhostChi2Cut(10);
282 TTask* calibration = GetCalibrationTask(&data);
284 loader->LoadRecPoints("RECREATE");
285 loader->LoadTracks("RECREATE");
286 loader->LoadDigits("READ");
291 TStopwatch totalTimer;
293 TStopwatch calibTimer;
294 TStopwatch clusterTimer;
295 TStopwatch trackingTimer;
297 rawTimer.Start(kTRUE); rawTimer.Stop();
298 calibTimer.Start(kTRUE); calibTimer.Stop();
299 clusterTimer.Start(kTRUE); clusterTimer.Stop();
300 trackingTimer.Start(kTRUE); trackingTimer.Stop();
302 totalTimer.Start(kTRUE);
304 while (rawReader->NextEvent())
306 AliDebug(1,Form("Event %d",iEvent));
308 runLoader->GetEvent(iEvent++);
310 //----------------------- raw2digits & raw2trigger-------------------
311 if (!loader->TreeD())
313 AliDebug(1,Form("Making Digit Container for event %d",iEvent));
314 loader->MakeDigitsContainer();
317 data.SetTreeAddress("D,GLT");
318 rawTimer.Start(kFALSE);
319 fDigitMaker->Raw2Digits(rawReader);
324 calibTimer.Start(kFALSE);
325 calibration->ExecuteTask();
329 //----------------------- digit2cluster & Trigger2Trigger -------------------
330 clusterTimer.Start(kFALSE);
332 if (!loader->TreeR()) loader->MakeRecPointsContainer();
335 data.MakeBranch("RC");
336 data.SetTreeAddress("RC");
337 recoCluster.Digits2Clusters();
341 data.MakeBranch("TC");
342 data.SetTreeAddress("TC");
343 recoCluster.Trigger2Trigger();
346 loader->WriteRecPoints("OVERWRITE");
350 //---------------------------- Track & TriggerTrack ---------------------
351 trackingTimer.Start(kFALSE);
352 if (!loader->TreeT()) loader->MakeTracksContainer();
355 data.MakeBranch("RL"); //trigger track
356 data.SetTreeAddress("RL");
357 recoEvent.EventReconstructTrigger();
361 data.MakeBranch("RT"); //track
362 data.SetTreeAddress("RT");
363 recoEvent.EventReconstruct();
366 loader->WriteTracks("OVERWRITE");
367 trackingTimer.Stop();
369 //--------------------------- Resetting branches -----------------------
371 data.ResetRawClusters();
374 data.ResetRawClusters();
376 data.ResetRecTracks();
377 data.ResetRecTriggerTracks();
383 loader->UnloadRecPoints();
384 loader->UnloadTracks();
385 loader->UnloadDigits();
387 AliInfo(Form("Execution time for converting RAW data to digits in MUON : R:%.2fs C:%.2fs",
388 rawTimer.RealTime(),rawTimer.CpuTime()));
389 AliInfo(Form("Execution time for calibrating MUON : R:%.2fs C:%.2fs",
390 calibTimer.RealTime(),calibTimer.CpuTime()));
391 AliInfo(Form("Execution time for clusterizing MUON : R:%.2fs C:%.2fs",
392 clusterTimer.RealTime(),clusterTimer.CpuTime()));
393 AliInfo(Form("Execution time for tracking MUON : R:%.2fs C:%.2fs",
394 trackingTimer.RealTime(),trackingTimer.CpuTime()));
395 AliInfo(Form("Total Execution time for Reconstruct(from raw) MUON : R:%.2fs C:%.2fs",
396 totalTimer.RealTime(),totalTimer.CpuTime()));
399 //_____________________________________________________________________________
400 void AliMUONReconstructor::FillESD(AliRunLoader* runLoader, AliESD* esd) const
405 TClonesArray* recTracksArray = 0;
406 TClonesArray* recTrigTracksArray = 0;
408 AliLoader* loader = runLoader->GetLoader("MUONLoader");
409 loader->LoadTracks("READ");
410 AliMUONData* muonData = new AliMUONData(loader,"MUON","MUON");
413 Int_t iEvent;// nPart;
414 Int_t nTrackHits;// nPrimary;
417 Double_t bendingSlope, nonBendingSlope, inverseBendingMomentum;
418 Double_t xRec, yRec, zRec, chi2MatchTrigger;
421 // setting pointer for tracks, triggertracks & trackparam at vertex
422 AliMUONTrack* recTrack = 0;
423 AliMUONTrackParam* trackParam = 0;
424 AliMUONTriggerTrack* recTriggerTrack = 0;
426 iEvent = runLoader->GetEventNumber();
427 runLoader->GetEvent(iEvent);
430 Double_t vertex[3] = {0};
431 const AliESDVertex *esdVert = esd->GetVertex();
432 if (esdVert) esdVert->GetXYZ(vertex);
434 // setting ESD MUON class
435 AliESDMuonTrack* theESDTrack = new AliESDMuonTrack() ;
437 //-------------------- trigger tracks-------------
439 muonData->SetTreeAddress("RL");
440 muonData->GetRecTriggerTracks();
441 recTrigTracksArray = muonData->RecTriggerTracks();
443 // ready global trigger pattern from first track
444 if (recTrigTracksArray)
445 recTriggerTrack = (AliMUONTriggerTrack*) recTrigTracksArray->First();
446 if (recTriggerTrack) trigPat = recTriggerTrack->GetGTPattern();
448 //printf(">>> Event %d Number of Recconstructed tracks %d \n",iEvent, nrectracks);
450 // -------------------- tracks-------------
451 muonData->SetTreeAddress("RT");
452 muonData->GetRecTracks();
453 recTracksArray = muonData->RecTracks();
455 Int_t nRecTracks = 0;
457 nRecTracks = (Int_t) recTracksArray->GetEntriesFast(); //
460 for (Int_t iRecTracks = 0; iRecTracks < nRecTracks; iRecTracks++) {
462 // reading info from tracks
463 recTrack = (AliMUONTrack*) recTracksArray->At(iRecTracks);
465 trackParam = (AliMUONTrackParam*) (recTrack->GetTrackParamAtHit())->First();
468 trackParam->ExtrapToVertex(vertex[0],vertex[1],vertex[2]);
470 bendingSlope = trackParam->GetBendingSlope();
471 nonBendingSlope = trackParam->GetNonBendingSlope();
472 inverseBendingMomentum = trackParam->GetInverseBendingMomentum();
473 xRec = trackParam->GetNonBendingCoor();
474 yRec = trackParam->GetBendingCoor();
475 zRec = trackParam->GetZ();
477 nTrackHits = recTrack->GetNTrackHits();
478 fitFmin = recTrack->GetFitFMin();
479 matchTrigger = recTrack->GetMatchTrigger();
480 chi2MatchTrigger = recTrack->GetChi2MatchTrigger();
482 // setting data member of ESD MUON
483 theESDTrack->SetInverseBendingMomentum(inverseBendingMomentum);
484 theESDTrack->SetThetaX(TMath::ATan(nonBendingSlope));
485 theESDTrack->SetThetaY(TMath::ATan(bendingSlope));
486 theESDTrack->SetZ(zRec);
487 theESDTrack->SetBendingCoor(yRec); // calculate vertex at ESD or Tracking level ?
488 theESDTrack->SetNonBendingCoor(xRec);
489 theESDTrack->SetChi2(fitFmin);
490 theESDTrack->SetNHit(nTrackHits);
491 theESDTrack->SetMatchTrigger(matchTrigger);
492 theESDTrack->SetChi2MatchTrigger(chi2MatchTrigger);
494 // storing ESD MUON Track into ESD Event
496 esd->AddMuonTrack(theESDTrack);
500 muonData->ResetRecTracks();
501 muonData->ResetRecTriggerTracks();
503 //} // end loop on event
504 loader->UnloadTracks();
508 }//_____________________________________________________________________________
509 void AliMUONReconstructor::FillESD(AliRunLoader* runLoader, AliRawReader* /*rawReader*/, AliESD* esd) const
514 // don't need rawReader ???
515 FillESD(runLoader, esd);