]>
Commit | Line | Data |
---|---|---|
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 | ||
18 | AliAnalysisTaskTRDgtuSim::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 | ||
36 | AliAnalysisTaskTRDgtuSim::~AliAnalysisTaskTRDgtuSim() | |
37 | { | |
38 | // dtor | |
39 | ||
40 | delete fGtuSim; | |
41 | } | |
42 | ||
43 | Bool_t AliAnalysisTaskTRDgtuSim::Notify() | |
44 | { | |
45 | // Implemented Notify() | |
46 | ||
47 | return AliAnalysisTaskSE::Notify(); | |
48 | } | |
49 | ||
50 | void 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 | ||
71 | void 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 | ||
98 | void AliAnalysisTaskTRDgtuSim::Terminate(const Option_t*) | |
99 | { | |
100 | ||
101 | } | |
102 | ||
103 | void 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 | } |