]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG/TRD/AliAnalysisTaskTRDgtuSim.cxx
Merge branch 'feature-movesplit'
[u/mrichter/AliRoot.git] / PWG / TRD / AliAnalysisTaskTRDgtuSim.cxx
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 }