]> git.uio.no Git - u/mrichter/AliRoot.git/blame - FMD/analysis/AliFMDAnalysisTaskGenerateBackground.cxx
analysis upgrade to take into account double hits in p+p collisions. Fix of warnings...
[u/mrichter/AliRoot.git] / FMD / analysis / AliFMDAnalysisTaskGenerateBackground.cxx
CommitLineData
2a667047 1#include "AliFMDAnalysisTaskGenerateBackground.h"
2#include "AliESDEvent.h"
3#include "iostream"
4#include "AliESDFMD.h"
5#include "TH2F.h"
6#include "AliTrackReference.h"
7#include "AliStack.h"
8#include "AliFMDAnaParameters.h"
9#include "AliFMDStripIndex.h"
10#include "AliStack.h"
11#include "AliMCParticle.h"
12#include "AliMCEvent.h"
78f6f750 13//#include "AliFMDGeometry.h"
2a667047 14#include "TArray.h"
15#include "AliGenEventHeader.h"
16#include "AliHeader.h"
17#include "AliFMDAnaCalibBackgroundCorrection.h"
78f6f750 18//#include "AliCDBManager.h"
19//#include "AliCDBId.h"
20//#include "AliCDBMetaData.h"
2a667047 21#include "TSystem.h"
22#include "TROOT.h"
23#include "TAxis.h"
24ClassImp(AliFMDAnalysisTaskGenerateBackground)
25
26//_____________________________________________________________________
27AliFMDAnalysisTaskGenerateBackground::AliFMDAnalysisTaskGenerateBackground():
f58a4769 28AliAnalysisTaskSE()
2a667047 29{
30 // Default constructor
31}
32//_____________________________________________________________________
33AliFMDAnalysisTaskGenerateBackground::AliFMDAnalysisTaskGenerateBackground(const char* name):
34 AliAnalysisTaskSE(name),
2a667047 35 fZvtxCut(10),
36 fNvtxBins(10),
78f6f750 37 fNbinsEta(200)
2a667047 38{
f58a4769 39
2a667047 40 DefineOutput(1, TList::Class());
41 DefineOutput(2, TList::Class());
42 DefineOutput(3, TH1F::Class());
43 DefineOutput(4, TList::Class());
44}
45//_____________________________________________________________________
46void AliFMDAnalysisTaskGenerateBackground::UserCreateOutputObjects()
47{
48// Create the output containers
49//
50
51 std::cout<<"Creating output objects"<<std::endl;
52 for(Int_t iring = 0; iring<2;iring++) {
53 Char_t ringChar = (iring == 0 ? 'I' : 'O');
54 Int_t nSec = (iring == 1 ? 40 : 20);
55 for(Int_t v=0; v<fNvtxBins;v++) {
56
57 TH2F* hPrimary = new TH2F(Form("hPrimary_FMD_%c_vtx%d",ringChar,v),
58 Form("hPrimary_FMD_%c_vtx%d",ringChar,v),
59 fNbinsEta, -6,6, nSec, 0,2*TMath::Pi());
60 hPrimary->Sumw2();
61 fListOfPrimaries.Add(hPrimary);
62 }
63 }
64
65
66 for(Int_t det =1; det<=3;det++) {
67 Int_t nRings = (det==1 ? 1 : 2);
68 for(Int_t ring = 0;ring<nRings;ring++) {
69 Int_t nSec = (ring == 1 ? 40 : 20);
70 Char_t ringChar = (ring == 0 ? 'I' : 'O');
4fb49e43 71 TH1F* doubleHits = new TH1F(Form("DoubleHits_FMD%d%c",det,ringChar),
72 Form("DoubleHits_FMD%d%c",det,ringChar),fNbinsEta, -6,6);
73 TH1F* allHits = new TH1F(Form("allHits_FMD%d%c",det,ringChar),
74 Form("allHits_FMD%d%c",det,ringChar), fNbinsEta, -6,6);
75
76 doubleHits->Sumw2();
77 allHits->Sumw2();
78 fListOfHits.Add(allHits);
79 fListOfHits.Add(doubleHits);
80
2a667047 81 for(Int_t v=0; v<fNvtxBins;v++) {
82 TH2F* hHits = new TH2F(Form("hHits_FMD%d%c_vtx%d", det,ringChar,v),
83 Form("hHits_FMD%d%c_vtx%d", det,ringChar,v),
84 fNbinsEta, -6,6, nSec, 0, 2*TMath::Pi());
85 hHits->Sumw2();
86 fListOfHits.Add(hHits);
87
88 }
89 }
90 }
4fb49e43 91
2a667047 92 fVertexBins.SetName("VertexBins");
93 fVertexBins.GetXaxis()->Set(fNvtxBins,-1*fZvtxCut,fZvtxCut);
4fb49e43 94
2a667047 95}
96//_____________________________________________________________________
97void AliFMDAnalysisTaskGenerateBackground::Init()
98{
2a667047 99 fLastTrackByStrip.Reset(-1);
100
101
102}
103//_____________________________________________________________________
104void AliFMDAnalysisTaskGenerateBackground::UserExec(Option_t */*option*/)
105{
106
107 fLastTrackByStrip.Reset(-1);
f58a4769 108 fHitsByStrip.Reset(0);
2a667047 109 AliMCEvent* mcevent = MCEvent();
f58a4769 110 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
2a667047 111
112 AliMCParticle* particle = 0;
113 AliStack* stack = mcevent->Stack();
114
115 UShort_t det,sec,strip;
116 Char_t ring;
117
118 Int_t nTracks = mcevent->GetNumberOfTracks();
119 AliHeader* header = mcevent->Header();
120 AliGenEventHeader* genHeader = header->GenEventHeader();
121
122 TArrayF vertex;
123 genHeader->PrimaryVertex(vertex);
124
125 if(TMath::Abs(vertex.At(2)) > fZvtxCut)
126 return;
127 for(Int_t i = 0 ;i<nTracks;i++) {
128 particle = mcevent->GetTrack(i);
129
130 if(!particle)
131 continue;
132
133 Double_t delta = 2*fZvtxCut/fNvtxBins;
134 Double_t vertexBinDouble = (vertex.At(2) + fZvtxCut) / delta;
135 Int_t vertexBin = (Int_t)vertexBinDouble;
136
137 if(stack->IsPhysicalPrimary(i) && particle->Charge() != 0) {
138
139
140 TH2F* hPrimaryInner = (TH2F*)fListOfPrimaries.FindObject( Form("hPrimary_FMD_%c_vtx%d",'I',vertexBin));
141 TH2F* hPrimaryOuter = (TH2F*)fListOfPrimaries.FindObject( Form("hPrimary_FMD_%c_vtx%d",'O',vertexBin));
142 hPrimaryInner->Fill(particle->Eta(),particle->Phi());
143 hPrimaryOuter->Fill(particle->Eta(),particle->Phi());
144 }
145
146 for(Int_t j=0; j<particle->GetNumberOfTrackReferences();j++) {
147
148 AliTrackReference* ref = particle->GetTrackReference(j);
149
150 if(ref->DetectorId() != AliTrackReference::kFMD)
151 continue;
152 AliFMDStripIndex::Unpack(ref->UserId(),det,ring,sec,strip);
153 Float_t thisStripTrack = fLastTrackByStrip.operator()(det,ring,sec,strip);
154 if(particle->Charge() != 0 && i != thisStripTrack ) {
78f6f750 155 //Double_t x,y,z;
156 //AliFMDGeometry* fmdgeo = AliFMDGeometry::Instance();
157 //fmdgeo->Detector2XYZ(det,ring,sec,strip,x,y,z);
158 Float_t phi = pars->GetPhiFromSector(det,ring,sec);
159 Float_t eta = pars->GetEtaFromStrip(det,ring,sec,strip,vertex.At(2));
160 //Float_t phi = TMath::ATan2(y,x);
161 //if(phi<0) phi = phi+2*TMath::Pi();
162 // Float_t r = TMath::Sqrt(TMath::Power(x,2)+TMath::Power(y,2));
163 //Float_t theta = TMath::ATan2(r,z-vertex.At(2));
164 //Float_t eta = -1*TMath::Log(TMath::Tan(0.5*theta));
2a667047 165 TH2F* hHits = (TH2F*)fListOfHits.FindObject(Form("hHits_FMD%d%c_vtx%d", det,ring,vertexBin));
166 hHits->Fill(eta,phi);
167 Float_t nstrips = (ring =='O' ? 256 : 512);
f58a4769 168 fHitsByStrip.operator()(det,ring,sec,strip) +=1;
4fb49e43 169 TH1F* allHits = (TH1F*)fListOfHits.FindObject(Form("allHits_FMD%d%c",det,ring));
170 TH1F* doubleHits = (TH1F*)fListOfHits.FindObject(Form("DoubleHits_FMD%d%c",det,ring));
f58a4769 171
172 if(fHitsByStrip.operator()(det,ring,sec,strip) == 1)
173 allHits->Fill(eta);
174
175 doubleHits->Fill(eta);
176 /*if(fHitsByStrip.operator()(det,ring,sec,strip) == 2){
177 TH1F* doubleHits = (TH1F*)fListOfHits.FindObject("DoubleHits");
178 doubleHits->Fill(eta,2);
179 }*/
180 //if(fHitsByStrip.operator()(det,ring,sec,strip) > 1){
181 // doubleHits->Fill(eta);
182 // }
183
2a667047 184
185 fLastTrackByStrip.operator()(det,ring,sec,strip) = (Float_t)i;
186 if(strip >0)
187 fLastTrackByStrip.operator()(det,ring,sec,strip-1) = (Float_t)i;
188 if(strip < (nstrips - 1))
189 fLastTrackByStrip.operator()(det,ring,sec,strip+1) = (Float_t)i;
190 }
191 }
192
193 }
194
f58a4769 195
2a667047 196 PostData(1, &fListOfHits);
197 PostData(2, &fListOfPrimaries);
198 PostData(3, &fVertexBins);
199}
200//_____________________________________________________________________
201void AliFMDAnalysisTaskGenerateBackground::Terminate(Option_t */*option*/)
202{
78f6f750 203 /* TH1F* allHits = (TH1F*)fListOfHits.FindObject("allHits");
f58a4769 204 TH1F* doubleHits = (TH1F*)fListOfHits.FindObject("DoubleHits");
205
206 doubleHits->Divide(allHits);
2a667047 207 GenerateCorrection();
f58a4769 208 PostData(1, &fListOfHits);
78f6f750 209 PostData(4, &fListOfCorrection);*/
f58a4769 210
2a667047 211}
212//_____________________________________________________________________
213void AliFMDAnalysisTaskGenerateBackground::GenerateCorrection() {
214
215 fBackground = new AliFMDAnaCalibBackgroundCorrection();
216
217 for(Int_t det= 1; det <=3; det++) {
218 Int_t nRings = (det==1 ? 1 : 2);
219
220 for(Int_t iring = 0; iring<nRings; iring++) {
221 Char_t ring = (iring == 0 ? 'I' : 'O');
4fb49e43 222 TH1F* allHits = (TH1F*)fListOfHits.FindObject(Form("allHits_FMD%d%c",det,ring));
223 TH1F* doubleHits = (TH1F*)fListOfHits.FindObject(Form("DoubleHits_FMD%d%c",det,ring));
224 fBackground->SetDoubleHitCorrection(det,ring,doubleHits);
225 doubleHits->Divide(allHits);
2a667047 226 for(Int_t vertexBin=0;vertexBin<fNvtxBins ;vertexBin++) {
227 TH2F* hHits = (TH2F*)fListOfHits.FindObject(Form("hHits_FMD%d%c_vtx%d", det,ring,vertexBin));
228 TH2F* hPrimary = (TH2F*)fListOfPrimaries.FindObject( Form("hPrimary_FMD_%c_vtx%d",ring,vertexBin));
229 TH2F* hCorrection = (TH2F*)hHits->Clone(Form("FMD%d%c_vtxbin_%d_correction",det,ring,vertexBin));
230 hCorrection->Divide(hPrimary);
231 hCorrection->SetTitle(hCorrection->GetName());
232 fListOfCorrection.Add(hCorrection);
233 fBackground->SetBgCorrection(det,ring,vertexBin,hCorrection);
4fb49e43 234
235
2a667047 236 }
237
238 }
239 }
240 TAxis refAxis(fNvtxBins,-1*fZvtxCut,fZvtxCut);
241 fBackground->SetRefAxis(&refAxis);
242
243}
244//_____________________________________________________________________
245void AliFMDAnalysisTaskGenerateBackground::ReadFromFile(const Char_t* filename, Bool_t storeInOCDB, Int_t runNo) {
246
247 TFile infile(filename);
248 TH1F* hVertex = (TH1F*)infile.Get("VertexBins");
249 fZvtxCut = hVertex->GetXaxis()->GetXmax();
250 fNvtxBins = hVertex->GetXaxis()->GetNbins();
251 fVertexBins.SetName("VertexBins");
252 fVertexBins.GetXaxis()->Set(fNvtxBins,-1*fZvtxCut,fZvtxCut);
253
254 TList* listOfHits = (TList*)infile.Get("Hits");
255 TList* listOfPrim = (TList*)infile.Get("Primaries");
256
257 for(Int_t det =1; det<=3;det++)
258 {
259 Int_t nRings = (det==1 ? 1 : 2);
260 for(Int_t ring = 0;ring<nRings;ring++)
261 {
262 Char_t ringChar = (ring == 0 ? 'I' : 'O');
4fb49e43 263 TH1F* allHits = (TH1F*)listOfHits->FindObject(Form("allHits_FMD%d%c",det,ringChar));
264 TH1F* doubleHits = (TH1F*)listOfHits->FindObject(Form("DoubleHits_FMD%d%c",det,ringChar));
265 fListOfHits.Add(allHits);
266 fListOfHits.Add(doubleHits);
2a667047 267 for(Int_t v=0; v<fNvtxBins;v++)
268 {
269
270 TH2F* hHits = (TH2F*)listOfHits->FindObject(Form("hHits_FMD%d%c_vtx%d", det,ringChar,v));
271 fListOfHits.Add(hHits);
272 }
273 }
274 }
275 for(Int_t iring = 0; iring<2;iring++) {
276 Char_t ringChar = (iring == 0 ? 'I' : 'O');
277 for(Int_t v=0; v<fNvtxBins;v++) {
278
279 TH2F* hPrimary = (TH2F*)listOfPrim->FindObject( Form("hPrimary_FMD_%c_vtx%d",ringChar,v));
280 fListOfPrimaries.Add(hPrimary);
281
282 }
283 }
284 GenerateCorrection();
285
286 TFile fout("backgroundFromFile.root","recreate");
287 fListOfHits.Write();
288 fListOfPrimaries.Write();
289 fListOfCorrection.Write();
290 fVertexBins.Write();
4fb49e43 291
2a667047 292 fout.Close();
293
294 if(storeInOCDB) {
78f6f750 295 TFile fcalib("$ALICE_ROOT/FMD/Correction/Background/background.root","RECREATE");
296 fBackground->Write(AliFMDAnaParameters::fkBackgroundID);
297 fcalib.Close();
298 /* AliCDBManager* cdb = AliCDBManager::Instance();
2a667047 299 cdb->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
300 AliCDBId id(AliFMDAnaParameters::GetBackgroundPath(),runNo,999999999);
301
302 AliCDBMetaData* meta = new AliCDBMetaData;
303 meta->SetResponsible(gSystem->GetUserInfo()->fRealName.Data());
304 meta->SetAliRootVersion(gROOT->GetVersion());
305 meta->SetBeamPeriod(1);
306 meta->SetComment("Background Correction for FMD");
307 meta->SetProperty("key1", fBackground );
308 cdb->Put(fBackground, id, meta);
78f6f750 309 */
2a667047 310 }
311
312}
313//_____________________________________________________________________
314//
315// EOF
316//