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 ///////////////////////////////////////////////////////////////////////////////
22 #include <TParticle.h>
25 #include "AliRunLoader.h"
26 #include "AliHeader.h"
27 #include "AliGenEventHeader.h"
29 #include "AliMUONReconstructor.h"
31 #include "AliMUONData.h"
32 #include "AliMUONTrackReconstructor.h"
33 #include "AliMUONClusterReconstructor.h"
34 #include "AliMUONClusterFinderVS.h"
35 #include "AliMUONClusterFinderAZ.h"
36 #include "AliMUONTrack.h"
37 #include "AliMUONTrackParam.h"
38 #include "AliMUONTriggerTrack.h"
39 #include "AliESDMuonTrack.h"
40 #include "AliMUONRawData.h"
42 #include "AliRawReader.h"
45 ClassImp(AliMUONReconstructor)
46 //_____________________________________________________________________________
47 AliMUONReconstructor::AliMUONReconstructor()
51 //_____________________________________________________________________________
52 AliMUONReconstructor::~AliMUONReconstructor()
55 //_____________________________________________________________________________
56 void AliMUONReconstructor::Reconstruct(AliRunLoader* runLoader) const
59 AliLoader* loader = runLoader->GetLoader("MUONLoader");
60 Int_t nEvents = runLoader->GetNumberOfEvents();
62 // used local container for each method
63 // passing fLoader as argument, could be avoided ???
64 AliMUONTrackReconstructor* recoEvent = new AliMUONTrackReconstructor(loader);
65 AliMUONData* dataEvent = recoEvent->GetMUONData();
66 if (strstr(GetOption(),"Kalman")) recoEvent->SetTrackMethod(2); // Kalman
67 else recoEvent->SetTrackMethod(1); // original
69 AliMUONClusterReconstructor* recoCluster = new AliMUONClusterReconstructor(loader);
70 AliMUONData* dataCluster = recoCluster->GetMUONData();
71 AliMUONClusterFinderVS *recModel = recoCluster->GetRecoModel();
72 if (strstr(GetOption(),"AZ")) {
73 recModel = (AliMUONClusterFinderVS*) new AliMUONClusterFinderAZ();
74 recoCluster->SetRecoModel(recModel);
76 recModel->SetGhostChi2Cut(10);
78 loader->LoadDigits("READ");
79 loader->LoadRecPoints("RECREATE");
80 loader->LoadTracks("RECREATE");
83 for(Int_t ievent = 0; ievent < nEvents; ievent++) {
84 printf("Event %d\n",ievent);
85 runLoader->GetEvent(ievent);
87 //----------------------- digit2cluster & Trigger2Trigger -------------------
88 if (!loader->TreeR()) loader->MakeRecPointsContainer();
91 dataCluster->MakeBranch("RC");
92 dataCluster->SetTreeAddress("D,RC");
93 recoCluster->Digits2Clusters();
94 dataCluster->Fill("RC");
97 dataCluster->MakeBranch("TC");
98 dataCluster->SetTreeAddress("TC");
99 recoCluster->Trigger2Trigger();
100 dataCluster->Fill("TC");
102 loader->WriteRecPoints("OVERWRITE");
104 //---------------------------- Track & TriggerTrack ---------------------
105 if (!loader->TreeT()) loader->MakeTracksContainer();
108 dataEvent->MakeBranch("RL"); //trigger track
109 dataEvent->SetTreeAddress("RL");
110 recoEvent->EventReconstructTrigger();
111 dataEvent->Fill("RL");
114 dataEvent->MakeBranch("RT"); //track
115 dataEvent->SetTreeAddress("RT");
116 recoEvent->EventReconstruct();
117 dataEvent->Fill("RT");
119 loader->WriteTracks("OVERWRITE");
121 //--------------------------- Resetting branches -----------------------
122 dataCluster->ResetDigits();
123 dataCluster->ResetRawClusters();
124 dataCluster->ResetTrigger();
126 dataEvent->ResetRawClusters();
127 dataEvent->ResetTrigger();
128 dataEvent->ResetRecTracks();
129 dataEvent->ResetRecTriggerTracks();
132 loader->UnloadDigits();
133 loader->UnloadRecPoints();
134 loader->UnloadTracks();
140 //_____________________________________________________________________________
141 void AliMUONReconstructor::Reconstruct(AliRunLoader* runLoader, AliRawReader* rawReader) const
144 AliLoader* loader = runLoader->GetLoader("MUONLoader");
146 // used local container for each method
147 // passing fLoader as argument, could be avoided ???
148 AliMUONTrackReconstructor* recoEvent = new AliMUONTrackReconstructor(loader);
149 AliMUONData* dataEvent = recoEvent->GetMUONData();
151 AliMUONRawData* rawData = new AliMUONRawData(loader);
152 AliMUONData* dataCluster = rawData->GetMUONData();
154 AliMUONClusterReconstructor* recoCluster = new AliMUONClusterReconstructor(loader, dataCluster);
155 AliMUONClusterFinderVS *recModel = recoCluster->GetRecoModel();
156 recModel->SetGhostChi2Cut(10);
158 loader->LoadRecPoints("RECREATE");
159 loader->LoadTracks("RECREATE");
160 loader->LoadDigits("RECREATE");
166 while (rawReader->NextEvent()) {
167 printf("Event %d\n",iEvent);
168 runLoader->GetEvent(iEvent++);
170 //----------------------- raw2digits & raw2trigger-------------------
171 if (!loader->TreeD()) loader->MakeDigitsContainer();
174 dataCluster->MakeBranch("D");
175 dataCluster->SetTreeAddress("D");
176 rawData->ReadTrackerDDL(rawReader);
177 dataCluster->Fill("D");
180 dataCluster->MakeBranch("GLT");
181 dataCluster->SetTreeAddress("GLT");
182 rawData->ReadTriggerDDL(rawReader);
183 dataCluster->Fill("GLT");
185 loader->WriteDigits("OVERWRITE");
187 //----------------------- digit2cluster & Trigger2Trigger -------------------
188 if (!loader->TreeR()) loader->MakeRecPointsContainer();
191 dataCluster->MakeBranch("RC");
192 dataCluster->SetTreeAddress("RC");
193 recoCluster->Digits2Clusters();
194 dataCluster->Fill("RC");
197 dataCluster->MakeBranch("TC");
198 dataCluster->SetTreeAddress("TC");
199 recoCluster->Trigger2Trigger();
200 dataCluster->Fill("TC");
202 loader->WriteRecPoints("OVERWRITE");
204 //---------------------------- Track & TriggerTrack ---------------------
205 if (!loader->TreeT()) loader->MakeTracksContainer();
208 dataEvent->MakeBranch("RL"); //trigger track
209 dataEvent->SetTreeAddress("RL");
210 recoEvent->EventReconstructTrigger();
211 dataEvent->Fill("RL");
214 dataEvent->MakeBranch("RT"); //track
215 dataEvent->SetTreeAddress("RT");
216 recoEvent->EventReconstruct();
217 dataEvent->Fill("RT");
219 loader->WriteTracks("OVERWRITE");
221 //--------------------------- Resetting branches -----------------------
222 dataCluster->ResetDigits();
223 dataCluster->ResetRawClusters();
224 dataCluster->ResetTrigger();
226 dataEvent->ResetRawClusters();
227 dataEvent->ResetTrigger();
228 dataEvent->ResetRecTracks();
229 dataEvent->ResetRecTriggerTracks();
232 loader->UnloadRecPoints();
233 loader->UnloadTracks();
234 loader->UnloadDigits();
240 //_____________________________________________________________________________
241 void AliMUONReconstructor::FillESD(AliRunLoader* runLoader, AliESD* esd) const
243 TClonesArray* recTracksArray = 0;
244 TClonesArray* recTrigTracksArray = 0;
246 AliLoader* loader = runLoader->GetLoader("MUONLoader");
247 loader->LoadTracks("READ");
248 AliMUONData* muonData = new AliMUONData(loader,"MUON","MUON");
251 Int_t iEvent;// nPart;
252 Int_t nTrackHits;// nPrimary;
256 Double_t bendingSlope, nonBendingSlope, inverseBendingMomentum;
257 Double_t xRec, yRec, zRec, chi2MatchTrigger;
260 // setting pointer for tracks, triggertracks & trackparam at vertex
261 AliMUONTrack* recTrack = 0;
262 AliMUONTrackParam* trackParam = 0;
263 AliMUONTriggerTrack* recTriggerTrack = 0;
264 // TParticle* particle = new TParticle();
265 // AliGenEventHeader* header = 0;
266 iEvent = runLoader->GetEventNumber();
267 runLoader->GetEvent(iEvent);
269 // vertex calculation (maybe it exists already somewhere else)
270 vertex[0] = vertex[1] = vertex[2] = 0.;
272 // if ( (header = runLoader->GetHeader()->GenEventHeader()) ) {
273 // header->PrimaryVertex(vertex);
275 // runLoader->LoadKinematics("READ");
276 // runLoader->TreeK()->GetBranch("Particles")->SetAddress(&particle);
277 // nPart = (Int_t)runLoader->TreeK()->GetEntries();
278 // for(Int_t iPart = 0; iPart < nPart; iPart++) {
279 // runLoader->TreeK()->GetEvent(iPart);
280 // if (particle->GetFirstMother() == -1) {
281 // vertex[0] += particle->Vx();
282 // vertex[1] += particle->Vy();
283 // vertex[2] += particle->Vz();
287 // vertex[0] /= (double)nPrimary;
288 // vertex[1] /= (double)nPrimary;
289 // vertex[2] /= (double)nPrimary;
293 // setting ESD MUON class
294 AliESDMuonTrack* theESDTrack = new AliESDMuonTrack() ;
296 //-------------------- trigger tracks-------------
298 muonData->SetTreeAddress("RL");
299 muonData->GetRecTriggerTracks();
300 recTrigTracksArray = muonData->RecTriggerTracks();
302 // ready global trigger pattern from first track
303 if (recTrigTracksArray)
304 recTriggerTrack = (AliMUONTriggerTrack*) recTrigTracksArray->First();
305 if (recTriggerTrack) trigPat = recTriggerTrack->GetGTPattern();
307 //printf(">>> Event %d Number of Recconstructed tracks %d \n",iEvent, nrectracks);
309 // -------------------- tracks-------------
310 muonData->SetTreeAddress("RT");
311 muonData->GetRecTracks();
312 recTracksArray = muonData->RecTracks();
314 Int_t nRecTracks = 0;
316 nRecTracks = (Int_t) recTracksArray->GetEntriesFast(); //
319 for (Int_t iRecTracks = 0; iRecTracks < nRecTracks; iRecTracks++) {
321 // reading info from tracks
322 recTrack = (AliMUONTrack*) recTracksArray->At(iRecTracks);
324 trackParam = (AliMUONTrackParam*) (recTrack->GetTrackParamAtHit())->First();
325 trackParam->ExtrapToVertex(vertex[0],vertex[1],vertex[2]);
327 bendingSlope = trackParam->GetBendingSlope();
328 nonBendingSlope = trackParam->GetNonBendingSlope();
329 inverseBendingMomentum = trackParam->GetInverseBendingMomentum();
330 xRec = trackParam->GetNonBendingCoor();
331 yRec = trackParam->GetBendingCoor();
332 zRec = trackParam->GetZ();
334 nTrackHits = recTrack->GetNTrackHits();
335 fitFmin = recTrack->GetFitFMin();
336 matchTrigger = recTrack->GetMatchTrigger();
337 chi2MatchTrigger = recTrack->GetChi2MatchTrigger();
339 // setting data member of ESD MUON
340 theESDTrack->SetInverseBendingMomentum(inverseBendingMomentum);
341 theESDTrack->SetThetaX(TMath::ATan(nonBendingSlope));
342 theESDTrack->SetThetaY(TMath::ATan(bendingSlope));
343 theESDTrack->SetZ(zRec);
344 theESDTrack->SetBendingCoor(yRec); // calculate vertex at ESD or Tracking level ?
345 theESDTrack->SetNonBendingCoor(xRec);
346 theESDTrack->SetChi2(fitFmin);
347 theESDTrack->SetNHit(nTrackHits);
348 theESDTrack->SetMatchTrigger(matchTrigger);
349 theESDTrack->SetChi2MatchTrigger(chi2MatchTrigger);
351 // storing ESD MUON Track into ESD Event
353 esd->AddMuonTrack(theESDTrack);
356 // add global trigger pattern
358 esd->SetTrigger(trigPat);
361 muonData->ResetRecTracks();
362 muonData->ResetRecTriggerTracks();
364 //} // end loop on event
365 loader->UnloadTracks();
367 // runLoader->UnloadKinematics();
371 }//_____________________________________________________________________________
372 void AliMUONReconstructor::FillESD(AliRunLoader* runLoader, AliRawReader* /*rawReader*/, AliESD* esd) const
374 // don't need rawReader ???
375 FillESD(runLoader, esd);