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),
108 fCorrectForSystematics(kTRUE),
109 fRemoveMonoCathCl(kFALSE),
110 fCheckAllPads(kFALSE),
111 fImproveTracks(kFALSE),
112 fShiftHalfCh(kFALSE),
113 fPrintHalfChShift(kFALSE),
115 fPrintDEShift(kFALSE),
119 fOldAlignStorage(""),
120 fOldAlignVersion(-1),
121 fOldAlignSubVersion(-1),
122 fNewAlignStorage(""),
123 fNewAlignVersion(-1),
124 fNewAlignSubVersion(-1),
125 fOldGeoTransformer(NULL),
126 fNewGeoTransformer(NULL),
132 for (
Int_t i = 0; i < 10; i++) SetStartingResolution(i, -1., -1.);
133 for (
Int_t i = 0; i < 1100; i++) fDEIndices[i] = 0;
134 for (
Int_t i = 0; i < 200; i++) fDEIds[i] = 0;
135 for (
Int_t i = 0; i < 20; i++) SetHalfChShift(i, 0., 0.);
136 for (
Int_t i = 0; i < 200; i++) SetDEShift(i, 0., 0.);
145 fResidualsVsCent(NULL),
146 fResidualsVsAngle(NULL),
152 fDefaultStorage(
"raw://"),
154 fShowProgressBar(kFALSE),
155 fPrintClResPerCh(kFALSE),
156 fPrintClResPerDE(kFALSE),
163 fCorrectForSystematics(kTRUE),
164 fRemoveMonoCathCl(kFALSE),
165 fCheckAllPads(kFALSE),
166 fImproveTracks(kFALSE),
167 fShiftHalfCh(kFALSE),
168 fPrintHalfChShift(kFALSE),
170 fPrintDEShift(kFALSE),
174 fOldAlignStorage(
""),
175 fOldAlignVersion(-1),
176 fOldAlignSubVersion(-1),
177 fNewAlignStorage(
""),
178 fNewAlignVersion(-1),
179 fNewAlignSubVersion(-1),
180 fOldGeoTransformer(NULL),
181 fNewGeoTransformer(NULL),
196 DefineOutput(1,TObjArray::Class());
198 DefineOutput(2,TObjArray::Class());
200 DefineOutput(3,TObjArray::Class());
202 DefineOutput(4,TObjArray::Class());
204 DefineOutput(5,TObjArray::Class());
206 DefineOutput(6,TObjArray::Class());
208 DefineOutput(7,TObjArray::Class());
215 if (!AliAnalysisManager::GetAnalysisManager()->IsProofMode()) {
254 const AliMUONRecoParam* recoParam = AliMUONESDInterface::GetTracker()->GetRecoParam();
256 for (
Int_t i = 0; i < 10; i++) {
257 if (recoParam->GetDefaultNonBendingReso(i) > maxSigma[0]) maxSigma[0] = recoParam->GetDefaultNonBendingReso(i);
258 if (recoParam->GetDefaultBendingReso(i) > maxSigma[1]) maxSigma[1] = recoParam->GetDefaultBendingReso(i);
260 const char* axes[2] = {
"X",
"Y"};
261 const char* side[2] = {
"I",
"O"};
262 const Int_t nBins = 5000;
263 const Int_t nSigma = 10;
264 const Int_t pNBins = 20;
265 const Double_t pEdges[2] = {0., 50.};
267 Double_t centRange[2] = {-10., 110.};
268 Int_t nAngleBins = 20;
269 Double_t angleRange[2][2] = {{-15., 15.}, {-40., 40.}};
272 for (
Int_t ia = 0; ia < 2; ia++) {
274 Double_t maxRes = nSigma*maxSigma[ia];
277 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]);
278 h2 =
new TH2F(name.Data(), title.Data(), 10, 0.5, 10.5, nBins, -maxRes, maxRes);
280 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]);
281 h2 =
new TH2F(name.Data(), title.Data(), 10, 0.5, 10.5, nBins, -2.*maxRes, 2.*maxRes);
284 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]);
285 h2 =
new TH2F(name.Data(), title.Data(), 20, 0.5, 20.5, nBins, -maxRes, 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)); }
288 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]);
289 h2 =
new TH2F(name.Data(), title.Data(), 20, 0.5, 20.5, nBins, -2.*maxRes, 2.*maxRes);
290 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)); }
293 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]);
294 h2 =
new TH2F(name.Data(), title.Data(),
fNDE, 0.5,
fNDE+0.5, nBins, -maxRes, maxRes);
295 for (
Int_t i = 1; i <=
fNDE; i++) h2->GetXaxis()->SetBinLabel(i, Form(
"%d",
fDEIds[i]));
297 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]);
298 h2 =
new TH2F(name.Data(), title.Data(),
fNDE, 0.5,
fNDE+0.5, nBins, -2.*maxRes, 2.*maxRes);
299 for (
Int_t i = 1; i <=
fNDE; i++) h2->GetXaxis()->SetBinLabel(i, Form(
"%d",
fDEIds[i]));
302 name = Form(
"hTrackRes%sPerCh",axes[ia]); title = Form(
"track #sigma_{%s} per Ch;chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]);
303 h2 =
new TH2F(name.Data(), title.Data(), 10, 0.5, 10.5, nBins, 0., maxRes);
305 name = Form(
"hTrackRes%sPerHalfCh",axes[ia]); title = Form(
"track #sigma_{%s} per half Ch;half chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]);
306 h2 =
new TH2F(name.Data(), title.Data(), 20, 0.5, 20.5, nBins, 0., maxRes);
307 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)); }
309 name = Form(
"hTrackRes%sPerDE",axes[ia]); title = Form(
"track #sigma_{%s} per DE;DE ID;#sigma_{%s} (cm)",axes[ia],axes[ia]);
310 h2 =
new TH2F(name.Data(), title.Data(),
fNDE, 0.5,
fNDE+0.5, nBins, 0., maxRes);
311 for (
Int_t i = 1; i <=
fNDE; i++) h2->GetXaxis()->SetBinLabel(i, Form(
"%d",
fDEIds[i]));
314 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]);
315 h2 =
new TH2F(name.Data(), title.Data(), 10, 0.5, 10.5, nBins, 0., 0.2);
317 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]);
318 h2 =
new TH2F(name.Data(), title.Data(), 20, 0.5, 20.5, nBins, 0., 0.2);
319 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)); }
321 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]);
322 h2 =
new TH2F(name.Data(), title.Data(),
fNDE, 0.5,
fNDE+0.5, nBins, 0., 0.2);
323 for (
Int_t i = 1; i <=
fNDE; i++) h2->GetXaxis()->SetBinLabel(i, Form(
"%d",
fDEIds[i]));
326 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]);
327 h2 =
new TH2F(name.Data(), title.Data(), 10, 0.5, 10.5, nSigma*nBins, -0.1*maxRes*maxRes, maxRes*maxRes);
331 for (
Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
332 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]);
333 h2 =
new TH2F(name.Data(), title.Data(), pNBins, pEdges[0], pEdges[1], nBins, -maxRes, maxRes);
335 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]);
336 h2 =
new TH2F(name.Data(), title.Data(), pNBins, pEdges[0], pEdges[1], nBins, -2.*maxRes, 2.*maxRes);
339 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]);
340 h2 =
new TH2F(name.Data(), title.Data(),
nCentBins, centRange[0], centRange[1], nBins, -maxRes, maxRes);
342 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]);
343 h2 =
new TH2F(name.Data(), title.Data(),
nCentBins, centRange[0], centRange[1], nBins, -2.*maxRes, 2.*maxRes);
346 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]);
347 h2 =
new TH2F(name.Data(), title.Data(), nAngleBins, angleRange[ia][0], angleRange[ia][1], nBins, -maxRes, maxRes);
349 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]);
350 h2 =
new TH2F(name.Data(), title.Data(), nAngleBins, angleRange[ia][0], angleRange[ia][1], nBins, -2.*maxRes, 2.*maxRes);
353 for (
Int_t j = 0; j < 2; j++) {
354 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]);
355 h2 =
new TH2F(name.Data(), title.Data(), nAngleBins, angleRange[ia][0], angleRange[ia][1], nBins, -maxRes, maxRes);
360 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]);
361 h2 =
new TH2F(name.Data(), title.Data(), pNBins, pEdges[0], pEdges[1], nBins, -maxRes, maxRes);
363 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]);
364 h2 =
new TH2F(name.Data(), title.Data(), pNBins, pEdges[0], pEdges[1], nBins, -2.*maxRes, 2.*maxRes);
367 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]);
368 h2 =
new TH2F(name.Data(), title.Data(),
nCentBins, centRange[0], centRange[1], nBins, -maxRes, maxRes);
370 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]);
371 h2 =
new TH2F(name.Data(), title.Data(),
nCentBins, centRange[0], centRange[1], nBins, -2.*maxRes, 2.*maxRes);
374 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]);
375 h2 =
new TH2F(name.Data(), title.Data(), nAngleBins, angleRange[ia][0], angleRange[ia][1], nBins, -maxRes, maxRes);
377 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]);
378 h2 =
new TH2F(name.Data(), title.Data(), nAngleBins, angleRange[ia][0], angleRange[ia][1], nBins, -2.*maxRes, 2.*maxRes);
382 name = Form(
"hLocalChi2%sPerCh",axes[ia]); title = Form(
"local chi2-%s distribution per chamber;chamber ID;local #chi^{2}_{%s}", axes[ia], axes[ia]);
383 h2 =
new TH2F(name.Data(), title.Data(), 10, 0.5, 10.5, 1000, 0., 25.);
385 name = Form(
"hLocalChi2%sPerDE",axes[ia]); title = Form(
"local chi2-%s distribution per DE;DE ID;local #chi^{2}_{%s}", axes[ia], axes[ia]);
386 h2 =
new TH2F(name.Data(), title.Data(),
fNDE, 0.5,
fNDE+0.5, 1000, 0., 25.);
387 for (
Int_t i = 1; i <=
fNDE; i++) h2->GetXaxis()->SetBinLabel(i, Form(
"%d",
fDEIds[i]));
391 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]);
392 h2 =
new TH2F(name.Data(), title.Data(), 300, 0., 300., 1000, 0., 0.003);
394 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]);
395 h2 =
new TH2F(name.Data(), title.Data(), 300, 0., 300., 1000, 0., 0.02);
400 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.);
402 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.);
403 for (
Int_t i = 1; i <=
fNDE; i++) h2->GetXaxis()->SetBinLabel(i, Form(
"%d",
fDEIds[i]));
407 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.);
409 h2 =
new TH2F(
"hPRes",
"muon momentum reconstructed resolution at vertex vs p;p (GeV/c); #sigma_{p}/p (%)", 300, 0., 300., 1000, 0., 10.);
411 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.);
413 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.);
430 if (!
fOCDBLoaded) AliFatal(
"Problem occur while loading OCDB objects");
441 AliMultSelection *multSelection =
static_cast<AliMultSelection*
>(esd->FindListObject(
"MultSelection"));
442 Float_t centrality = multSelection ? multSelection->GetMultiplicityPercentile(
"V0M") : -1.;
445 AliMUONVTrackReconstructor* tracker = AliMUONESDInterface::GetTracker();
448 Int_t nTracks = (
Int_t) esd->GetNumberOfMuonTracks();
449 for (
Int_t iTrack = 0; iTrack < nTracks; ++iTrack) {
452 AliESDMuonTrack* esdTrack = esd->GetMuonTrack(iTrack);
455 if (!esdTrack->ContainTrackerData())
continue;
461 if (
fSign*esdTrack->Charge() < 0)
continue;
464 if (
fUseMCLabel && esdTrack->GetLabel() < 0)
continue;
471 AliMUONESDInterface::ESDToMUON(*esdTrack, track, kFALSE);
480 AliMUONTrack referenceTrack(track);
483 AliMUONTrackParam trackParamAtFirstCluster(*(static_cast<AliMUONTrackParam*>(track.GetTrackParamAtCluster()->First())));
484 Int_t firstCh = trackParamAtFirstCluster.GetClusterPtr()->GetChamberId();
485 AliMUONTrackExtrap::AddMCSEffect(&trackParamAtFirstCluster, AliMUONConstants::ChamberThicknessInX0(firstCh)/2., -1.);
488 Double_t pXUncorr = trackParamAtFirstCluster.Px();
489 Double_t pYUncorr = trackParamAtFirstCluster.Py();
490 Double_t pZUncorr = trackParamAtFirstCluster.Pz();
491 Double_t pUncorr = trackParamAtFirstCluster.P();
492 TMatrixD covUncorr(5,5);
493 Cov2CovP(trackParamAtFirstCluster,covUncorr);
494 Double_t sigmaPUncorr = TMath::Sqrt(pXUncorr * (pXUncorr*covUncorr(2,2) + pYUncorr*covUncorr(2,3) + pZUncorr*covUncorr(2,4)) +
495 pYUncorr * (pXUncorr*covUncorr(3,2) + pYUncorr*covUncorr(3,3) + pZUncorr*covUncorr(3,4)) +
496 pZUncorr * (pXUncorr*covUncorr(4,2) + pYUncorr*covUncorr(4,3) + pZUncorr*covUncorr(4,4))) / pUncorr;
500 Double_t ptUncorr = TMath::Sqrt(pXUncorr*pXUncorr + pYUncorr*pYUncorr);
501 Double_t sigmaPtUncorr = TMath::Sqrt(pXUncorr * (pXUncorr*covUncorr(2,2) + pYUncorr*covUncorr(2,3)) + pYUncorr * (pXUncorr*covUncorr(3,2) + pYUncorr*covUncorr(3,3))) / ptUncorr;
509 AliMUONTrackParam trackParamAtVtx(trackParamAtFirstCluster);
510 AliMUONTrackExtrap::ExtrapToVertex(&trackParamAtVtx, esdTrack->GetNonBendingCoor(), esdTrack->GetBendingCoor(), esdTrack->GetZ(), 0., 0.);
511 Double_t pXVtx = trackParamAtVtx.Px();
512 Double_t pYVtx = trackParamAtVtx.Py();
513 Double_t pZVtx = trackParamAtVtx.Pz();
514 Double_t pVtx = trackParamAtVtx.P();
515 TMatrixD covVtx(5,5);
517 Double_t sigmaPVtx = TMath::Sqrt(pXVtx * (pXVtx*covVtx(2,2) + pYVtx*covVtx(2,3) + pZVtx*covVtx(2,4)) +
518 pYVtx * (pXVtx*covVtx(3,2) + pYVtx*covVtx(3,3) + pZVtx*covVtx(3,4)) +
519 pZVtx * (pXVtx*covVtx(4,2) + pYVtx*covVtx(4,3) + pZVtx*covVtx(4,4))) / pVtx;
523 Double_t ptVtx = TMath::Sqrt(pXVtx*pXVtx + pYVtx*pYVtx);
524 Double_t sigmaPtVtx = TMath::Sqrt(pXVtx * (pXVtx*covVtx(2,2) + pYVtx*covVtx(2,3)) + pYVtx * (pXVtx*covVtx(3,2) + pYVtx*covVtx(3,3))) / ptVtx;
528 ((
TH2F*)
fTrackRes->UncheckedAt(
kSlopeRes))->Fill(pVtx,TMath::Sqrt(trackParamAtVtx.GetCovariances()(1,1)));
529 ((
TH2F*)
fTrackRes->UncheckedAt(
kSlopeRes+1))->Fill(pVtx,TMath::Sqrt(trackParamAtVtx.GetCovariances()(3,3)));
535 Double_t pXUncorr0 = esdTrack->PxUncorrected();
536 Double_t pYUncorr0 = esdTrack->PyUncorrected();
537 if (TMath::Sqrt(pXUncorr0*pXUncorr0+pYUncorr0*pYUncorr0) <
fMinPt)
continue;
540 Int_t nClusters = track.GetNClusters();
541 for (
Int_t iCluster=0; iCluster<nClusters; iCluster++) {
544 AliMUONTrackParam* trackParam =
static_cast<AliMUONTrackParam*
>(track.GetTrackParamAtCluster()->UncheckedAt(iCluster));
545 AliMUONTrackParam* previousTrackParam =
static_cast<AliMUONTrackParam*
>(track.GetTrackParamAtCluster()->Before(trackParam));
546 AliMUONTrackParam* nextTrackParam =
static_cast<AliMUONTrackParam*
>(track.GetTrackParamAtCluster()->After(trackParam));
547 if (!previousTrackParam && !nextTrackParam) {
548 AliError(Form(
"unable to find a cluster neither before nor after the one at position %d !?!", iCluster));
549 track.RecursiveDump();
555 Bool_t hasBending, hasNonBending;
557 else CheckPadsBelow(trackParam->GetClusterPtr(), hasBending, hasNonBending);
558 if (!hasBending || !hasNonBending)
continue;
562 AliMUONTrackParam currentTrackParam(*trackParam);
563 track.RemoveTrackParamAtCluster(trackParam);
566 AliMUONVCluster* cluster = currentTrackParam.GetClusterPtr();
567 Int_t chId = cluster->GetChamberId();
568 Int_t halfChId = (cluster->GetX() > 0) ? 2*chId : 2*chId+1;
569 Int_t deId = cluster->GetDetElemId();
572 AliMUONTrackParam* referenceTrackParam =
static_cast<AliMUONTrackParam*
>(referenceTrack.GetTrackParamAtCluster()->UncheckedAt(iCluster));
573 Double_t deltaX = cluster->GetX() - referenceTrackParam->GetNonBendingCoor();
574 Double_t deltaY = cluster->GetY() - referenceTrackParam->GetBendingCoor();
577 Double_t angleX = TMath::ATan(referenceTrackParam->GetNonBendingSlope())*TMath::RadToDeg();
578 Double_t angleY = TMath::ATan(referenceTrackParam->GetBendingSlope())*TMath::RadToDeg();
581 Double_t sigmaDeltaX2 = cluster->GetErrX2() - referenceTrackParam->GetCovariances()(0,0);
582 Double_t sigmaDeltaY2 = cluster->GetErrY2() - referenceTrackParam->GetCovariances()(2,2);
583 Double_t localChi2X = (sigmaDeltaX2 > 0.) ? deltaX*deltaX/sigmaDeltaX2 : 0.;
584 Double_t localChi2Y = (sigmaDeltaY2 > 0.) ? deltaY*deltaY/sigmaDeltaY2 : 0.;
585 Double_t localChi2 = 0.5 * referenceTrackParam->GetLocalChi2();
596 Bool_t refit = track.IsValid( 1 << (chId/2) );
600 if (tracker->RefitTrack(track, kFALSE)) {
625 Double_t dZWithPrevious = (previousTrackParam) ? TMath::Abs(previousTrackParam->GetClusterPtr()->GetZ() - cluster->GetZ()) : FLT_MAX;
626 Int_t previousChId = (previousTrackParam) ? previousTrackParam->GetClusterPtr()->GetChamberId() : -1;
627 Double_t dZWithNext = (nextTrackParam) ? TMath::Abs(nextTrackParam->GetClusterPtr()->GetZ() - cluster->GetZ()) : FLT_MAX;
628 AliMUONTrackParam* startingTrackParam = (nextTrackParam) ? nextTrackParam : previousTrackParam;
629 if ((
fExtrapMode == 0 && previousTrackParam && dZWithPrevious < dZWithNext) ||
630 (
fExtrapMode == 1 && previousTrackParam && !(chId/2 == 2 && previousChId/2 == 1) &&
631 !(chId/2 == 3 && previousChId/2 == 2))) startingTrackParam = previousTrackParam;
634 currentTrackParam.SetParameters(startingTrackParam->GetParameters());
635 currentTrackParam.SetZ(startingTrackParam->GetZ());
636 currentTrackParam.SetCovariances(startingTrackParam->GetCovariances());
637 currentTrackParam.ResetPropagator();
640 if (AliMUONTrackExtrap::ExtrapToZCov(¤tTrackParam, currentTrackParam.GetClusterPtr()->GetZ(), kTRUE)) {
643 TMatrixD mcsCov(5,5);
644 if (startingTrackParam == nextTrackParam && chId == 0) {
645 AliMUONTrackParam trackParamForMCS;
646 trackParamForMCS.SetParameters(nextTrackParam->GetParameters());
647 AliMUONTrackExtrap::AddMCSEffect(&trackParamForMCS,AliMUONConstants::ChamberThicknessInX0(nextTrackParam->GetClusterPtr()->GetChamberId()),-1.);
648 const TMatrixD &propagator = currentTrackParam.GetPropagator();
649 TMatrixD tmp(trackParamForMCS.GetCovariances(),TMatrixD::kMultTranspose,propagator);
650 mcsCov.Mult(propagator,tmp);
651 }
else mcsCov.Zero();
654 Double_t trackResX2 = currentTrackParam.GetCovariances()(0,0) + mcsCov(0,0);
655 Double_t trackResY2 = currentTrackParam.GetCovariances()(2,2) + mcsCov(2,2);
656 deltaX = cluster->GetX() - currentTrackParam.GetNonBendingCoor();
657 deltaY = cluster->GetY() - currentTrackParam.GetBendingCoor();
699 track.AddTrackParamAtCluster(currentTrackParam, *(currentTrackParam.GetClusterPtr()), kTRUE);
722 AliCDBManager* cdbm = AliCDBManager::Instance();
736 AliCDBManager* cdbm = AliCDBManager::Instance();
737 cdbm->SetRun(fCurrentRunNumber);
739 if (!AliMUONCDB::LoadField())
return;
741 if (!AliMUONCDB::LoadMapping())
return;
743 AliMUONRecoParam* recoParam = AliMUONCDB::LoadRecoParam();
744 if (!recoParam)
return;
747 else recoParam->ImproveTracks(kFALSE);
749 AliMUONESDInterface::ResetTracker(recoParam);
751 for (
Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
760 while (!it.IsDone()) {
770 TString defaultStorage(cdbm->GetDefaultStorage()->GetType());
771 if (defaultStorage ==
"alien") defaultStorage += Form(
"://folder=%s", cdbm->GetDefaultStorage()->GetBaseFolder().Data());
772 else defaultStorage += Form(
"://%s", cdbm->GetDefaultStorage()->GetBaseFolder().Data());
777 if (cdbm->GetEntryCache()->Contains(
"GRP/Geometry/Data")) cdbm->UnloadFromCache(
"GRP/Geometry/Data");
778 if (cdbm->GetEntryCache()->Contains(
"MUON/Align/Data")) cdbm->UnloadFromCache(
"MUON/Align/Data");
779 if (AliGeomManager::GetGeometry()) AliGeomManager::GetGeometry()->UnlockGeometry();
782 AliGeomManager::LoadGeometry();
783 if (!AliGeomManager::GetGeometry())
return;
786 AliGeomManager::ApplyAlignObjsFromCDB(
"MUON");
794 if (cdbm->GetEntryCache()->Contains(
"GRP/Geometry/Data")) cdbm->UnloadFromCache(
"GRP/Geometry/Data");
795 if (cdbm->GetEntryCache()->Contains(
"MUON/Align/Data")) cdbm->UnloadFromCache(
"MUON/Align/Data");
796 if (AliGeomManager::GetGeometry()) AliGeomManager::GetGeometry()->UnlockGeometry();
799 AliGeomManager::LoadGeometry();
800 if (!AliGeomManager::GetGeometry())
return;
803 AliGeomManager::ApplyAlignObjsFromCDB(
"MUON");
810 printf(
"\nstarting chamber resolution:\n");
811 printf(
" - non-bending:");
812 for (
Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) printf((i==0)?
" %5.3f":
", %5.3f",
fClusterResNB[i]);
813 printf(
"\n - bending:");
814 for (
Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) printf((i==0)?
" %6.4f":
", %6.4f",
fClusterResB[i]);
858 const char* axes[2] = {
"X",
"Y"};
859 const char* side[2] = {
"I",
"O"};
860 Double_t newClusterRes[2][10], newClusterResErr[2][10];
864 for (
Int_t ia = 0; ia < 2; ia++) {
868 g->SetName(Form(
"gResidual%sPerChMean_ClusterIn",axes[ia]));
869 g->SetTitle(Form(
"cluster-track residual-%s per Ch: mean (cluster in);chamber ID;<#Delta_{%s}> (cm)",axes[ia],axes[ia]));
870 g->SetMarkerStyle(kFullDotLarge);
873 g->SetName(Form(
"gResidual%sPerChMean_ClusterOut",axes[ia]));
874 g->SetTitle(Form(
"cluster-track residual-%s per Ch: mean (cluster out);chamber ID;<#Delta_{%s}> (cm)",axes[ia],axes[ia]));
875 g->SetMarkerStyle(kFullDotLarge);
879 g =
new TGraphErrors(2*AliMUONConstants::NTrackingCh());
880 g->SetName(Form(
"gResidual%sPerHalfChMean_ClusterIn",axes[ia]));
881 g->SetTitle(Form(
"cluster-track residual-%s per half Ch: mean (cluster in);half chamber ID;<#Delta_{%s}> (cm)",axes[ia],axes[ia]));
882 g->SetMarkerStyle(kFullDotLarge);
884 g =
new TGraphErrors(2*AliMUONConstants::NTrackingCh());
885 g->SetName(Form(
"gResidual%sPerHalfChMean_ClusterOut",axes[ia]));
886 g->SetTitle(Form(
"cluster-track residual-%s per half Ch: mean (cluster out);half chamber ID;<#Delta_{%s}> (cm)",axes[ia],axes[ia]));
887 g->SetMarkerStyle(kFullDotLarge);
892 g->SetName(Form(
"gResidual%sPerDEMean_ClusterIn",axes[ia]));
893 g->SetTitle(Form(
"cluster-track residual-%s per DE: mean (cluster in);DE ID;<#Delta_{%s}> (cm)",axes[ia],axes[ia]));
894 g->SetMarkerStyle(kFullDotLarge);
897 g->SetName(Form(
"gResidual%sPerDEMean_ClusterOut",axes[ia]));
898 g->SetTitle(Form(
"cluster-track residual-%s per DE: mean (cluster out);DE ID;<#Delta_{%s}> (cm)",axes[ia],axes[ia]));
899 g->SetMarkerStyle(kFullDotLarge);
904 g->SetName(Form(
"gResidual%sPerChSigma_ClusterIn",axes[ia]));
905 g->SetTitle(Form(
"cluster-track residual-%s per Ch: sigma (cluster in);chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
906 g->SetMarkerStyle(kFullDotLarge);
909 g->SetName(Form(
"gResidual%sPerChSigma_ClusterOut",axes[ia]));
910 g->SetTitle(Form(
"cluster-track residual-%s per Ch: sigma (cluster out);chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
911 g->SetMarkerStyle(kFullDotLarge);
915 g->SetName(Form(
"gResidual%sPerChDispersion_ClusterOut",axes[ia]));
916 g->SetTitle(Form(
"cluster-track residual-%s per Ch: dispersion (cluster out);chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
917 g->SetMarkerStyle(kFullDotLarge);
921 g->SetName(Form(
"gCombinedResidual%sPerChSigma",axes[ia]));
922 g->SetTitle(Form(
"combined cluster-track residual-%s per Ch: sigma;chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
923 g->SetMarkerStyle(kFullDotLarge);
927 g =
new TGraphErrors(2*AliMUONConstants::NTrackingCh());
928 g->SetName(Form(
"gCombinedResidual%sPerHalfChSigma",axes[ia]));
929 g->SetTitle(Form(
"combined cluster-track residual-%s per half Ch: sigma;half chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
930 g->SetMarkerStyle(kFullDotLarge);
935 g->SetName(Form(
"gCombinedResidual%sPerDESigma",axes[ia]));
936 g->SetTitle(Form(
"combined cluster-track residual-%s per DE: sigma;DE ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
937 g->SetMarkerStyle(kFullDotLarge);
941 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]);
942 mg =
new TMultiGraph(name.Data(), title.Data());
943 for (
Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
945 g->SetName(Form(
"gShift%sVsP_ch%d",axes[ia],i+1));
946 g->SetMarkerStyle(kFullDotMedium);
947 g->SetMarkerColor(i+1+i/9);
953 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]);
954 mg =
new TMultiGraph(name.Data(), title.Data());
955 for (
Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
957 g->SetName(Form(
"gRes%sVsP_ch%d",axes[ia],i+1));
958 g->SetMarkerStyle(kFullDotMedium);
959 g->SetMarkerColor(i+1+i/9);
965 g->SetName(Form(
"gCombinedResidual%sSigmaVsP",axes[ia]));
966 g->SetTitle(Form(
"cluster %s-resolution integrated over chambers versus momentum: sigma;p (GeV/c^{2});#sigma_{%s} (cm)",axes[ia],axes[ia]));
967 g->SetMarkerStyle(kFullDotLarge);
971 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]);
972 mg =
new TMultiGraph(name.Data(), title.Data());
973 for (
Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
975 g->SetName(Form(
"gShift%sVsCent_ch%d",axes[ia],i+1));
976 g->SetMarkerStyle(kFullDotMedium);
977 g->SetMarkerColor(i+1+i/9);
983 name = Form(
"mgCombinedResidual%sSigmaVsCent",axes[ia]); title = Form(
"cluster %s-resolution per chamber versus centrality;centrality (%%);#sigma_{%s} (cm)",axes[ia],axes[ia]);
984 mg =
new TMultiGraph(name.Data(), title.Data());
985 for (
Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
987 g->SetName(Form(
"gRes%sVsCent_ch%d",axes[ia],i+1));
988 g->SetMarkerStyle(kFullDotMedium);
989 g->SetMarkerColor(i+1+i/9);
995 g->SetName(Form(
"gCombinedResidual%sSigmaVsCent",axes[ia]));
996 g->SetTitle(Form(
"cluster %s-resolution integrated over chambers versus centrality: sigma;centrality (%%);#sigma_{%s} (cm)",axes[ia],axes[ia]));
997 g->SetMarkerStyle(kFullDotLarge);
1001 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]);
1002 mg =
new TMultiGraph(name.Data(), title.Data());
1003 for (
Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
1005 g->SetName(Form(
"gShift%sVsAngle_ch%d",axes[ia],i+1));
1006 g->SetMarkerStyle(kFullDotMedium);
1007 g->SetMarkerColor(i+1+i/9);
1012 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]);
1013 mg =
new TMultiGraph(name.Data(), title.Data());
1014 for (
Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
1015 for (
Int_t j = 0; j < 2; j++) {
1017 g->SetName(Form(
"gShift%sVsAngle_halfCh%d%s",axes[ia],i+1,side[j]));
1018 g->SetMarkerStyle(kFullDotMedium);
1019 g->SetMarkerColor(2*i+j+1+(2*i+j)/9);
1026 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]);
1027 mg =
new TMultiGraph(name.Data(), title.Data());
1028 for (
Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
1030 g->SetName(Form(
"gRes%sVsAngle_ch%d",axes[ia],i+1));
1031 g->SetMarkerStyle(kFullDotMedium);
1032 g->SetMarkerColor(i+1+i/9);
1038 g->SetName(Form(
"gCombinedResidual%sSigmaVsAngle",axes[ia]));
1039 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]));
1040 g->SetMarkerStyle(kFullDotLarge);
1044 g->SetName(Form(
"gTrackRes%sPerCh",axes[ia]));
1045 g->SetTitle(Form(
"track <#sigma_{%s}> per Ch;chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
1046 g->SetMarkerStyle(kFullDotLarge);
1050 g->SetName(Form(
"gMCS%sPerCh",axes[ia]));
1051 g->SetTitle(Form(
"MCS %s-dispersion of extrapolated track per Ch;chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
1052 g->SetMarkerStyle(kFullDotLarge);
1056 g->SetName(Form(
"gClusterRes%sPerCh",axes[ia]));
1057 g->SetTitle(Form(
"cluster <#sigma_{%s}> per Ch;chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
1058 g->SetMarkerStyle(kFullDotLarge);
1061 g =
new TGraphErrors(2*AliMUONConstants::NTrackingCh());
1062 g->SetName(Form(
"gClusterRes%sPerHalfCh",axes[ia]));
1063 g->SetTitle(Form(
"cluster <#sigma_{%s}> per half Ch;half chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
1064 g->SetMarkerStyle(kFullDotLarge);
1068 g->SetName(Form(
"gClusterRes%sPerDE",axes[ia]));
1069 g->SetTitle(Form(
"cluster <#sigma_{%s}> per DE;DE ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
1070 g->SetMarkerStyle(kFullDotLarge);
1074 g->SetName(Form(
"gCalcClusterRes%sPerCh",axes[ia]));
1075 g->SetTitle(Form(
"calculated cluster <#sigma_{%s}> per Ch;chamber ID;#sigma_{%s} (cm)",axes[ia],axes[ia]));
1076 g->SetMarkerStyle(kFullDotLarge);
1080 g->SetName(Form(
"gLocalChi2%sPerChMean",axes[ia]));
1081 g->SetTitle(Form(
"local chi2-%s per Ch: mean;chamber ID;<local #chi^{2}_{%s}>",axes[ia],axes[ia]));
1082 g->SetMarkerStyle(kFullDotLarge);
1086 g->SetName(Form(
"gLocalChi2%sPerDEMean",axes[ia]));
1087 g->SetTitle(Form(
"local chi2-%s per DE: mean;DE ID;<local #chi^{2}_{%s}>",axes[ia],axes[ia]));
1088 g->SetMarkerStyle(kFullDotLarge);
1092 name = Form(
"cDetailRes%sPerChClIn",axes[ia]); title = Form(
"cDetailRes%sPerChClIn",axes[ia]);
1093 c =
new TCanvas(name.Data(), title.Data(), 1200, 500);
1097 name = Form(
"cDetailRes%sPerChClOut",axes[ia]); title = Form(
"cDetailRes%sPerChClOut",axes[ia]);
1098 c =
new TCanvas(name.Data(), title.Data(), 1200, 500);
1102 name = Form(
"cDetailRes%sPerHalfChClIn",axes[ia]); title = Form(
"cDetailRes%sPerHalfChClIn",axes[ia]);
1103 c =
new TCanvas(name.Data(), title.Data(), 1200, 800);
1107 name = Form(
"cDetailRes%sPerHalfChClOut",axes[ia]); title = Form(
"cDetailRes%sPerHalfChClOut",axes[ia]);
1108 c =
new TCanvas(name.Data(), title.Data(), 1200, 800);
1112 name = Form(
"cDetailRes%sPerDEClIn",axes[ia]); title = Form(
"cDetailRes%sPerDEClIn",axes[ia]);
1113 c =
new TCanvas(name.Data(), title.Data(), 1200, 800);
1117 name = Form(
"cDetailRes%sPerDEClOut",axes[ia]); title = Form(
"cDetailRes%sPerDEClOut",axes[ia]);
1118 c =
new TCanvas(name.Data(), title.Data(), 1200, 800);
1138 Double_t meanIn, meanInErr, meanOut, meanOutErr,
sigma, sigmaIn, sigmaInErr, sigmaOut, sigmaOutErr;
1139 Double_t sigmaTrack, sigmaTrackErr, sigmaMCS, sigmaMCSErr, clusterRes, clusterResErr, sigmaCluster, sigmaClusterErr;
1141 for (
Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
1145 tmp->SetTitle(Form(
"chamber %d",i+1));
1151 tmp->SetTitle(Form(
"chamber %d",i+1));
1157 sigma = TMath::Sqrt(sigmaIn*sigmaIn + meanIn*meanIn);
1158 sigmaInErr = (sigma>0) ? TMath::Sqrt(sigmaIn*sigmaIn*sigmaInErr*sigmaInErr + meanIn*meanIn*meanInErr*meanInErr) / sigma : 0.;
1160 sigma = TMath::Sqrt(sigmaOut*sigmaOut + meanOut*meanOut);
1161 sigmaOutErr = (sigma>0) ? TMath::Sqrt(sigmaOut*sigmaOut*sigmaOutErr*sigmaOutErr + meanOut*meanOut*meanOutErr*meanOutErr) / sigma : 0.;
1167 clusterRes = TMath::Sqrt(sigmaIn*sigmaOut);
1169 clusterResErr = TMath::Sqrt(sigmaInErr*sigmaOutErr);
1172 newClusterRes[ia][i] = clusterRes;
1173 newClusterResErr[ia][i] = clusterResErr;
1177 GetMeanRMS(tmp, sigmaTrack, sigmaTrackErr, dumy1, dumy2, (
TGraphErrors*)
fChamberRes->UncheckedAt(
kTrackResPerChMean+ia), 0x0, i, i+1, kFALSE, kFALSE);
1181 GetMeanRMS(tmp, sigmaMCS, sigmaMCSErr, dumy1, dumy2, (
TGraphErrors*)
fChamberRes->UncheckedAt(
kMCSPerChMean+ia), 0x0, i, i+1, kFALSE, kFALSE);
1184 sigmaCluster = sigmaOut*sigmaOut - sigmaTrack*sigmaTrack;
1185 if (sigmaCluster > 0.) {
1186 sigmaCluster = TMath::Sqrt(sigmaCluster);
1187 sigmaClusterErr = TMath::Sqrt(sigmaOut*sigmaOut*sigmaOutErr*sigmaOutErr + sigmaTrack*sigmaTrack*sigmaTrackErr*sigmaTrackErr) / sigmaCluster;
1190 sigmaClusterErr = 0.;
1198 clusterRes = tmp->GetMean();
1199 if (clusterRes > 0.) {
1227 for (
Int_t j = 0; j < 2; j++) {
1242 sigma = TMath::Sqrt(sigmaIn*sigmaIn + meanIn*meanIn);
1243 sigmaInErr = (sigma>0) ? TMath::Sqrt(sigmaIn*sigmaIn*sigmaInErr*sigmaInErr + meanIn*meanIn*meanInErr*meanInErr) / sigma : 0.;
1245 sigma = TMath::Sqrt(sigmaOut*sigmaOut + meanOut*meanOut);
1246 sigmaOutErr = (sigma>0) ? TMath::Sqrt(sigmaOut*sigmaOut*sigmaOutErr*sigmaOutErr + meanOut*meanOut*meanOutErr*meanOutErr) / sigma : 0.;
1250 clusterRes = TMath::Sqrt(sigmaIn*sigmaOut);
1252 clusterResErr = TMath::Sqrt(sigmaInErr*sigmaOutErr);
1258 GetMeanRMS(tmp, sigmaTrack, sigmaTrackErr, dumy1, dumy2, 0x0, 0x0, 0, 0, kFALSE, kFALSE);
1262 GetMeanRMS(tmp, sigmaMCS, sigmaMCSErr, dumy1, dumy2, 0x0, 0x0, 0, 0, kFALSE, kFALSE);
1265 sigmaCluster = sigmaOut*sigmaOut - sigmaTrack*sigmaTrack;
1266 if (sigmaCluster > 0.) {
1267 sigmaCluster = TMath::Sqrt(sigmaCluster);
1268 sigmaClusterErr = TMath::Sqrt(sigmaOut*sigmaOut*sigmaOutErr*sigmaOutErr + sigmaTrack*sigmaTrack*sigmaTrackErr*sigmaTrackErr) / sigmaCluster;
1271 sigmaClusterErr = 0.;
1305 sigma = TMath::Sqrt(sigmaIn*sigmaIn + meanIn*meanIn);
1306 sigmaInErr = (sigma>0) ? TMath::Sqrt(sigmaIn*sigmaIn*sigmaInErr*sigmaInErr + meanIn*meanIn*meanInErr*meanInErr) / sigma : 0.;
1308 sigma = TMath::Sqrt(sigmaOut*sigmaOut + meanOut*meanOut);
1309 sigmaOutErr = (sigma>0) ? TMath::Sqrt(sigmaOut*sigmaOut*sigmaOutErr*sigmaOutErr + meanOut*meanOut*meanOutErr*meanOutErr) / sigma : 0.;
1313 clusterRes = TMath::Sqrt(sigmaIn*sigmaOut);
1315 clusterResErr = TMath::Sqrt(sigmaInErr*sigmaOutErr);
1321 GetMeanRMS(tmp, sigmaTrack, sigmaTrackErr, dumy1, dumy2, 0x0, 0x0, 0, 0, kFALSE, kFALSE);
1325 GetMeanRMS(tmp, sigmaMCS, sigmaMCSErr, dumy1, dumy2, 0x0, 0x0, 0, 0, kFALSE, kFALSE);
1328 sigmaCluster = sigmaOut*sigmaOut - sigmaTrack*sigmaTrack;
1329 if (sigmaCluster > 0.) {
1330 sigmaCluster = TMath::Sqrt(sigmaCluster);
1331 sigmaClusterErr = TMath::Sqrt(sigmaOut*sigmaOut*sigmaOutErr*sigmaOutErr + sigmaTrack*sigmaTrack*sigmaTrackErr*sigmaTrackErr) / sigmaCluster;
1334 sigmaClusterErr = 0.;
1353 for (
Int_t i = 1; i <= 20; i++) {
1354 const char* label = xAxis->GetBinLabel(i);
1369 const char* label = xAxis->GetBinLabel(i);
1382 g->SetName(
"gLocalChi2PerChMean");
1383 g->SetTitle(
"local chi2 per Ch: mean;chamber ID;<local #chi^{2}>");
1384 g->SetMarkerStyle(kFullDotLarge);
1386 for (
Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) {
1387 TH1D* tmp = h2->ProjectionY(
"tmp",i+1,i+1,
"e");
1388 g->SetPoint(i, i+1, tmp->GetMean());
1389 g->SetPointError(i, 0., tmp->GetMeanError());
1396 g->SetName(
"gLocalChi2PerDEMean");
1397 g->SetTitle(
"local chi2 per DE: mean;DE ID;<local #chi^{2}>");
1398 g->SetMarkerStyle(kFullDotLarge);
1401 TH1D* tmp = h2->ProjectionY(
"tmp",i+1,i+1,
"e");
1402 g->SetPoint(i, i+1, tmp->GetMean());
1403 g->SetPointError(i, 0., tmp->GetMeanError());
1408 g->GetXaxis()->Set(fNDE, 0.5, fNDE+0.5);
1410 const char* label = h2->GetXaxis()->GetBinLabel(i);
1411 g->GetXaxis()->SetBinLabel(i, label);
1415 TLegend *lResPerChMean =
new TLegend(0.75,0.85,0.99,0.99);
1416 TLegend *lResPerChSigma1 =
new TLegend(0.75,0.85,0.99,0.99);
1417 TLegend *lResPerChSigma2 =
new TLegend(0.75,0.85,0.99,0.99);
1418 TLegend *lResPerChSigma3 =
new TLegend(0.75,0.85,0.99,0.99);
1420 TCanvas* cResPerCh =
new TCanvas(
"cResPerCh",
"cResPerCh",1200,500);
1421 cResPerCh->Divide(4,2);
1422 for (
Int_t ia = 0; ia < 2; ia++) {
1423 gROOT->SetSelectedPad(cResPerCh->cd(1+4*ia));
1426 g->SetMarkerColor(2);
1428 if (ia == 0) lResPerChMean->AddEntry(g,
"cluster out",
"PL");
1431 g->SetMarkerColor(4);
1433 if (ia == 0) lResPerChMean->AddEntry(g,
"cluster in",
"PL");
1434 if (ia == 0) lResPerChMean->Draw();
1435 else lResPerChMean->DrawClone();
1436 gROOT->SetSelectedPad(cResPerCh->cd(2+4*ia));
1440 g->SetMarkerColor(2);
1442 if (ia == 0) lResPerChSigma1->AddEntry(g,
"cluster out",
"PL");
1445 g->SetMarkerColor(4);
1447 if (ia == 0) lResPerChSigma1->AddEntry(g,
"cluster in",
"PL");
1450 g->SetMarkerColor(5);
1452 if (ia == 0) lResPerChSigma1->AddEntry(g,
"MCS",
"PL");
1455 g->SetMarkerColor(3);
1457 if (ia == 0) lResPerChSigma1->AddEntry(g,
"combined 1",
"PL");
1458 if (ia == 0) lResPerChSigma1->Draw();
1459 else lResPerChSigma1->DrawClone();
1460 gROOT->SetSelectedPad(cResPerCh->cd(3+4*ia));
1464 g->SetMarkerColor(2);
1466 if (ia == 0) lResPerChSigma2->AddEntry(g,
"cluster out",
"PL");
1469 if (ia == 0) lResPerChSigma2->AddEntry(g,
"MCS",
"PL");
1472 g->SetMarkerColor(4);
1474 if (ia == 0) lResPerChSigma2->AddEntry(g,
"track res.",
"PL");
1477 if (ia == 0) lResPerChSigma2->AddEntry(g,
"combined 2",
"PL");
1478 if (ia == 0) lResPerChSigma2->Draw();
1479 else lResPerChSigma2->DrawClone();
1480 gROOT->SetSelectedPad(cResPerCh->cd(4+4*ia));
1484 if (ia == 0) lResPerChSigma3->AddEntry(g,
"combined 1",
"PL");
1487 if (ia == 0) lResPerChSigma3->AddEntry(g,
"combined 2",
"PL");
1488 if (ia == 0) lResPerChSigma3->Draw();
1489 else lResPerChSigma3->DrawClone();
1493 TCanvas* cResPerHalfCh =
new TCanvas(
"cResPerHalfCh",
"cResPerHalfCh",1200,500);
1494 cResPerHalfCh->Divide(2,2);
1495 for (
Int_t ia = 0; ia < 2; ia++) {
1496 gROOT->SetSelectedPad(cResPerHalfCh->cd(1+2*ia));
1499 g->SetMarkerColor(2);
1503 g->SetMarkerColor(4);
1505 lResPerChMean->DrawClone();
1506 gROOT->SetSelectedPad(cResPerHalfCh->cd(2+2*ia));
1510 g->SetMarkerColor(3);
1514 lResPerChSigma3->DrawClone();
1518 TCanvas* cResPerDE =
new TCanvas(
"cResPerDE",
"cResPerDE",1200,800);
1519 cResPerDE->Divide(1,4);
1520 for (
Int_t ia = 0; ia < 2; ia++) {
1521 gROOT->SetSelectedPad(cResPerDE->cd(1+ia));
1524 g->SetMarkerColor(2);
1528 g->SetMarkerColor(4);
1530 lResPerChMean->DrawClone();
1531 gROOT->SetSelectedPad(cResPerDE->cd(3+ia));
1535 g->SetMarkerColor(3);
1539 lResPerChSigma3->DrawClone();
1543 TCanvas* cResPerChVsP =
new TCanvas(
"cResPerChVsP",
"cResPerChVsP");
1544 cResPerChVsP->Divide(1,2);
1545 for (
Int_t ia = 0; ia < 2; ia++) {
1546 gROOT->SetSelectedPad(cResPerChVsP->cd(1+ia));
1552 TCanvas* cResPerChVsCent =
new TCanvas(
"cResPerChVsCent",
"cResPerChVsCent");
1553 cResPerChVsCent->Divide(1,2);
1554 for (
Int_t ia = 0; ia < 2; ia++) {
1555 gROOT->SetSelectedPad(cResPerChVsCent->cd(1+ia));
1561 TCanvas* cResPerChVsAngle =
new TCanvas(
"cResPerChVsAngle",
"cResPerChVsAngle");
1562 cResPerChVsAngle->Divide(1,2);
1563 for (
Int_t ia = 0; ia < 2; ia++) {
1564 gROOT->SetSelectedPad(cResPerChVsAngle->cd(1+ia));
1570 TCanvas* cShiftPerChVsP =
new TCanvas(
"cShiftPerChVsP",
"cShiftPerChVsP");
1571 cShiftPerChVsP->Divide(1,2);
1572 for (
Int_t ia = 0; ia < 2; ia++) {
1573 gROOT->SetSelectedPad(cShiftPerChVsP->cd(1+ia));
1579 TCanvas* cShiftPerChVsCent =
new TCanvas(
"cShiftPerChVsCent",
"cShiftPerChVsCent");
1580 cShiftPerChVsCent->Divide(1,2);
1581 for (
Int_t ia = 0; ia < 2; ia++) {
1582 gROOT->SetSelectedPad(cShiftPerChVsCent->cd(1+ia));
1588 TCanvas* cShiftPerChVsAngle =
new TCanvas(
"cShiftPerChVsAngle",
"cShiftPerChVsAngle");
1589 cShiftPerChVsAngle->Divide(1,2);
1590 for (
Int_t ia = 0; ia < 2; ia++) {
1591 gROOT->SetSelectedPad(cShiftPerChVsAngle->cd(1+ia));
1599 printf(
"\nchamber resolution:\n");
1600 printf(
" - non-bending:");
1601 for (
Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) printf((i==0)?
" %5.3f":
", %5.3f",newClusterRes[0][i]);
1602 printf(
"\n - bending:");
1603 for (
Int_t i = 0; i < AliMUONConstants::NTrackingCh(); i++) printf((i==0)?
" %6.4f":
", %6.4f",newClusterRes[1][i]);
1609 printf(
"\nDE resolution:\n");
1610 printf(
" - non-bending:");
1613 printf((i==0)?
" %5.3f":
", %5.3f", clRes);
1615 printf(
"\n - bending:");
1618 printf((i==0)?
" %6.4f":
", %6.4f", clRes);
1625 printf(
"\nhalf-chamber residual displacements:\n");
1626 printf(
" - non-bending:");
1627 for (
Int_t i = 0; i < 2*AliMUONConstants::NTrackingCh(); i++) {
1629 printf((i==0)?
" %6.4f":
", %6.4f", hChShift);
1631 printf(
"\n - bending:");
1632 for (
Int_t i = 0; i < 2*AliMUONConstants::NTrackingCh(); i++) {
1634 printf((i==0)?
" %6.4f":
", %6.4f", hChShift);
1641 printf(
"\nDE residual displacements:\n");
1642 printf(
" - non-bending:");
1645 printf((i==0)?
" %6.4f":
", %6.4f", deShift);
1647 printf(
"\n - bending:");
1650 printf((i==0)?
" %6.4f":
", %6.4f", deShift);
1669 Int_t nClusters = track.GetNClusters();
1670 for (
Int_t iCluster=0; iCluster<nClusters; iCluster++) {
1672 AliMUONVCluster* cl =
static_cast<AliMUONTrackParam*
>(track.GetTrackParamAtCluster()->UncheckedAt(iCluster))->GetClusterPtr();
1673 Int_t chId = cl->GetChamberId();
1674 Int_t halfChId = (cl->GetX() > 0) ? 2*chId : 2*chId+1;
1675 Int_t deId = cl->GetDetElemId();
1696 cl->SetXYZ(gX,gY,gZ);
1701 Bool_t hasBending, hasNonBending;
1704 if (!hasNonBending) cl->SetErrXY(10., cl->GetErrY());
1705 if (!hasBending) cl->SetErrXY(cl->GetErrX(), 10.);
1724 Int_t maxEventsCut = (
Int_t) (fractionCut * h->GetEntries());
1725 Int_t nBins = h->GetNbinsX();
1729 Int_t eventsCut = 0;
1730 for (minBin = 1; minBin <= nBins; minBin++) {
1731 eventsCut += (
Int_t) h->GetBinContent(minBin);
1732 if (eventsCut > maxEventsCut)
break;
1736 h->GetXaxis()->SetRange(--minBin, h->GetXaxis()->GetLast());
1743 Int_t maxEventsCut = (
Int_t) (fractionCut * h->GetEntries());
1744 Int_t nBins = h->GetNbinsX();
1748 Int_t eventsCut = 0;
1749 for (maxBin = nBins; maxBin >= 1; maxBin--) {
1750 eventsCut += (
Int_t) h->GetBinContent(maxBin);
1751 if (eventsCut > maxEventsCut)
break;
1755 h->GetXaxis()->SetRange(h->GetXaxis()->GetFirst(), ++maxBin);
1773 }
else if (enableFit &&
fGaus) {
1776 Double_t xMin = h->GetXaxis()->GetXmin();
1777 Double_t xMax = h->GetXaxis()->GetXmax();
1778 fGaus->SetRange(xMin, xMax);
1779 fGaus->SetParameters(h->GetEntries(), 0., 0.1);
1780 fGaus->SetParLimits(1, xMin, xMax);
1781 h->Fit(
"fGaus",
"WWNQ");
1784 Int_t rebin =
static_cast<Int_t>(TMath::Min(0.1*h->GetNbinsX(),TMath::Max(0.3*
fGaus->GetParameter(2)/h->GetBinWidth(1),1.)));
1785 while (h->GetNbinsX()%rebin!=0) rebin--;
1789 xMin = TMath::Max(
fGaus->GetParameter(1)-10.*
fGaus->GetParameter(2), h->GetXaxis()->GetXmin());
1790 xMax = TMath::Min(
fGaus->GetParameter(1)+10.*
fGaus->GetParameter(2), h->GetXaxis()->GetXmax());
1791 fGaus->SetRange(xMin, xMax);
1792 fGaus->SetParLimits(1, xMin, xMax);
1793 h->Fit(
"fGaus",
"NQR");
1795 mean =
fGaus->GetParameter(1);
1796 meanErr =
fGaus->GetParError(1);
1797 rms =
fGaus->GetParameter(2);
1798 rmsErr =
fGaus->GetParError(2);
1801 if (!strstr(h->GetName(),
"tmp")) {
1802 Int_t ia = (strstr(h->GetName(),
"ResX")) ? 0 : 1;
1803 Int_t ib = (strstr(h->GetName(),
"ClIn")) ? 0 : 1;
1804 if (strstr(h->GetName(),
"Half"))
1806 else if (strstr(h->GetName(),
"Ch"))
1812 TF1* f = (TF1*)
fGaus->DrawClone(
"same");
1822 mean = h->GetMean();
1823 meanErr = h->GetMeanError();
1825 rmsErr = h->GetRMSError();
1827 if (zoom) h->GetXaxis()->SetRange(0,0);
1833 gMean->SetPoint(i, x, mean);
1834 gMean->SetPointError(i, 0., meanErr);
1837 gRMS->SetPoint(i, x, rms);
1838 gRMS->SetPointError(i, 0., rmsErr);
1849 Double_t meanIn, meanInErr, sigmaIn, sigmaInErr, sigmaOut, sigmaOutErr, clusterRes, clusterResErr, dumy1, dumy2;
1850 for (
Int_t j = 1; j <= hIn->GetNbinsX(); j++) {
1851 TH1D* tmp = hIn->ProjectionY(
"tmp",j,j,
"e");
1852 GetMeanRMS(tmp, meanIn, meanInErr, sigmaIn, sigmaInErr, 0x0, 0x0, 0, 0.);
1855 tmp = hOut->ProjectionY(
"tmp",j,j,
"e");
1856 GetMeanRMS(tmp, dumy1, dumy2, sigmaOut, sigmaOutErr, 0x0, 0x0, 0, 0.);
1859 Double_t x = 0.5 * (hIn->GetXaxis()->GetBinLowEdge(j) + hIn->GetXaxis()->GetBinLowEdge(j+1));
1860 Double_t xErr = x - hIn->GetXaxis()->GetBinLowEdge(j);
1862 gMean->SetPoint(j-1, x, meanIn);
1863 gMean->SetPointError(j-1, xErr, meanInErr);
1865 if (hOut && gSigma) {
1866 clusterRes = TMath::Sqrt(sigmaIn*sigmaOut);
1868 clusterResErr = TMath::Sqrt(sigmaInErr*sigmaOutErr);
1869 gSigma->SetPoint(j-1, x, clusterRes);
1870 gSigma->SetPointError(j-1, xErr, clusterResErr);
1882 Double_t slopeX = param.GetNonBendingSlope();
1883 Double_t slopeY = param.GetBendingSlope();
1884 Double_t qOverPYZ = param.GetInverseBendingMomentum();
1888 Double_t dpZdSlopeY = - qOverPYZ * qOverPYZ * pZ * pZ * pZ * slopeY;
1889 Double_t dpZdQOverPYZ = (qOverPYZ != 0.) ? - pZ / qOverPYZ : - FLT_MAX;
1890 TMatrixD jacob(5,5);
1895 jacob(2,3) = slopeX * dpZdSlopeY;
1896 jacob(2,4) = slopeX * dpZdQOverPYZ;
1897 jacob(3,3) = pZ + slopeY * dpZdSlopeY;
1898 jacob(3,4) = slopeY * dpZdQOverPYZ;
1899 jacob(4,3) = dpZdSlopeY;
1900 jacob(4,4) = dpZdQOverPYZ;
1903 TMatrixD tmp(param.GetCovariances(),TMatrixD::kMultTranspose,jacob);
1904 covP.Mult(jacob,tmp);
1913 hasBending = kFALSE;
1914 hasNonBending = kFALSE;
1917 for (
Int_t iDigit = 0; iDigit < cl->GetNDigits(); iDigit++) {
1919 Int_t manuId = AliMUONVDigit::ManuId(cl->GetDigitId(iDigit));
1923 if (manuId & AliMpConstants::ManuMask(AliMp::kNonBendingPlane)) hasNonBending = kTRUE;
1924 else hasBending = kTRUE;
1937 hasBending = kFALSE;
1938 hasNonBending = kFALSE;
1941 Int_t deId = cl->GetDetElemId();
1942 AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(deId, kFALSE);
1944 AliMp::CathodType cath1 = de->GetCathodType(AliMp::kBendingPlane);
1945 AliMp::CathodType cath2 = de->GetCathodType(AliMp::kNonBendingPlane);
1948 const AliMpVSegmentation* seg1 = AliMpSegmentation::Instance()->GetMpSegmentation(deId, cath1);
1949 const AliMpVSegmentation* seg2 = AliMpSegmentation::Instance()->GetMpSegmentation(deId, cath2);
1950 if (!seg1 || !seg2)
return;
1958 Int_t chId = cl->GetChamberId();
1959 Int_t halfChId = (cl->GetX() > 0) ? 2*chId : 2*chId+1;
1974 AliMpPad pad1 = seg1->PadByPosition(lX, lY, kFALSE);
1975 AliMpPad pad2 = seg2->PadByPosition(lX, lY, kFALSE);
1978 UInt_t padId1 = (pad1.IsValid()) ? AliMUONVDigit::BuildUniqueID(deId, pad1.GetManuId(), pad1.GetManuChannel(), cath1) : 0;
1979 UInt_t padId2 = (pad2.IsValid()) ? AliMUONVDigit::BuildUniqueID(deId, pad2.GetManuId(), pad2.GetManuChannel(), cath2) : 0;
1982 for (
Int_t iDigit = 0; iDigit < cl->GetNDigits(); iDigit++) {
1984 UInt_t digitId = cl->GetDigitId(iDigit);
1986 if (digitId == padId1) {
1989 if (hasNonBending)
break;
1991 }
else if (digitId == padId2) {
1993 hasNonBending = kTRUE;
1994 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.
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()
Bool_t fUseMCLabel
use only tracks with MC label or not
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 ...