]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MUON/AliMUONAlignmentTask.cxx
Removing obsolete class
[u/mrichter/AliRoot.git] / MUON / AliMUONAlignmentTask.cxx
CommitLineData
81f1d3ae 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**************************************************************************/
15
16// $Id$
17
4d610fd5 18//-----------------------------------------------------------------------------
19/// \class AliMUONAlignmentTask
20/// AliAnalysisTask to align the MUON spectrometer.
21/// The Task reads as input ESDs and feeds the MUONTracks to AliMUONAlignment.
22/// The alignment itself is performed by AliMillepede.
23/// A OCDB entry is written with the alignment parameters.
24/// A list of graph are written to monitor the alignment parameters.
25///
26/// \author Javier Castillo, CEA/Saclay - Irfu/SPhN
27//-----------------------------------------------------------------------------
28
29#include <fstream>
30
31#include <TString.h>
2df5c2cf 32#include <TError.h>
4d610fd5 33#include <TGraphErrors.h>
34#include <TTree.h>
35#include <TChain.h>
36#include <TClonesArray.h>
37#include <TGeoGlobalMagField.h>
cd8521dd 38#include <TGeoManager.h>
4d610fd5 39#include <Riostream.h>
40
41#include "AliAnalysisTask.h"
42#include "AliAnalysisManager.h"
43#include "AliESDInputHandler.h"
44#include "AliESDEvent.h"
45#include "AliESDMuonTrack.h"
46#include "AliMagF.h"
47#include "AliCDBManager.h"
cd8521dd 48#include "AliGRPManager.h"
4d610fd5 49#include "AliCDBMetaData.h"
50#include "AliCDBId.h"
51#include "AliGeomManager.h"
52
53#include "AliMpCDB.h"
54#include "AliMUONAlignment.h"
55#include "AliMUONTrack.h"
56#include "AliMUONTrackExtrap.h"
57#include "AliMUONTrackParam.h"
58#include "AliMUONGeometryTransformer.h"
59#include "AliMUONESDInterface.h"
60
61#include "AliMUONAlignmentTask.h"
62
63///\cond CLASSIMP
64ClassImp(AliMUONAlignmentTask)
65///\endcond
66
67// //________________________________________________________________________
68// AliMUONAlignmentTask::AliMUONAlignmentTask(const char *name)
69// : AliAnalysisTask(name, ""),
70// fESD(0x0),
71// fAlign(0x0),
72// fGeoFilename(""),
73// fTransform(0x0),
74// fTrackTot(0),
75// fTrackOk(0),
76// fMSDEx(0x0),
77// fMSDEy(0x0),
78// fMSDEz(0x0),
79// fMSDEp(0x0),
80// fList(0x0)
81// {
82// /// Default Constructor
83// // Define input and output slots here
84// // Input slot #0 works with a TChain
85// DefineInput(0, TChain::Class());
86// // Output slot #0 writes NTuple/histos into a TList
87// DefineOutput(0, TList::Class());
88
89// // initialize parameters ...
90// for(Int_t k=0;k<4*156;k++) {
91// fParameters[k]=0.;
92// fErrors[k]=0.;
93// fPulls[k]=0.;
94// }
95
96// fAlign = new AliMUONAlignment();
97// fTransform = new AliMUONGeometryTransformer();
98// }
99
100//________________________________________________________________________
cd8521dd 101AliMUONAlignmentTask::AliMUONAlignmentTask(const char *name, const char *geofilename, const char *defaultocdb, const char *misalignocdb)
4d610fd5 102 : AliAnalysisTask(name, ""),
103 fESD(0x0),
104 fAlign(0x0),
105 fGeoFilename(geofilename),
cd8521dd 106 fMisAlignOCDB(misalignocdb),
107 fDefaultOCDB(defaultocdb),
4d610fd5 108 fTransform(0x0),
109 fTrackTot(0),
110 fTrackOk(0),
2df5c2cf 111 fLastRunNumber(-1),
4d610fd5 112 fMSDEx(0x0),
113 fMSDEy(0x0),
114 fMSDEz(0x0),
115 fMSDEp(0x0),
116 fList(0x0)
117{
118 /// Default Constructor
119 // Define input and output slots here
120 // Input slot #0 works with a TChain
121 DefineInput(0, TChain::Class());
122 // Output slot #0 writes NTuple/histos into a TList
123 DefineOutput(0, TList::Class());
124
125 // initialize parameters ...
126 for(Int_t k=0;k<4*156;k++) {
127 fParameters[k]=0.;
128 fErrors[k]=0.;
129 fPulls[k]=0.;
130 }
131
132 fAlign = new AliMUONAlignment();
133 fTransform = new AliMUONGeometryTransformer();
134}
135
136
137//________________________________________________________________________
138AliMUONAlignmentTask::AliMUONAlignmentTask(const AliMUONAlignmentTask& obj)
139 : AliAnalysisTask(obj),
140 fESD(0x0),
141 fAlign(0x0),
142 fGeoFilename(""),
cd8521dd 143 fMisAlignOCDB(""),
144 fDefaultOCDB(""),
4d610fd5 145 fTransform(0x0),
146 fTrackTot(0),
147 fTrackOk(0),
2df5c2cf 148 fLastRunNumber(-1),
4d610fd5 149 fMSDEx(0x0),
150 fMSDEy(0x0),
151 fMSDEz(0x0),
152 fMSDEp(0x0),
153 fList(0x0)
154{
155 /// Copy constructor
156 fESD = obj.fESD;
157 fAlign = obj.fAlign;
158 fGeoFilename = obj.fGeoFilename;
159 fTransform = obj.fTransform;
160 fTrackTot = obj.fTrackTot;
161 fTrackOk = obj.fTrackOk;
2df5c2cf 162 fLastRunNumber = obj.fLastRunNumber;
4d610fd5 163 fMSDEx = obj.fMSDEx;
164 fMSDEy = obj.fMSDEy;
165 fMSDEz = obj.fMSDEz;
166 fMSDEp = obj.fMSDEp;
167 fList = obj.fList;
f4c2989f 168
169 // initialize parameters ...
170 for(Int_t k=0;k<4*156;k++) {
171 fParameters[k]=obj.fParameters[k];
172 fErrors[k]=obj.fErrors[k];
173 fPulls[k]=obj.fPulls[k];
174 }
175
4d610fd5 176}
177
178//________________________________________________________________________
179AliMUONAlignmentTask& AliMUONAlignmentTask::operator=(const AliMUONAlignmentTask& other)
180{
181 /// Assignment
182 AliAnalysisTask::operator=(other);
183 fESD = other.fESD;
184 fAlign = other.fAlign;
185 fGeoFilename = other.fGeoFilename;
cd8521dd 186 fMisAlignOCDB = other.fMisAlignOCDB;
187 fDefaultOCDB = other.fDefaultOCDB;
4d610fd5 188 fTransform = other.fTransform;
189 fTrackTot = other.fTrackTot;
190 fTrackOk = other.fTrackOk;
2df5c2cf 191 fLastRunNumber = other.fLastRunNumber;
4d610fd5 192 fMSDEx = other.fMSDEx;
193 fMSDEy = other.fMSDEy;
194 fMSDEz = other.fMSDEz;
195 fMSDEp = other.fMSDEp;
196 fList = other.fList;
f4c2989f 197
198 // initialize parameters ...
199 for(Int_t k=0;k<4*156;k++) {
200 fParameters[k]=other.fParameters[k];
201 fErrors[k]=other.fErrors[k];
202 fPulls[k]=other.fPulls[k];
203 }
4d610fd5 204
205 return *this;
206}
207
208//________________________________________________________________________
209AliMUONAlignmentTask::~AliMUONAlignmentTask()
210{
211 /// Destructor
212 if (fAlign) delete fAlign;
213 if (fTransform) delete fTransform;
214}
215
216//________________________________________________________________________
217void AliMUONAlignmentTask::LocalInit()
218{
219 /// Local initialization, called once per task on the client machine
220 /// where the analysis train is assembled
2df5c2cf 221 fLastRunNumber = 0;
222 // Prepare(fGeoFilename.Data(),fDefaultOCDB.Data(),fMisAlignOCDB.Data());
223 Prepare(fGeoFilename.Data(),"local://$ALICE_ROOT/OCDB",fMisAlignOCDB.Data());
224 fLastRunNumber = -1;
4d610fd5 225
226 // Set initial values here, good guess may help convergence
227 // St 1
228 // Int_t iPar = 0;
229 // fParameters[iPar++] = 0.010300 ; fParameters[iPar++] = 0.010600 ; fParameters[iPar++] = 0.000396 ;
230
231
232 fAlign->InitGlobalParameters(fParameters);
233
234
235 fTransform->LoadGeometryData();
236 fAlign->SetGeometryTransformer(fTransform);
237
238 // Do alignment with magnetic field off
239 fAlign->SetBFieldOn(kFALSE);
240
241 // Set tracking station to use
242 // Bool_t bStOnOff[5] = {kTRUE,kTRUE,kTRUE,kTRUE,kTRUE};
243 Bool_t bChOnOff[10] = {kTRUE,kTRUE,kTRUE,kTRUE,kTRUE,kFALSE,kTRUE,kTRUE,kTRUE,kTRUE};
244
245 // Set degrees of freedom to align (see AliMUONAlignment)
246 fAlign->AllowVariations(bChOnOff);
247
248 // Fix parameters or add constraints here
249 // for (Int_t iSt=0; iSt<5; iSt++)
250 // if (!bStOnOff[iSt]) fAlign->FixStation(iSt+1);
251 for (Int_t iCh=0; iCh<10; iCh++)
252 if (!bChOnOff[iCh]) fAlign->FixChamber(iCh+1);
253
254 // Left and right sides of the detector are independent, one can choose to align
255 // only one side
256 Bool_t bSpecLROnOff[2] = {kTRUE,kTRUE};
257 fAlign->FixHalfSpectrometer(bChOnOff,bSpecLROnOff);
258
259 fAlign->SetChOnOff(bChOnOff);
260 fAlign->SetSpecLROnOff(bChOnOff);
261
262 // Here we can fix some detection elements
263 fAlign->FixDetElem(908);
264 fAlign->FixDetElem(1020);
265
266 // Set predifined global constrains: X, Y, P, XvsZ, YvsZ, PvsZ, XvsY, YvsY, PvsY
267// Bool_t bVarXYT[9] = {kTRUE,kTRUE,kTRUE,kTRUE,kTRUE,kTRUE,kTRUE,kTRUE,kTRUE};
268// Bool_t bDetTLBR[4] = {kFALSE,kTRUE,kFALSE,kTRUE};
269 // fAlign->AddConstraints(bChOnOff,bVarXYT,bDetTLBR,bSpecLROnOff);
270
271}
272
273//________________________________________________________________________
274void AliMUONAlignmentTask::ConnectInputData(Option_t *)
275{
276 /// Connect ESD here. Called on each input data change.
277
278 // Connect ESD here
279 TTree* esdTree = dynamic_cast<TTree*> (GetInputData(0));
280 if (!esdTree) {
281 Printf("ERROR: Could not read chain from input slot 0");
282 }
283 else {
284 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
285 if (!esdH) {
286 Printf("ERROR: Could not get ESDInputHandler");
287 }
288 else {
289 fESD = esdH->GetEvent();
290 }
291 }
292}
293
294//________________________________________________________________________
295void AliMUONAlignmentTask::CreateOutputObjects()
296{
297 /// Executed once on each worker (machine actually running the analysis code)
298 //
299 // This method has to be called INSIDE the user redefined CreateOutputObjects
300 // method, before creating each object corresponding to the output containers
301 // that are to be written to a file. This need to be done in general for the big output
302 // objects that may not fit memory during processing.
303 // OpenFile(0);
304
305 // Creating graphs
306 fMSDEx = new TGraphErrors(156);
307 fMSDEy = new TGraphErrors(156);
308 fMSDEz = new TGraphErrors(156);
309 fMSDEp = new TGraphErrors(156);
310
311 // Add Ntuples to the list
312 fList = new TList();
313 fList->Add(fMSDEx);
314 fList->Add(fMSDEy);
315 fList->Add(fMSDEz);
316 fList->Add(fMSDEp);
317}
318
319//________________________________________________________________________
320void AliMUONAlignmentTask::Exec(Option_t *)
321{
322 /// Main loop, called for each event
323 if (!fESD) {
324 Printf("ERROR: fESD not available");
325 return;
326 }
327
328 Double_t trackParams[8] = {0.,0.,0.,0.,0.,0.,0.,0.};
2df5c2cf 329 if (fESD->GetRunNumber()!=fLastRunNumber){
330 fLastRunNumber = fESD->GetRunNumber();
331 Prepare(fGeoFilename.Data(),fDefaultOCDB.Data(),fMisAlignOCDB.Data());
332 }
4d610fd5 333
334 Int_t nTracks = Int_t(fESD->GetNumberOfMuonTracks());
335 // if (!event%100) cout << " there are " << nTracks << " tracks in event " << event << endl;
336 for (Int_t iTrack = 0; iTrack < nTracks; iTrack++) {
337 AliESDMuonTrack* esdTrack = fESD->GetMuonTrack(iTrack);
338 if (!esdTrack->ClustersStored()) continue;
339 Double_t invBenMom = esdTrack->GetInverseBendingMomentum();
340// fInvBenMom->Fill(invBenMom);
341// fBenMom->Fill(1./invBenMom);
342 if (TMath::Abs(invBenMom)<=1.04) {
343 AliMUONTrack track;
344 AliMUONESDInterface::ESDToMUON(*esdTrack, track);
345 fAlign->ProcessTrack(&track);
346 fAlign->LocalFit(fTrackOk++,trackParams,0);
347 }
348 fTrackTot++;
2df5c2cf 349 cout << "Processed " << fTrackTot << " Tracks." << endl;
4d610fd5 350 }
351
352 // Post final data. Write histo list to a file with option "RECREATE"
353 PostData(0,fList);
354}
355
356//________________________________________________________________________
2df5c2cf 357void AliMUONAlignmentTask::FinishTaskOutput()
4d610fd5 358{
359 /// Called once per task on the client machine at the end of the analysis.
360
361 cout << "Processed " << fTrackTot << " Tracks." << endl;
362 // Perform global fit
363 fAlign->GlobalFit(fParameters,fErrors,fPulls);
364
365 cout << "Done with GlobalFit " << endl;
366
2df5c2cf 367// // Update pointers reading them from the output slot
368// fList = (TList*)GetOutputData(0);
369// fMSDEx = (TGraphErrors*)fList->At(0);
370// fMSDEy = (TGraphErrors*)fList->At(1);
371// fMSDEz = (TGraphErrors*)fList->At(2);
372// fMSDEp = (TGraphErrors*)fList->At(3);
4d610fd5 373
374 // Store results
9ee1d6ff 375 Double_t deId[156] = {0};
376 Double_t msdEx[156] = {0};
377 Double_t msdEy[156] = {0};
378 Double_t msdEz[156] = {0};
379 Double_t msdEp[156] = {0};
380 Double_t deIdErr[156] = {0};
381 Double_t msdExErr[156] = {0};
382 Double_t msdEyErr[156] = {0};
383 Double_t msdEzErr[156] = {0};
384 Double_t msdEpErr[156] = {0};
4d610fd5 385 Int_t lNDetElem = 4*2+4*2+18*2+26*2+26*2;
386 Int_t lNDetElemCh[10] = {4,4,4,4,18,18,26,26,26,26};
387 // Int_t lSNDetElemCh[10] = {4,8,12,16,34,52,78,104,130,156};
388 Int_t idOffset = 0; // 400
389 Int_t lSDetElemCh = 0;
390 for(Int_t iDE=0; iDE<lNDetElem; iDE++){
9ee1d6ff 391 deIdErr[iDE] = 0.;
392 deId[iDE] = idOffset+100;
393 deId[iDE] += iDE;
4d610fd5 394 lSDetElemCh = 0;
395 for(Int_t iCh=0; iCh<9; iCh++){
396 lSDetElemCh += lNDetElemCh[iCh];
397 if (iDE>=lSDetElemCh) {
9ee1d6ff 398 deId[iDE] += 100;
399 deId[iDE] -= lNDetElemCh[iCh];
4d610fd5 400 }
401 }
9ee1d6ff 402 msdEx[iDE]=fParameters[3*iDE+0];
403 msdEy[iDE]=fParameters[3*iDE+1];
404 msdEz[iDE]=fParameters[3*iDE+3];
405 msdEp[iDE]=fParameters[3*iDE+2];
406 msdExErr[iDE]=(Double_t)fAlign->GetParError(3*iDE+0);
407 msdEyErr[iDE]=(Double_t)fAlign->GetParError(3*iDE+1);
408 msdEzErr[iDE]=(Double_t)fAlign->GetParError(3*iDE+3);
409 msdEpErr[iDE]=(Double_t)fAlign->GetParError(3*iDE+2);
410 fMSDEx->SetPoint(iDE,deId[iDE],fParameters[3*iDE+0]);
411 fMSDEx->SetPoint(iDE,deIdErr[iDE],(Double_t)fAlign->GetParError(3*iDE+0));
412 fMSDEy->SetPoint(iDE,deId[iDE],fParameters[3*iDE+1]);
413 fMSDEy->SetPoint(iDE,deIdErr[iDE],(Double_t)fAlign->GetParError(3*iDE+1));
414 fMSDEp->SetPoint(iDE,deId[iDE],fParameters[3*iDE+2]);
415 fMSDEp->SetPoint(iDE,deIdErr[iDE],(Double_t)fAlign->GetParError(3*iDE+2));
416 fMSDEz->SetPoint(iDE,deId[iDE],fParameters[3*iDE+3]);
417 fMSDEz->SetPoint(iDE,deIdErr[iDE],(Double_t)fAlign->GetParError(3*iDE+3));
4d610fd5 418 }
419
420 // Post final data. Write histo list to a file with option "RECREATE"
421 PostData(0,fList);
422
4d610fd5 423 // Re Align
424 AliMUONGeometryTransformer *newTransform = fAlign->ReAlign(fTransform,fParameters,true);
425 newTransform->WriteTransformations("transform2ReAlign.dat");
426
427 // Generate realigned data in local cdb
428 const TClonesArray* array = newTransform->GetMisAlignmentData();
429
430 // 100 mum residual resolution for chamber misalignments?
431 fAlign->SetAlignmentResolution(array,-1,0.01,0.01,0.004,0.003);
432
433 // CDB manager
434 AliCDBManager* cdbManager = AliCDBManager::Instance();
cd8521dd 435 cdbManager->SetDefaultStorage(fDefaultOCDB.Data());
436 cdbManager->SetSpecificStorage("MUON/Align/Data",fMisAlignOCDB.Data());
4d610fd5 437
438 AliCDBMetaData* cdbData = new AliCDBMetaData();
439 cdbData->SetResponsible("Dimuon Offline project");
440 cdbData->SetComment("MUON alignment objects with residual misalignment");
441 AliCDBId id("MUON/Align/Data", 0, AliCDBRunRange::Infinity());
442 cdbManager->Put(const_cast<TClonesArray*>(array), id, cdbData);
443
444}
445
2df5c2cf 446//________________________________________________________________________
447void AliMUONAlignmentTask::Terminate(const Option_t*)
448{
449 /// Called once per task on the client machine at the end of the analysis.
450
451}
452
cd8521dd 453//-----------------------------------------------------------------------
454void AliMUONAlignmentTask::Prepare(const char* geoFilename, const char* defaultOCDB, const char* misAlignOCDB)
455{
456 /// Set the geometry, the magnetic field, the mapping and the reconstruction parameters
2df5c2cf 457
cd8521dd 458 // Load mapping
459 AliCDBManager* man = AliCDBManager::Instance();
460 man->SetDefaultStorage(defaultOCDB);
461 man->SetSpecificStorage("MUON/Align/Data",misAlignOCDB);
462 man->Print();
2df5c2cf 463 man->SetRun(fLastRunNumber);
cd8521dd 464 if ( ! AliMpCDB::LoadDDLStore() ) {
2df5c2cf 465 Error("MUONRefit","Could not access mapping from OCDB !");
cd8521dd 466 exit(-1);
467 }
468
2df5c2cf 469 // Import TGeo geometry (needed by AliMUONTrackExtrap::ExtrapToVertex)
470 if (!gGeoManager) {
471 AliGeomManager::LoadGeometry(geoFilename);
472 if (!gGeoManager) {
473 Error("AliMUONReAlignTask", "getting geometry from file %s failed", "generated/galice.root");
474 return;
475 }
476 }
477
cd8521dd 478 // set mag field
479 if (!TGeoGlobalMagField::Instance()->GetField()) {
480 printf("Loading field map...\n");
481 AliGRPManager *grpMan = new AliGRPManager();
482 grpMan->ReadGRPEntry();
483 grpMan->SetMagField();
484 delete grpMan;
485 }
486 // set the magnetic field for track extrapolations
487 AliMUONTrackExtrap::SetField();
488
489}