1 /**************************************************************************
3 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
7 * Author: The ALICE Off-line Project. *
9 * Contributors are mentioned in the code where appropriate. *
13 * Permission to use, copy, modify and distribute this software and its *
15 * documentation strictly for non-commercial purposes is hereby granted *
17 * without fee, provided that the above copyright notice appears in all *
19 * copies and that both the copyright notice and this permission notice *
21 * appear in the supporting documentation. The authors make no claims *
23 * about the suitability of this software for any purpose. It is *
25 * provided "as is" without express or implied warranty. *
27 **************************************************************************/
33 ///////////////////////////////////////////////////////////////////////////////
37 // class for MUON reconstruction //
41 ///////////////////////////////////////////////////////////////////////////////
43 #include <TParticle.h>
49 #include "AliRunLoader.h"
51 #include "AliHeader.h"
53 #include "AliGenEventHeader.h"
57 #include "AliMUONReconstructor.h"
61 #include "AliMUONData.h"
63 #include "AliMUONTrackReconstructor.h"
65 #include "AliMUONClusterReconstructor.h"
67 #include "AliMUONClusterFinderVS.h"
69 #include "AliMUONClusterFinderAZ.h"
71 #include "AliMUONTrack.h"
73 #include "AliMUONTrackParam.h"
75 #include "AliMUONTriggerTrack.h"
77 #include "AliESDMuonTrack.h"
79 #include "AliMUONRawData.h"
83 #include "AliRawReader.h"
89 ClassImp(AliMUONReconstructor)
91 //_____________________________________________________________________________
93 AliMUONReconstructor::AliMUONReconstructor()
101 //_____________________________________________________________________________
103 AliMUONReconstructor::~AliMUONReconstructor()
109 //_____________________________________________________________________________
111 void AliMUONReconstructor::Reconstruct(AliRunLoader* runLoader) const
117 AliLoader* loader = runLoader->GetLoader("MUONLoader");
119 Int_t nEvents = runLoader->GetNumberOfEvents();
123 // used local container for each method
125 // passing fLoader as argument, could be avoided ???
127 AliMUONTrackReconstructor* recoEvent = new AliMUONTrackReconstructor(loader);
129 AliMUONData* dataEvent = recoEvent->GetMUONData();
131 if (strstr(GetOption(),"Kalman")) recoEvent->SetTrackMethod(2); // Kalman
133 else recoEvent->SetTrackMethod(1); // original
137 AliMUONClusterReconstructor* recoCluster = new AliMUONClusterReconstructor(loader);
139 AliMUONData* dataCluster = recoCluster->GetMUONData();
141 AliMUONClusterFinderVS *recModel = recoCluster->GetRecoModel();
143 if (strstr(GetOption(),"AZ")) {
145 recModel = (AliMUONClusterFinderVS*) new AliMUONClusterFinderAZ(0,1);
147 recoCluster->SetRecoModel(recModel);
151 recModel->SetGhostChi2Cut(10);
155 loader->LoadDigits("READ");
157 loader->LoadRecPoints("RECREATE");
159 loader->LoadTracks("RECREATE");
165 for(Int_t ievent = 0; ievent < nEvents; ievent++) {
167 printf("Event %d\n",ievent);
169 runLoader->GetEvent(ievent);
173 //----------------------- digit2cluster & Trigger2Trigger -------------------
175 if (!loader->TreeR()) loader->MakeRecPointsContainer();
181 dataCluster->MakeBranch("RC");
183 dataCluster->SetTreeAddress("D,RC");
185 recoCluster->Digits2Clusters();
187 dataCluster->Fill("RC");
193 dataCluster->MakeBranch("TC");
195 dataCluster->SetTreeAddress("TC");
197 recoCluster->Trigger2Trigger();
199 dataCluster->Fill("TC");
203 loader->WriteRecPoints("OVERWRITE");
207 //---------------------------- Track & TriggerTrack ---------------------
209 if (!loader->TreeT()) loader->MakeTracksContainer();
215 dataEvent->MakeBranch("RL"); //trigger track
217 dataEvent->SetTreeAddress("RL");
219 recoEvent->EventReconstructTrigger();
221 dataEvent->Fill("RL");
227 dataEvent->MakeBranch("RT"); //track
229 dataEvent->SetTreeAddress("RT");
231 recoEvent->EventReconstruct();
233 dataEvent->Fill("RT");
237 loader->WriteTracks("OVERWRITE");
241 //--------------------------- Resetting branches -----------------------
243 dataCluster->ResetDigits();
245 dataCluster->ResetRawClusters();
247 dataCluster->ResetTrigger();
251 dataEvent->ResetRawClusters();
253 dataEvent->ResetTrigger();
255 dataEvent->ResetRecTracks();
257 dataEvent->ResetRecTriggerTracks();
263 loader->UnloadDigits();
265 loader->UnloadRecPoints();
267 loader->UnloadTracks();
279 //_____________________________________________________________________________
281 void AliMUONReconstructor::Reconstruct(AliRunLoader* runLoader, AliRawReader* rawReader) const
287 AliLoader* loader = runLoader->GetLoader("MUONLoader");
291 // used local container for each method
293 // passing fLoader as argument, could be avoided ???
295 AliMUONTrackReconstructor* recoEvent = new AliMUONTrackReconstructor(loader);
297 AliMUONData* dataEvent = recoEvent->GetMUONData();
301 AliMUONRawData* rawData = new AliMUONRawData(loader);
303 AliMUONData* dataCluster = rawData->GetMUONData();
307 AliMUONClusterReconstructor* recoCluster = new AliMUONClusterReconstructor(loader, dataCluster);
309 AliMUONClusterFinderVS *recModel = recoCluster->GetRecoModel();
311 recModel->SetGhostChi2Cut(10);
315 loader->LoadRecPoints("RECREATE");
317 loader->LoadTracks("RECREATE");
319 loader->LoadDigits("RECREATE");
331 while (rawReader->NextEvent()) {
333 printf("Event %d\n",iEvent);
335 runLoader->GetEvent(iEvent++);
339 //----------------------- raw2digits & raw2trigger-------------------
341 if (!loader->TreeD()) loader->MakeDigitsContainer();
347 dataCluster->MakeBranch("D");
349 dataCluster->SetTreeAddress("D");
351 rawData->ReadTrackerDDL(rawReader);
353 dataCluster->Fill("D");
359 dataCluster->MakeBranch("GLT");
361 dataCluster->SetTreeAddress("GLT");
363 rawData->ReadTriggerDDL(rawReader);
365 dataCluster->Fill("GLT");
369 loader->WriteDigits("OVERWRITE");
373 //----------------------- digit2cluster & Trigger2Trigger -------------------
375 if (!loader->TreeR()) loader->MakeRecPointsContainer();
381 dataCluster->MakeBranch("RC");
383 dataCluster->SetTreeAddress("RC");
385 recoCluster->Digits2Clusters();
387 dataCluster->Fill("RC");
393 dataCluster->MakeBranch("TC");
395 dataCluster->SetTreeAddress("TC");
397 recoCluster->Trigger2Trigger();
399 dataCluster->Fill("TC");
403 loader->WriteRecPoints("OVERWRITE");
407 //---------------------------- Track & TriggerTrack ---------------------
409 if (!loader->TreeT()) loader->MakeTracksContainer();
415 dataEvent->MakeBranch("RL"); //trigger track
417 dataEvent->SetTreeAddress("RL");
419 recoEvent->EventReconstructTrigger();
421 dataEvent->Fill("RL");
427 dataEvent->MakeBranch("RT"); //track
429 dataEvent->SetTreeAddress("RT");
431 recoEvent->EventReconstruct();
433 dataEvent->Fill("RT");
437 loader->WriteTracks("OVERWRITE");
441 //--------------------------- Resetting branches -----------------------
443 dataCluster->ResetDigits();
445 dataCluster->ResetRawClusters();
447 dataCluster->ResetTrigger();
451 dataEvent->ResetRawClusters();
453 dataEvent->ResetTrigger();
455 dataEvent->ResetRecTracks();
457 dataEvent->ResetRecTriggerTracks();
463 loader->UnloadRecPoints();
465 loader->UnloadTracks();
467 loader->UnloadDigits();
479 //_____________________________________________________________________________
481 void AliMUONReconstructor::FillESD(AliRunLoader* runLoader, AliESD* esd) const
485 TClonesArray* recTracksArray = 0;
487 TClonesArray* recTrigTracksArray = 0;
491 AliLoader* loader = runLoader->GetLoader("MUONLoader");
493 loader->LoadTracks("READ");
495 AliMUONData* muonData = new AliMUONData(loader,"MUON","MUON");
501 Int_t iEvent;// nPart;
503 Int_t nTrackHits;// nPrimary;
511 Double_t bendingSlope, nonBendingSlope, inverseBendingMomentum;
513 Double_t xRec, yRec, zRec, chi2MatchTrigger;
519 // setting pointer for tracks, triggertracks & trackparam at vertex
521 AliMUONTrack* recTrack = 0;
523 AliMUONTrackParam* trackParam = 0;
525 AliMUONTriggerTrack* recTriggerTrack = 0;
527 // TParticle* particle = new TParticle();
529 // AliGenEventHeader* header = 0;
531 iEvent = runLoader->GetEventNumber();
533 runLoader->GetEvent(iEvent);
537 // vertex calculation (maybe it exists already somewhere else)
539 vertex[0] = vertex[1] = vertex[2] = 0.;
543 // if ( (header = runLoader->GetHeader()->GenEventHeader()) ) {
545 // header->PrimaryVertex(vertex);
549 // runLoader->LoadKinematics("READ");
551 // runLoader->TreeK()->GetBranch("Particles")->SetAddress(&particle);
553 // nPart = (Int_t)runLoader->TreeK()->GetEntries();
555 // for(Int_t iPart = 0; iPart < nPart; iPart++) {
557 // runLoader->TreeK()->GetEvent(iPart);
559 // if (particle->GetFirstMother() == -1) {
561 // vertex[0] += particle->Vx();
563 // vertex[1] += particle->Vy();
565 // vertex[2] += particle->Vz();
573 // vertex[0] /= (double)nPrimary;
575 // vertex[1] /= (double)nPrimary;
577 // vertex[2] /= (double)nPrimary;
585 // setting ESD MUON class
587 AliESDMuonTrack* theESDTrack = new AliESDMuonTrack() ;
591 //-------------------- trigger tracks-------------
595 muonData->SetTreeAddress("RL");
597 muonData->GetRecTriggerTracks();
599 recTrigTracksArray = muonData->RecTriggerTracks();
603 // ready global trigger pattern from first track
605 if (recTrigTracksArray)
607 recTriggerTrack = (AliMUONTriggerTrack*) recTrigTracksArray->First();
609 if (recTriggerTrack) trigPat = recTriggerTrack->GetGTPattern();
613 //printf(">>> Event %d Number of Recconstructed tracks %d \n",iEvent, nrectracks);
617 // -------------------- tracks-------------
619 muonData->SetTreeAddress("RT");
621 muonData->GetRecTracks();
623 recTracksArray = muonData->RecTracks();
627 Int_t nRecTracks = 0;
631 nRecTracks = (Int_t) recTracksArray->GetEntriesFast(); //
637 for (Int_t iRecTracks = 0; iRecTracks < nRecTracks; iRecTracks++) {
641 // reading info from tracks
643 recTrack = (AliMUONTrack*) recTracksArray->At(iRecTracks);
647 trackParam = (AliMUONTrackParam*) (recTrack->GetTrackParamAtHit())->First();
649 trackParam->ExtrapToVertex(vertex[0],vertex[1],vertex[2]);
653 bendingSlope = trackParam->GetBendingSlope();
655 nonBendingSlope = trackParam->GetNonBendingSlope();
657 inverseBendingMomentum = trackParam->GetInverseBendingMomentum();
659 xRec = trackParam->GetNonBendingCoor();
661 yRec = trackParam->GetBendingCoor();
663 zRec = trackParam->GetZ();
667 nTrackHits = recTrack->GetNTrackHits();
669 fitFmin = recTrack->GetFitFMin();
671 matchTrigger = recTrack->GetMatchTrigger();
673 chi2MatchTrigger = recTrack->GetChi2MatchTrigger();
677 // setting data member of ESD MUON
679 theESDTrack->SetInverseBendingMomentum(inverseBendingMomentum);
681 theESDTrack->SetThetaX(TMath::ATan(nonBendingSlope));
683 theESDTrack->SetThetaY(TMath::ATan(bendingSlope));
685 theESDTrack->SetZ(zRec);
687 theESDTrack->SetBendingCoor(yRec); // calculate vertex at ESD or Tracking level ?
689 theESDTrack->SetNonBendingCoor(xRec);
691 theESDTrack->SetChi2(fitFmin);
693 theESDTrack->SetNHit(nTrackHits);
695 theESDTrack->SetMatchTrigger(matchTrigger);
697 theESDTrack->SetChi2MatchTrigger(chi2MatchTrigger);
701 // storing ESD MUON Track into ESD Event
705 esd->AddMuonTrack(theESDTrack);
711 // add global trigger pattern
715 esd->SetTrigger(trigPat);
721 muonData->ResetRecTracks();
723 muonData->ResetRecTriggerTracks();
727 //} // end loop on event
729 loader->UnloadTracks();
733 // runLoader->UnloadKinematics();
741 }//_____________________________________________________________________________
743 void AliMUONReconstructor::FillESD(AliRunLoader* runLoader, AliRawReader* /*rawReader*/, AliESD* esd) const
747 // don't need rawReader ???
749 FillESD(runLoader, esd);