]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG/TRD/AliAnalysisTaskTRDgtuSim.cxx
Merge branch 'feature-movesplit'
[u/mrichter/AliRoot.git] / PWG / TRD / AliAnalysisTaskTRDgtuSim.cxx
CommitLineData
9e7843aa 1#include "AliLog.h"
2
3// analysis framework
4#include "AliAnalysisManager.h"
5#include "AliInputEventHandler.h"
6
7// ESD stuff
8#include "AliESDEvent.h"
9#include "AliESDInputHandler.h"
10
11// GTU simulation
12#include "AliTRDgtuParam.h"
13#include "AliTRDgtuSim.h"
14
15#include "AliAnalysisTaskTRDgtuSim.h"
16#include "AliTRDonlineTrackMatching.h"
17
18AliAnalysisTaskTRDgtuSim::AliAnalysisTaskTRDgtuSim(const char *name) :
19 AliAnalysisTaskSE(name),
20 fOutputList(0x0),
21 fHistStat(0x0),
22 fHistDeltaA(0x0),
23 fGtuSim(new AliTRDgtuSim()),
24 fTrackletLabel(-2),
25 fLabel(-10),
26 fDeltaY(12),
27 fDeltaAlpha(16),
28 fLimitNoTracklets(kTRUE),
29 fMaxNoTracklets(62)
30{
31 // ctor
32
33 DefineOutput(1, TList::Class());
34}
35
36AliAnalysisTaskTRDgtuSim::~AliAnalysisTaskTRDgtuSim()
37{
38 // dtor
39
40 delete fGtuSim;
41}
42
43Bool_t AliAnalysisTaskTRDgtuSim::Notify()
44{
45 // Implemented Notify()
46
47 return AliAnalysisTaskSE::Notify();
48}
49
50void AliAnalysisTaskTRDgtuSim::UserCreateOutputObjects()
51{
52 // create output objects
53
54 OpenFile(1);
55 fOutputList = new TList;
56 fOutputList->SetOwner(kTRUE);
57
58 fHistStat = new TH1F("stat", "stat", 4, .5, 4.5);
59 fHistStat->GetXaxis()->SetBinLabel(1, "identical");
60 fHistStat->GetXaxis()->SetBinLabel(2, "mismatch");
61 fHistStat->GetXaxis()->SetBinLabel(3, "sim only");
62 fHistStat->GetXaxis()->SetBinLabel(4, "raw only");
63 fOutputList->Add(fHistStat);
64
65 fHistDeltaA = new TH1F("deltaA", "delta A", 100, -100., 100.);
66 fOutputList->Add(fHistDeltaA);
67
68 PostData(1, fOutputList);
69}
70
71void AliAnalysisTaskTRDgtuSim::UserExec(Option_t * /* option */)
72{
73 // perform actual analysis
74
75 AliESDEvent *esdEvent =
76 dynamic_cast<AliESDEvent*>(this->InputEvent());
77
78 if (!esdEvent)
79 return;
80
81 AliTRDgtuParam::SetDeltaY(fDeltaY);
82 AliTRDgtuParam::SetDeltaAlpha(fDeltaAlpha);
83 AliTRDgtuParam::SetLimitNoTracklets(fLimitNoTracklets);
84 AliTRDgtuParam::SetMaxNoTracklets(fMaxNoTracklets);
85
86 fGtuSim->RunGTU(0x0, esdEvent, fTrackletLabel, fLabel);
87
88 AliTRDonlineTrackMatching trdMatch;
89 trdMatch.ProcessEvent(esdEvent, kTRUE, fLabel);
90
91 // compare to hardware tracks
92 Check(fLabel, -3);
93
94 PostData(1, fOutputList);
95}
96
97
98void AliAnalysisTaskTRDgtuSim::Terminate(const Option_t*)
99{
100
101}
102
103void AliAnalysisTaskTRDgtuSim::Check(Int_t label, Int_t labelRef)
104{
105 // compare tracks with label label with tracks with label labelRef
106
107 AliESDEvent *esdEvent =
108 dynamic_cast<AliESDEvent*>(this->InputEvent());
109
110 if (!esdEvent)
111 return;
112
113 TList tracksCheck;
114 TList tracksRef;
115
116 Int_t nTracks = esdEvent->GetNumberOfTrdTracks();
117 for (Int_t iTrack = 0; iTrack < nTracks; ++iTrack) {
118 AliESDTrdTrack *trk = esdEvent->GetTrdTrack(iTrack);
119 if (trk->GetLabel() == label)
120 tracksCheck.Add(trk);
121 if (trk->GetLabel() == labelRef)
122 tracksRef.Add(trk);
123 }
124
125 TIter iterTrack(&tracksCheck);
126 while (AliESDTrdTrack *trk = (AliESDTrdTrack*) iterTrack()) {
127 TIter iterTrackRef(&tracksRef);
128 Bool_t foundMatch = kFALSE;
129 while (AliESDTrdTrack *trkRef = (AliESDTrdTrack*) iterTrackRef()) {
130 // check for common tracklets
131 Bool_t commonTracklet = kFALSE;
132 Bool_t allEqual = kTRUE;
133 for (Int_t iLayer = 0; iLayer < 6; ++iLayer) {
134 if (trk->GetTracklet(iLayer)) {
135 if (trk->GetTracklet(iLayer) == trkRef->GetTracklet(iLayer))
136 commonTracklet = kTRUE;
137 else
138 allEqual = kFALSE;
139 }
140 else if (trkRef->GetTracklet(iLayer))
141 allEqual = kFALSE;
142 }
143 if (commonTracklet) {
144 // tracks with a common tracklet should be identical
145 if (allEqual) {
146 // identical track composition
147 fHistStat->Fill(1);
148 Int_t deltaA = trk->GetA() - trkRef->GetA();
149 fHistDeltaA->Fill(deltaA);
150 }
151 else {
152 // track with different tracklets
153 fHistStat->Fill(2);
154 }
155 tracksRef.Remove(trkRef);
156 foundMatch = kTRUE;
157 break;
158 }
159 }
160 if (!foundMatch) {
161 // unmatched sim track
162 fHistStat->Fill(3);
163 }
164 }
165 TIter iterTrackRef(&tracksRef);
166 while (iterTrackRef()) {
167 // unmatched raw track
168 fHistStat->Fill(4);
169 }
170}