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 "AliCentrality.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 Float_t
centrality = esd->GetCentrality()->GetCentralityPercentileUnchecked(
"V0M");
440 AliMUONVTrackReconstructor* tracker = AliMUONESDInterface::GetTracker();
443 Int_t nTracks = (Int_t) esd->GetNumberOfMuonTracks();
444 for (Int_t iTrack = 0; iTrack < nTracks; ++iTrack) {
447 AliESDMuonTrack* esdTrack = esd->GetMuonTrack(iTrack);
450 if (!esdTrack->ContainTrackerData())
continue;
463 AliMUONESDInterface::ESDToMUON(*esdTrack, track, kFALSE);
472 AliMUONTrack referenceTrack(track);
475 AliMUONTrackParam trackParamAtFirstCluster(*(static_cast<AliMUONTrackParam*>(track.GetTrackParamAtCluster()->First())));
476 Int_t firstCh = trackParamAtFirstCluster.GetClusterPtr()->GetChamberId();
477 AliMUONTrackExtrap::AddMCSEffect(&trackParamAtFirstCluster, AliMUONConstants::ChamberThicknessInX0(firstCh)/2., -1.);
480 Double_t pXUncorr = trackParamAtFirstCluster.Px();
481 Double_t pYUncorr = trackParamAtFirstCluster.Py();
482 Double_t pZUncorr = trackParamAtFirstCluster.Pz();
483 Double_t pUncorr = trackParamAtFirstCluster.P();
484 TMatrixD covUncorr(5,5);
485 Cov2CovP(trackParamAtFirstCluster,covUncorr);
486 Double_t sigmaPUncorr = TMath::Sqrt(pXUncorr * (pXUncorr*covUncorr(2,2) + pYUncorr*covUncorr(2,3) + pZUncorr*covUncorr(2,4)) +
487 pYUncorr * (pXUncorr*covUncorr(3,2) + pYUncorr*covUncorr(3,3) + pZUncorr*covUncorr(3,4)) +
488 pZUncorr * (pXUncorr*covUncorr(4,2) + pYUncorr*covUncorr(4,3) + pZUncorr*covUncorr(4,4))) / pUncorr;
492 Double_t ptUncorr = TMath::Sqrt(pXUncorr*pXUncorr + pYUncorr*pYUncorr);
493 Double_t sigmaPtUncorr = TMath::Sqrt(pXUncorr * (pXUncorr*covUncorr(2,2) + pYUncorr*covUncorr(2,3)) + pYUncorr * (pXUncorr*covUncorr(3,2) + pYUncorr*covUncorr(3,3))) / ptUncorr;
497 ((TH2F*)
fTrackRes->UncheckedAt(
kUncorrSlopeRes))->Fill(pUncorr,TMath::Sqrt(trackParamAtFirstCluster.GetCovariances()(1,1)));
498 ((TH2F*)
fTrackRes->UncheckedAt(
kUncorrSlopeRes+1))->Fill(pUncorr,TMath::Sqrt(trackParamAtFirstCluster.GetCovariances()(3,3)));
501 AliMUONTrackParam trackParamAtVtx(trackParamAtFirstCluster);
502 AliMUONTrackExtrap::ExtrapToVertex(&trackParamAtVtx, esdTrack->GetNonBendingCoor(), esdTrack->GetBendingCoor(), esdTrack->GetZ(), 0., 0.);
503 Double_t pXVtx = trackParamAtVtx.Px();
504 Double_t pYVtx = trackParamAtVtx.Py();
505 Double_t pZVtx = trackParamAtVtx.Pz();
506 Double_t pVtx = trackParamAtVtx.P();
507 TMatrixD covVtx(5,5);
509 Double_t sigmaPVtx = TMath::Sqrt(pXVtx * (pXVtx*covVtx(2,2) + pYVtx*covVtx(2,3) + pZVtx*covVtx(2,4)) +
510 pYVtx * (pXVtx*covVtx(3,2) + pYVtx*covVtx(3,3) + pZVtx*covVtx(3,4)) +
511 pZVtx * (pXVtx*covVtx(4,2) + pYVtx*covVtx(4,3) + pZVtx*covVtx(4,4))) / pVtx;
512 ((TH2F*)
fTrackRes->UncheckedAt(
kPRes))->Fill(pVtx,100.*sigmaPVtx/pVtx);
515 Double_t ptVtx = TMath::Sqrt(pXVtx*pXVtx + pYVtx*pYVtx);
516 Double_t sigmaPtVtx = TMath::Sqrt(pXVtx * (pXVtx*covVtx(2,2) + pYVtx*covVtx(2,3)) + pYVtx * (pXVtx*covVtx(3,2) + pYVtx*covVtx(3,3))) / ptVtx;
517 ((TH2F*)
fTrackRes->UncheckedAt(
kPtRes))->Fill(ptVtx,100.*sigmaPtVtx/ptVtx);
520 ((TH2F*)
fTrackRes->UncheckedAt(
kSlopeRes))->Fill(pVtx,TMath::Sqrt(trackParamAtVtx.GetCovariances()(1,1)));
521 ((TH2F*)
fTrackRes->UncheckedAt(
kSlopeRes+1))->Fill(pVtx,TMath::Sqrt(trackParamAtVtx.GetCovariances()(3,3)));
527 Double_t pXUncorr0 = esdTrack->PxUncorrected();
528 Double_t pYUncorr0 = esdTrack->PyUncorrected();
529 if (TMath::Sqrt(pXUncorr0*pXUncorr0+pYUncorr0*pYUncorr0) <
fMinPt)
continue;
532 Int_t nClusters = track.GetNClusters();
533 for (Int_t iCluster=0; iCluster<nClusters; iCluster++) {
536 AliMUONTrackParam* trackParam =
static_cast<AliMUONTrackParam*
>(track.GetTrackParamAtCluster()->UncheckedAt(iCluster));
537 AliMUONTrackParam* previousTrackParam =
static_cast<AliMUONTrackParam*
>(track.GetTrackParamAtCluster()->Before(trackParam));
538 AliMUONTrackParam* nextTrackParam =
static_cast<AliMUONTrackParam*
>(track.GetTrackParamAtCluster()->After(trackParam));
539 if (!previousTrackParam && !nextTrackParam) {
540 AliError(Form(
"unable to find a cluster neither before nor after the one at position %d !?!", iCluster));
541 track.RecursiveDump();
547 Bool_t hasBending, hasNonBending;
549 else CheckPadsBelow(trackParam->GetClusterPtr(), hasBending, hasNonBending);
550 if (!hasBending || !hasNonBending)
continue;
554 AliMUONTrackParam currentTrackParam(*trackParam);
555 track.RemoveTrackParamAtCluster(trackParam);
558 AliMUONVCluster* cluster = currentTrackParam.GetClusterPtr();
559 Int_t chId = cluster->GetChamberId();
560 Int_t halfChId = (cluster->GetX() > 0) ? 2*chId : 2*chId+1;
561 Int_t deId = cluster->GetDetElemId();
564 AliMUONTrackParam* referenceTrackParam =
static_cast<AliMUONTrackParam*
>(referenceTrack.GetTrackParamAtCluster()->UncheckedAt(iCluster));
565 Double_t deltaX = cluster->GetX() - referenceTrackParam->GetNonBendingCoor();
566 Double_t deltaY = cluster->GetY() - referenceTrackParam->GetBendingCoor();
569 Double_t angleX = TMath::ATan(referenceTrackParam->GetNonBendingSlope())*TMath::RadToDeg();
570 Double_t angleY = TMath::ATan(referenceTrackParam->GetBendingSlope())*TMath::RadToDeg();
573 Double_t sigmaDeltaX2 = cluster->GetErrX2() - referenceTrackParam->GetCovariances()(0,0);
574 Double_t sigmaDeltaY2 = cluster->GetErrY2() - referenceTrackParam->GetCovariances()(2,2);
575 Double_t localChi2X = (sigmaDeltaX2 > 0.) ? deltaX*deltaX/sigmaDeltaX2 : 0.;
576 Double_t localChi2Y = (sigmaDeltaY2 > 0.) ? deltaY*deltaY/sigmaDeltaY2 : 0.;
577 Double_t localChi2 = 0.5 * referenceTrackParam->GetLocalChi2();
588 Bool_t refit = track.IsValid( 1 << (chId/2) );
592 if (tracker->RefitTrack(track, kFALSE)) {
617 Double_t dZWithPrevious = (previousTrackParam) ? TMath::Abs(previousTrackParam->GetClusterPtr()->GetZ() - cluster->GetZ()) : FLT_MAX;
618 Int_t previousChId = (previousTrackParam) ? previousTrackParam->GetClusterPtr()->GetChamberId() : -1;
619 Double_t dZWithNext = (nextTrackParam) ? TMath::Abs(nextTrackParam->GetClusterPtr()->GetZ() - cluster->GetZ()) : FLT_MAX;
620 AliMUONTrackParam* startingTrackParam = (nextTrackParam) ? nextTrackParam : previousTrackParam;
621 if ((
fExtrapMode == 0 && previousTrackParam && dZWithPrevious < dZWithNext) ||
622 (
fExtrapMode == 1 && previousTrackParam && !(chId/2 == 2 && previousChId/2 == 1) &&
623 !(chId/2 == 3 && previousChId/2 == 2))) startingTrackParam = previousTrackParam;
626 currentTrackParam.SetParameters(startingTrackParam->GetParameters());
627 currentTrackParam.SetZ(startingTrackParam->GetZ());
628 currentTrackParam.SetCovariances(startingTrackParam->GetCovariances());
629 currentTrackParam.ResetPropagator();
632 if (AliMUONTrackExtrap::ExtrapToZCov(¤tTrackParam, currentTrackParam.GetClusterPtr()->GetZ(), kTRUE)) {
635 TMatrixD mcsCov(5,5);
636 if (startingTrackParam == nextTrackParam && chId == 0) {
637 AliMUONTrackParam trackParamForMCS;
638 trackParamForMCS.SetParameters(nextTrackParam->GetParameters());
639 AliMUONTrackExtrap::AddMCSEffect(&trackParamForMCS,AliMUONConstants::ChamberThicknessInX0(nextTrackParam->GetClusterPtr()->GetChamberId()),-1.);
640 const TMatrixD &propagator = currentTrackParam.GetPropagator();
641 TMatrixD tmp(trackParamForMCS.GetCovariances(),TMatrixD::kMultTranspose,propagator);
642 mcsCov.Mult(propagator,tmp);
643 }
else mcsCov.Zero();
646 Double_t trackResX2 = currentTrackParam.GetCovariances()(0,0) + mcsCov(0,0);
647 Double_t trackResY2 = currentTrackParam.GetCovariances()(2,2) + mcsCov(2,2);
648 deltaX = cluster->GetX() - currentTrackParam.GetNonBendingCoor();
649 deltaY = cluster->GetY() - currentTrackParam.GetBendingCoor();
691 track.AddTrackParamAtCluster(currentTrackParam, *(currentTrackParam.GetClusterPtr()), kTRUE);
712 AliCDBManager* cdbm = AliCDBManager::Instance();
714 cdbm->SetRun(fCurrentRunNumber);
716 if (!AliMUONCDB::LoadField())
return;
718 if (!AliMUONCDB::LoadMapping())
return;
720 AliMUONRecoParam* recoParam = AliMUONCDB::LoadRecoParam();
721 if (!recoParam)
return;
724 else recoParam->ImproveTracks(kFALSE);
726 AliMUONESDInterface::ResetTracker(recoParam);
728 for (Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
737 while (!it.IsDone()) {
747 TString defaultStorage(cdbm->GetDefaultStorage()->GetType());
748 if (defaultStorage ==
"alien") defaultStorage += Form(
"://folder=%s", cdbm->GetDefaultStorage()->GetBaseFolder().Data());
749 else defaultStorage += Form(
"://%s", cdbm->GetDefaultStorage()->GetBaseFolder().Data());
754 if (cdbm->GetEntryCache()->Contains(
"GRP/Geometry/Data")) cdbm->UnloadFromCache(
"GRP/Geometry/Data");
755 if (cdbm->GetEntryCache()->Contains(
"MUON/Align/Data")) cdbm->UnloadFromCache(
"MUON/Align/Data");
756 if (AliGeomManager::GetGeometry()) AliGeomManager::GetGeometry()->UnlockGeometry();
759 AliGeomManager::LoadGeometry();
760 if (!AliGeomManager::GetGeometry())
return;
763 AliGeomManager::ApplyAlignObjsFromCDB(
"MUON");
771 if (cdbm->GetEntryCache()->Contains(
"GRP/Geometry/Data")) cdbm->UnloadFromCache(
"GRP/Geometry/Data");
772 if (cdbm->GetEntryCache()->Contains(
"MUON/Align/Data")) cdbm->UnloadFromCache(
"MUON/Align/Data");
773 if (AliGeomManager::GetGeometry()) AliGeomManager::GetGeometry()->UnlockGeometry();
776 AliGeomManager::LoadGeometry();
777 if (!AliGeomManager::GetGeometry())
return;
780 AliGeomManager::ApplyAlignObjsFromCDB(
"MUON");
787 printf(
"\nstarting chamber resolution:\n");
788 printf(
" - non-bending:");
789 for (Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) printf((i==0)?
" %5.3f":
", %5.3f",
fClusterResNB[i]);
790 printf(
"\n - bending:");
791 for (Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) printf((i==0)?
" %6.4f":
", %6.4f",
fClusterResB[i]);
815 fResiduals =
static_cast<TObjArray*
> (GetOutputData(1));
819 fTrackRes =
static_cast<TObjArray*
> (GetOutputData(5));
835 const char* axes[2] = {
"X",
"Y"};
836 const char* side[2] = {
"I",
"O"};
837 Double_t newClusterRes[2][10], newClusterResErr[2][10];
841 for (Int_t ia = 0; ia < 2; ia++) {
844 g =
new TGraphErrors(AliMUONConstants::NTrackingCh());
845 g->SetName(Form(
"gResidual%sPerChMean_ClusterIn",axes[ia]));
846 g->SetTitle(Form(
"cluster-track residual-%s per Ch: mean (cluster in);chamber ID;<#Delta_{%s}> (cm)",axes[ia],axes[ia]));
847 g->SetMarkerStyle(kFullDotLarge);
849 g =
new TGraphErrors(AliMUONConstants::NTrackingCh());
850 g->SetName(Form(
"gResidual%sPerChMean_ClusterOut",axes[ia]));
851 g->SetTitle(Form(
"cluster-track residual-%s per Ch: mean (cluster out);chamber ID;<#Delta_{%s}> (cm)",axes[ia],axes[ia]));
852 g->SetMarkerStyle(kFullDotLarge);
856 g =
new TGraphErrors(2*AliMUONConstants::NTrackingCh());
857 g->SetName(Form(
"gResidual%sPerHalfChMean_ClusterIn",axes[ia]));
858 g->SetTitle(Form(
"cluster-track residual-%s per half Ch: mean (cluster in);half chamber ID;<#Delta_{%s}> (cm)",axes[ia],axes[ia]));
859 g->SetMarkerStyle(kFullDotLarge);
861 g =
new TGraphErrors(2*AliMUONConstants::NTrackingCh());
862 g->SetName(Form(
"gResidual%sPerHalfChMean_ClusterOut",axes[ia]));
863 g->SetTitle(Form(
"cluster-track residual-%s per half Ch: mean (cluster out);half chamber ID;<#Delta_{%s}> (cm)",axes[ia],axes[ia]));
864 g->SetMarkerStyle(kFullDotLarge);
868 g =
new TGraphErrors(
fNDE);
869 g->SetName(Form(
"gResidual%sPerDEMean_ClusterIn",axes[ia]));
870 g->SetTitle(Form(
"cluster-track residual-%s per DE: mean (cluster in);DE ID;<#Delta_{%s}> (cm)",axes[ia],axes[ia]));
871 g->SetMarkerStyle(kFullDotLarge);
873 g =
new TGraphErrors(
fNDE);
874 g->SetName(Form(
"gResidual%sPerDEMean_ClusterOut",axes[ia]));
875 g->SetTitle(Form(
"cluster-track residual-%s per DE: mean (cluster out);DE ID;<#Delta_{%s}> (cm)",axes[ia],axes[ia]));
876 g->SetMarkerStyle(kFullDotLarge);
880 g =
new TGraphErrors(AliMUONConstants::NTrackingCh());
881 g->SetName(Form(
"gResidual%sPerChSigma_ClusterIn",axes[ia]));
882 g->SetTitle(Form(
"cluster-track residual-%s per Ch: sigma (cluster in);chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
883 g->SetMarkerStyle(kFullDotLarge);
885 g =
new TGraphErrors(AliMUONConstants::NTrackingCh());
886 g->SetName(Form(
"gResidual%sPerChSigma_ClusterOut",axes[ia]));
887 g->SetTitle(Form(
"cluster-track residual-%s per Ch: sigma (cluster out);chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
888 g->SetMarkerStyle(kFullDotLarge);
891 g =
new TGraphErrors(AliMUONConstants::NTrackingCh());
892 g->SetName(Form(
"gResidual%sPerChDispersion_ClusterOut",axes[ia]));
893 g->SetTitle(Form(
"cluster-track residual-%s per Ch: dispersion (cluster out);chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
894 g->SetMarkerStyle(kFullDotLarge);
897 g =
new TGraphErrors(AliMUONConstants::NTrackingCh());
898 g->SetName(Form(
"gCombinedResidual%sPerChSigma",axes[ia]));
899 g->SetTitle(Form(
"combined cluster-track residual-%s per Ch: sigma;chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
900 g->SetMarkerStyle(kFullDotLarge);
904 g =
new TGraphErrors(2*AliMUONConstants::NTrackingCh());
905 g->SetName(Form(
"gCombinedResidual%sPerHalfChSigma",axes[ia]));
906 g->SetTitle(Form(
"combined cluster-track residual-%s per half Ch: sigma;half chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
907 g->SetMarkerStyle(kFullDotLarge);
911 g =
new TGraphErrors(
fNDE);
912 g->SetName(Form(
"gCombinedResidual%sPerDESigma",axes[ia]));
913 g->SetTitle(Form(
"combined cluster-track residual-%s per DE: sigma;DE ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
914 g->SetMarkerStyle(kFullDotLarge);
918 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]);
919 mg =
new TMultiGraph(name.Data(), title.Data());
920 for (Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
922 g->SetName(Form(
"gShift%sVsP_ch%d",axes[ia],i+1));
923 g->SetMarkerStyle(kFullDotMedium);
924 g->SetMarkerColor(i+1+i/9);
930 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]);
931 mg =
new TMultiGraph(name.Data(), title.Data());
932 for (Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
934 g->SetName(Form(
"gRes%sVsP_ch%d",axes[ia],i+1));
935 g->SetMarkerStyle(kFullDotMedium);
936 g->SetMarkerColor(i+1+i/9);
942 g->SetName(Form(
"gCombinedResidual%sSigmaVsP",axes[ia]));
943 g->SetTitle(Form(
"cluster %s-resolution integrated over chambers versus momentum: sigma;p (GeV/c^{2});#sigma_{%s} (cm)",axes[ia],axes[ia]));
944 g->SetMarkerStyle(kFullDotLarge);
948 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]);
949 mg =
new TMultiGraph(name.Data(), title.Data());
950 for (Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
952 g->SetName(Form(
"gShift%sVsCent_ch%d",axes[ia],i+1));
953 g->SetMarkerStyle(kFullDotMedium);
954 g->SetMarkerColor(i+1+i/9);
960 name = Form(
"mgCombinedResidual%sSigmaVsCent",axes[ia]); title = Form(
"cluster %s-resolution per chamber versus centrality;centrality (%%);#sigma_{%s} (cm)",axes[ia],axes[ia]);
961 mg =
new TMultiGraph(name.Data(), title.Data());
962 for (Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
964 g->SetName(Form(
"gRes%sVsCent_ch%d",axes[ia],i+1));
965 g->SetMarkerStyle(kFullDotMedium);
966 g->SetMarkerColor(i+1+i/9);
972 g->SetName(Form(
"gCombinedResidual%sSigmaVsCent",axes[ia]));
973 g->SetTitle(Form(
"cluster %s-resolution integrated over chambers versus centrality: sigma;centrality (%%);#sigma_{%s} (cm)",axes[ia],axes[ia]));
974 g->SetMarkerStyle(kFullDotLarge);
978 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]);
979 mg =
new TMultiGraph(name.Data(), title.Data());
980 for (Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
982 g->SetName(Form(
"gShift%sVsAngle_ch%d",axes[ia],i+1));
983 g->SetMarkerStyle(kFullDotMedium);
984 g->SetMarkerColor(i+1+i/9);
989 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]);
990 mg =
new TMultiGraph(name.Data(), title.Data());
991 for (Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
992 for (Int_t j = 0; j < 2; j++) {
994 g->SetName(Form(
"gShift%sVsAngle_halfCh%d%s",axes[ia],i+1,side[j]));
995 g->SetMarkerStyle(kFullDotMedium);
996 g->SetMarkerColor(2*i+j+1+(2*i+j)/9);
1003 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]);
1004 mg =
new TMultiGraph(name.Data(), title.Data());
1005 for (Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
1007 g->SetName(Form(
"gRes%sVsAngle_ch%d",axes[ia],i+1));
1008 g->SetMarkerStyle(kFullDotMedium);
1009 g->SetMarkerColor(i+1+i/9);
1015 g->SetName(Form(
"gCombinedResidual%sSigmaVsAngle",axes[ia]));
1016 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]));
1017 g->SetMarkerStyle(kFullDotLarge);
1020 g =
new TGraphErrors(AliMUONConstants::NTrackingCh());
1021 g->SetName(Form(
"gTrackRes%sPerCh",axes[ia]));
1022 g->SetTitle(Form(
"track <#sigma_{%s}> per Ch;chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
1023 g->SetMarkerStyle(kFullDotLarge);
1026 g =
new TGraphErrors(AliMUONConstants::NTrackingCh());
1027 g->SetName(Form(
"gMCS%sPerCh",axes[ia]));
1028 g->SetTitle(Form(
"MCS %s-dispersion of extrapolated track per Ch;chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
1029 g->SetMarkerStyle(kFullDotLarge);
1032 g =
new TGraphErrors(AliMUONConstants::NTrackingCh());
1033 g->SetName(Form(
"gClusterRes%sPerCh",axes[ia]));
1034 g->SetTitle(Form(
"cluster <#sigma_{%s}> per Ch;chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
1035 g->SetMarkerStyle(kFullDotLarge);
1038 g =
new TGraphErrors(2*AliMUONConstants::NTrackingCh());
1039 g->SetName(Form(
"gClusterRes%sPerHalfCh",axes[ia]));
1040 g->SetTitle(Form(
"cluster <#sigma_{%s}> per half Ch;half chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
1041 g->SetMarkerStyle(kFullDotLarge);
1044 g =
new TGraphErrors(
fNDE);
1045 g->SetName(Form(
"gClusterRes%sPerDE",axes[ia]));
1046 g->SetTitle(Form(
"cluster <#sigma_{%s}> per DE;DE ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
1047 g->SetMarkerStyle(kFullDotLarge);
1050 g =
new TGraphErrors(AliMUONConstants::NTrackingCh());
1051 g->SetName(Form(
"gCalcClusterRes%sPerCh",axes[ia]));
1052 g->SetTitle(Form(
"calculated cluster <#sigma_{%s}> per Ch;chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
1053 g->SetMarkerStyle(kFullDotLarge);
1056 g =
new TGraphErrors(AliMUONConstants::NTrackingCh());
1057 g->SetName(Form(
"gLocalChi2%sPerChMean",axes[ia]));
1058 g->SetTitle(Form(
"local chi2-%s per Ch: mean;chamber ID;<local #chi^{2}_{%s}>",axes[ia],axes[ia]));
1059 g->SetMarkerStyle(kFullDotLarge);
1062 g =
new TGraphErrors(
fNDE);
1063 g->SetName(Form(
"gLocalChi2%sPerDEMean",axes[ia]));
1064 g->SetTitle(Form(
"local chi2-%s per DE: mean;DE ID;<local #chi^{2}_{%s}>",axes[ia],axes[ia]));
1065 g->SetMarkerStyle(kFullDotLarge);
1069 name = Form(
"cDetailRes%sPerChClIn",axes[ia]); title = Form(
"cDetailRes%sPerChClIn",axes[ia]);
1070 c =
new TCanvas(name.Data(), title.Data(), 1200, 500);
1074 name = Form(
"cDetailRes%sPerChClOut",axes[ia]); title = Form(
"cDetailRes%sPerChClOut",axes[ia]);
1075 c =
new TCanvas(name.Data(), title.Data(), 1200, 500);
1079 name = Form(
"cDetailRes%sPerHalfChClIn",axes[ia]); title = Form(
"cDetailRes%sPerHalfChClIn",axes[ia]);
1080 c =
new TCanvas(name.Data(), title.Data(), 1200, 800);
1084 name = Form(
"cDetailRes%sPerHalfChClOut",axes[ia]); title = Form(
"cDetailRes%sPerHalfChClOut",axes[ia]);
1085 c =
new TCanvas(name.Data(), title.Data(), 1200, 800);
1089 name = Form(
"cDetailRes%sPerDEClIn",axes[ia]); title = Form(
"cDetailRes%sPerDEClIn",axes[ia]);
1090 c =
new TCanvas(name.Data(), title.Data(), 1200, 800);
1094 name = Form(
"cDetailRes%sPerDEClOut",axes[ia]); title = Form(
"cDetailRes%sPerDEClOut",axes[ia]);
1095 c =
new TCanvas(name.Data(), title.Data(), 1200, 800);
1115 Double_t meanIn, meanInErr, meanOut, meanOutErr,
sigma, sigmaIn, sigmaInErr, sigmaOut, sigmaOutErr;
1116 Double_t sigmaTrack, sigmaTrackErr, sigmaMCS, sigmaMCSErr, clusterRes, clusterResErr, sigmaCluster, sigmaClusterErr;
1117 Double_t dumy1, dumy2;
1118 for (Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
1122 tmp->SetTitle(Form(
"chamber %d",i+1));
1128 tmp->SetTitle(Form(
"chamber %d",i+1));
1134 sigma = TMath::Sqrt(sigmaIn*sigmaIn + meanIn*meanIn);
1135 sigmaInErr = (sigma>0) ? TMath::Sqrt(sigmaIn*sigmaIn*sigmaInErr*sigmaInErr + meanIn*meanIn*meanInErr*meanInErr) / sigma : 0.;
1137 sigma = TMath::Sqrt(sigmaOut*sigmaOut + meanOut*meanOut);
1138 sigmaOutErr = (sigma>0) ? TMath::Sqrt(sigmaOut*sigmaOut*sigmaOutErr*sigmaOutErr + meanOut*meanOut*meanOutErr*meanOutErr) / sigma : 0.;
1144 clusterRes = TMath::Sqrt(sigmaIn*sigmaOut);
1146 clusterResErr = TMath::Sqrt(sigmaInErr*sigmaOutErr);
1149 newClusterRes[ia][i] = clusterRes;
1150 newClusterResErr[ia][i] = clusterResErr;
1154 GetMeanRMS(tmp, sigmaTrack, sigmaTrackErr, dumy1, dumy2, (TGraphErrors*)
fChamberRes->UncheckedAt(
kTrackResPerChMean+ia), 0x0, i, i+1, kFALSE, kFALSE);
1158 GetMeanRMS(tmp, sigmaMCS, sigmaMCSErr, dumy1, dumy2, (TGraphErrors*)
fChamberRes->UncheckedAt(
kMCSPerChMean+ia), 0x0, i, i+1, kFALSE, kFALSE);
1161 sigmaCluster = sigmaOut*sigmaOut - sigmaTrack*sigmaTrack;
1162 if (sigmaCluster > 0.) {
1163 sigmaCluster = TMath::Sqrt(sigmaCluster);
1164 sigmaClusterErr = TMath::Sqrt(sigmaOut*sigmaOut*sigmaOutErr*sigmaOutErr + sigmaTrack*sigmaTrack*sigmaTrackErr*sigmaTrackErr) / sigmaCluster;
1167 sigmaClusterErr = 0.;
1175 clusterRes = tmp->GetMean();
1176 if (clusterRes > 0.) {
1204 for (Int_t j = 0; j < 2; j++) {
1219 sigma = TMath::Sqrt(sigmaIn*sigmaIn + meanIn*meanIn);
1220 sigmaInErr = (sigma>0) ? TMath::Sqrt(sigmaIn*sigmaIn*sigmaInErr*sigmaInErr + meanIn*meanIn*meanInErr*meanInErr) / sigma : 0.;
1222 sigma = TMath::Sqrt(sigmaOut*sigmaOut + meanOut*meanOut);
1223 sigmaOutErr = (sigma>0) ? TMath::Sqrt(sigmaOut*sigmaOut*sigmaOutErr*sigmaOutErr + meanOut*meanOut*meanOutErr*meanOutErr) / sigma : 0.;
1227 clusterRes = TMath::Sqrt(sigmaIn*sigmaOut);
1229 clusterResErr = TMath::Sqrt(sigmaInErr*sigmaOutErr);
1235 GetMeanRMS(tmp, sigmaTrack, sigmaTrackErr, dumy1, dumy2, 0x0, 0x0, 0, 0, kFALSE, kFALSE);
1239 GetMeanRMS(tmp, sigmaMCS, sigmaMCSErr, dumy1, dumy2, 0x0, 0x0, 0, 0, kFALSE, kFALSE);
1242 sigmaCluster = sigmaOut*sigmaOut - sigmaTrack*sigmaTrack;
1243 if (sigmaCluster > 0.) {
1244 sigmaCluster = TMath::Sqrt(sigmaCluster);
1245 sigmaClusterErr = TMath::Sqrt(sigmaOut*sigmaOut*sigmaOutErr*sigmaOutErr + sigmaTrack*sigmaTrack*sigmaTrackErr*sigmaTrackErr) / sigmaCluster;
1248 sigmaClusterErr = 0.;
1268 for (Int_t i = 0; i <
fNDE; i++) {
1282 sigma = TMath::Sqrt(sigmaIn*sigmaIn + meanIn*meanIn);
1283 sigmaInErr = (sigma>0) ? TMath::Sqrt(sigmaIn*sigmaIn*sigmaInErr*sigmaInErr + meanIn*meanIn*meanInErr*meanInErr) / sigma : 0.;
1285 sigma = TMath::Sqrt(sigmaOut*sigmaOut + meanOut*meanOut);
1286 sigmaOutErr = (sigma>0) ? TMath::Sqrt(sigmaOut*sigmaOut*sigmaOutErr*sigmaOutErr + meanOut*meanOut*meanOutErr*meanOutErr) / sigma : 0.;
1290 clusterRes = TMath::Sqrt(sigmaIn*sigmaOut);
1292 clusterResErr = TMath::Sqrt(sigmaInErr*sigmaOutErr);
1298 GetMeanRMS(tmp, sigmaTrack, sigmaTrackErr, dumy1, dumy2, 0x0, 0x0, 0, 0, kFALSE, kFALSE);
1302 GetMeanRMS(tmp, sigmaMCS, sigmaMCSErr, dumy1, dumy2, 0x0, 0x0, 0, 0, kFALSE, kFALSE);
1305 sigmaCluster = sigmaOut*sigmaOut - sigmaTrack*sigmaTrack;
1306 if (sigmaCluster > 0.) {
1307 sigmaCluster = TMath::Sqrt(sigmaCluster);
1308 sigmaClusterErr = TMath::Sqrt(sigmaOut*sigmaOut*sigmaOutErr*sigmaOutErr + sigmaTrack*sigmaTrack*sigmaTrackErr*sigmaTrackErr) / sigmaCluster;
1311 sigmaClusterErr = 0.;
1330 for (Int_t i = 1; i <= 20; i++) {
1331 const char* label = xAxis->GetBinLabel(i);
1345 for (Int_t i = 1; i <=
fNDE; i++) {
1346 const char* label = xAxis->GetBinLabel(i);
1358 g =
new TGraphErrors(AliMUONConstants::NTrackingCh());
1359 g->SetName(
"gLocalChi2PerChMean");
1360 g->SetTitle(
"local chi2 per Ch: mean;chamber ID;<local #chi^{2}>");
1361 g->SetMarkerStyle(kFullDotLarge);
1363 for (Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
1364 TH1D* tmp = h2->ProjectionY(
"tmp",i+1,i+1,
"e");
1365 g->SetPoint(i, i+1, tmp->GetMean());
1366 g->SetPointError(i, 0., tmp->GetMeanError());
1372 g =
new TGraphErrors(
fNDE);
1373 g->SetName(
"gLocalChi2PerDEMean");
1374 g->SetTitle(
"local chi2 per DE: mean;DE ID;<local #chi^{2}>");
1375 g->SetMarkerStyle(kFullDotLarge);
1377 for (Int_t i = 0; i <
fNDE; i++) {
1378 TH1D* tmp = h2->ProjectionY(
"tmp",i+1,i+1,
"e");
1379 g->SetPoint(i, i+1, tmp->GetMean());
1380 g->SetPointError(i, 0., tmp->GetMeanError());
1385 g->GetXaxis()->Set(fNDE, 0.5, fNDE+0.5);
1386 for (Int_t i = 1; i <=
fNDE; i++) {
1387 const char* label = h2->GetXaxis()->GetBinLabel(i);
1388 g->GetXaxis()->SetBinLabel(i, label);
1392 TLegend *lResPerChMean =
new TLegend(0.75,0.85,0.99,0.99);
1393 TLegend *lResPerChSigma1 =
new TLegend(0.75,0.85,0.99,0.99);
1394 TLegend *lResPerChSigma2 =
new TLegend(0.75,0.85,0.99,0.99);
1395 TLegend *lResPerChSigma3 =
new TLegend(0.75,0.85,0.99,0.99);
1397 TCanvas* cResPerCh =
new TCanvas(
"cResPerCh",
"cResPerCh",1200,500);
1398 cResPerCh->Divide(4,2);
1399 for (Int_t ia = 0; ia < 2; ia++) {
1400 gROOT->SetSelectedPad(cResPerCh->cd(1+4*ia));
1403 g->SetMarkerColor(2);
1405 if (ia == 0) lResPerChMean->AddEntry(g,
"cluster out",
"PL");
1408 g->SetMarkerColor(4);
1410 if (ia == 0) lResPerChMean->AddEntry(g,
"cluster in",
"PL");
1411 if (ia == 0) lResPerChMean->Draw();
1412 else lResPerChMean->DrawClone();
1413 gROOT->SetSelectedPad(cResPerCh->cd(2+4*ia));
1417 g->SetMarkerColor(2);
1419 if (ia == 0) lResPerChSigma1->AddEntry(g,
"cluster out",
"PL");
1422 g->SetMarkerColor(4);
1424 if (ia == 0) lResPerChSigma1->AddEntry(g,
"cluster in",
"PL");
1427 g->SetMarkerColor(5);
1429 if (ia == 0) lResPerChSigma1->AddEntry(g,
"MCS",
"PL");
1432 g->SetMarkerColor(3);
1434 if (ia == 0) lResPerChSigma1->AddEntry(g,
"combined 1",
"PL");
1435 if (ia == 0) lResPerChSigma1->Draw();
1436 else lResPerChSigma1->DrawClone();
1437 gROOT->SetSelectedPad(cResPerCh->cd(3+4*ia));
1441 g->SetMarkerColor(2);
1443 if (ia == 0) lResPerChSigma2->AddEntry(g,
"cluster out",
"PL");
1446 if (ia == 0) lResPerChSigma2->AddEntry(g,
"MCS",
"PL");
1449 g->SetMarkerColor(4);
1451 if (ia == 0) lResPerChSigma2->AddEntry(g,
"track res.",
"PL");
1454 if (ia == 0) lResPerChSigma2->AddEntry(g,
"combined 2",
"PL");
1455 if (ia == 0) lResPerChSigma2->Draw();
1456 else lResPerChSigma2->DrawClone();
1457 gROOT->SetSelectedPad(cResPerCh->cd(4+4*ia));
1461 if (ia == 0) lResPerChSigma3->AddEntry(g,
"combined 1",
"PL");
1464 if (ia == 0) lResPerChSigma3->AddEntry(g,
"combined 2",
"PL");
1465 if (ia == 0) lResPerChSigma3->Draw();
1466 else lResPerChSigma3->DrawClone();
1470 TCanvas* cResPerHalfCh =
new TCanvas(
"cResPerHalfCh",
"cResPerHalfCh",1200,500);
1471 cResPerHalfCh->Divide(2,2);
1472 for (Int_t ia = 0; ia < 2; ia++) {
1473 gROOT->SetSelectedPad(cResPerHalfCh->cd(1+2*ia));
1476 g->SetMarkerColor(2);
1480 g->SetMarkerColor(4);
1482 lResPerChMean->DrawClone();
1483 gROOT->SetSelectedPad(cResPerHalfCh->cd(2+2*ia));
1487 g->SetMarkerColor(3);
1491 lResPerChSigma3->DrawClone();
1495 TCanvas* cResPerDE =
new TCanvas(
"cResPerDE",
"cResPerDE",1200,800);
1496 cResPerDE->Divide(1,4);
1497 for (Int_t ia = 0; ia < 2; ia++) {
1498 gROOT->SetSelectedPad(cResPerDE->cd(1+ia));
1501 g->SetMarkerColor(2);
1505 g->SetMarkerColor(4);
1507 lResPerChMean->DrawClone();
1508 gROOT->SetSelectedPad(cResPerDE->cd(3+ia));
1512 g->SetMarkerColor(3);
1516 lResPerChSigma3->DrawClone();
1520 TCanvas* cResPerChVsP =
new TCanvas(
"cResPerChVsP",
"cResPerChVsP");
1521 cResPerChVsP->Divide(1,2);
1522 for (Int_t ia = 0; ia < 2; ia++) {
1523 gROOT->SetSelectedPad(cResPerChVsP->cd(1+ia));
1529 TCanvas* cResPerChVsCent =
new TCanvas(
"cResPerChVsCent",
"cResPerChVsCent");
1530 cResPerChVsCent->Divide(1,2);
1531 for (Int_t ia = 0; ia < 2; ia++) {
1532 gROOT->SetSelectedPad(cResPerChVsCent->cd(1+ia));
1538 TCanvas* cResPerChVsAngle =
new TCanvas(
"cResPerChVsAngle",
"cResPerChVsAngle");
1539 cResPerChVsAngle->Divide(1,2);
1540 for (Int_t ia = 0; ia < 2; ia++) {
1541 gROOT->SetSelectedPad(cResPerChVsAngle->cd(1+ia));
1547 TCanvas* cShiftPerChVsP =
new TCanvas(
"cShiftPerChVsP",
"cShiftPerChVsP");
1548 cShiftPerChVsP->Divide(1,2);
1549 for (Int_t ia = 0; ia < 2; ia++) {
1550 gROOT->SetSelectedPad(cShiftPerChVsP->cd(1+ia));
1556 TCanvas* cShiftPerChVsCent =
new TCanvas(
"cShiftPerChVsCent",
"cShiftPerChVsCent");
1557 cShiftPerChVsCent->Divide(1,2);
1558 for (Int_t ia = 0; ia < 2; ia++) {
1559 gROOT->SetSelectedPad(cShiftPerChVsCent->cd(1+ia));
1565 TCanvas* cShiftPerChVsAngle =
new TCanvas(
"cShiftPerChVsAngle",
"cShiftPerChVsAngle");
1566 cShiftPerChVsAngle->Divide(1,2);
1567 for (Int_t ia = 0; ia < 2; ia++) {
1568 gROOT->SetSelectedPad(cShiftPerChVsAngle->cd(1+ia));
1576 printf(
"\nchamber resolution:\n");
1577 printf(
" - non-bending:");
1578 for (Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) printf((i==0)?
" %5.3f":
", %5.3f",newClusterRes[0][i]);
1579 printf(
"\n - bending:");
1580 for (Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) printf((i==0)?
" %6.4f":
", %6.4f",newClusterRes[1][i]);
1585 Double_t iDE, clRes;
1586 printf(
"\nDE resolution:\n");
1587 printf(
" - non-bending:");
1588 for (Int_t i = 0; i <
fNDE; i++) {
1590 printf((i==0)?
" %5.3f":
", %5.3f", clRes);
1592 printf(
"\n - bending:");
1593 for (Int_t i = 0; i <
fNDE; i++) {
1595 printf((i==0)?
" %6.4f":
", %6.4f", clRes);
1601 Double_t iHCh, hChShift;
1602 printf(
"\nhalf-chamber residual displacements:\n");
1603 printf(
" - non-bending:");
1604 for (Int_t i = 0; i < 2*AliMUONConstants::NTrackingCh(); i++) {
1606 printf((i==0)?
" %6.4f":
", %6.4f", hChShift);
1608 printf(
"\n - bending:");
1609 for (Int_t i = 0; i < 2*AliMUONConstants::NTrackingCh(); i++) {
1611 printf((i==0)?
" %6.4f":
", %6.4f", hChShift);
1617 Double_t iDE, deShift;
1618 printf(
"\nDE residual displacements:\n");
1619 printf(
" - non-bending:");
1620 for (Int_t i = 0; i <
fNDE; i++) {
1622 printf((i==0)?
" %6.4f":
", %6.4f", deShift);
1624 printf(
"\n - bending:");
1625 for (Int_t i = 0; i <
fNDE; i++) {
1627 printf((i==0)?
" %6.4f":
", %6.4f", deShift);
1643 Double_t gX,gY,gZ,lX,lY,lZ;
1646 Int_t nClusters = track.GetNClusters();
1647 for (Int_t iCluster=0; iCluster<nClusters; iCluster++) {
1649 AliMUONVCluster* cl =
static_cast<AliMUONTrackParam*
>(track.GetTrackParamAtCluster()->UncheckedAt(iCluster))->GetClusterPtr();
1650 Int_t chId = cl->GetChamberId();
1651 Int_t halfChId = (cl->GetX() > 0) ? 2*chId : 2*chId+1;
1652 Int_t deId = cl->GetDetElemId();
1673 cl->SetXYZ(gX,gY,gZ);
1678 Bool_t hasBending, hasNonBending;
1681 if (!hasNonBending) cl->SetErrXY(10., cl->GetErrY());
1682 if (!hasBending) cl->SetErrXY(cl->GetErrX(), 10.);
1701 Int_t maxEventsCut = (Int_t) (fractionCut * h->GetEntries());
1702 Int_t nBins = h->GetNbinsX();
1706 Int_t eventsCut = 0;
1707 for (minBin = 1; minBin <= nBins; minBin++) {
1708 eventsCut += (Int_t) h->GetBinContent(minBin);
1709 if (eventsCut > maxEventsCut)
break;
1713 h->GetXaxis()->SetRange(--minBin, h->GetXaxis()->GetLast());
1720 Int_t maxEventsCut = (Int_t) (fractionCut * h->GetEntries());
1721 Int_t nBins = h->GetNbinsX();
1725 Int_t eventsCut = 0;
1726 for (maxBin = nBins; maxBin >= 1; maxBin--) {
1727 eventsCut += (Int_t) h->GetBinContent(maxBin);
1728 if (eventsCut > maxEventsCut)
break;
1732 h->GetXaxis()->SetRange(h->GetXaxis()->GetFirst(), ++maxBin);
1737 Double_t& rms, Double_t& rmsErr,
1738 TGraphErrors* gMean, TGraphErrors* gRMS,
1739 Int_t i, Double_t x, Bool_t zoom, Bool_t enableFit)
1750 }
else if (enableFit &&
fGaus) {
1753 Double_t xMin = h->GetXaxis()->GetXmin();
1754 Double_t xMax = h->GetXaxis()->GetXmax();
1755 fGaus->SetRange(xMin, xMax);
1756 fGaus->SetParameters(h->GetEntries(), 0., 0.1);
1757 fGaus->SetParLimits(1, xMin, xMax);
1758 h->Fit(
"fGaus",
"WWNQ");
1761 Int_t
rebin =
static_cast<Int_t
>(TMath::Min(0.1*h->GetNbinsX(),TMath::Max(0.3*
fGaus->GetParameter(2)/h->GetBinWidth(1),1.)));
1762 while (h->GetNbinsX()%rebin!=0) rebin--;
1766 xMin = TMath::Max(
fGaus->GetParameter(1)-10.*
fGaus->GetParameter(2), h->GetXaxis()->GetXmin());
1767 xMax = TMath::Min(
fGaus->GetParameter(1)+10.*
fGaus->GetParameter(2), h->GetXaxis()->GetXmax());
1768 fGaus->SetRange(xMin, xMax);
1769 fGaus->SetParLimits(1, xMin, xMax);
1770 h->Fit(
"fGaus",
"NQR");
1772 mean =
fGaus->GetParameter(1);
1773 meanErr =
fGaus->GetParError(1);
1774 rms =
fGaus->GetParameter(2);
1775 rmsErr =
fGaus->GetParError(2);
1778 if (!strstr(h->GetName(),
"tmp")) {
1779 Int_t ia = (strstr(h->GetName(),
"ResX")) ? 0 : 1;
1780 Int_t ib = (strstr(h->GetName(),
"ClIn")) ? 0 : 1;
1781 if (strstr(h->GetName(),
"Half"))
1783 else if (strstr(h->GetName(),
"Ch"))
1789 TF1* f = (TF1*)
fGaus->DrawClone(
"same");
1799 mean = h->GetMean();
1800 meanErr = h->GetMeanError();
1802 rmsErr = h->GetRMSError();
1804 if (zoom) h->GetXaxis()->SetRange(0,0);
1810 gMean->SetPoint(i, x, mean);
1811 gMean->SetPointError(i, 0., meanErr);
1814 gRMS->SetPoint(i, x, rms);
1815 gRMS->SetPointError(i, 0., rmsErr);
1822 TGraphErrors* gMean, TGraphErrors* gSigma)
1826 Double_t meanIn, meanInErr, sigmaIn, sigmaInErr, sigmaOut, sigmaOutErr, clusterRes, clusterResErr, dumy1, dumy2;
1827 for (Int_t j = 1; j <= hIn->GetNbinsX(); j++) {
1828 TH1D* tmp = hIn->ProjectionY(
"tmp",j,j,
"e");
1829 GetMeanRMS(tmp, meanIn, meanInErr, sigmaIn, sigmaInErr, 0x0, 0x0, 0, 0.);
1832 tmp = hOut->ProjectionY(
"tmp",j,j,
"e");
1833 GetMeanRMS(tmp, dumy1, dumy2, sigmaOut, sigmaOutErr, 0x0, 0x0, 0, 0.);
1836 Double_t x = 0.5 * (hIn->GetXaxis()->GetBinLowEdge(j) + hIn->GetXaxis()->GetBinLowEdge(j+1));
1837 Double_t xErr = x - hIn->GetXaxis()->GetBinLowEdge(j);
1839 gMean->SetPoint(j-1, x, meanIn);
1840 gMean->SetPointError(j-1, xErr, meanInErr);
1842 if (hOut && gSigma) {
1843 clusterRes = TMath::Sqrt(sigmaIn*sigmaOut);
1845 clusterResErr = TMath::Sqrt(sigmaInErr*sigmaOutErr);
1846 gSigma->SetPoint(j-1, x, clusterRes);
1847 gSigma->SetPointError(j-1, xErr, clusterResErr);
1859 Double_t slopeX = param.GetNonBendingSlope();
1860 Double_t slopeY = param.GetBendingSlope();
1861 Double_t qOverPYZ = param.GetInverseBendingMomentum();
1862 Double_t pZ = param.Pz();
1865 Double_t dpZdSlopeY = - qOverPYZ * qOverPYZ * pZ * pZ * pZ * slopeY;
1866 Double_t dpZdQOverPYZ = (qOverPYZ != 0.) ? - pZ / qOverPYZ : - FLT_MAX;
1867 TMatrixD jacob(5,5);
1872 jacob(2,3) = slopeX * dpZdSlopeY;
1873 jacob(2,4) = slopeX * dpZdQOverPYZ;
1874 jacob(3,3) = pZ + slopeY * dpZdSlopeY;
1875 jacob(3,4) = slopeY * dpZdQOverPYZ;
1876 jacob(4,3) = dpZdSlopeY;
1877 jacob(4,4) = dpZdQOverPYZ;
1880 TMatrixD tmp(param.GetCovariances(),TMatrixD::kMultTranspose,jacob);
1881 covP.Mult(jacob,tmp);
1890 hasBending = kFALSE;
1891 hasNonBending = kFALSE;
1894 for (Int_t iDigit = 0; iDigit < cl->GetNDigits(); iDigit++) {
1896 Int_t manuId = AliMUONVDigit::ManuId(cl->GetDigitId(iDigit));
1900 if (manuId & AliMpConstants::ManuMask(AliMp::kNonBendingPlane)) hasNonBending = kTRUE;
1901 else hasBending = kTRUE;
1914 hasBending = kFALSE;
1915 hasNonBending = kFALSE;
1918 Int_t deId = cl->GetDetElemId();
1919 AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(deId, kFALSE);
1921 AliMp::CathodType cath1 = de->GetCathodType(AliMp::kBendingPlane);
1922 AliMp::CathodType cath2 = de->GetCathodType(AliMp::kNonBendingPlane);
1925 const AliMpVSegmentation* seg1 = AliMpSegmentation::Instance()->GetMpSegmentation(deId, cath1);
1926 const AliMpVSegmentation* seg2 = AliMpSegmentation::Instance()->GetMpSegmentation(deId, cath2);
1927 if (!seg1 || !seg2)
return;
1930 Double_t gX = cl->GetX();
1931 Double_t gY = cl->GetY();
1932 Double_t gZ = cl->GetZ();
1935 Int_t chId = cl->GetChamberId();
1936 Int_t halfChId = (cl->GetX() > 0) ? 2*chId : 2*chId+1;
1951 AliMpPad pad1 = seg1->PadByPosition(lX, lY, kFALSE);
1952 AliMpPad pad2 = seg2->PadByPosition(lX, lY, kFALSE);
1955 UInt_t padId1 = (pad1.IsValid()) ? AliMUONVDigit::BuildUniqueID(deId, pad1.GetManuId(), pad1.GetManuChannel(), cath1) : 0;
1956 UInt_t padId2 = (pad2.IsValid()) ? AliMUONVDigit::BuildUniqueID(deId, pad2.GetManuId(), pad2.GetManuChannel(), cath2) : 0;
1959 for (Int_t iDigit = 0; iDigit < cl->GetNDigits(); iDigit++) {
1961 UInt_t digitId = cl->GetDigitId(iDigit);
1963 if (digitId == padId1) {
1966 if (hasNonBending)
break;
1968 }
else if (digitId == padId2) {
1970 hasNonBending = kTRUE;
1971 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)
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 ...