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 **************************************************************************/
20 #include <TGeoManager.h>
23 #include "AliESDEvent.h"
24 #include "AliESDMuonTrack.h"
25 #include "AliCDBManager.h"
26 #include "AliCDBStorage.h"
27 #include "AliGeomManager.h"
30 #include "AliAnalysisManager.h"
31 #include "AliInputEventHandler.h"
32 #include "AliAnalysisTaskMuonRefit.h"
35 #include "AliMUONCDB.h"
36 #include "AliMUONRecoParam.h"
37 #include "AliMUONESDInterface.h"
38 #include "AliMUONRefitter.h"
39 #include "AliMUONTrack.h"
40 #include "AliMUONVCluster.h"
41 #include "AliMUONVTrackStore.h"
42 #include "AliMUONGeometryTransformer.h"
45 #define SafeDelete(x) if (x != NULL) { delete x; x = NULL; }
48 ClassImp(AliAnalysisTaskMuonRefit)
50 //________________________________________________________________________
51 AliAnalysisTaskMuonRefit::AliAnalysisTaskMuonRefit() :
54 fImproveTracks(kFALSE),
56 fSigmaCutForTrigger(-1.),
60 fOldGeoTransformer(NULL),
61 fNewGeoTransformer(NULL),
65 /// Default constructor
68 //________________________________________________________________________
69 AliAnalysisTaskMuonRefit::AliAnalysisTaskMuonRefit(const char *name) :
70 AliAnalysisTaskSE(name),
71 fDefaultStorage("raw://"),
72 fImproveTracks(kFALSE),
74 fSigmaCutForTrigger(-1.),
78 fOldGeoTransformer(NULL),
79 fNewGeoTransformer(NULL),
84 for (Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) ResetClusterResolution(i, -1., -1.);
87 //________________________________________________________________________
88 AliAnalysisTaskMuonRefit::~AliAnalysisTaskMuonRefit()
91 SafeDelete(fOldGeoTransformer);
92 SafeDelete(fNewGeoTransformer);
93 SafeDelete(fESDInterface);
94 SafeDelete(fRefitter);
97 //___________________________________________________________________________
98 void AliAnalysisTaskMuonRefit::UserCreateOutputObjects()
102 //________________________________________________________________________
103 void AliAnalysisTaskMuonRefit::UserExec(Option_t *)
107 // check if refitter properly created
108 if (!fRefitter) return;
110 AliESDEvent* esd = dynamic_cast<AliESDEvent*>(InputEvent());
113 Int_t nTracks = (Int_t)esd->GetNumberOfMuonTracks();
114 if (nTracks < 1) return;
116 // load the current event
117 fESDInterface->LoadEvent(*esd, kFALSE);
120 AliMUONVCluster* cluster = 0x0;
121 TIter nextCluster(fESDInterface->CreateClusterIterator());
122 while ((cluster = static_cast<AliMUONVCluster*>(nextCluster()))) ModifyCluster(*cluster);
124 // refit the tracks from clusters
125 AliMUONVTrackStore* newTrackStore = fRefitter->ReconstructFromClusters();
127 // loop over the list of ESD tracks
128 TClonesArray *esdTracks = (TClonesArray*) esd->FindListObject("MuonTracks");
129 for (Int_t iTrack = 0; iTrack < nTracks; iTrack++) {
132 AliESDMuonTrack* esdTrack = (AliESDMuonTrack*) esdTracks->UncheckedAt(iTrack);
134 // skip ghost tracks (leave them unchanged)
135 if (!esdTrack->ContainTrackerData()) continue;
137 // Find the corresponding re-fitted MUON track
138 AliMUONTrack* newTrack = (AliMUONTrack*) newTrackStore->FindObject(esdTrack->GetUniqueID());
140 // replace the content of the current ESD track or remove it
141 if (newTrack && (!fImproveTracks || newTrack->IsImproved())) {
142 Double_t vertex[3] = {esdTrack->GetNonBendingCoor(), esdTrack->GetBendingCoor(), esdTrack->GetZ()};
143 AliMUONESDInterface::MUONToESD(*newTrack, *esdTrack, vertex, fESDInterface->GetDigits());
145 // eventually remove the trigger part if matching chi2 do not pass the new cut
146 if (newTrack->GetChi2MatchTrigger() > fSigmaCutForTrigger*fSigmaCutForTrigger) {
147 esdTrack->SetLocalTrigger(0);
148 esdTrack->SetChi2MatchTrigger(0.);
149 esdTrack->SetHitsPatternInTrigCh(0);
150 esdTrack->SetTriggerX1Pattern(0);
151 esdTrack->SetTriggerY1Pattern(0);
152 esdTrack->SetTriggerX2Pattern(0);
153 esdTrack->SetTriggerY2Pattern(0);
154 esdTrack->SetTriggerX3Pattern(0);
155 esdTrack->SetTriggerY3Pattern(0);
156 esdTrack->SetTriggerX4Pattern(0);
157 esdTrack->SetTriggerY4Pattern(0);
161 esdTracks->Remove(esdTrack);
167 delete newTrackStore;
169 // compress the array of ESD tracks
170 esdTracks->Compress();
174 //________________________________________________________________________
175 void AliAnalysisTaskMuonRefit::NotifyRun()
177 /// load necessary data from OCDB and create the refitter
179 AliCDBManager* cdbm = AliCDBManager::Instance();
180 cdbm->SetDefaultStorage(fDefaultStorage.Data());
181 cdbm->SetRun(fCurrentRunNumber);
183 if (!AliMUONCDB::LoadField()) return;
185 if (!AliMUONCDB::LoadMapping(kTRUE)) return;
187 AliMUONRecoParam* recoParam = AliMUONCDB::LoadRecoParam();
188 if (!recoParam) return;
190 if (fImproveTracks) {
191 if (fSigmaCut > 0.) recoParam->ImproveTracks(kTRUE, fSigmaCut);
192 else recoParam->ImproveTracks(kTRUE);
193 } else recoParam->ImproveTracks(kFALSE);
195 if (fSigmaCutForTrigger > 0.) recoParam->SetSigmaCutForTrigger(fSigmaCutForTrigger);
196 else fSigmaCutForTrigger = recoParam->GetSigmaCutForTrigger();
198 for (Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
199 if (fClusterResNB[i] < 0.) fClusterResNB[i] = recoParam->GetDefaultNonBendingReso(i);
200 if (fClusterResB[i] < 0.) fClusterResB[i] = recoParam->GetDefaultBendingReso(i);
205 // recover default storage full name (raw:// cannot be used to set specific storage)
206 TString defaultStorage(cdbm->GetDefaultStorage()->GetType());
207 if (defaultStorage == "alien") defaultStorage += Form("://folder=%s", cdbm->GetDefaultStorage()->GetBaseFolder().Data());
208 else defaultStorage += Form("://%s", cdbm->GetDefaultStorage()->GetBaseFolder().Data());
210 // reset existing geometry/alignment if any
211 if (cdbm->GetEntryCache()->Contains("GRP/Geometry/Data")) cdbm->UnloadFromCache("GRP/Geometry/Data");
212 if (cdbm->GetEntryCache()->Contains("MUON/Align/Data")) cdbm->UnloadFromCache("MUON/Align/Data");
213 if (AliGeomManager::GetGeometry()) AliGeomManager::GetGeometry()->UnlockGeometry();
215 // get original geometry transformer
216 AliGeomManager::LoadGeometry();
217 if (!AliGeomManager::GetGeometry()) return;
218 if (fOldAlignStorage != "none") {
219 if (!fOldAlignStorage.IsNull()) cdbm->SetSpecificStorage("MUON/Align/Data",fOldAlignStorage.Data());
220 else cdbm->SetSpecificStorage("MUON/Align/Data",defaultStorage.Data());
221 AliGeomManager::ApplyAlignObjsFromCDB("MUON");
223 fOldGeoTransformer = new AliMUONGeometryTransformer();
224 fOldGeoTransformer->LoadGeometryData();
226 // get new geometry transformer
227 cdbm->UnloadFromCache("GRP/Geometry/Data");
228 if (fOldAlignStorage != "none") cdbm->UnloadFromCache("MUON/Align/Data");
229 AliGeomManager::GetGeometry()->UnlockGeometry();
230 AliGeomManager::LoadGeometry();
231 if (!AliGeomManager::GetGeometry()) return;
232 if (!fNewAlignStorage.IsNull()) cdbm->SetSpecificStorage("MUON/Align/Data",fNewAlignStorage.Data());
233 else cdbm->SetSpecificStorage("MUON/Align/Data",defaultStorage.Data());
234 AliGeomManager::ApplyAlignObjsFromCDB("MUON");
235 fNewGeoTransformer = new AliMUONGeometryTransformer();
236 fNewGeoTransformer->LoadGeometryData();
240 // load geometry for track extrapolation to vertex
241 if (cdbm->GetEntryCache()->Contains("GRP/Geometry/Data")) cdbm->UnloadFromCache("GRP/Geometry/Data");
242 if (AliGeomManager::GetGeometry()) AliGeomManager::GetGeometry()->UnlockGeometry();
243 AliGeomManager::LoadGeometry();
244 if (!AliGeomManager::GetGeometry()) return;
248 fESDInterface = new AliMUONESDInterface();
249 fRefitter = new AliMUONRefitter(recoParam);
250 fRefitter->Connect(fESDInterface);
253 //________________________________________________________________________
254 void AliAnalysisTaskMuonRefit::Terminate(Option_t *)
258 //________________________________________________________________________
259 void AliAnalysisTaskMuonRefit::ModifyCluster(AliMUONVCluster& cl)
261 /// Reset the cluster resolution to the one given to the task and change
262 /// the cluster position according to the new alignment parameters if required
264 Double_t gX,gY,gZ,lX,lY,lZ;
266 // change their resolution
267 cl.SetErrXY(fClusterResNB[cl.GetChamberId()], fClusterResB[cl.GetChamberId()]);
269 // change their position
274 fOldGeoTransformer->Global2Local(cl.GetDetElemId(),gX,gY,gZ,lX,lY,lZ);
275 fNewGeoTransformer->Local2Global(cl.GetDetElemId(),lX,lY,lZ,gX,gY,gZ);