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),
107 fCorrectForSystematics(kTRUE),
108 fRemoveMonoCathCl(kFALSE),
109 fCheckAllPads(kFALSE),
110 fImproveTracks(kFALSE),
111 fShiftHalfCh(kFALSE),
112 fPrintHalfChShift(kFALSE),
114 fPrintDEShift(kFALSE),
118 fOldAlignStorage(""),
119 fOldAlignVersion(-1),
120 fOldAlignSubVersion(-1),
121 fNewAlignStorage(""),
122 fNewAlignVersion(-1),
123 fNewAlignSubVersion(-1),
124 fOldGeoTransformer(NULL),
125 fNewGeoTransformer(NULL),
131 for (
Int_t i = 0; i < 10; i++) SetStartingResolution(i, -1., -1.);
132 for (
Int_t i = 0; i < 1100; i++) fDEIndices[i] = 0;
133 for (
Int_t i = 0; i < 200; i++) fDEIds[i] = 0;
134 for (
Int_t i = 0; i < 20; i++) SetHalfChShift(i, 0., 0.);
135 for (
Int_t i = 0; i < 200; i++) SetDEShift(i, 0., 0.);
144 fResidualsVsCent(NULL),
145 fResidualsVsAngle(NULL),
151 fDefaultStorage(
"raw://"),
153 fShowProgressBar(kFALSE),
154 fPrintClResPerCh(kFALSE),
155 fPrintClResPerDE(kFALSE),
161 fCorrectForSystematics(kTRUE),
162 fRemoveMonoCathCl(kFALSE),
163 fCheckAllPads(kFALSE),
164 fImproveTracks(kFALSE),
165 fShiftHalfCh(kFALSE),
166 fPrintHalfChShift(kFALSE),
168 fPrintDEShift(kFALSE),
172 fOldAlignStorage(
""),
173 fOldAlignVersion(-1),
174 fOldAlignSubVersion(-1),
175 fNewAlignStorage(
""),
176 fNewAlignVersion(-1),
177 fNewAlignSubVersion(-1),
178 fOldGeoTransformer(NULL),
179 fNewGeoTransformer(NULL),
194 DefineOutput(1,TObjArray::Class());
196 DefineOutput(2,TObjArray::Class());
198 DefineOutput(3,TObjArray::Class());
200 DefineOutput(4,TObjArray::Class());
202 DefineOutput(5,TObjArray::Class());
204 DefineOutput(6,TObjArray::Class());
206 DefineOutput(7,TObjArray::Class());
213 if (!AliAnalysisManager::GetAnalysisManager()->IsProofMode()) {
252 const AliMUONRecoParam* recoParam = AliMUONESDInterface::GetTracker()->GetRecoParam();
254 for (
Int_t i = 0; i < 10; i++) {
255 if (recoParam->GetDefaultNonBendingReso(i) > maxSigma[0]) maxSigma[0] = recoParam->GetDefaultNonBendingReso(i);
256 if (recoParam->GetDefaultBendingReso(i) > maxSigma[1]) maxSigma[1] = recoParam->GetDefaultBendingReso(i);
258 const char* axes[2] = {
"X",
"Y"};
259 const char* side[2] = {
"I",
"O"};
260 const Int_t nBins = 5000;
261 const Int_t nSigma = 10;
262 const Int_t pNBins = 20;
263 const Double_t pEdges[2] = {0., 50.};
265 Double_t centRange[2] = {-10., 110.};
266 Int_t nAngleBins = 20;
267 Double_t angleRange[2][2] = {{-15., 15.}, {-40., 40.}};
270 for (
Int_t ia = 0; ia < 2; ia++) {
272 Double_t maxRes = nSigma*maxSigma[ia];
275 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]);
276 h2 =
new TH2F(name.Data(), title.Data(), 10, 0.5, 10.5, nBins, -maxRes, maxRes);
278 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]);
279 h2 =
new TH2F(name.Data(), title.Data(), 10, 0.5, 10.5, nBins, -2.*maxRes, 2.*maxRes);
282 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]);
283 h2 =
new TH2F(name.Data(), title.Data(), 20, 0.5, 20.5, nBins, -maxRes, maxRes);
284 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)); }
286 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]);
287 h2 =
new TH2F(name.Data(), title.Data(), 20, 0.5, 20.5, nBins, -2.*maxRes, 2.*maxRes);
288 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)); }
291 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]);
292 h2 =
new TH2F(name.Data(), title.Data(),
fNDE, 0.5,
fNDE+0.5, nBins, -maxRes, maxRes);
293 for (
Int_t i = 1; i <=
fNDE; i++) h2->GetXaxis()->SetBinLabel(i, Form(
"%d",
fDEIds[i]));
295 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]);
296 h2 =
new TH2F(name.Data(), title.Data(),
fNDE, 0.5,
fNDE+0.5, nBins, -2.*maxRes, 2.*maxRes);
297 for (
Int_t i = 1; i <=
fNDE; i++) h2->GetXaxis()->SetBinLabel(i, Form(
"%d",
fDEIds[i]));
300 name = Form(
"hTrackRes%sPerCh",axes[ia]); title = Form(
"track #sigma_{%s} per Ch;chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]);
301 h2 =
new TH2F(name.Data(), title.Data(), 10, 0.5, 10.5, nBins, 0., maxRes);
303 name = Form(
"hTrackRes%sPerHalfCh",axes[ia]); title = Form(
"track #sigma_{%s} per half Ch;half chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]);
304 h2 =
new TH2F(name.Data(), title.Data(), 20, 0.5, 20.5, nBins, 0., maxRes);
305 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)); }
307 name = Form(
"hTrackRes%sPerDE",axes[ia]); title = Form(
"track #sigma_{%s} per DE;DE ID;#sigma_{%s} (cm)",axes[ia],axes[ia]);
308 h2 =
new TH2F(name.Data(), title.Data(),
fNDE, 0.5,
fNDE+0.5, nBins, 0., maxRes);
309 for (
Int_t i = 1; i <=
fNDE; i++) h2->GetXaxis()->SetBinLabel(i, Form(
"%d",
fDEIds[i]));
312 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]);
313 h2 =
new TH2F(name.Data(), title.Data(), 10, 0.5, 10.5, nBins, 0., 0.2);
315 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]);
316 h2 =
new TH2F(name.Data(), title.Data(), 20, 0.5, 20.5, nBins, 0., 0.2);
317 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)); }
319 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]);
320 h2 =
new TH2F(name.Data(), title.Data(),
fNDE, 0.5,
fNDE+0.5, nBins, 0., 0.2);
321 for (
Int_t i = 1; i <=
fNDE; i++) h2->GetXaxis()->SetBinLabel(i, Form(
"%d",
fDEIds[i]));
324 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]);
325 h2 =
new TH2F(name.Data(), title.Data(), 10, 0.5, 10.5, nSigma*nBins, -0.1*maxRes*maxRes, maxRes*maxRes);
329 for (
Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
330 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]);
331 h2 =
new TH2F(name.Data(), title.Data(), pNBins, pEdges[0], pEdges[1], nBins, -maxRes, maxRes);
333 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]);
334 h2 =
new TH2F(name.Data(), title.Data(), pNBins, pEdges[0], pEdges[1], nBins, -2.*maxRes, 2.*maxRes);
337 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]);
338 h2 =
new TH2F(name.Data(), title.Data(),
nCentBins, centRange[0], centRange[1], nBins, -maxRes, maxRes);
340 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]);
341 h2 =
new TH2F(name.Data(), title.Data(),
nCentBins, centRange[0], centRange[1], nBins, -2.*maxRes, 2.*maxRes);
344 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]);
345 h2 =
new TH2F(name.Data(), title.Data(), nAngleBins, angleRange[ia][0], angleRange[ia][1], nBins, -maxRes, maxRes);
347 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]);
348 h2 =
new TH2F(name.Data(), title.Data(), nAngleBins, angleRange[ia][0], angleRange[ia][1], nBins, -2.*maxRes, 2.*maxRes);
351 for (
Int_t j = 0; j < 2; j++) {
352 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]);
353 h2 =
new TH2F(name.Data(), title.Data(), nAngleBins, angleRange[ia][0], angleRange[ia][1], nBins, -maxRes, maxRes);
358 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]);
359 h2 =
new TH2F(name.Data(), title.Data(), pNBins, pEdges[0], pEdges[1], nBins, -maxRes, maxRes);
361 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]);
362 h2 =
new TH2F(name.Data(), title.Data(), pNBins, pEdges[0], pEdges[1], nBins, -2.*maxRes, 2.*maxRes);
365 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]);
366 h2 =
new TH2F(name.Data(), title.Data(),
nCentBins, centRange[0], centRange[1], nBins, -maxRes, maxRes);
368 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]);
369 h2 =
new TH2F(name.Data(), title.Data(),
nCentBins, centRange[0], centRange[1], nBins, -2.*maxRes, 2.*maxRes);
372 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]);
373 h2 =
new TH2F(name.Data(), title.Data(), nAngleBins, angleRange[ia][0], angleRange[ia][1], nBins, -maxRes, maxRes);
375 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]);
376 h2 =
new TH2F(name.Data(), title.Data(), nAngleBins, angleRange[ia][0], angleRange[ia][1], nBins, -2.*maxRes, 2.*maxRes);
380 name = Form(
"hLocalChi2%sPerCh",axes[ia]); title = Form(
"local chi2-%s distribution per chamber;chamber ID;local #chi^{2}_{%s}", axes[ia], axes[ia]);
381 h2 =
new TH2F(name.Data(), title.Data(), 10, 0.5, 10.5, 1000, 0., 25.);
383 name = Form(
"hLocalChi2%sPerDE",axes[ia]); title = Form(
"local chi2-%s distribution per DE;DE ID;local #chi^{2}_{%s}", axes[ia], axes[ia]);
384 h2 =
new TH2F(name.Data(), title.Data(),
fNDE, 0.5,
fNDE+0.5, 1000, 0., 25.);
385 for (
Int_t i = 1; i <=
fNDE; i++) h2->GetXaxis()->SetBinLabel(i, Form(
"%d",
fDEIds[i]));
389 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]);
390 h2 =
new TH2F(name.Data(), title.Data(), 300, 0., 300., 1000, 0., 0.003);
392 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]);
393 h2 =
new TH2F(name.Data(), title.Data(), 300, 0., 300., 1000, 0., 0.02);
398 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.);
400 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.);
401 for (
Int_t i = 1; i <=
fNDE; i++) h2->GetXaxis()->SetBinLabel(i, Form(
"%d",
fDEIds[i]));
405 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.);
407 h2 =
new TH2F(
"hPRes",
"muon momentum reconstructed resolution at vertex vs p;p (GeV/c); #sigma_{p}/p (%)", 300, 0., 300., 1000, 0., 10.);
409 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.);
411 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.);
428 if (!
fOCDBLoaded) AliFatal(
"Problem occur while loading OCDB objects");
439 AliMultSelection *multSelection =
static_cast<AliMultSelection*
>(esd->FindListObject(
"MultSelection"));
440 Float_t centrality = multSelection ? multSelection->GetMultiplicityPercentile(
"V0M") : -1.;
443 AliMUONVTrackReconstructor* tracker = AliMUONESDInterface::GetTracker();
446 Int_t nTracks = (
Int_t) esd->GetNumberOfMuonTracks();
447 for (
Int_t iTrack = 0; iTrack < nTracks; ++iTrack) {
450 AliESDMuonTrack* esdTrack = esd->GetMuonTrack(iTrack);
453 if (!esdTrack->ContainTrackerData())
continue;
459 if (
fSign*esdTrack->Charge() < 0)
continue;
466 AliMUONESDInterface::ESDToMUON(*esdTrack, track, kFALSE);
475 AliMUONTrack referenceTrack(track);
478 AliMUONTrackParam trackParamAtFirstCluster(*(static_cast<AliMUONTrackParam*>(track.GetTrackParamAtCluster()->First())));
479 Int_t firstCh = trackParamAtFirstCluster.GetClusterPtr()->GetChamberId();
480 AliMUONTrackExtrap::AddMCSEffect(&trackParamAtFirstCluster, AliMUONConstants::ChamberThicknessInX0(firstCh)/2., -1.);
483 Double_t pXUncorr = trackParamAtFirstCluster.Px();
484 Double_t pYUncorr = trackParamAtFirstCluster.Py();
485 Double_t pZUncorr = trackParamAtFirstCluster.Pz();
486 Double_t pUncorr = trackParamAtFirstCluster.P();
487 TMatrixD covUncorr(5,5);
488 Cov2CovP(trackParamAtFirstCluster,covUncorr);
489 Double_t sigmaPUncorr = TMath::Sqrt(pXUncorr * (pXUncorr*covUncorr(2,2) + pYUncorr*covUncorr(2,3) + pZUncorr*covUncorr(2,4)) +
490 pYUncorr * (pXUncorr*covUncorr(3,2) + pYUncorr*covUncorr(3,3) + pZUncorr*covUncorr(3,4)) +
491 pZUncorr * (pXUncorr*covUncorr(4,2) + pYUncorr*covUncorr(4,3) + pZUncorr*covUncorr(4,4))) / pUncorr;
495 Double_t ptUncorr = TMath::Sqrt(pXUncorr*pXUncorr + pYUncorr*pYUncorr);
496 Double_t sigmaPtUncorr = TMath::Sqrt(pXUncorr * (pXUncorr*covUncorr(2,2) + pYUncorr*covUncorr(2,3)) + pYUncorr * (pXUncorr*covUncorr(3,2) + pYUncorr*covUncorr(3,3))) / ptUncorr;
504 AliMUONTrackParam trackParamAtVtx(trackParamAtFirstCluster);
505 AliMUONTrackExtrap::ExtrapToVertex(&trackParamAtVtx, esdTrack->GetNonBendingCoor(), esdTrack->GetBendingCoor(), esdTrack->GetZ(), 0., 0.);
506 Double_t pXVtx = trackParamAtVtx.Px();
507 Double_t pYVtx = trackParamAtVtx.Py();
508 Double_t pZVtx = trackParamAtVtx.Pz();
509 Double_t pVtx = trackParamAtVtx.P();
510 TMatrixD covVtx(5,5);
512 Double_t sigmaPVtx = TMath::Sqrt(pXVtx * (pXVtx*covVtx(2,2) + pYVtx*covVtx(2,3) + pZVtx*covVtx(2,4)) +
513 pYVtx * (pXVtx*covVtx(3,2) + pYVtx*covVtx(3,3) + pZVtx*covVtx(3,4)) +
514 pZVtx * (pXVtx*covVtx(4,2) + pYVtx*covVtx(4,3) + pZVtx*covVtx(4,4))) / pVtx;
518 Double_t ptVtx = TMath::Sqrt(pXVtx*pXVtx + pYVtx*pYVtx);
519 Double_t sigmaPtVtx = TMath::Sqrt(pXVtx * (pXVtx*covVtx(2,2) + pYVtx*covVtx(2,3)) + pYVtx * (pXVtx*covVtx(3,2) + pYVtx*covVtx(3,3))) / ptVtx;
523 ((
TH2F*)
fTrackRes->UncheckedAt(
kSlopeRes))->Fill(pVtx,TMath::Sqrt(trackParamAtVtx.GetCovariances()(1,1)));
524 ((
TH2F*)
fTrackRes->UncheckedAt(
kSlopeRes+1))->Fill(pVtx,TMath::Sqrt(trackParamAtVtx.GetCovariances()(3,3)));
530 Double_t pXUncorr0 = esdTrack->PxUncorrected();
531 Double_t pYUncorr0 = esdTrack->PyUncorrected();
532 if (TMath::Sqrt(pXUncorr0*pXUncorr0+pYUncorr0*pYUncorr0) <
fMinPt)
continue;
535 Int_t nClusters = track.GetNClusters();
536 for (
Int_t iCluster=0; iCluster<nClusters; iCluster++) {
539 AliMUONTrackParam* trackParam =
static_cast<AliMUONTrackParam*
>(track.GetTrackParamAtCluster()->UncheckedAt(iCluster));
540 AliMUONTrackParam* previousTrackParam =
static_cast<AliMUONTrackParam*
>(track.GetTrackParamAtCluster()->Before(trackParam));
541 AliMUONTrackParam* nextTrackParam =
static_cast<AliMUONTrackParam*
>(track.GetTrackParamAtCluster()->After(trackParam));
542 if (!previousTrackParam && !nextTrackParam) {
543 AliError(Form(
"unable to find a cluster neither before nor after the one at position %d !?!", iCluster));
544 track.RecursiveDump();
550 Bool_t hasBending, hasNonBending;
552 else CheckPadsBelow(trackParam->GetClusterPtr(), hasBending, hasNonBending);
553 if (!hasBending || !hasNonBending)
continue;
557 AliMUONTrackParam currentTrackParam(*trackParam);
558 track.RemoveTrackParamAtCluster(trackParam);
561 AliMUONVCluster* cluster = currentTrackParam.GetClusterPtr();
562 Int_t chId = cluster->GetChamberId();
563 Int_t halfChId = (cluster->GetX() > 0) ? 2*chId : 2*chId+1;
564 Int_t deId = cluster->GetDetElemId();
567 AliMUONTrackParam* referenceTrackParam =
static_cast<AliMUONTrackParam*
>(referenceTrack.GetTrackParamAtCluster()->UncheckedAt(iCluster));
568 Double_t deltaX = cluster->GetX() - referenceTrackParam->GetNonBendingCoor();
569 Double_t deltaY = cluster->GetY() - referenceTrackParam->GetBendingCoor();
572 Double_t angleX = TMath::ATan(referenceTrackParam->GetNonBendingSlope())*TMath::RadToDeg();
573 Double_t angleY = TMath::ATan(referenceTrackParam->GetBendingSlope())*TMath::RadToDeg();
576 Double_t sigmaDeltaX2 = cluster->GetErrX2() - referenceTrackParam->GetCovariances()(0,0);
577 Double_t sigmaDeltaY2 = cluster->GetErrY2() - referenceTrackParam->GetCovariances()(2,2);
578 Double_t localChi2X = (sigmaDeltaX2 > 0.) ? deltaX*deltaX/sigmaDeltaX2 : 0.;
579 Double_t localChi2Y = (sigmaDeltaY2 > 0.) ? deltaY*deltaY/sigmaDeltaY2 : 0.;
580 Double_t localChi2 = 0.5 * referenceTrackParam->GetLocalChi2();
591 Bool_t refit = track.IsValid( 1 << (chId/2) );
595 if (tracker->RefitTrack(track, kFALSE)) {
620 Double_t dZWithPrevious = (previousTrackParam) ? TMath::Abs(previousTrackParam->GetClusterPtr()->GetZ() - cluster->GetZ()) : FLT_MAX;
621 Int_t previousChId = (previousTrackParam) ? previousTrackParam->GetClusterPtr()->GetChamberId() : -1;
622 Double_t dZWithNext = (nextTrackParam) ? TMath::Abs(nextTrackParam->GetClusterPtr()->GetZ() - cluster->GetZ()) : FLT_MAX;
623 AliMUONTrackParam* startingTrackParam = (nextTrackParam) ? nextTrackParam : previousTrackParam;
624 if ((
fExtrapMode == 0 && previousTrackParam && dZWithPrevious < dZWithNext) ||
625 (
fExtrapMode == 1 && previousTrackParam && !(chId/2 == 2 && previousChId/2 == 1) &&
626 !(chId/2 == 3 && previousChId/2 == 2))) startingTrackParam = previousTrackParam;
629 currentTrackParam.SetParameters(startingTrackParam->GetParameters());
630 currentTrackParam.SetZ(startingTrackParam->GetZ());
631 currentTrackParam.SetCovariances(startingTrackParam->GetCovariances());
632 currentTrackParam.ResetPropagator();
635 if (AliMUONTrackExtrap::ExtrapToZCov(¤tTrackParam, currentTrackParam.GetClusterPtr()->GetZ(), kTRUE)) {
638 TMatrixD mcsCov(5,5);
639 if (startingTrackParam == nextTrackParam && chId == 0) {
640 AliMUONTrackParam trackParamForMCS;
641 trackParamForMCS.SetParameters(nextTrackParam->GetParameters());
642 AliMUONTrackExtrap::AddMCSEffect(&trackParamForMCS,AliMUONConstants::ChamberThicknessInX0(nextTrackParam->GetClusterPtr()->GetChamberId()),-1.);
643 const TMatrixD &propagator = currentTrackParam.GetPropagator();
644 TMatrixD tmp(trackParamForMCS.GetCovariances(),TMatrixD::kMultTranspose,propagator);
645 mcsCov.Mult(propagator,tmp);
646 }
else mcsCov.Zero();
649 Double_t trackResX2 = currentTrackParam.GetCovariances()(0,0) + mcsCov(0,0);
650 Double_t trackResY2 = currentTrackParam.GetCovariances()(2,2) + mcsCov(2,2);
651 deltaX = cluster->GetX() - currentTrackParam.GetNonBendingCoor();
652 deltaY = cluster->GetY() - currentTrackParam.GetBendingCoor();
694 track.AddTrackParamAtCluster(currentTrackParam, *(currentTrackParam.GetClusterPtr()), kTRUE);
717 AliCDBManager* cdbm = AliCDBManager::Instance();
731 AliCDBManager* cdbm = AliCDBManager::Instance();
732 cdbm->SetRun(fCurrentRunNumber);
734 if (!AliMUONCDB::LoadField())
return;
736 if (!AliMUONCDB::LoadMapping())
return;
738 AliMUONRecoParam* recoParam = AliMUONCDB::LoadRecoParam();
739 if (!recoParam)
return;
742 else recoParam->ImproveTracks(kFALSE);
744 AliMUONESDInterface::ResetTracker(recoParam);
746 for (
Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
755 while (!it.IsDone()) {
765 TString defaultStorage(cdbm->GetDefaultStorage()->GetType());
766 if (defaultStorage ==
"alien") defaultStorage += Form(
"://folder=%s", cdbm->GetDefaultStorage()->GetBaseFolder().Data());
767 else defaultStorage += Form(
"://%s", cdbm->GetDefaultStorage()->GetBaseFolder().Data());
772 if (cdbm->GetEntryCache()->Contains(
"GRP/Geometry/Data")) cdbm->UnloadFromCache(
"GRP/Geometry/Data");
773 if (cdbm->GetEntryCache()->Contains(
"MUON/Align/Data")) cdbm->UnloadFromCache(
"MUON/Align/Data");
774 if (AliGeomManager::GetGeometry()) AliGeomManager::GetGeometry()->UnlockGeometry();
777 AliGeomManager::LoadGeometry();
778 if (!AliGeomManager::GetGeometry())
return;
781 AliGeomManager::ApplyAlignObjsFromCDB(
"MUON");
789 if (cdbm->GetEntryCache()->Contains(
"GRP/Geometry/Data")) cdbm->UnloadFromCache(
"GRP/Geometry/Data");
790 if (cdbm->GetEntryCache()->Contains(
"MUON/Align/Data")) cdbm->UnloadFromCache(
"MUON/Align/Data");
791 if (AliGeomManager::GetGeometry()) AliGeomManager::GetGeometry()->UnlockGeometry();
794 AliGeomManager::LoadGeometry();
795 if (!AliGeomManager::GetGeometry())
return;
798 AliGeomManager::ApplyAlignObjsFromCDB(
"MUON");
805 printf(
"\nstarting chamber resolution:\n");
806 printf(
" - non-bending:");
807 for (
Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) printf((i==0)?
" %5.3f":
", %5.3f",
fClusterResNB[i]);
808 printf(
"\n - bending:");
809 for (
Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) printf((i==0)?
" %6.4f":
", %6.4f",
fClusterResB[i]);
853 const char* axes[2] = {
"X",
"Y"};
854 const char* side[2] = {
"I",
"O"};
855 Double_t newClusterRes[2][10], newClusterResErr[2][10];
859 for (
Int_t ia = 0; ia < 2; ia++) {
863 g->SetName(Form(
"gResidual%sPerChMean_ClusterIn",axes[ia]));
864 g->SetTitle(Form(
"cluster-track residual-%s per Ch: mean (cluster in);chamber ID;<#Delta_{%s}> (cm)",axes[ia],axes[ia]));
865 g->SetMarkerStyle(kFullDotLarge);
868 g->SetName(Form(
"gResidual%sPerChMean_ClusterOut",axes[ia]));
869 g->SetTitle(Form(
"cluster-track residual-%s per Ch: mean (cluster out);chamber ID;<#Delta_{%s}> (cm)",axes[ia],axes[ia]));
870 g->SetMarkerStyle(kFullDotLarge);
874 g =
new TGraphErrors(2*AliMUONConstants::NTrackingCh());
875 g->SetName(Form(
"gResidual%sPerHalfChMean_ClusterIn",axes[ia]));
876 g->SetTitle(Form(
"cluster-track residual-%s per half Ch: mean (cluster in);half chamber ID;<#Delta_{%s}> (cm)",axes[ia],axes[ia]));
877 g->SetMarkerStyle(kFullDotLarge);
879 g =
new TGraphErrors(2*AliMUONConstants::NTrackingCh());
880 g->SetName(Form(
"gResidual%sPerHalfChMean_ClusterOut",axes[ia]));
881 g->SetTitle(Form(
"cluster-track residual-%s per half Ch: mean (cluster out);half chamber ID;<#Delta_{%s}> (cm)",axes[ia],axes[ia]));
882 g->SetMarkerStyle(kFullDotLarge);
887 g->SetName(Form(
"gResidual%sPerDEMean_ClusterIn",axes[ia]));
888 g->SetTitle(Form(
"cluster-track residual-%s per DE: mean (cluster in);DE ID;<#Delta_{%s}> (cm)",axes[ia],axes[ia]));
889 g->SetMarkerStyle(kFullDotLarge);
892 g->SetName(Form(
"gResidual%sPerDEMean_ClusterOut",axes[ia]));
893 g->SetTitle(Form(
"cluster-track residual-%s per DE: mean (cluster out);DE ID;<#Delta_{%s}> (cm)",axes[ia],axes[ia]));
894 g->SetMarkerStyle(kFullDotLarge);
899 g->SetName(Form(
"gResidual%sPerChSigma_ClusterIn",axes[ia]));
900 g->SetTitle(Form(
"cluster-track residual-%s per Ch: sigma (cluster in);chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
901 g->SetMarkerStyle(kFullDotLarge);
904 g->SetName(Form(
"gResidual%sPerChSigma_ClusterOut",axes[ia]));
905 g->SetTitle(Form(
"cluster-track residual-%s per Ch: sigma (cluster out);chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
906 g->SetMarkerStyle(kFullDotLarge);
910 g->SetName(Form(
"gResidual%sPerChDispersion_ClusterOut",axes[ia]));
911 g->SetTitle(Form(
"cluster-track residual-%s per Ch: dispersion (cluster out);chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
912 g->SetMarkerStyle(kFullDotLarge);
916 g->SetName(Form(
"gCombinedResidual%sPerChSigma",axes[ia]));
917 g->SetTitle(Form(
"combined cluster-track residual-%s per Ch: sigma;chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
918 g->SetMarkerStyle(kFullDotLarge);
922 g =
new TGraphErrors(2*AliMUONConstants::NTrackingCh());
923 g->SetName(Form(
"gCombinedResidual%sPerHalfChSigma",axes[ia]));
924 g->SetTitle(Form(
"combined cluster-track residual-%s per half Ch: sigma;half chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
925 g->SetMarkerStyle(kFullDotLarge);
930 g->SetName(Form(
"gCombinedResidual%sPerDESigma",axes[ia]));
931 g->SetTitle(Form(
"combined cluster-track residual-%s per DE: sigma;DE ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
932 g->SetMarkerStyle(kFullDotLarge);
936 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]);
937 mg =
new TMultiGraph(name.Data(), title.Data());
938 for (
Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
940 g->SetName(Form(
"gShift%sVsP_ch%d",axes[ia],i+1));
941 g->SetMarkerStyle(kFullDotMedium);
942 g->SetMarkerColor(i+1+i/9);
948 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]);
949 mg =
new TMultiGraph(name.Data(), title.Data());
950 for (
Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
952 g->SetName(Form(
"gRes%sVsP_ch%d",axes[ia],i+1));
953 g->SetMarkerStyle(kFullDotMedium);
954 g->SetMarkerColor(i+1+i/9);
960 g->SetName(Form(
"gCombinedResidual%sSigmaVsP",axes[ia]));
961 g->SetTitle(Form(
"cluster %s-resolution integrated over chambers versus momentum: sigma;p (GeV/c^{2});#sigma_{%s} (cm)",axes[ia],axes[ia]));
962 g->SetMarkerStyle(kFullDotLarge);
966 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]);
967 mg =
new TMultiGraph(name.Data(), title.Data());
968 for (
Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
970 g->SetName(Form(
"gShift%sVsCent_ch%d",axes[ia],i+1));
971 g->SetMarkerStyle(kFullDotMedium);
972 g->SetMarkerColor(i+1+i/9);
978 name = Form(
"mgCombinedResidual%sSigmaVsCent",axes[ia]); title = Form(
"cluster %s-resolution per chamber versus centrality;centrality (%%);#sigma_{%s} (cm)",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(
"gRes%sVsCent_ch%d",axes[ia],i+1));
983 g->SetMarkerStyle(kFullDotMedium);
984 g->SetMarkerColor(i+1+i/9);
990 g->SetName(Form(
"gCombinedResidual%sSigmaVsCent",axes[ia]));
991 g->SetTitle(Form(
"cluster %s-resolution integrated over chambers versus centrality: sigma;centrality (%%);#sigma_{%s} (cm)",axes[ia],axes[ia]));
992 g->SetMarkerStyle(kFullDotLarge);
996 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]);
997 mg =
new TMultiGraph(name.Data(), title.Data());
998 for (
Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
1000 g->SetName(Form(
"gShift%sVsAngle_ch%d",axes[ia],i+1));
1001 g->SetMarkerStyle(kFullDotMedium);
1002 g->SetMarkerColor(i+1+i/9);
1007 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]);
1008 mg =
new TMultiGraph(name.Data(), title.Data());
1009 for (
Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
1010 for (
Int_t j = 0; j < 2; j++) {
1012 g->SetName(Form(
"gShift%sVsAngle_halfCh%d%s",axes[ia],i+1,side[j]));
1013 g->SetMarkerStyle(kFullDotMedium);
1014 g->SetMarkerColor(2*i+j+1+(2*i+j)/9);
1021 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]);
1022 mg =
new TMultiGraph(name.Data(), title.Data());
1023 for (
Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
1025 g->SetName(Form(
"gRes%sVsAngle_ch%d",axes[ia],i+1));
1026 g->SetMarkerStyle(kFullDotMedium);
1027 g->SetMarkerColor(i+1+i/9);
1033 g->SetName(Form(
"gCombinedResidual%sSigmaVsAngle",axes[ia]));
1034 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]));
1035 g->SetMarkerStyle(kFullDotLarge);
1039 g->SetName(Form(
"gTrackRes%sPerCh",axes[ia]));
1040 g->SetTitle(Form(
"track <#sigma_{%s}> per Ch;chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
1041 g->SetMarkerStyle(kFullDotLarge);
1045 g->SetName(Form(
"gMCS%sPerCh",axes[ia]));
1046 g->SetTitle(Form(
"MCS %s-dispersion of extrapolated track per Ch;chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
1047 g->SetMarkerStyle(kFullDotLarge);
1051 g->SetName(Form(
"gClusterRes%sPerCh",axes[ia]));
1052 g->SetTitle(Form(
"cluster <#sigma_{%s}> per Ch;chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
1053 g->SetMarkerStyle(kFullDotLarge);
1056 g =
new TGraphErrors(2*AliMUONConstants::NTrackingCh());
1057 g->SetName(Form(
"gClusterRes%sPerHalfCh",axes[ia]));
1058 g->SetTitle(Form(
"cluster <#sigma_{%s}> per half Ch;half chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
1059 g->SetMarkerStyle(kFullDotLarge);
1063 g->SetName(Form(
"gClusterRes%sPerDE",axes[ia]));
1064 g->SetTitle(Form(
"cluster <#sigma_{%s}> per DE;DE ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
1065 g->SetMarkerStyle(kFullDotLarge);
1069 g->SetName(Form(
"gCalcClusterRes%sPerCh",axes[ia]));
1070 g->SetTitle(Form(
"calculated cluster <#sigma_{%s}> per Ch;chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
1071 g->SetMarkerStyle(kFullDotLarge);
1075 g->SetName(Form(
"gLocalChi2%sPerChMean",axes[ia]));
1076 g->SetTitle(Form(
"local chi2-%s per Ch: mean;chamber ID;<local #chi^{2}_{%s}>",axes[ia],axes[ia]));
1077 g->SetMarkerStyle(kFullDotLarge);
1081 g->SetName(Form(
"gLocalChi2%sPerDEMean",axes[ia]));
1082 g->SetTitle(Form(
"local chi2-%s per DE: mean;DE ID;<local #chi^{2}_{%s}>",axes[ia],axes[ia]));
1083 g->SetMarkerStyle(kFullDotLarge);
1087 name = Form(
"cDetailRes%sPerChClIn",axes[ia]); title = Form(
"cDetailRes%sPerChClIn",axes[ia]);
1088 c =
new TCanvas(name.Data(), title.Data(), 1200, 500);
1092 name = Form(
"cDetailRes%sPerChClOut",axes[ia]); title = Form(
"cDetailRes%sPerChClOut",axes[ia]);
1093 c =
new TCanvas(name.Data(), title.Data(), 1200, 500);
1097 name = Form(
"cDetailRes%sPerHalfChClIn",axes[ia]); title = Form(
"cDetailRes%sPerHalfChClIn",axes[ia]);
1098 c =
new TCanvas(name.Data(), title.Data(), 1200, 800);
1102 name = Form(
"cDetailRes%sPerHalfChClOut",axes[ia]); title = Form(
"cDetailRes%sPerHalfChClOut",axes[ia]);
1103 c =
new TCanvas(name.Data(), title.Data(), 1200, 800);
1107 name = Form(
"cDetailRes%sPerDEClIn",axes[ia]); title = Form(
"cDetailRes%sPerDEClIn",axes[ia]);
1108 c =
new TCanvas(name.Data(), title.Data(), 1200, 800);
1112 name = Form(
"cDetailRes%sPerDEClOut",axes[ia]); title = Form(
"cDetailRes%sPerDEClOut",axes[ia]);
1113 c =
new TCanvas(name.Data(), title.Data(), 1200, 800);
1133 Double_t meanIn, meanInErr, meanOut, meanOutErr,
sigma, sigmaIn, sigmaInErr, sigmaOut, sigmaOutErr;
1134 Double_t sigmaTrack, sigmaTrackErr, sigmaMCS, sigmaMCSErr, clusterRes, clusterResErr, sigmaCluster, sigmaClusterErr;
1136 for (
Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
1140 tmp->SetTitle(Form(
"chamber %d",i+1));
1146 tmp->SetTitle(Form(
"chamber %d",i+1));
1152 sigma = TMath::Sqrt(sigmaIn*sigmaIn + meanIn*meanIn);
1153 sigmaInErr = (sigma>0) ? TMath::Sqrt(sigmaIn*sigmaIn*sigmaInErr*sigmaInErr + meanIn*meanIn*meanInErr*meanInErr) / sigma : 0.;
1155 sigma = TMath::Sqrt(sigmaOut*sigmaOut + meanOut*meanOut);
1156 sigmaOutErr = (sigma>0) ? TMath::Sqrt(sigmaOut*sigmaOut*sigmaOutErr*sigmaOutErr + meanOut*meanOut*meanOutErr*meanOutErr) / sigma : 0.;
1162 clusterRes = TMath::Sqrt(sigmaIn*sigmaOut);
1164 clusterResErr = TMath::Sqrt(sigmaInErr*sigmaOutErr);
1167 newClusterRes[ia][i] = clusterRes;
1168 newClusterResErr[ia][i] = clusterResErr;
1172 GetMeanRMS(tmp, sigmaTrack, sigmaTrackErr, dumy1, dumy2, (
TGraphErrors*)
fChamberRes->UncheckedAt(
kTrackResPerChMean+ia), 0x0, i, i+1, kFALSE, kFALSE);
1176 GetMeanRMS(tmp, sigmaMCS, sigmaMCSErr, dumy1, dumy2, (
TGraphErrors*)
fChamberRes->UncheckedAt(
kMCSPerChMean+ia), 0x0, i, i+1, kFALSE, kFALSE);
1179 sigmaCluster = sigmaOut*sigmaOut - sigmaTrack*sigmaTrack;
1180 if (sigmaCluster > 0.) {
1181 sigmaCluster = TMath::Sqrt(sigmaCluster);
1182 sigmaClusterErr = TMath::Sqrt(sigmaOut*sigmaOut*sigmaOutErr*sigmaOutErr + sigmaTrack*sigmaTrack*sigmaTrackErr*sigmaTrackErr) / sigmaCluster;
1185 sigmaClusterErr = 0.;
1193 clusterRes = tmp->GetMean();
1194 if (clusterRes > 0.) {
1222 for (
Int_t j = 0; j < 2; j++) {
1237 sigma = TMath::Sqrt(sigmaIn*sigmaIn + meanIn*meanIn);
1238 sigmaInErr = (sigma>0) ? TMath::Sqrt(sigmaIn*sigmaIn*sigmaInErr*sigmaInErr + meanIn*meanIn*meanInErr*meanInErr) / sigma : 0.;
1240 sigma = TMath::Sqrt(sigmaOut*sigmaOut + meanOut*meanOut);
1241 sigmaOutErr = (sigma>0) ? TMath::Sqrt(sigmaOut*sigmaOut*sigmaOutErr*sigmaOutErr + meanOut*meanOut*meanOutErr*meanOutErr) / sigma : 0.;
1245 clusterRes = TMath::Sqrt(sigmaIn*sigmaOut);
1247 clusterResErr = TMath::Sqrt(sigmaInErr*sigmaOutErr);
1253 GetMeanRMS(tmp, sigmaTrack, sigmaTrackErr, dumy1, dumy2, 0x0, 0x0, 0, 0, kFALSE, kFALSE);
1257 GetMeanRMS(tmp, sigmaMCS, sigmaMCSErr, dumy1, dumy2, 0x0, 0x0, 0, 0, kFALSE, kFALSE);
1260 sigmaCluster = sigmaOut*sigmaOut - sigmaTrack*sigmaTrack;
1261 if (sigmaCluster > 0.) {
1262 sigmaCluster = TMath::Sqrt(sigmaCluster);
1263 sigmaClusterErr = TMath::Sqrt(sigmaOut*sigmaOut*sigmaOutErr*sigmaOutErr + sigmaTrack*sigmaTrack*sigmaTrackErr*sigmaTrackErr) / sigmaCluster;
1266 sigmaClusterErr = 0.;
1300 sigma = TMath::Sqrt(sigmaIn*sigmaIn + meanIn*meanIn);
1301 sigmaInErr = (sigma>0) ? TMath::Sqrt(sigmaIn*sigmaIn*sigmaInErr*sigmaInErr + meanIn*meanIn*meanInErr*meanInErr) / sigma : 0.;
1303 sigma = TMath::Sqrt(sigmaOut*sigmaOut + meanOut*meanOut);
1304 sigmaOutErr = (sigma>0) ? TMath::Sqrt(sigmaOut*sigmaOut*sigmaOutErr*sigmaOutErr + meanOut*meanOut*meanOutErr*meanOutErr) / sigma : 0.;
1308 clusterRes = TMath::Sqrt(sigmaIn*sigmaOut);
1310 clusterResErr = TMath::Sqrt(sigmaInErr*sigmaOutErr);
1316 GetMeanRMS(tmp, sigmaTrack, sigmaTrackErr, dumy1, dumy2, 0x0, 0x0, 0, 0, kFALSE, kFALSE);
1320 GetMeanRMS(tmp, sigmaMCS, sigmaMCSErr, dumy1, dumy2, 0x0, 0x0, 0, 0, kFALSE, kFALSE);
1323 sigmaCluster = sigmaOut*sigmaOut - sigmaTrack*sigmaTrack;
1324 if (sigmaCluster > 0.) {
1325 sigmaCluster = TMath::Sqrt(sigmaCluster);
1326 sigmaClusterErr = TMath::Sqrt(sigmaOut*sigmaOut*sigmaOutErr*sigmaOutErr + sigmaTrack*sigmaTrack*sigmaTrackErr*sigmaTrackErr) / sigmaCluster;
1329 sigmaClusterErr = 0.;
1348 for (
Int_t i = 1; i <= 20; i++) {
1349 const char* label = xAxis->GetBinLabel(i);
1364 const char* label = xAxis->GetBinLabel(i);
1377 g->SetName(
"gLocalChi2PerChMean");
1378 g->SetTitle(
"local chi2 per Ch: mean;chamber ID;<local #chi^{2}>");
1379 g->SetMarkerStyle(kFullDotLarge);
1381 for (
Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
1382 TH1D* tmp = h2->ProjectionY(
"tmp",i+1,i+1,
"e");
1383 g->SetPoint(i, i+1, tmp->GetMean());
1384 g->SetPointError(i, 0., tmp->GetMeanError());
1391 g->SetName(
"gLocalChi2PerDEMean");
1392 g->SetTitle(
"local chi2 per DE: mean;DE ID;<local #chi^{2}>");
1393 g->SetMarkerStyle(kFullDotLarge);
1396 TH1D* tmp = h2->ProjectionY(
"tmp",i+1,i+1,
"e");
1397 g->SetPoint(i, i+1, tmp->GetMean());
1398 g->SetPointError(i, 0., tmp->GetMeanError());
1403 g->GetXaxis()->Set(fNDE, 0.5, fNDE+0.5);
1405 const char* label = h2->GetXaxis()->GetBinLabel(i);
1406 g->GetXaxis()->SetBinLabel(i, label);
1410 TLegend *lResPerChMean =
new TLegend(0.75,0.85,0.99,0.99);
1411 TLegend *lResPerChSigma1 =
new TLegend(0.75,0.85,0.99,0.99);
1412 TLegend *lResPerChSigma2 =
new TLegend(0.75,0.85,0.99,0.99);
1413 TLegend *lResPerChSigma3 =
new TLegend(0.75,0.85,0.99,0.99);
1415 TCanvas* cResPerCh =
new TCanvas(
"cResPerCh",
"cResPerCh",1200,500);
1416 cResPerCh->Divide(4,2);
1417 for (
Int_t ia = 0; ia < 2; ia++) {
1418 gROOT->SetSelectedPad(cResPerCh->cd(1+4*ia));
1421 g->SetMarkerColor(2);
1423 if (ia == 0) lResPerChMean->AddEntry(g,
"cluster out",
"PL");
1426 g->SetMarkerColor(4);
1428 if (ia == 0) lResPerChMean->AddEntry(g,
"cluster in",
"PL");
1429 if (ia == 0) lResPerChMean->Draw();
1430 else lResPerChMean->DrawClone();
1431 gROOT->SetSelectedPad(cResPerCh->cd(2+4*ia));
1435 g->SetMarkerColor(2);
1437 if (ia == 0) lResPerChSigma1->AddEntry(g,
"cluster out",
"PL");
1440 g->SetMarkerColor(4);
1442 if (ia == 0) lResPerChSigma1->AddEntry(g,
"cluster in",
"PL");
1445 g->SetMarkerColor(5);
1447 if (ia == 0) lResPerChSigma1->AddEntry(g,
"MCS",
"PL");
1450 g->SetMarkerColor(3);
1452 if (ia == 0) lResPerChSigma1->AddEntry(g,
"combined 1",
"PL");
1453 if (ia == 0) lResPerChSigma1->Draw();
1454 else lResPerChSigma1->DrawClone();
1455 gROOT->SetSelectedPad(cResPerCh->cd(3+4*ia));
1459 g->SetMarkerColor(2);
1461 if (ia == 0) lResPerChSigma2->AddEntry(g,
"cluster out",
"PL");
1464 if (ia == 0) lResPerChSigma2->AddEntry(g,
"MCS",
"PL");
1467 g->SetMarkerColor(4);
1469 if (ia == 0) lResPerChSigma2->AddEntry(g,
"track res.",
"PL");
1472 if (ia == 0) lResPerChSigma2->AddEntry(g,
"combined 2",
"PL");
1473 if (ia == 0) lResPerChSigma2->Draw();
1474 else lResPerChSigma2->DrawClone();
1475 gROOT->SetSelectedPad(cResPerCh->cd(4+4*ia));
1479 if (ia == 0) lResPerChSigma3->AddEntry(g,
"combined 1",
"PL");
1482 if (ia == 0) lResPerChSigma3->AddEntry(g,
"combined 2",
"PL");
1483 if (ia == 0) lResPerChSigma3->Draw();
1484 else lResPerChSigma3->DrawClone();
1488 TCanvas* cResPerHalfCh =
new TCanvas(
"cResPerHalfCh",
"cResPerHalfCh",1200,500);
1489 cResPerHalfCh->Divide(2,2);
1490 for (
Int_t ia = 0; ia < 2; ia++) {
1491 gROOT->SetSelectedPad(cResPerHalfCh->cd(1+2*ia));
1494 g->SetMarkerColor(2);
1498 g->SetMarkerColor(4);
1500 lResPerChMean->DrawClone();
1501 gROOT->SetSelectedPad(cResPerHalfCh->cd(2+2*ia));
1505 g->SetMarkerColor(3);
1509 lResPerChSigma3->DrawClone();
1513 TCanvas* cResPerDE =
new TCanvas(
"cResPerDE",
"cResPerDE",1200,800);
1514 cResPerDE->Divide(1,4);
1515 for (
Int_t ia = 0; ia < 2; ia++) {
1516 gROOT->SetSelectedPad(cResPerDE->cd(1+ia));
1519 g->SetMarkerColor(2);
1523 g->SetMarkerColor(4);
1525 lResPerChMean->DrawClone();
1526 gROOT->SetSelectedPad(cResPerDE->cd(3+ia));
1530 g->SetMarkerColor(3);
1534 lResPerChSigma3->DrawClone();
1538 TCanvas* cResPerChVsP =
new TCanvas(
"cResPerChVsP",
"cResPerChVsP");
1539 cResPerChVsP->Divide(1,2);
1540 for (
Int_t ia = 0; ia < 2; ia++) {
1541 gROOT->SetSelectedPad(cResPerChVsP->cd(1+ia));
1547 TCanvas* cResPerChVsCent =
new TCanvas(
"cResPerChVsCent",
"cResPerChVsCent");
1548 cResPerChVsCent->Divide(1,2);
1549 for (
Int_t ia = 0; ia < 2; ia++) {
1550 gROOT->SetSelectedPad(cResPerChVsCent->cd(1+ia));
1556 TCanvas* cResPerChVsAngle =
new TCanvas(
"cResPerChVsAngle",
"cResPerChVsAngle");
1557 cResPerChVsAngle->Divide(1,2);
1558 for (
Int_t ia = 0; ia < 2; ia++) {
1559 gROOT->SetSelectedPad(cResPerChVsAngle->cd(1+ia));
1565 TCanvas* cShiftPerChVsP =
new TCanvas(
"cShiftPerChVsP",
"cShiftPerChVsP");
1566 cShiftPerChVsP->Divide(1,2);
1567 for (
Int_t ia = 0; ia < 2; ia++) {
1568 gROOT->SetSelectedPad(cShiftPerChVsP->cd(1+ia));
1574 TCanvas* cShiftPerChVsCent =
new TCanvas(
"cShiftPerChVsCent",
"cShiftPerChVsCent");
1575 cShiftPerChVsCent->Divide(1,2);
1576 for (
Int_t ia = 0; ia < 2; ia++) {
1577 gROOT->SetSelectedPad(cShiftPerChVsCent->cd(1+ia));
1583 TCanvas* cShiftPerChVsAngle =
new TCanvas(
"cShiftPerChVsAngle",
"cShiftPerChVsAngle");
1584 cShiftPerChVsAngle->Divide(1,2);
1585 for (
Int_t ia = 0; ia < 2; ia++) {
1586 gROOT->SetSelectedPad(cShiftPerChVsAngle->cd(1+ia));
1594 printf(
"\nchamber resolution:\n");
1595 printf(
" - non-bending:");
1596 for (
Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) printf((i==0)?
" %5.3f":
", %5.3f",newClusterRes[0][i]);
1597 printf(
"\n - bending:");
1598 for (
Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) printf((i==0)?
" %6.4f":
", %6.4f",newClusterRes[1][i]);
1604 printf(
"\nDE resolution:\n");
1605 printf(
" - non-bending:");
1608 printf((i==0)?
" %5.3f":
", %5.3f", clRes);
1610 printf(
"\n - bending:");
1613 printf((i==0)?
" %6.4f":
", %6.4f", clRes);
1620 printf(
"\nhalf-chamber residual displacements:\n");
1621 printf(
" - non-bending:");
1622 for (
Int_t i = 0; i < 2*AliMUONConstants::NTrackingCh(); i++) {
1624 printf((i==0)?
" %6.4f":
", %6.4f", hChShift);
1626 printf(
"\n - bending:");
1627 for (
Int_t i = 0; i < 2*AliMUONConstants::NTrackingCh(); i++) {
1629 printf((i==0)?
" %6.4f":
", %6.4f", hChShift);
1636 printf(
"\nDE residual displacements:\n");
1637 printf(
" - non-bending:");
1640 printf((i==0)?
" %6.4f":
", %6.4f", deShift);
1642 printf(
"\n - bending:");
1645 printf((i==0)?
" %6.4f":
", %6.4f", deShift);
1664 Int_t nClusters = track.GetNClusters();
1665 for (
Int_t iCluster=0; iCluster<nClusters; iCluster++) {
1667 AliMUONVCluster* cl =
static_cast<AliMUONTrackParam*
>(track.GetTrackParamAtCluster()->UncheckedAt(iCluster))->GetClusterPtr();
1668 Int_t chId = cl->GetChamberId();
1669 Int_t halfChId = (cl->GetX() > 0) ? 2*chId : 2*chId+1;
1670 Int_t deId = cl->GetDetElemId();
1691 cl->SetXYZ(gX,gY,gZ);
1696 Bool_t hasBending, hasNonBending;
1699 if (!hasNonBending) cl->SetErrXY(10., cl->GetErrY());
1700 if (!hasBending) cl->SetErrXY(cl->GetErrX(), 10.);
1719 Int_t maxEventsCut = (
Int_t) (fractionCut * h->GetEntries());
1720 Int_t nBins = h->GetNbinsX();
1724 Int_t eventsCut = 0;
1725 for (minBin = 1; minBin <= nBins; minBin++) {
1726 eventsCut += (
Int_t) h->GetBinContent(minBin);
1727 if (eventsCut > maxEventsCut)
break;
1731 h->GetXaxis()->SetRange(--minBin, h->GetXaxis()->GetLast());
1738 Int_t maxEventsCut = (
Int_t) (fractionCut * h->GetEntries());
1739 Int_t nBins = h->GetNbinsX();
1743 Int_t eventsCut = 0;
1744 for (maxBin = nBins; maxBin >= 1; maxBin--) {
1745 eventsCut += (
Int_t) h->GetBinContent(maxBin);
1746 if (eventsCut > maxEventsCut)
break;
1750 h->GetXaxis()->SetRange(h->GetXaxis()->GetFirst(), ++maxBin);
1768 }
else if (enableFit &&
fGaus) {
1771 Double_t xMin = h->GetXaxis()->GetXmin();
1772 Double_t xMax = h->GetXaxis()->GetXmax();
1773 fGaus->SetRange(xMin, xMax);
1774 fGaus->SetParameters(h->GetEntries(), 0., 0.1);
1775 fGaus->SetParLimits(1, xMin, xMax);
1776 h->Fit(
"fGaus",
"WWNQ");
1779 Int_t rebin =
static_cast<Int_t>(TMath::Min(0.1*h->GetNbinsX(),TMath::Max(0.3*
fGaus->GetParameter(2)/h->GetBinWidth(1),1.)));
1780 while (h->GetNbinsX()%rebin!=0) rebin--;
1784 xMin = TMath::Max(
fGaus->GetParameter(1)-10.*
fGaus->GetParameter(2), h->GetXaxis()->GetXmin());
1785 xMax = TMath::Min(
fGaus->GetParameter(1)+10.*
fGaus->GetParameter(2), h->GetXaxis()->GetXmax());
1786 fGaus->SetRange(xMin, xMax);
1787 fGaus->SetParLimits(1, xMin, xMax);
1788 h->Fit(
"fGaus",
"NQR");
1790 mean =
fGaus->GetParameter(1);
1791 meanErr =
fGaus->GetParError(1);
1792 rms =
fGaus->GetParameter(2);
1793 rmsErr =
fGaus->GetParError(2);
1796 if (!strstr(h->GetName(),
"tmp")) {
1797 Int_t ia = (strstr(h->GetName(),
"ResX")) ? 0 : 1;
1798 Int_t ib = (strstr(h->GetName(),
"ClIn")) ? 0 : 1;
1799 if (strstr(h->GetName(),
"Half"))
1801 else if (strstr(h->GetName(),
"Ch"))
1807 TF1* f = (TF1*)
fGaus->DrawClone(
"same");
1817 mean = h->GetMean();
1818 meanErr = h->GetMeanError();
1820 rmsErr = h->GetRMSError();
1822 if (zoom) h->GetXaxis()->SetRange(0,0);
1828 gMean->SetPoint(i, x, mean);
1829 gMean->SetPointError(i, 0., meanErr);
1832 gRMS->SetPoint(i, x, rms);
1833 gRMS->SetPointError(i, 0., rmsErr);
1844 Double_t meanIn, meanInErr, sigmaIn, sigmaInErr, sigmaOut, sigmaOutErr, clusterRes, clusterResErr, dumy1, dumy2;
1845 for (
Int_t j = 1; j <= hIn->GetNbinsX(); j++) {
1846 TH1D* tmp = hIn->ProjectionY(
"tmp",j,j,
"e");
1847 GetMeanRMS(tmp, meanIn, meanInErr, sigmaIn, sigmaInErr, 0x0, 0x0, 0, 0.);
1850 tmp = hOut->ProjectionY(
"tmp",j,j,
"e");
1851 GetMeanRMS(tmp, dumy1, dumy2, sigmaOut, sigmaOutErr, 0x0, 0x0, 0, 0.);
1854 Double_t x = 0.5 * (hIn->GetXaxis()->GetBinLowEdge(j) + hIn->GetXaxis()->GetBinLowEdge(j+1));
1855 Double_t xErr = x - hIn->GetXaxis()->GetBinLowEdge(j);
1857 gMean->SetPoint(j-1, x, meanIn);
1858 gMean->SetPointError(j-1, xErr, meanInErr);
1860 if (hOut && gSigma) {
1861 clusterRes = TMath::Sqrt(sigmaIn*sigmaOut);
1863 clusterResErr = TMath::Sqrt(sigmaInErr*sigmaOutErr);
1864 gSigma->SetPoint(j-1, x, clusterRes);
1865 gSigma->SetPointError(j-1, xErr, clusterResErr);
1877 Double_t slopeX = param.GetNonBendingSlope();
1878 Double_t slopeY = param.GetBendingSlope();
1879 Double_t qOverPYZ = param.GetInverseBendingMomentum();
1883 Double_t dpZdSlopeY = - qOverPYZ * qOverPYZ * pZ * pZ * pZ * slopeY;
1884 Double_t dpZdQOverPYZ = (qOverPYZ != 0.) ? - pZ / qOverPYZ : - FLT_MAX;
1885 TMatrixD jacob(5,5);
1890 jacob(2,3) = slopeX * dpZdSlopeY;
1891 jacob(2,4) = slopeX * dpZdQOverPYZ;
1892 jacob(3,3) = pZ + slopeY * dpZdSlopeY;
1893 jacob(3,4) = slopeY * dpZdQOverPYZ;
1894 jacob(4,3) = dpZdSlopeY;
1895 jacob(4,4) = dpZdQOverPYZ;
1898 TMatrixD tmp(param.GetCovariances(),TMatrixD::kMultTranspose,jacob);
1899 covP.Mult(jacob,tmp);
1908 hasBending = kFALSE;
1909 hasNonBending = kFALSE;
1912 for (
Int_t iDigit = 0; iDigit < cl->GetNDigits(); iDigit++) {
1914 Int_t manuId = AliMUONVDigit::ManuId(cl->GetDigitId(iDigit));
1918 if (manuId & AliMpConstants::ManuMask(AliMp::kNonBendingPlane)) hasNonBending = kTRUE;
1919 else hasBending = kTRUE;
1932 hasBending = kFALSE;
1933 hasNonBending = kFALSE;
1936 Int_t deId = cl->GetDetElemId();
1937 AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(deId, kFALSE);
1939 AliMp::CathodType cath1 = de->GetCathodType(AliMp::kBendingPlane);
1940 AliMp::CathodType cath2 = de->GetCathodType(AliMp::kNonBendingPlane);
1943 const AliMpVSegmentation* seg1 = AliMpSegmentation::Instance()->GetMpSegmentation(deId, cath1);
1944 const AliMpVSegmentation* seg2 = AliMpSegmentation::Instance()->GetMpSegmentation(deId, cath2);
1945 if (!seg1 || !seg2)
return;
1953 Int_t chId = cl->GetChamberId();
1954 Int_t halfChId = (cl->GetX() > 0) ? 2*chId : 2*chId+1;
1969 AliMpPad pad1 = seg1->PadByPosition(lX, lY, kFALSE);
1970 AliMpPad pad2 = seg2->PadByPosition(lX, lY, kFALSE);
1973 UInt_t padId1 = (pad1.IsValid()) ? AliMUONVDigit::BuildUniqueID(deId, pad1.GetManuId(), pad1.GetManuChannel(), cath1) : 0;
1974 UInt_t padId2 = (pad2.IsValid()) ? AliMUONVDigit::BuildUniqueID(deId, pad2.GetManuId(), pad2.GetManuChannel(), cath2) : 0;
1977 for (
Int_t iDigit = 0; iDigit < cl->GetNDigits(); iDigit++) {
1979 UInt_t digitId = cl->GetDigitId(iDigit);
1981 if (digitId == padId1) {
1984 if (hasNonBending)
break;
1986 }
else if (digitId == padId2) {
1988 hasNonBending = kTRUE;
1989 if (hasBending)
break;
local chi2-X/Y/total per chamber: mean
Short_t fSign
use only tracks of this sign
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.
ClassImp(AliAnalysisTaskDeltaPt) AliAnalysisTaskDeltaPt
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
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 ...