24 #include <TMultiGraph.h>
25 #include <TGraphErrors.h>
28 #include <Riostream.h>
30 #include <TGeoManager.h>
32 #include <TObjString.h>
36 #include "AliESDEvent.h"
37 #include "AliESDMuonTrack.h"
38 #include "AliCDBManager.h"
39 #include "AliCDBStorage.h"
40 #include "AliGeomManager.h"
41 #include "AliVVertex.h"
44 #include "AliAnalysisDataSlot.h"
45 #include "AliAnalysisManager.h"
46 #include "AliInputEventHandler.h"
48 #include "AliMultSelection.h"
51 #include "AliMUONCDB.h"
52 #include "AliMUONConstants.h"
53 #include "AliMUONRecoParam.h"
54 #include "AliMUONESDInterface.h"
55 #include "AliMUONVTrackReconstructor.h"
56 #include "AliMUONTrack.h"
57 #include "AliMUONTrackParam.h"
58 #include "AliMUONTrackExtrap.h"
59 #include "AliMUONVCluster.h"
60 #include "AliMUONVDigit.h"
61 #include "AliMUONGeometryTransformer.h"
62 #include "AliMUONGeometryModuleTransformer.h"
63 #include "AliMUONGeometryDetElement.h"
64 #include "AliMpDEIterator.h"
65 #include "AliMpSegmentation.h"
66 #include "AliMpVSegmentation.h"
67 #include "AliMpConstants.h"
68 #include "AliMpDDLStore.h"
70 #include "AliMpDetElement.h"
71 #include "AliMpCathodType.h"
74 #define SafeDelete(x) if (x != NULL) { delete x; x = NULL; }
90 fResidualsVsCent(NULL),
91 fResidualsVsAngle(NULL),
99 fShowProgressBar(kFALSE),
100 fPrintClResPerCh(kFALSE),
101 fPrintClResPerDE(kFALSE),
106 fCorrectForSystematics(kTRUE),
107 fRemoveMonoCathCl(kFALSE),
108 fCheckAllPads(kFALSE),
109 fImproveTracks(kFALSE),
110 fShiftHalfCh(kFALSE),
111 fPrintHalfChShift(kFALSE),
113 fPrintDEShift(kFALSE),
117 fOldAlignStorage(""),
118 fOldAlignVersion(-1),
119 fOldAlignSubVersion(-1),
120 fNewAlignStorage(""),
121 fNewAlignVersion(-1),
122 fNewAlignSubVersion(-1),
123 fOldGeoTransformer(NULL),
124 fNewGeoTransformer(NULL),
130 for (Int_t i = 0; i < 10; i++) SetStartingResolution(i, -1., -1.);
131 for (Int_t i = 0; i < 1100; i++) fDEIndices[i] = 0;
132 for (Int_t i = 0; i < 200; i++) fDEIds[i] = 0;
133 for (Int_t i = 0; i < 20; i++) SetHalfChShift(i, 0., 0.);
134 for (Int_t i = 0; i < 200; i++) SetDEShift(i, 0., 0.);
140 AliAnalysisTaskSE(name),
143 fResidualsVsCent(NULL),
144 fResidualsVsAngle(NULL),
150 fDefaultStorage(
"raw://"),
152 fShowProgressBar(kFALSE),
153 fPrintClResPerCh(kFALSE),
154 fPrintClResPerDE(kFALSE),
159 fCorrectForSystematics(kTRUE),
160 fRemoveMonoCathCl(kFALSE),
161 fCheckAllPads(kFALSE),
162 fImproveTracks(kFALSE),
163 fShiftHalfCh(kFALSE),
164 fPrintHalfChShift(kFALSE),
166 fPrintDEShift(kFALSE),
170 fOldAlignStorage(
""),
171 fOldAlignVersion(-1),
172 fOldAlignSubVersion(-1),
173 fNewAlignStorage(
""),
174 fNewAlignVersion(-1),
175 fNewAlignSubVersion(-1),
176 fOldGeoTransformer(NULL),
177 fNewGeoTransformer(NULL),
184 for (Int_t i = 0; i < 1100; i++)
fDEIndices[i] = 0;
185 for (Int_t i = 0; i < 200; i++)
fDEIds[i] = 0;
187 for (Int_t i = 0; i < 200; i++)
SetDEShift(i, 0., 0.);
192 DefineOutput(1,TObjArray::Class());
194 DefineOutput(2,TObjArray::Class());
196 DefineOutput(3,TObjArray::Class());
198 DefineOutput(4,TObjArray::Class());
200 DefineOutput(5,TObjArray::Class());
202 DefineOutput(6,TObjArray::Class());
204 DefineOutput(7,TObjArray::Class());
211 if (!AliAnalysisManager::GetAnalysisManager()->IsProofMode()) {
250 const AliMUONRecoParam* recoParam = AliMUONESDInterface::GetTracker()->GetRecoParam();
251 Double_t maxSigma[2] = {-1., -1.};
252 for (Int_t i = 0; i < 10; i++) {
253 if (recoParam->GetDefaultNonBendingReso(i) > maxSigma[0]) maxSigma[0] = recoParam->GetDefaultNonBendingReso(i);
254 if (recoParam->GetDefaultBendingReso(i) > maxSigma[1]) maxSigma[1] = recoParam->GetDefaultBendingReso(i);
256 const char* axes[2] = {
"X",
"Y"};
257 const char* side[2] = {
"I",
"O"};
258 const Int_t nBins = 5000;
259 const Int_t nSigma = 10;
260 const Int_t pNBins = 20;
261 const Double_t pEdges[2] = {0., 50.};
262 Int_t nCentBins = 12;
263 Double_t centRange[2] = {-10., 110.};
264 Int_t nAngleBins = 20;
265 Double_t angleRange[2][2] = {{-15., 15.}, {-40., 40.}};
268 for (Int_t ia = 0; ia < 2; ia++) {
270 Double_t maxRes = nSigma*maxSigma[ia];
273 name = Form(
"hResidual%sPerCh_ClusterIn",axes[ia]); title = Form(
"cluster-track residual-%s distribution per chamber (cluster attached to the track);chamber ID;#Delta_{%s} (cm)",axes[ia],axes[ia]);
274 h2 =
new TH2F(name.Data(), title.Data(), 10, 0.5, 10.5, nBins, -maxRes, maxRes);
276 name = Form(
"hResidual%sPerCh_ClusterOut",axes[ia]); title = Form(
"cluster-track residual-%s distribution per chamber (cluster not attached to the track);chamber ID;#Delta_{%s} (cm)",axes[ia],axes[ia]);
277 h2 =
new TH2F(name.Data(), title.Data(), 10, 0.5, 10.5, nBins, -2.*maxRes, 2.*maxRes);
280 name = Form(
"hResidual%sPerHalfCh_ClusterIn",axes[ia]); title = Form(
"cluster-track residual-%s distribution per half chamber (cluster attached to the track);half chamber ID;#Delta_{%s} (cm)",axes[ia],axes[ia]);
281 h2 =
new TH2F(name.Data(), title.Data(), 20, 0.5, 20.5, nBins, -maxRes, maxRes);
282 for (Int_t i = 0; i < 10; i++) { h2->GetXaxis()->SetBinLabel(2*i+1, Form(
"%d-I",i+1)); h2->GetXaxis()->SetBinLabel(2*i+2, Form(
"%d-O",i+1)); }
284 name = Form(
"hResidual%sPerHalfCh_ClusterOut",axes[ia]); title = Form(
"cluster-track residual-%s distribution per half chamber (cluster not attached to the track);half chamber ID;#Delta_{%s} (cm)",axes[ia],axes[ia]);
285 h2 =
new TH2F(name.Data(), title.Data(), 20, 0.5, 20.5, nBins, -2.*maxRes, 2.*maxRes);
286 for (Int_t i = 0; i < 10; i++) { h2->GetXaxis()->SetBinLabel(2*i+1, Form(
"%d-I",i+1)); h2->GetXaxis()->SetBinLabel(2*i+2, Form(
"%d-O",i+1)); }
289 name = Form(
"hResidual%sPerDE_ClusterIn",axes[ia]); title = Form(
"cluster-track residual-%s distribution per DE (cluster attached to the track);DE ID;#Delta_{%s} (cm)",axes[ia],axes[ia]);
290 h2 =
new TH2F(name.Data(), title.Data(),
fNDE, 0.5,
fNDE+0.5, nBins, -maxRes, maxRes);
291 for (Int_t i = 1; i <=
fNDE; i++) h2->GetXaxis()->SetBinLabel(i, Form(
"%d",
fDEIds[i]));
293 name = Form(
"hResidual%sPerDE_ClusterOut",axes[ia]); title = Form(
"cluster-track residual-%s distribution per DE (cluster not attached to the track);DE ID;#Delta_{%s} (cm)",axes[ia],axes[ia]);
294 h2 =
new TH2F(name.Data(), title.Data(),
fNDE, 0.5,
fNDE+0.5, nBins, -2.*maxRes, 2.*maxRes);
295 for (Int_t i = 1; i <=
fNDE; i++) h2->GetXaxis()->SetBinLabel(i, Form(
"%d",
fDEIds[i]));
298 name = Form(
"hTrackRes%sPerCh",axes[ia]); title = Form(
"track #sigma_{%s} per Ch;chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]);
299 h2 =
new TH2F(name.Data(), title.Data(), 10, 0.5, 10.5, nBins, 0., maxRes);
301 name = Form(
"hTrackRes%sPerHalfCh",axes[ia]); title = Form(
"track #sigma_{%s} per half Ch;half chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]);
302 h2 =
new TH2F(name.Data(), title.Data(), 20, 0.5, 20.5, nBins, 0., maxRes);
303 for (Int_t i = 0; i < 10; i++) { h2->GetXaxis()->SetBinLabel(2*i+1, Form(
"%d-I",i+1)); h2->GetXaxis()->SetBinLabel(2*i+2, Form(
"%d-O",i+1)); }
305 name = Form(
"hTrackRes%sPerDE",axes[ia]); title = Form(
"track #sigma_{%s} per DE;DE ID;#sigma_{%s} (cm)",axes[ia],axes[ia]);
306 h2 =
new TH2F(name.Data(), title.Data(),
fNDE, 0.5,
fNDE+0.5, nBins, 0., maxRes);
307 for (Int_t i = 1; i <=
fNDE; i++) h2->GetXaxis()->SetBinLabel(i, Form(
"%d",
fDEIds[i]));
310 name = Form(
"hMCS%sPerCh",axes[ia]); title = Form(
"MCS %s-dispersion of extrapolated track per Ch;chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]);
311 h2 =
new TH2F(name.Data(), title.Data(), 10, 0.5, 10.5, nBins, 0., 0.2);
313 name = Form(
"hMCS%sPerHalfCh",axes[ia]); title = Form(
"MCS %s-dispersion of extrapolated track per half Ch;half chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]);
314 h2 =
new TH2F(name.Data(), title.Data(), 20, 0.5, 20.5, nBins, 0., 0.2);
315 for (Int_t i = 0; i < 10; i++) { h2->GetXaxis()->SetBinLabel(2*i+1, Form(
"%d-I",i+1)); h2->GetXaxis()->SetBinLabel(2*i+2, Form(
"%d-O",i+1)); }
317 name = Form(
"hMCS%sPerDE",axes[ia]); title = Form(
"MCS %s-dispersion of extrapolated track per DE;DE ID;#sigma_{%s} (cm)",axes[ia],axes[ia]);
318 h2 =
new TH2F(name.Data(), title.Data(),
fNDE, 0.5,
fNDE+0.5, nBins, 0., 0.2);
319 for (Int_t i = 1; i <=
fNDE; i++) h2->GetXaxis()->SetBinLabel(i, Form(
"%d",
fDEIds[i]));
322 name = Form(
"hClusterRes2%sPerCh",axes[ia]); title = Form(
"cluster #sigma_{%s}^{2} per Ch;chamber ID;#sigma_{%s}^{2} (cm^{2})",axes[ia],axes[ia]);
323 h2 =
new TH2F(name.Data(), title.Data(), 10, 0.5, 10.5, nSigma*nBins, -0.1*maxRes*maxRes, maxRes*maxRes);
327 for (Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
328 name = Form(
"hResidual%sInCh%dVsP_ClusterIn",axes[ia],i+1); title = Form(
"cluster-track residual-%s distribution in chamber %d versus momentum (cluster attached to the track);p (GeV/c^{2});#Delta_{%s} (cm)",axes[ia],i+1,axes[ia]);
329 h2 =
new TH2F(name.Data(), title.Data(), pNBins, pEdges[0], pEdges[1], nBins, -maxRes, maxRes);
331 name = Form(
"hResidual%sInCh%dVsP_ClusterOut",axes[ia],i+1); title = Form(
"cluster-track residual-%s distribution in chamber %d versus momentum (cluster not attached to the track);p (GeV/c^{2});#Delta_{%s} (cm)",axes[ia],i+1,axes[ia]);
332 h2 =
new TH2F(name.Data(), title.Data(), pNBins, pEdges[0], pEdges[1], nBins, -2.*maxRes, 2.*maxRes);
335 name = Form(
"hResidual%sInCh%dVsCent_ClusterIn",axes[ia],i+1); title = Form(
"cluster-track residual-%s distribution in chamber %d versus centrality (cluster attached to the track);centrality (%%);#Delta_{%s} (cm)",axes[ia],i+1,axes[ia]);
336 h2 =
new TH2F(name.Data(), title.Data(), nCentBins, centRange[0], centRange[1], nBins, -maxRes, maxRes);
338 name = Form(
"hResidual%sInCh%dVsCent_ClusterOut",axes[ia],i+1); title = Form(
"cluster-track residual-%s distribution in chamber %d versus centrality (cluster not attached to the track);centrality (%%);#Delta_{%s} (cm)",axes[ia],i+1,axes[ia]);
339 h2 =
new TH2F(name.Data(), title.Data(), nCentBins, centRange[0], centRange[1], nBins, -2.*maxRes, 2.*maxRes);
342 name = Form(
"hResidual%sInCh%dVsAngle_ClusterIn",axes[ia],i+1); title = Form(
"cluster-track residual-%s distribution in chamber %d versus track angle (cluster attached to the track);%s-angle (deg);#Delta_{%s} (cm)",axes[ia],i+1,axes[ia],axes[ia]);
343 h2 =
new TH2F(name.Data(), title.Data(), nAngleBins, angleRange[ia][0], angleRange[ia][1], nBins, -maxRes, maxRes);
345 name = Form(
"hResidual%sInCh%dVsAngle_ClusterOut",axes[ia],i+1); title = Form(
"cluster-track residual-%s distribution in chamber %d versus track angle (cluster not attached to the track);%s-angle (deg);#Delta_{%s} (cm)",axes[ia],i+1,axes[ia],axes[ia]);
346 h2 =
new TH2F(name.Data(), title.Data(), nAngleBins, angleRange[ia][0], angleRange[ia][1], nBins, -2.*maxRes, 2.*maxRes);
349 for (Int_t j = 0; j < 2; j++) {
350 name = Form(
"hResidual%sInHalfCh%d%sVsAngle_ClusterIn",axes[ia],i+1,side[j]); title = Form(
"cluster-track residual-%s distribution in half-chamber %d-%s versus track angle (cluster attached to the track);%s-angle (deg);#Delta_{%s} (cm)",axes[ia],i+1,side[j],axes[ia],axes[ia]);
351 h2 =
new TH2F(name.Data(), title.Data(), nAngleBins, angleRange[ia][0], angleRange[ia][1], nBins, -maxRes, maxRes);
356 name = Form(
"hResidual%sVsP_ClusterIn",axes[ia]); title = Form(
"cluster-track residual-%s distribution integrated over chambers versus momentum (cluster attached to the track);p (GeV/c^{2});#Delta_{%s} (cm)",axes[ia],axes[ia]);
357 h2 =
new TH2F(name.Data(), title.Data(), pNBins, pEdges[0], pEdges[1], nBins, -maxRes, maxRes);
359 name = Form(
"hResidual%sVsP_ClusterOut",axes[ia]); title = Form(
"cluster-track residual-%s distribution integrated over chambers versus momentum (cluster not attached to the track);p (GeV/c^{2});#Delta_{%s} (cm)",axes[ia],axes[ia]);
360 h2 =
new TH2F(name.Data(), title.Data(), pNBins, pEdges[0], pEdges[1], nBins, -2.*maxRes, 2.*maxRes);
363 name = Form(
"hResidual%sVsCent_ClusterIn",axes[ia]); title = Form(
"cluster-track residual-%s distribution integrated over chambers versus centrality (cluster attached to the track);centrality (%%);#Delta_{%s} (cm)",axes[ia],axes[ia]);
364 h2 =
new TH2F(name.Data(), title.Data(), nCentBins, centRange[0], centRange[1], nBins, -maxRes, maxRes);
366 name = Form(
"hResidual%sVsCent_ClusterOut",axes[ia]); title = Form(
"cluster-track residual-%s distribution integrated over chambers versus centrality (cluster not attached to the track);centrality (%%);#Delta_{%s} (cm)",axes[ia],axes[ia]);
367 h2 =
new TH2F(name.Data(), title.Data(), nCentBins, centRange[0], centRange[1], nBins, -2.*maxRes, 2.*maxRes);
370 name = Form(
"hResidual%sVsAngle_ClusterIn",axes[ia]); title = Form(
"cluster-track residual-%s distribution integrated over chambers versus track angle (cluster attached to the track);%s-angle (deg);#Delta_{%s} (cm)",axes[ia],axes[ia],axes[ia]);
371 h2 =
new TH2F(name.Data(), title.Data(), nAngleBins, angleRange[ia][0], angleRange[ia][1], nBins, -maxRes, maxRes);
373 name = Form(
"hResidual%sVsAngle_ClusterOut",axes[ia]); title = Form(
"cluster-track residual-%s distribution integrated over chambers versus track angle (cluster not attached to the track);%s-angle (deg);#Delta_{%s} (cm)",axes[ia],axes[ia],axes[ia]);
374 h2 =
new TH2F(name.Data(), title.Data(), nAngleBins, angleRange[ia][0], angleRange[ia][1], nBins, -2.*maxRes, 2.*maxRes);
378 name = Form(
"hLocalChi2%sPerCh",axes[ia]); title = Form(
"local chi2-%s distribution per chamber;chamber ID;local #chi^{2}_{%s}", axes[ia], axes[ia]);
379 h2 =
new TH2F(name.Data(), title.Data(), 10, 0.5, 10.5, 1000, 0., 25.);
381 name = Form(
"hLocalChi2%sPerDE",axes[ia]); title = Form(
"local chi2-%s distribution per DE;DE ID;local #chi^{2}_{%s}", axes[ia], axes[ia]);
382 h2 =
new TH2F(name.Data(), title.Data(),
fNDE, 0.5,
fNDE+0.5, 1000, 0., 25.);
383 for (Int_t i = 1; i <=
fNDE; i++) h2->GetXaxis()->SetBinLabel(i, Form(
"%d",
fDEIds[i]));
387 name = Form(
"hUncorrSlope%sRes",axes[ia]); title = Form(
"muon slope_{%s} reconstructed resolution at first cluster vs p;p (GeV/c); #sigma_{slope_{%s}}", axes[ia], axes[ia]);
388 h2 =
new TH2F(name.Data(), title.Data(), 300, 0., 300., 1000, 0., 0.003);
390 name = Form(
"hSlope%sRes",axes[ia]); title = Form(
"muon slope_{%s} reconstructed resolution at vertex vs p;p (GeV/c); #sigma_{slope_{%s}}", axes[ia], axes[ia]);
391 h2 =
new TH2F(name.Data(), title.Data(), 300, 0., 300., 1000, 0., 0.02);
396 h2 =
new TH2F(
"hLocalChi2PerCh",
"local chi2 (~0.5*(#chi^{2}_{X}+#chi^{2}_{Y})) distribution per chamber;chamber ID;local #chi^{2}", 10, 0.5, 10.5, 1000, 0., 25.);
398 h2 =
new TH2F(
"hLocalChi2PerDE",
"local chi2 (~0.5*(#chi^{2}_{X}+#chi^{2}_{Y})) distribution per chamber;DE ID;local #chi^{2}",
fNDE, 0.5,
fNDE+0.5, 1000, 0., 25.);
399 for (Int_t i = 1; i <=
fNDE; i++) h2->GetXaxis()->SetBinLabel(i, Form(
"%d",
fDEIds[i]));
403 h2 =
new TH2F(
"hUncorrPRes",
"muon momentum reconstructed resolution at first cluster vs p;p (GeV/c); #sigma_{p}/p (%)", 300, 0., 300., 1000, 0., 10.);
405 h2 =
new TH2F(
"hPRes",
"muon momentum reconstructed resolution at vertex vs p;p (GeV/c); #sigma_{p}/p (%)", 300, 0., 300., 1000, 0., 10.);
407 h2 =
new TH2F(
"hUncorrPtRes",
"muon transverse momentum reconstructed resolution at first cluster vs p_{t};p_{t} (GeV/c); #sigma_{p_{t}}/p_{t} (%)", 300, 0., 30., 300, 0., 30.);
409 h2 =
new TH2F(
"hPtRes",
"muon transverse momentum reconstructed resolution at vertex vs p_{t};p_{t} (GeV/c); #sigma_{p_{t}}/p_{t} (%)", 300, 0., 30., 300, 0., 30.);
426 if (!
fOCDBLoaded) AliFatal(
"Problem occur while loading OCDB objects");
428 AliESDEvent* esd =
dynamic_cast<AliESDEvent*
>(InputEvent());
437 AliMultSelection *multSelection =
static_cast<AliMultSelection*
>(esd->FindListObject(
"MultSelection"));
438 Float_t
centrality = multSelection ? multSelection->GetMultiplicityPercentile(
"V0M") : -1.;
441 AliMUONVTrackReconstructor* tracker = AliMUONESDInterface::GetTracker();
444 Int_t nTracks = (Int_t) esd->GetNumberOfMuonTracks();
445 for (Int_t iTrack = 0; iTrack < nTracks; ++iTrack) {
448 AliESDMuonTrack* esdTrack = esd->GetMuonTrack(iTrack);
451 if (!esdTrack->ContainTrackerData())
continue;
464 AliMUONESDInterface::ESDToMUON(*esdTrack, track, kFALSE);
473 AliMUONTrack referenceTrack(track);
476 AliMUONTrackParam trackParamAtFirstCluster(*(static_cast<AliMUONTrackParam*>(track.GetTrackParamAtCluster()->First())));
477 Int_t firstCh = trackParamAtFirstCluster.GetClusterPtr()->GetChamberId();
478 AliMUONTrackExtrap::AddMCSEffect(&trackParamAtFirstCluster, AliMUONConstants::ChamberThicknessInX0(firstCh)/2., -1.);
481 Double_t pXUncorr = trackParamAtFirstCluster.Px();
482 Double_t pYUncorr = trackParamAtFirstCluster.Py();
483 Double_t pZUncorr = trackParamAtFirstCluster.Pz();
484 Double_t pUncorr = trackParamAtFirstCluster.P();
485 TMatrixD covUncorr(5,5);
486 Cov2CovP(trackParamAtFirstCluster,covUncorr);
487 Double_t sigmaPUncorr = TMath::Sqrt(pXUncorr * (pXUncorr*covUncorr(2,2) + pYUncorr*covUncorr(2,3) + pZUncorr*covUncorr(2,4)) +
488 pYUncorr * (pXUncorr*covUncorr(3,2) + pYUncorr*covUncorr(3,3) + pZUncorr*covUncorr(3,4)) +
489 pZUncorr * (pXUncorr*covUncorr(4,2) + pYUncorr*covUncorr(4,3) + pZUncorr*covUncorr(4,4))) / pUncorr;
493 Double_t ptUncorr = TMath::Sqrt(pXUncorr*pXUncorr + pYUncorr*pYUncorr);
494 Double_t sigmaPtUncorr = TMath::Sqrt(pXUncorr * (pXUncorr*covUncorr(2,2) + pYUncorr*covUncorr(2,3)) + pYUncorr * (pXUncorr*covUncorr(3,2) + pYUncorr*covUncorr(3,3))) / ptUncorr;
498 ((TH2F*)
fTrackRes->UncheckedAt(
kUncorrSlopeRes))->Fill(pUncorr,TMath::Sqrt(trackParamAtFirstCluster.GetCovariances()(1,1)));
499 ((TH2F*)
fTrackRes->UncheckedAt(
kUncorrSlopeRes+1))->Fill(pUncorr,TMath::Sqrt(trackParamAtFirstCluster.GetCovariances()(3,3)));
502 AliMUONTrackParam trackParamAtVtx(trackParamAtFirstCluster);
503 AliMUONTrackExtrap::ExtrapToVertex(&trackParamAtVtx, esdTrack->GetNonBendingCoor(), esdTrack->GetBendingCoor(), esdTrack->GetZ(), 0., 0.);
504 Double_t pXVtx = trackParamAtVtx.Px();
505 Double_t pYVtx = trackParamAtVtx.Py();
506 Double_t pZVtx = trackParamAtVtx.Pz();
507 Double_t pVtx = trackParamAtVtx.P();
508 TMatrixD covVtx(5,5);
510 Double_t sigmaPVtx = TMath::Sqrt(pXVtx * (pXVtx*covVtx(2,2) + pYVtx*covVtx(2,3) + pZVtx*covVtx(2,4)) +
511 pYVtx * (pXVtx*covVtx(3,2) + pYVtx*covVtx(3,3) + pZVtx*covVtx(3,4)) +
512 pZVtx * (pXVtx*covVtx(4,2) + pYVtx*covVtx(4,3) + pZVtx*covVtx(4,4))) / pVtx;
513 ((TH2F*)
fTrackRes->UncheckedAt(
kPRes))->Fill(pVtx,100.*sigmaPVtx/pVtx);
516 Double_t ptVtx = TMath::Sqrt(pXVtx*pXVtx + pYVtx*pYVtx);
517 Double_t sigmaPtVtx = TMath::Sqrt(pXVtx * (pXVtx*covVtx(2,2) + pYVtx*covVtx(2,3)) + pYVtx * (pXVtx*covVtx(3,2) + pYVtx*covVtx(3,3))) / ptVtx;
518 ((TH2F*)
fTrackRes->UncheckedAt(
kPtRes))->Fill(ptVtx,100.*sigmaPtVtx/ptVtx);
521 ((TH2F*)
fTrackRes->UncheckedAt(
kSlopeRes))->Fill(pVtx,TMath::Sqrt(trackParamAtVtx.GetCovariances()(1,1)));
522 ((TH2F*)
fTrackRes->UncheckedAt(
kSlopeRes+1))->Fill(pVtx,TMath::Sqrt(trackParamAtVtx.GetCovariances()(3,3)));
528 Double_t pXUncorr0 = esdTrack->PxUncorrected();
529 Double_t pYUncorr0 = esdTrack->PyUncorrected();
530 if (TMath::Sqrt(pXUncorr0*pXUncorr0+pYUncorr0*pYUncorr0) <
fMinPt)
continue;
533 Int_t nClusters = track.GetNClusters();
534 for (Int_t iCluster=0; iCluster<nClusters; iCluster++) {
537 AliMUONTrackParam* trackParam =
static_cast<AliMUONTrackParam*
>(track.GetTrackParamAtCluster()->UncheckedAt(iCluster));
538 AliMUONTrackParam* previousTrackParam =
static_cast<AliMUONTrackParam*
>(track.GetTrackParamAtCluster()->Before(trackParam));
539 AliMUONTrackParam* nextTrackParam =
static_cast<AliMUONTrackParam*
>(track.GetTrackParamAtCluster()->After(trackParam));
540 if (!previousTrackParam && !nextTrackParam) {
541 AliError(Form(
"unable to find a cluster neither before nor after the one at position %d !?!", iCluster));
542 track.RecursiveDump();
548 Bool_t hasBending, hasNonBending;
550 else CheckPadsBelow(trackParam->GetClusterPtr(), hasBending, hasNonBending);
551 if (!hasBending || !hasNonBending)
continue;
555 AliMUONTrackParam currentTrackParam(*trackParam);
556 track.RemoveTrackParamAtCluster(trackParam);
559 AliMUONVCluster* cluster = currentTrackParam.GetClusterPtr();
560 Int_t chId = cluster->GetChamberId();
561 Int_t halfChId = (cluster->GetX() > 0) ? 2*chId : 2*chId+1;
562 Int_t deId = cluster->GetDetElemId();
565 AliMUONTrackParam* referenceTrackParam =
static_cast<AliMUONTrackParam*
>(referenceTrack.GetTrackParamAtCluster()->UncheckedAt(iCluster));
566 Double_t deltaX = cluster->GetX() - referenceTrackParam->GetNonBendingCoor();
567 Double_t deltaY = cluster->GetY() - referenceTrackParam->GetBendingCoor();
570 Double_t angleX = TMath::ATan(referenceTrackParam->GetNonBendingSlope())*TMath::RadToDeg();
571 Double_t angleY = TMath::ATan(referenceTrackParam->GetBendingSlope())*TMath::RadToDeg();
574 Double_t sigmaDeltaX2 = cluster->GetErrX2() - referenceTrackParam->GetCovariances()(0,0);
575 Double_t sigmaDeltaY2 = cluster->GetErrY2() - referenceTrackParam->GetCovariances()(2,2);
576 Double_t localChi2X = (sigmaDeltaX2 > 0.) ? deltaX*deltaX/sigmaDeltaX2 : 0.;
577 Double_t localChi2Y = (sigmaDeltaY2 > 0.) ? deltaY*deltaY/sigmaDeltaY2 : 0.;
578 Double_t localChi2 = 0.5 * referenceTrackParam->GetLocalChi2();
589 Bool_t refit = track.IsValid( 1 << (chId/2) );
593 if (tracker->RefitTrack(track, kFALSE)) {
618 Double_t dZWithPrevious = (previousTrackParam) ? TMath::Abs(previousTrackParam->GetClusterPtr()->GetZ() - cluster->GetZ()) : FLT_MAX;
619 Int_t previousChId = (previousTrackParam) ? previousTrackParam->GetClusterPtr()->GetChamberId() : -1;
620 Double_t dZWithNext = (nextTrackParam) ? TMath::Abs(nextTrackParam->GetClusterPtr()->GetZ() - cluster->GetZ()) : FLT_MAX;
621 AliMUONTrackParam* startingTrackParam = (nextTrackParam) ? nextTrackParam : previousTrackParam;
622 if ((
fExtrapMode == 0 && previousTrackParam && dZWithPrevious < dZWithNext) ||
623 (
fExtrapMode == 1 && previousTrackParam && !(chId/2 == 2 && previousChId/2 == 1) &&
624 !(chId/2 == 3 && previousChId/2 == 2))) startingTrackParam = previousTrackParam;
627 currentTrackParam.SetParameters(startingTrackParam->GetParameters());
628 currentTrackParam.SetZ(startingTrackParam->GetZ());
629 currentTrackParam.SetCovariances(startingTrackParam->GetCovariances());
630 currentTrackParam.ResetPropagator();
633 if (AliMUONTrackExtrap::ExtrapToZCov(¤tTrackParam, currentTrackParam.GetClusterPtr()->GetZ(), kTRUE)) {
636 TMatrixD mcsCov(5,5);
637 if (startingTrackParam == nextTrackParam && chId == 0) {
638 AliMUONTrackParam trackParamForMCS;
639 trackParamForMCS.SetParameters(nextTrackParam->GetParameters());
640 AliMUONTrackExtrap::AddMCSEffect(&trackParamForMCS,AliMUONConstants::ChamberThicknessInX0(nextTrackParam->GetClusterPtr()->GetChamberId()),-1.);
641 const TMatrixD &propagator = currentTrackParam.GetPropagator();
642 TMatrixD tmp(trackParamForMCS.GetCovariances(),TMatrixD::kMultTranspose,propagator);
643 mcsCov.Mult(propagator,tmp);
644 }
else mcsCov.Zero();
647 Double_t trackResX2 = currentTrackParam.GetCovariances()(0,0) + mcsCov(0,0);
648 Double_t trackResY2 = currentTrackParam.GetCovariances()(2,2) + mcsCov(2,2);
649 deltaX = cluster->GetX() - currentTrackParam.GetNonBendingCoor();
650 deltaY = cluster->GetY() - currentTrackParam.GetBendingCoor();
692 track.AddTrackParamAtCluster(currentTrackParam, *(currentTrackParam.GetClusterPtr()), kTRUE);
715 AliCDBManager* cdbm = AliCDBManager::Instance();
729 AliCDBManager* cdbm = AliCDBManager::Instance();
730 cdbm->SetRun(fCurrentRunNumber);
732 if (!AliMUONCDB::LoadField())
return;
734 if (!AliMUONCDB::LoadMapping())
return;
736 AliMUONRecoParam* recoParam = AliMUONCDB::LoadRecoParam();
737 if (!recoParam)
return;
740 else recoParam->ImproveTracks(kFALSE);
742 AliMUONESDInterface::ResetTracker(recoParam);
744 for (Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
753 while (!it.IsDone()) {
763 TString defaultStorage(cdbm->GetDefaultStorage()->GetType());
764 if (defaultStorage ==
"alien") defaultStorage += Form(
"://folder=%s", cdbm->GetDefaultStorage()->GetBaseFolder().Data());
765 else defaultStorage += Form(
"://%s", cdbm->GetDefaultStorage()->GetBaseFolder().Data());
770 if (cdbm->GetEntryCache()->Contains(
"GRP/Geometry/Data")) cdbm->UnloadFromCache(
"GRP/Geometry/Data");
771 if (cdbm->GetEntryCache()->Contains(
"MUON/Align/Data")) cdbm->UnloadFromCache(
"MUON/Align/Data");
772 if (AliGeomManager::GetGeometry()) AliGeomManager::GetGeometry()->UnlockGeometry();
775 AliGeomManager::LoadGeometry();
776 if (!AliGeomManager::GetGeometry())
return;
779 AliGeomManager::ApplyAlignObjsFromCDB(
"MUON");
787 if (cdbm->GetEntryCache()->Contains(
"GRP/Geometry/Data")) cdbm->UnloadFromCache(
"GRP/Geometry/Data");
788 if (cdbm->GetEntryCache()->Contains(
"MUON/Align/Data")) cdbm->UnloadFromCache(
"MUON/Align/Data");
789 if (AliGeomManager::GetGeometry()) AliGeomManager::GetGeometry()->UnlockGeometry();
792 AliGeomManager::LoadGeometry();
793 if (!AliGeomManager::GetGeometry())
return;
796 AliGeomManager::ApplyAlignObjsFromCDB(
"MUON");
803 printf(
"\nstarting chamber resolution:\n");
804 printf(
" - non-bending:");
805 for (Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) printf((i==0)?
" %5.3f":
", %5.3f",
fClusterResNB[i]);
806 printf(
"\n - bending:");
807 for (Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) printf((i==0)?
" %6.4f":
", %6.4f",
fClusterResB[i]);
831 fResiduals =
static_cast<TObjArray*
> (GetOutputData(1));
835 fTrackRes =
static_cast<TObjArray*
> (GetOutputData(5));
851 const char* axes[2] = {
"X",
"Y"};
852 const char* side[2] = {
"I",
"O"};
853 Double_t newClusterRes[2][10], newClusterResErr[2][10];
857 for (Int_t ia = 0; ia < 2; ia++) {
860 g =
new TGraphErrors(AliMUONConstants::NTrackingCh());
861 g->SetName(Form(
"gResidual%sPerChMean_ClusterIn",axes[ia]));
862 g->SetTitle(Form(
"cluster-track residual-%s per Ch: mean (cluster in);chamber ID;<#Delta_{%s}> (cm)",axes[ia],axes[ia]));
863 g->SetMarkerStyle(kFullDotLarge);
865 g =
new TGraphErrors(AliMUONConstants::NTrackingCh());
866 g->SetName(Form(
"gResidual%sPerChMean_ClusterOut",axes[ia]));
867 g->SetTitle(Form(
"cluster-track residual-%s per Ch: mean (cluster out);chamber ID;<#Delta_{%s}> (cm)",axes[ia],axes[ia]));
868 g->SetMarkerStyle(kFullDotLarge);
872 g =
new TGraphErrors(2*AliMUONConstants::NTrackingCh());
873 g->SetName(Form(
"gResidual%sPerHalfChMean_ClusterIn",axes[ia]));
874 g->SetTitle(Form(
"cluster-track residual-%s per half Ch: mean (cluster in);half chamber ID;<#Delta_{%s}> (cm)",axes[ia],axes[ia]));
875 g->SetMarkerStyle(kFullDotLarge);
877 g =
new TGraphErrors(2*AliMUONConstants::NTrackingCh());
878 g->SetName(Form(
"gResidual%sPerHalfChMean_ClusterOut",axes[ia]));
879 g->SetTitle(Form(
"cluster-track residual-%s per half Ch: mean (cluster out);half chamber ID;<#Delta_{%s}> (cm)",axes[ia],axes[ia]));
880 g->SetMarkerStyle(kFullDotLarge);
884 g =
new TGraphErrors(
fNDE);
885 g->SetName(Form(
"gResidual%sPerDEMean_ClusterIn",axes[ia]));
886 g->SetTitle(Form(
"cluster-track residual-%s per DE: mean (cluster in);DE ID;<#Delta_{%s}> (cm)",axes[ia],axes[ia]));
887 g->SetMarkerStyle(kFullDotLarge);
889 g =
new TGraphErrors(
fNDE);
890 g->SetName(Form(
"gResidual%sPerDEMean_ClusterOut",axes[ia]));
891 g->SetTitle(Form(
"cluster-track residual-%s per DE: mean (cluster out);DE ID;<#Delta_{%s}> (cm)",axes[ia],axes[ia]));
892 g->SetMarkerStyle(kFullDotLarge);
896 g =
new TGraphErrors(AliMUONConstants::NTrackingCh());
897 g->SetName(Form(
"gResidual%sPerChSigma_ClusterIn",axes[ia]));
898 g->SetTitle(Form(
"cluster-track residual-%s per Ch: sigma (cluster in);chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
899 g->SetMarkerStyle(kFullDotLarge);
901 g =
new TGraphErrors(AliMUONConstants::NTrackingCh());
902 g->SetName(Form(
"gResidual%sPerChSigma_ClusterOut",axes[ia]));
903 g->SetTitle(Form(
"cluster-track residual-%s per Ch: sigma (cluster out);chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
904 g->SetMarkerStyle(kFullDotLarge);
907 g =
new TGraphErrors(AliMUONConstants::NTrackingCh());
908 g->SetName(Form(
"gResidual%sPerChDispersion_ClusterOut",axes[ia]));
909 g->SetTitle(Form(
"cluster-track residual-%s per Ch: dispersion (cluster out);chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
910 g->SetMarkerStyle(kFullDotLarge);
913 g =
new TGraphErrors(AliMUONConstants::NTrackingCh());
914 g->SetName(Form(
"gCombinedResidual%sPerChSigma",axes[ia]));
915 g->SetTitle(Form(
"combined cluster-track residual-%s per Ch: sigma;chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
916 g->SetMarkerStyle(kFullDotLarge);
920 g =
new TGraphErrors(2*AliMUONConstants::NTrackingCh());
921 g->SetName(Form(
"gCombinedResidual%sPerHalfChSigma",axes[ia]));
922 g->SetTitle(Form(
"combined cluster-track residual-%s per half Ch: sigma;half chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
923 g->SetMarkerStyle(kFullDotLarge);
927 g =
new TGraphErrors(
fNDE);
928 g->SetName(Form(
"gCombinedResidual%sPerDESigma",axes[ia]));
929 g->SetTitle(Form(
"combined cluster-track residual-%s per DE: sigma;DE ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
930 g->SetMarkerStyle(kFullDotLarge);
934 name = Form(
"mgResidual%sMeanVsP_ClusterIn",axes[ia]); title = Form(
"cluster-track residual-%s per chamber versus momentum: mean (cluster in);p (GeV/c^{2});<#Delta_{%s}> (cm)",axes[ia],axes[ia]);
935 mg =
new TMultiGraph(name.Data(), title.Data());
936 for (Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
938 g->SetName(Form(
"gShift%sVsP_ch%d",axes[ia],i+1));
939 g->SetMarkerStyle(kFullDotMedium);
940 g->SetMarkerColor(i+1+i/9);
946 name = Form(
"mgCombinedResidual%sSigmaVsP",axes[ia]); title = Form(
"cluster %s-resolution per chamber versus momentum;p (GeV/c^{2});#sigma_{%s} (cm)",axes[ia],axes[ia]);
947 mg =
new TMultiGraph(name.Data(), title.Data());
948 for (Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
950 g->SetName(Form(
"gRes%sVsP_ch%d",axes[ia],i+1));
951 g->SetMarkerStyle(kFullDotMedium);
952 g->SetMarkerColor(i+1+i/9);
958 g->SetName(Form(
"gCombinedResidual%sSigmaVsP",axes[ia]));
959 g->SetTitle(Form(
"cluster %s-resolution integrated over chambers versus momentum: sigma;p (GeV/c^{2});#sigma_{%s} (cm)",axes[ia],axes[ia]));
960 g->SetMarkerStyle(kFullDotLarge);
964 name = Form(
"mgResidual%sMeanVsCent_ClusterIn",axes[ia]); title = Form(
"cluster-track residual-%s per chamber versus centrality: mean (cluster in);centrality (%%);<#Delta_{%s}> (cm)",axes[ia],axes[ia]);
965 mg =
new TMultiGraph(name.Data(), title.Data());
966 for (Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
968 g->SetName(Form(
"gShift%sVsCent_ch%d",axes[ia],i+1));
969 g->SetMarkerStyle(kFullDotMedium);
970 g->SetMarkerColor(i+1+i/9);
976 name = Form(
"mgCombinedResidual%sSigmaVsCent",axes[ia]); title = Form(
"cluster %s-resolution per chamber versus centrality;centrality (%%);#sigma_{%s} (cm)",axes[ia],axes[ia]);
977 mg =
new TMultiGraph(name.Data(), title.Data());
978 for (Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
980 g->SetName(Form(
"gRes%sVsCent_ch%d",axes[ia],i+1));
981 g->SetMarkerStyle(kFullDotMedium);
982 g->SetMarkerColor(i+1+i/9);
988 g->SetName(Form(
"gCombinedResidual%sSigmaVsCent",axes[ia]));
989 g->SetTitle(Form(
"cluster %s-resolution integrated over chambers versus centrality: sigma;centrality (%%);#sigma_{%s} (cm)",axes[ia],axes[ia]));
990 g->SetMarkerStyle(kFullDotLarge);
994 name = Form(
"mgResidual%sMeanVsAngle_ClusterIn",axes[ia]); title = Form(
"cluster-track residual-%s per chamber versus track angle: mean (cluster in);%s-angle (deg);<#Delta_{%s}> (cm)",axes[ia],axes[ia],axes[ia]);
995 mg =
new TMultiGraph(name.Data(), title.Data());
996 for (Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
998 g->SetName(Form(
"gShift%sVsAngle_ch%d",axes[ia],i+1));
999 g->SetMarkerStyle(kFullDotMedium);
1000 g->SetMarkerColor(i+1+i/9);
1005 name = Form(
"mgHChResidual%sMeanVsAngle_ClusterIn",axes[ia]); title = Form(
"cluster-track residual-%s per half-chamber versus track angle: mean (cluster in);%s-angle (deg);<#Delta_{%s}> (cm)",axes[ia],axes[ia],axes[ia]);
1006 mg =
new TMultiGraph(name.Data(), title.Data());
1007 for (Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
1008 for (Int_t j = 0; j < 2; j++) {
1010 g->SetName(Form(
"gShift%sVsAngle_halfCh%d%s",axes[ia],i+1,side[j]));
1011 g->SetMarkerStyle(kFullDotMedium);
1012 g->SetMarkerColor(2*i+j+1+(2*i+j)/9);
1019 name = Form(
"mgCombinedResidual%sSigmaVsAngle",axes[ia]); title = Form(
"cluster %s-resolution per chamber versus track angle;%s-angle (deg);#sigma_{%s} (cm)",axes[ia],axes[ia],axes[ia]);
1020 mg =
new TMultiGraph(name.Data(), title.Data());
1021 for (Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
1023 g->SetName(Form(
"gRes%sVsAngle_ch%d",axes[ia],i+1));
1024 g->SetMarkerStyle(kFullDotMedium);
1025 g->SetMarkerColor(i+1+i/9);
1031 g->SetName(Form(
"gCombinedResidual%sSigmaVsAngle",axes[ia]));
1032 g->SetTitle(Form(
"cluster %s-resolution integrated over chambers versus track angle: sigma;%s-angle (deg);#sigma_{%s} (cm)",axes[ia],axes[ia],axes[ia]));
1033 g->SetMarkerStyle(kFullDotLarge);
1036 g =
new TGraphErrors(AliMUONConstants::NTrackingCh());
1037 g->SetName(Form(
"gTrackRes%sPerCh",axes[ia]));
1038 g->SetTitle(Form(
"track <#sigma_{%s}> per Ch;chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
1039 g->SetMarkerStyle(kFullDotLarge);
1042 g =
new TGraphErrors(AliMUONConstants::NTrackingCh());
1043 g->SetName(Form(
"gMCS%sPerCh",axes[ia]));
1044 g->SetTitle(Form(
"MCS %s-dispersion of extrapolated track per Ch;chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
1045 g->SetMarkerStyle(kFullDotLarge);
1048 g =
new TGraphErrors(AliMUONConstants::NTrackingCh());
1049 g->SetName(Form(
"gClusterRes%sPerCh",axes[ia]));
1050 g->SetTitle(Form(
"cluster <#sigma_{%s}> per Ch;chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
1051 g->SetMarkerStyle(kFullDotLarge);
1054 g =
new TGraphErrors(2*AliMUONConstants::NTrackingCh());
1055 g->SetName(Form(
"gClusterRes%sPerHalfCh",axes[ia]));
1056 g->SetTitle(Form(
"cluster <#sigma_{%s}> per half Ch;half chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
1057 g->SetMarkerStyle(kFullDotLarge);
1060 g =
new TGraphErrors(
fNDE);
1061 g->SetName(Form(
"gClusterRes%sPerDE",axes[ia]));
1062 g->SetTitle(Form(
"cluster <#sigma_{%s}> per DE;DE ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
1063 g->SetMarkerStyle(kFullDotLarge);
1066 g =
new TGraphErrors(AliMUONConstants::NTrackingCh());
1067 g->SetName(Form(
"gCalcClusterRes%sPerCh",axes[ia]));
1068 g->SetTitle(Form(
"calculated cluster <#sigma_{%s}> per Ch;chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
1069 g->SetMarkerStyle(kFullDotLarge);
1072 g =
new TGraphErrors(AliMUONConstants::NTrackingCh());
1073 g->SetName(Form(
"gLocalChi2%sPerChMean",axes[ia]));
1074 g->SetTitle(Form(
"local chi2-%s per Ch: mean;chamber ID;<local #chi^{2}_{%s}>",axes[ia],axes[ia]));
1075 g->SetMarkerStyle(kFullDotLarge);
1078 g =
new TGraphErrors(
fNDE);
1079 g->SetName(Form(
"gLocalChi2%sPerDEMean",axes[ia]));
1080 g->SetTitle(Form(
"local chi2-%s per DE: mean;DE ID;<local #chi^{2}_{%s}>",axes[ia],axes[ia]));
1081 g->SetMarkerStyle(kFullDotLarge);
1085 name = Form(
"cDetailRes%sPerChClIn",axes[ia]); title = Form(
"cDetailRes%sPerChClIn",axes[ia]);
1086 c =
new TCanvas(name.Data(), title.Data(), 1200, 500);
1090 name = Form(
"cDetailRes%sPerChClOut",axes[ia]); title = Form(
"cDetailRes%sPerChClOut",axes[ia]);
1091 c =
new TCanvas(name.Data(), title.Data(), 1200, 500);
1095 name = Form(
"cDetailRes%sPerHalfChClIn",axes[ia]); title = Form(
"cDetailRes%sPerHalfChClIn",axes[ia]);
1096 c =
new TCanvas(name.Data(), title.Data(), 1200, 800);
1100 name = Form(
"cDetailRes%sPerHalfChClOut",axes[ia]); title = Form(
"cDetailRes%sPerHalfChClOut",axes[ia]);
1101 c =
new TCanvas(name.Data(), title.Data(), 1200, 800);
1105 name = Form(
"cDetailRes%sPerDEClIn",axes[ia]); title = Form(
"cDetailRes%sPerDEClIn",axes[ia]);
1106 c =
new TCanvas(name.Data(), title.Data(), 1200, 800);
1110 name = Form(
"cDetailRes%sPerDEClOut",axes[ia]); title = Form(
"cDetailRes%sPerDEClOut",axes[ia]);
1111 c =
new TCanvas(name.Data(), title.Data(), 1200, 800);
1131 Double_t meanIn, meanInErr, meanOut, meanOutErr,
sigma, sigmaIn, sigmaInErr, sigmaOut, sigmaOutErr;
1132 Double_t sigmaTrack, sigmaTrackErr, sigmaMCS, sigmaMCSErr, clusterRes, clusterResErr, sigmaCluster, sigmaClusterErr;
1133 Double_t dumy1, dumy2;
1134 for (Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
1138 tmp->SetTitle(Form(
"chamber %d",i+1));
1144 tmp->SetTitle(Form(
"chamber %d",i+1));
1150 sigma = TMath::Sqrt(sigmaIn*sigmaIn + meanIn*meanIn);
1151 sigmaInErr = (sigma>0) ? TMath::Sqrt(sigmaIn*sigmaIn*sigmaInErr*sigmaInErr + meanIn*meanIn*meanInErr*meanInErr) / sigma : 0.;
1153 sigma = TMath::Sqrt(sigmaOut*sigmaOut + meanOut*meanOut);
1154 sigmaOutErr = (sigma>0) ? TMath::Sqrt(sigmaOut*sigmaOut*sigmaOutErr*sigmaOutErr + meanOut*meanOut*meanOutErr*meanOutErr) / sigma : 0.;
1160 clusterRes = TMath::Sqrt(sigmaIn*sigmaOut);
1162 clusterResErr = TMath::Sqrt(sigmaInErr*sigmaOutErr);
1165 newClusterRes[ia][i] = clusterRes;
1166 newClusterResErr[ia][i] = clusterResErr;
1170 GetMeanRMS(tmp, sigmaTrack, sigmaTrackErr, dumy1, dumy2, (TGraphErrors*)
fChamberRes->UncheckedAt(
kTrackResPerChMean+ia), 0x0, i, i+1, kFALSE, kFALSE);
1174 GetMeanRMS(tmp, sigmaMCS, sigmaMCSErr, dumy1, dumy2, (TGraphErrors*)
fChamberRes->UncheckedAt(
kMCSPerChMean+ia), 0x0, i, i+1, kFALSE, kFALSE);
1177 sigmaCluster = sigmaOut*sigmaOut - sigmaTrack*sigmaTrack;
1178 if (sigmaCluster > 0.) {
1179 sigmaCluster = TMath::Sqrt(sigmaCluster);
1180 sigmaClusterErr = TMath::Sqrt(sigmaOut*sigmaOut*sigmaOutErr*sigmaOutErr + sigmaTrack*sigmaTrack*sigmaTrackErr*sigmaTrackErr) / sigmaCluster;
1183 sigmaClusterErr = 0.;
1191 clusterRes = tmp->GetMean();
1192 if (clusterRes > 0.) {
1220 for (Int_t j = 0; j < 2; j++) {
1235 sigma = TMath::Sqrt(sigmaIn*sigmaIn + meanIn*meanIn);
1236 sigmaInErr = (sigma>0) ? TMath::Sqrt(sigmaIn*sigmaIn*sigmaInErr*sigmaInErr + meanIn*meanIn*meanInErr*meanInErr) / sigma : 0.;
1238 sigma = TMath::Sqrt(sigmaOut*sigmaOut + meanOut*meanOut);
1239 sigmaOutErr = (sigma>0) ? TMath::Sqrt(sigmaOut*sigmaOut*sigmaOutErr*sigmaOutErr + meanOut*meanOut*meanOutErr*meanOutErr) / sigma : 0.;
1243 clusterRes = TMath::Sqrt(sigmaIn*sigmaOut);
1245 clusterResErr = TMath::Sqrt(sigmaInErr*sigmaOutErr);
1251 GetMeanRMS(tmp, sigmaTrack, sigmaTrackErr, dumy1, dumy2, 0x0, 0x0, 0, 0, kFALSE, kFALSE);
1255 GetMeanRMS(tmp, sigmaMCS, sigmaMCSErr, dumy1, dumy2, 0x0, 0x0, 0, 0, kFALSE, kFALSE);
1258 sigmaCluster = sigmaOut*sigmaOut - sigmaTrack*sigmaTrack;
1259 if (sigmaCluster > 0.) {
1260 sigmaCluster = TMath::Sqrt(sigmaCluster);
1261 sigmaClusterErr = TMath::Sqrt(sigmaOut*sigmaOut*sigmaOutErr*sigmaOutErr + sigmaTrack*sigmaTrack*sigmaTrackErr*sigmaTrackErr) / sigmaCluster;
1264 sigmaClusterErr = 0.;
1284 for (Int_t i = 0; i <
fNDE; i++) {
1298 sigma = TMath::Sqrt(sigmaIn*sigmaIn + meanIn*meanIn);
1299 sigmaInErr = (sigma>0) ? TMath::Sqrt(sigmaIn*sigmaIn*sigmaInErr*sigmaInErr + meanIn*meanIn*meanInErr*meanInErr) / sigma : 0.;
1301 sigma = TMath::Sqrt(sigmaOut*sigmaOut + meanOut*meanOut);
1302 sigmaOutErr = (sigma>0) ? TMath::Sqrt(sigmaOut*sigmaOut*sigmaOutErr*sigmaOutErr + meanOut*meanOut*meanOutErr*meanOutErr) / sigma : 0.;
1306 clusterRes = TMath::Sqrt(sigmaIn*sigmaOut);
1308 clusterResErr = TMath::Sqrt(sigmaInErr*sigmaOutErr);
1314 GetMeanRMS(tmp, sigmaTrack, sigmaTrackErr, dumy1, dumy2, 0x0, 0x0, 0, 0, kFALSE, kFALSE);
1318 GetMeanRMS(tmp, sigmaMCS, sigmaMCSErr, dumy1, dumy2, 0x0, 0x0, 0, 0, kFALSE, kFALSE);
1321 sigmaCluster = sigmaOut*sigmaOut - sigmaTrack*sigmaTrack;
1322 if (sigmaCluster > 0.) {
1323 sigmaCluster = TMath::Sqrt(sigmaCluster);
1324 sigmaClusterErr = TMath::Sqrt(sigmaOut*sigmaOut*sigmaOutErr*sigmaOutErr + sigmaTrack*sigmaTrack*sigmaTrackErr*sigmaTrackErr) / sigmaCluster;
1327 sigmaClusterErr = 0.;
1346 for (Int_t i = 1; i <= 20; i++) {
1347 const char* label = xAxis->GetBinLabel(i);
1361 for (Int_t i = 1; i <=
fNDE; i++) {
1362 const char* label = xAxis->GetBinLabel(i);
1374 g =
new TGraphErrors(AliMUONConstants::NTrackingCh());
1375 g->SetName(
"gLocalChi2PerChMean");
1376 g->SetTitle(
"local chi2 per Ch: mean;chamber ID;<local #chi^{2}>");
1377 g->SetMarkerStyle(kFullDotLarge);
1379 for (Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
1380 TH1D* tmp = h2->ProjectionY(
"tmp",i+1,i+1,
"e");
1381 g->SetPoint(i, i+1, tmp->GetMean());
1382 g->SetPointError(i, 0., tmp->GetMeanError());
1388 g =
new TGraphErrors(
fNDE);
1389 g->SetName(
"gLocalChi2PerDEMean");
1390 g->SetTitle(
"local chi2 per DE: mean;DE ID;<local #chi^{2}>");
1391 g->SetMarkerStyle(kFullDotLarge);
1393 for (Int_t i = 0; i <
fNDE; i++) {
1394 TH1D* tmp = h2->ProjectionY(
"tmp",i+1,i+1,
"e");
1395 g->SetPoint(i, i+1, tmp->GetMean());
1396 g->SetPointError(i, 0., tmp->GetMeanError());
1401 g->GetXaxis()->Set(fNDE, 0.5, fNDE+0.5);
1402 for (Int_t i = 1; i <=
fNDE; i++) {
1403 const char* label = h2->GetXaxis()->GetBinLabel(i);
1404 g->GetXaxis()->SetBinLabel(i, label);
1408 TLegend *lResPerChMean =
new TLegend(0.75,0.85,0.99,0.99);
1409 TLegend *lResPerChSigma1 =
new TLegend(0.75,0.85,0.99,0.99);
1410 TLegend *lResPerChSigma2 =
new TLegend(0.75,0.85,0.99,0.99);
1411 TLegend *lResPerChSigma3 =
new TLegend(0.75,0.85,0.99,0.99);
1413 TCanvas* cResPerCh =
new TCanvas(
"cResPerCh",
"cResPerCh",1200,500);
1414 cResPerCh->Divide(4,2);
1415 for (Int_t ia = 0; ia < 2; ia++) {
1416 gROOT->SetSelectedPad(cResPerCh->cd(1+4*ia));
1419 g->SetMarkerColor(2);
1421 if (ia == 0) lResPerChMean->AddEntry(g,
"cluster out",
"PL");
1424 g->SetMarkerColor(4);
1426 if (ia == 0) lResPerChMean->AddEntry(g,
"cluster in",
"PL");
1427 if (ia == 0) lResPerChMean->Draw();
1428 else lResPerChMean->DrawClone();
1429 gROOT->SetSelectedPad(cResPerCh->cd(2+4*ia));
1433 g->SetMarkerColor(2);
1435 if (ia == 0) lResPerChSigma1->AddEntry(g,
"cluster out",
"PL");
1438 g->SetMarkerColor(4);
1440 if (ia == 0) lResPerChSigma1->AddEntry(g,
"cluster in",
"PL");
1443 g->SetMarkerColor(5);
1445 if (ia == 0) lResPerChSigma1->AddEntry(g,
"MCS",
"PL");
1448 g->SetMarkerColor(3);
1450 if (ia == 0) lResPerChSigma1->AddEntry(g,
"combined 1",
"PL");
1451 if (ia == 0) lResPerChSigma1->Draw();
1452 else lResPerChSigma1->DrawClone();
1453 gROOT->SetSelectedPad(cResPerCh->cd(3+4*ia));
1457 g->SetMarkerColor(2);
1459 if (ia == 0) lResPerChSigma2->AddEntry(g,
"cluster out",
"PL");
1462 if (ia == 0) lResPerChSigma2->AddEntry(g,
"MCS",
"PL");
1465 g->SetMarkerColor(4);
1467 if (ia == 0) lResPerChSigma2->AddEntry(g,
"track res.",
"PL");
1470 if (ia == 0) lResPerChSigma2->AddEntry(g,
"combined 2",
"PL");
1471 if (ia == 0) lResPerChSigma2->Draw();
1472 else lResPerChSigma2->DrawClone();
1473 gROOT->SetSelectedPad(cResPerCh->cd(4+4*ia));
1477 if (ia == 0) lResPerChSigma3->AddEntry(g,
"combined 1",
"PL");
1480 if (ia == 0) lResPerChSigma3->AddEntry(g,
"combined 2",
"PL");
1481 if (ia == 0) lResPerChSigma3->Draw();
1482 else lResPerChSigma3->DrawClone();
1486 TCanvas* cResPerHalfCh =
new TCanvas(
"cResPerHalfCh",
"cResPerHalfCh",1200,500);
1487 cResPerHalfCh->Divide(2,2);
1488 for (Int_t ia = 0; ia < 2; ia++) {
1489 gROOT->SetSelectedPad(cResPerHalfCh->cd(1+2*ia));
1492 g->SetMarkerColor(2);
1496 g->SetMarkerColor(4);
1498 lResPerChMean->DrawClone();
1499 gROOT->SetSelectedPad(cResPerHalfCh->cd(2+2*ia));
1503 g->SetMarkerColor(3);
1507 lResPerChSigma3->DrawClone();
1511 TCanvas* cResPerDE =
new TCanvas(
"cResPerDE",
"cResPerDE",1200,800);
1512 cResPerDE->Divide(1,4);
1513 for (Int_t ia = 0; ia < 2; ia++) {
1514 gROOT->SetSelectedPad(cResPerDE->cd(1+ia));
1517 g->SetMarkerColor(2);
1521 g->SetMarkerColor(4);
1523 lResPerChMean->DrawClone();
1524 gROOT->SetSelectedPad(cResPerDE->cd(3+ia));
1528 g->SetMarkerColor(3);
1532 lResPerChSigma3->DrawClone();
1536 TCanvas* cResPerChVsP =
new TCanvas(
"cResPerChVsP",
"cResPerChVsP");
1537 cResPerChVsP->Divide(1,2);
1538 for (Int_t ia = 0; ia < 2; ia++) {
1539 gROOT->SetSelectedPad(cResPerChVsP->cd(1+ia));
1545 TCanvas* cResPerChVsCent =
new TCanvas(
"cResPerChVsCent",
"cResPerChVsCent");
1546 cResPerChVsCent->Divide(1,2);
1547 for (Int_t ia = 0; ia < 2; ia++) {
1548 gROOT->SetSelectedPad(cResPerChVsCent->cd(1+ia));
1554 TCanvas* cResPerChVsAngle =
new TCanvas(
"cResPerChVsAngle",
"cResPerChVsAngle");
1555 cResPerChVsAngle->Divide(1,2);
1556 for (Int_t ia = 0; ia < 2; ia++) {
1557 gROOT->SetSelectedPad(cResPerChVsAngle->cd(1+ia));
1563 TCanvas* cShiftPerChVsP =
new TCanvas(
"cShiftPerChVsP",
"cShiftPerChVsP");
1564 cShiftPerChVsP->Divide(1,2);
1565 for (Int_t ia = 0; ia < 2; ia++) {
1566 gROOT->SetSelectedPad(cShiftPerChVsP->cd(1+ia));
1572 TCanvas* cShiftPerChVsCent =
new TCanvas(
"cShiftPerChVsCent",
"cShiftPerChVsCent");
1573 cShiftPerChVsCent->Divide(1,2);
1574 for (Int_t ia = 0; ia < 2; ia++) {
1575 gROOT->SetSelectedPad(cShiftPerChVsCent->cd(1+ia));
1581 TCanvas* cShiftPerChVsAngle =
new TCanvas(
"cShiftPerChVsAngle",
"cShiftPerChVsAngle");
1582 cShiftPerChVsAngle->Divide(1,2);
1583 for (Int_t ia = 0; ia < 2; ia++) {
1584 gROOT->SetSelectedPad(cShiftPerChVsAngle->cd(1+ia));
1592 printf(
"\nchamber resolution:\n");
1593 printf(
" - non-bending:");
1594 for (Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) printf((i==0)?
" %5.3f":
", %5.3f",newClusterRes[0][i]);
1595 printf(
"\n - bending:");
1596 for (Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) printf((i==0)?
" %6.4f":
", %6.4f",newClusterRes[1][i]);
1601 Double_t iDE, clRes;
1602 printf(
"\nDE resolution:\n");
1603 printf(
" - non-bending:");
1604 for (Int_t i = 0; i <
fNDE; i++) {
1606 printf((i==0)?
" %5.3f":
", %5.3f", clRes);
1608 printf(
"\n - bending:");
1609 for (Int_t i = 0; i <
fNDE; i++) {
1611 printf((i==0)?
" %6.4f":
", %6.4f", clRes);
1617 Double_t iHCh, hChShift;
1618 printf(
"\nhalf-chamber residual displacements:\n");
1619 printf(
" - non-bending:");
1620 for (Int_t i = 0; i < 2*AliMUONConstants::NTrackingCh(); i++) {
1622 printf((i==0)?
" %6.4f":
", %6.4f", hChShift);
1624 printf(
"\n - bending:");
1625 for (Int_t i = 0; i < 2*AliMUONConstants::NTrackingCh(); i++) {
1627 printf((i==0)?
" %6.4f":
", %6.4f", hChShift);
1633 Double_t iDE, deShift;
1634 printf(
"\nDE residual displacements:\n");
1635 printf(
" - non-bending:");
1636 for (Int_t i = 0; i <
fNDE; i++) {
1638 printf((i==0)?
" %6.4f":
", %6.4f", deShift);
1640 printf(
"\n - bending:");
1641 for (Int_t i = 0; i <
fNDE; i++) {
1643 printf((i==0)?
" %6.4f":
", %6.4f", deShift);
1659 Double_t gX,gY,gZ,lX,lY,lZ;
1662 Int_t nClusters = track.GetNClusters();
1663 for (Int_t iCluster=0; iCluster<nClusters; iCluster++) {
1665 AliMUONVCluster* cl =
static_cast<AliMUONTrackParam*
>(track.GetTrackParamAtCluster()->UncheckedAt(iCluster))->GetClusterPtr();
1666 Int_t chId = cl->GetChamberId();
1667 Int_t halfChId = (cl->GetX() > 0) ? 2*chId : 2*chId+1;
1668 Int_t deId = cl->GetDetElemId();
1689 cl->SetXYZ(gX,gY,gZ);
1694 Bool_t hasBending, hasNonBending;
1697 if (!hasNonBending) cl->SetErrXY(10., cl->GetErrY());
1698 if (!hasBending) cl->SetErrXY(cl->GetErrX(), 10.);
1717 Int_t maxEventsCut = (Int_t) (fractionCut * h->GetEntries());
1718 Int_t nBins = h->GetNbinsX();
1722 Int_t eventsCut = 0;
1723 for (minBin = 1; minBin <= nBins; minBin++) {
1724 eventsCut += (Int_t) h->GetBinContent(minBin);
1725 if (eventsCut > maxEventsCut)
break;
1729 h->GetXaxis()->SetRange(--minBin, h->GetXaxis()->GetLast());
1736 Int_t maxEventsCut = (Int_t) (fractionCut * h->GetEntries());
1737 Int_t nBins = h->GetNbinsX();
1741 Int_t eventsCut = 0;
1742 for (maxBin = nBins; maxBin >= 1; maxBin--) {
1743 eventsCut += (Int_t) h->GetBinContent(maxBin);
1744 if (eventsCut > maxEventsCut)
break;
1748 h->GetXaxis()->SetRange(h->GetXaxis()->GetFirst(), ++maxBin);
1753 Double_t& rms, Double_t& rmsErr,
1754 TGraphErrors* gMean, TGraphErrors* gRMS,
1755 Int_t i, Double_t x, Bool_t zoom, Bool_t enableFit)
1766 }
else if (enableFit &&
fGaus) {
1769 Double_t xMin = h->GetXaxis()->GetXmin();
1770 Double_t xMax = h->GetXaxis()->GetXmax();
1771 fGaus->SetRange(xMin, xMax);
1772 fGaus->SetParameters(h->GetEntries(), 0., 0.1);
1773 fGaus->SetParLimits(1, xMin, xMax);
1774 h->Fit(
"fGaus",
"WWNQ");
1777 Int_t
rebin =
static_cast<Int_t
>(TMath::Min(0.1*h->GetNbinsX(),TMath::Max(0.3*
fGaus->GetParameter(2)/h->GetBinWidth(1),1.)));
1778 while (h->GetNbinsX()%rebin!=0) rebin--;
1782 xMin = TMath::Max(
fGaus->GetParameter(1)-10.*
fGaus->GetParameter(2), h->GetXaxis()->GetXmin());
1783 xMax = TMath::Min(
fGaus->GetParameter(1)+10.*
fGaus->GetParameter(2), h->GetXaxis()->GetXmax());
1784 fGaus->SetRange(xMin, xMax);
1785 fGaus->SetParLimits(1, xMin, xMax);
1786 h->Fit(
"fGaus",
"NQR");
1788 mean =
fGaus->GetParameter(1);
1789 meanErr =
fGaus->GetParError(1);
1790 rms =
fGaus->GetParameter(2);
1791 rmsErr =
fGaus->GetParError(2);
1794 if (!strstr(h->GetName(),
"tmp")) {
1795 Int_t ia = (strstr(h->GetName(),
"ResX")) ? 0 : 1;
1796 Int_t ib = (strstr(h->GetName(),
"ClIn")) ? 0 : 1;
1797 if (strstr(h->GetName(),
"Half"))
1799 else if (strstr(h->GetName(),
"Ch"))
1805 TF1* f = (TF1*)
fGaus->DrawClone(
"same");
1815 mean = h->GetMean();
1816 meanErr = h->GetMeanError();
1818 rmsErr = h->GetRMSError();
1820 if (zoom) h->GetXaxis()->SetRange(0,0);
1826 gMean->SetPoint(i, x, mean);
1827 gMean->SetPointError(i, 0., meanErr);
1830 gRMS->SetPoint(i, x, rms);
1831 gRMS->SetPointError(i, 0., rmsErr);
1838 TGraphErrors* gMean, TGraphErrors* gSigma)
1842 Double_t meanIn, meanInErr, sigmaIn, sigmaInErr, sigmaOut, sigmaOutErr, clusterRes, clusterResErr, dumy1, dumy2;
1843 for (Int_t j = 1; j <= hIn->GetNbinsX(); j++) {
1844 TH1D* tmp = hIn->ProjectionY(
"tmp",j,j,
"e");
1845 GetMeanRMS(tmp, meanIn, meanInErr, sigmaIn, sigmaInErr, 0x0, 0x0, 0, 0.);
1848 tmp = hOut->ProjectionY(
"tmp",j,j,
"e");
1849 GetMeanRMS(tmp, dumy1, dumy2, sigmaOut, sigmaOutErr, 0x0, 0x0, 0, 0.);
1852 Double_t x = 0.5 * (hIn->GetXaxis()->GetBinLowEdge(j) + hIn->GetXaxis()->GetBinLowEdge(j+1));
1853 Double_t xErr = x - hIn->GetXaxis()->GetBinLowEdge(j);
1855 gMean->SetPoint(j-1, x, meanIn);
1856 gMean->SetPointError(j-1, xErr, meanInErr);
1858 if (hOut && gSigma) {
1859 clusterRes = TMath::Sqrt(sigmaIn*sigmaOut);
1861 clusterResErr = TMath::Sqrt(sigmaInErr*sigmaOutErr);
1862 gSigma->SetPoint(j-1, x, clusterRes);
1863 gSigma->SetPointError(j-1, xErr, clusterResErr);
1875 Double_t slopeX = param.GetNonBendingSlope();
1876 Double_t slopeY = param.GetBendingSlope();
1877 Double_t qOverPYZ = param.GetInverseBendingMomentum();
1878 Double_t pZ = param.Pz();
1881 Double_t dpZdSlopeY = - qOverPYZ * qOverPYZ * pZ * pZ * pZ * slopeY;
1882 Double_t dpZdQOverPYZ = (qOverPYZ != 0.) ? - pZ / qOverPYZ : - FLT_MAX;
1883 TMatrixD jacob(5,5);
1888 jacob(2,3) = slopeX * dpZdSlopeY;
1889 jacob(2,4) = slopeX * dpZdQOverPYZ;
1890 jacob(3,3) = pZ + slopeY * dpZdSlopeY;
1891 jacob(3,4) = slopeY * dpZdQOverPYZ;
1892 jacob(4,3) = dpZdSlopeY;
1893 jacob(4,4) = dpZdQOverPYZ;
1896 TMatrixD tmp(param.GetCovariances(),TMatrixD::kMultTranspose,jacob);
1897 covP.Mult(jacob,tmp);
1906 hasBending = kFALSE;
1907 hasNonBending = kFALSE;
1910 for (Int_t iDigit = 0; iDigit < cl->GetNDigits(); iDigit++) {
1912 Int_t manuId = AliMUONVDigit::ManuId(cl->GetDigitId(iDigit));
1916 if (manuId & AliMpConstants::ManuMask(AliMp::kNonBendingPlane)) hasNonBending = kTRUE;
1917 else hasBending = kTRUE;
1930 hasBending = kFALSE;
1931 hasNonBending = kFALSE;
1934 Int_t deId = cl->GetDetElemId();
1935 AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(deId, kFALSE);
1937 AliMp::CathodType cath1 = de->GetCathodType(AliMp::kBendingPlane);
1938 AliMp::CathodType cath2 = de->GetCathodType(AliMp::kNonBendingPlane);
1941 const AliMpVSegmentation* seg1 = AliMpSegmentation::Instance()->GetMpSegmentation(deId, cath1);
1942 const AliMpVSegmentation* seg2 = AliMpSegmentation::Instance()->GetMpSegmentation(deId, cath2);
1943 if (!seg1 || !seg2)
return;
1946 Double_t gX = cl->GetX();
1947 Double_t gY = cl->GetY();
1948 Double_t gZ = cl->GetZ();
1951 Int_t chId = cl->GetChamberId();
1952 Int_t halfChId = (cl->GetX() > 0) ? 2*chId : 2*chId+1;
1967 AliMpPad pad1 = seg1->PadByPosition(lX, lY, kFALSE);
1968 AliMpPad pad2 = seg2->PadByPosition(lX, lY, kFALSE);
1971 UInt_t padId1 = (pad1.IsValid()) ? AliMUONVDigit::BuildUniqueID(deId, pad1.GetManuId(), pad1.GetManuChannel(), cath1) : 0;
1972 UInt_t padId2 = (pad2.IsValid()) ? AliMUONVDigit::BuildUniqueID(deId, pad2.GetManuId(), pad2.GetManuChannel(), cath2) : 0;
1975 for (Int_t iDigit = 0; iDigit < cl->GetNDigits(); iDigit++) {
1977 UInt_t digitId = cl->GetDigitId(iDigit);
1979 if (digitId == padId1) {
1982 if (hasNonBending)
break;
1984 }
else if (digitId == padId2) {
1986 hasNonBending = kTRUE;
1987 if (hasBending)
break;
local chi2-X/Y/total per chamber: mean
Double_t fHalfChShiftB[20]
half-chamber deplacements in bending direction
cluster X/Y-resolution per DE
muon slope-X/Y reconstructed resolution at first cluster vs p
cluster-track residual-X/Y distribution in chamber i versus momentum (cluster attached to the track) ...
muon momentum reconstructed resolution at first cluster vs p
cluster X/Y-resolution per chamber versus momentum
cluster-track residual-X/Y distribution in half-chamber i versus track angle in X/Y direction (cluste...
cluster-track residual-X/Y distribution integrated over chambers versus centrality (cluster not attac...
static const Int_t fgkMinEntries
minimum number of entries needed to compute resolution
AliMUONGeometryTransformer * fOldGeoTransformer
geometry transformer used to recontruct the present data
Bool_t fShiftDE
flag telling wether to displace DEs by fDEShift(N)B[i] or not
track resolution-X/Y per half chamber
cluster-track residual-X/Y per DE: mean (cluster in)
void FitResiduals(Bool_t flag=kTRUE)
cluster-track residual-X/Y distribution in chamber i versus centrality (cluster not attached to the t...
cluster-track residual-X/Y distribution per DE (cluster not attached to the track) ...
Bool_t fPrintClResPerCh
print the cluster resolution per chamber
cluster X/Y-resolution integrated over chambers versus centrality
cluster-track residual-X/Y per chamber: sigma (cluster out)
Bool_t fShowProgressBar
show the progression bar
local chi2-X/Y/total distribution per DE
TString fOldAlignStorage
location of the OCDB storage where to find old MUON/Align/Data (use the default one if empty) ...
TString fNewAlignStorage
location of the OCDB storage where to find new MUON/Align/Data (use the default one if empty) ...
Bool_t fShiftHalfCh
flag telling wether to displace half-chambers by fHalfChShift(N)B[i] or not
cluster X/Y-resolution integrated over chambers versus track angle in X/Y direction ...
Bool_t fImproveTracks
flag telling whether to improve or not the track before measuring the resolution
Bool_t fPrintHalfChShift
print the half-chamber displacements
cluster X/Y-resolution integrated over chambers versus momentum
AliMuonEventCuts * fMuonEventCuts
cuts to select events to be considered
cluster X/Y-resolution per chamber
cluster-track residual-X/Y distribution per chamber (cluster not attached to the track) ...
combined cluster-track residual-X/Y per DE
AliMuonTrackCuts * fMuonTrackCuts
cuts to select tracks to be considered
Bool_t fPrintDEShift
print the DE displacements
cluster-track residual-X/Y per chamber: mean (cluster out)
void ZoomLeft(TH1 *h, Double_t fractionCut=0.02)
Int_t fDEIds[200]
ID of DE refered by index in histograms.
cluster-track residual-X/Y distribution integrated over chambers versus track angle in X/Y direction ...
Double_t fClusterResNB[10]
cluster resolution in non-bending direction
void Zoom(TH1 *h, Double_t fractionCut=0.01)
Bool_t fRemoveMonoCathCl
remove or not the mono-cathod clusters
void FillMeanSigmaClusterVsX(const TH2 *hIn, const TH2 *hOut, TGraphErrors *gMean, TGraphErrors *gSigma)
cluster-track residual-X/Y distribution in chamber i versus track angle in X/Y direction (cluster att...
TObjArray * fCanvases
List of canvases summarizing the results.
muon momentum reconstructed resolution at vertex vs p
Double_t fHalfChShiftNB[20]
half-chamber deplacements in non-bending direction
cluster-track residual-X/Y distribution in chamber i versus centrality (cluster attached to the track...
AliMUONGeometryTransformer * fNewGeoTransformer
new geometry transformer containing the new alignment to be applied
muon slope-X/Y reconstructed resolution at vertex vs p
Double_t fMinMomentum
use only tracks with momentum higher than this value
cluster-track residual-X/Y per chamber: dispersion (cluster out)
Int_t fNDE
total number of DE
Bool_t fOCDBLoaded
flag telling if the OCDB has been properly loaded or not
void SetHalfChShift(Int_t hchId, Double_t valNB, Double_t valB)
TObjArray * fResidualsVsP
List of residual vs. p histos.
calculated cluster X/Y-resolution per chamber
void CheckPadsBelow(AliMUONVCluster *cl, Bool_t &hasBending, Bool_t &hasNonBending) const
cluster-track residual-X/Y distribution per half chamber (cluster not attached to the track) ...
track resolution-X/Y per DE
cluster-track residual-X/Y distribution in chamber i versus momentum (cluster not attached to the tra...
combined cluster-track residual-X/Y per half chamber
void GetMeanRMS(TH1 *h, Double_t &mean, Double_t &meanErr, Double_t &rms, Double_t &rmsErr, TGraphErrors *gMean=0x0, TGraphErrors *gRMS=0x0, Int_t i=0, Double_t x=0, Bool_t zoom=kTRUE, Bool_t enableFit=kTRUE)
virtual Bool_t UserNotify()
cluster-track residual-X/Y distribution integrated over chambers versus centrality (cluster attached ...
cluster-track residual-X/Y per half-chamber versus track angle in X/Y direction: mean (cluster in) ...
local chi2-X/Y/total distribution per chamber
cluster X/Y-resolution per half chamber
cluster-track residual-X/Y per chamber versus centrality: mean (cluster in)
track X/Y-resolution per chamber
Int_t fNEvents
number of processed events
TObjArray * fResiduals
List of residual histos.
TObjArray * fResidualsVsAngle
List of residual vs. track angle histos.
virtual void Terminate(Option_t *)
muon transverse momentum reconstructed resolution at vertex vs p
cluster-track residual-X/Y distribution integrated over chambers versus momentum (cluster not attache...
TObjArray * fTrackRes
List of plots related to track resolution (p, pT, ...)
Int_t fOldAlignVersion
specific version of the old MUON/Align/Data/object to load
Double_t fMinPt
use only tracks with pT higher than this value
MCS X/Y-dispersion of extrapolated track per DE.
TObjArray * fLocalChi2
List of plots related to local chi2 per chamber/DE.
cluster-track residual-X/Y distribution per chamber (cluster attached to the track) ...
cluster-track residual-X/Y distribution in chamber i versus track angle in X/Y direction (cluster not...
TObjArray * fResidualsVsCent
List of residual vs. centrality histos.
Int_t fNewAlignSubVersion
specific subversion of the new MUON/Align/Data/object to load
cluster-track residual-X/Y per DE: mean (cluster out)
AliAnalysisTaskMuonResolution()
MCS X/Y-dispersion of extrapolated track per chamber.
Double_t fDEShiftB[200]
DE deplacements in bending direction.
Double_t fClusterResB[10]
cluster resolution in bending direction
cluster-track residual-X/Y per half chamber: mean (cluster in)
combined cluster-track residual-X/Y per chamber
cluster-track residual-X/Y per chamber versus momentum: mean (cluster in)
cluster X/Y-resolution per chamber versus centrality
Muon spectrometer resolution.
Double_t fDEShiftNB[200]
DE deplacements in non-bending direction.
track resolution-X/Y per chamber
ClassImp(AliAnalysisTaskCRC) AliAnalysisTaskCRC
cluster-track residual-X/Y per chamber: sigma (cluster in)
MCS X/Y-dispersion of extrapolated track per chamber.
cluster-track residual-X/Y per chamber: mean (cluster in)
cluster-track residual-X/Y distribution integrated over chambers versus momentum (cluster attached to...
cluster-track residual-X/Y per half chamber: mean (cluster out)
Bool_t fCheckAllPads
use all pads or only the ones directly below the cluster to look for mono-cathods ...
void SetDEShift(Int_t iDE, Double_t valNB, Double_t valB)
TObjArray * fChamberRes
List of plots related to chamber/DE resolution.
cluster-track residual-X/Y per chamber versus track angle in X/Y direction: mean (cluster in) ...
cluster-track residual-X/Y distribution per half chamber (cluster attached to the track) ...
void ZoomRight(TH1 *h, Double_t fractionCut=0.02)
TString fDefaultStorage
location of the default OCDB storage
virtual ~AliAnalysisTaskMuonResolution()
MCS X/Y-dispersion of extrapolated track per half chamber.
Bool_t fPrintClResPerDE
print the cluster resolution per DE
cluster X/Y-resolution per chamber
Int_t fOldAlignSubVersion
specific subversion of the old MUON/Align/Data/object to load
Bool_t fCorrectForSystematics
add or not the systematic shifts of the residuals to the resolution
Int_t fDEIndices[1100]
index of DE in histograms refered by ID
void Cov2CovP(const AliMUONTrackParam ¶m, TMatrixD &covP)
cluster X/Y-resolution per chamber versus track angle in X/Y direction
TObjArray * fTmpHists
List of temporary histograms.
TF1 * fGaus
gaussian function to fit the residuals
void ModifyClusters(AliMUONTrack &track)
Int_t fNewAlignVersion
specific version of the new MUON/Align/Data/object to load
virtual void UserExec(Option_t *)
virtual void UserCreateOutputObjects()
void SetStartingResolution(Int_t chId, Double_t valNB, Double_t valB)
local chi2-X/Y/total per DE: mean
muon transverse momentum reconstructed resolution at first cluster vs p
Bool_t fReAlign
flag telling whether to re-align the spectrometer or not before computing resolution ...
void CheckPads(AliMUONVCluster *cl, Bool_t &hasBending, Bool_t &hasNonBending) const
cluster-track residual-X/Y distribution per DE (cluster attached to the track)
Int_t fExtrapMode
extrapolation mode to get the track parameters and covariances at a given cluster ...
cluster-track residual-X/Y distribution integrated over chambers versus track angle in X/Y direction ...