1 #include "AliFMDAnalysisTaskGenerateCorrection.h"
2 #include "AliESDEvent.h"
6 #include "AliTrackReference.h"
8 #include "AliFMDAnaParameters.h"
9 #include "AliFMDStripIndex.h"
11 #include "AliMCParticle.h"
12 #include "AliMCEvent.h"
13 //#include "AliFMDGeometry.h"
15 #include "AliGenEventHeader.h"
16 #include "AliHeader.h"
17 #include "AliFMDAnaCalibBackgroundCorrection.h"
18 #include "AliFMDAnaCalibEventSelectionEfficiency.h"
19 //#include "AliCDBManager.h"
20 //#include "AliCDBId.h"
21 //#include "AliCDBMetaData.h"
25 ClassImp(AliFMDAnalysisTaskGenerateCorrection)
27 //_____________________________________________________________________
28 AliFMDAnalysisTaskGenerateCorrection::AliFMDAnalysisTaskGenerateCorrection():
42 // Default constructor
44 //_____________________________________________________________________
45 AliFMDAnalysisTaskGenerateCorrection::AliFMDAnalysisTaskGenerateCorrection(const char* name):
46 AliAnalysisTaskSE(name),
60 DefineOutput(1, TList::Class());
61 DefineOutput(2, TList::Class());
62 DefineOutput(3, TH1F::Class());
63 DefineOutput(4, TList::Class());
65 //_____________________________________________________________________
66 void AliFMDAnalysisTaskGenerateCorrection::UserCreateOutputObjects()
68 // Create the output containers
71 std::cout<<"Creating output objects"<<std::endl;
72 for(Int_t iring = 0; iring<2;iring++) {
73 Char_t ringChar = (iring == 0 ? 'I' : 'O');
74 Int_t nSec = (iring == 1 ? 40 : 20);
75 for(Int_t v=0; v<fNvtxBins;v++) {
77 TH2F* hPrimary = new TH2F(Form("hPrimary_FMD_%c_vtx%d",ringChar,v),
78 Form("hPrimary_FMD_%c_vtx%d",ringChar,v),
79 fNbinsEta, -6,6, nSec, 0,2*TMath::Pi());
81 fListOfPrimaries.Add(hPrimary);
87 for(Int_t det =1; det<=3;det++) {
88 Int_t nRings = (det==1 ? 1 : 2);
89 for(Int_t ring = 0;ring<nRings;ring++) {
90 Int_t nSec = (ring == 1 ? 40 : 20);
91 Char_t ringChar = (ring == 0 ? 'I' : 'O');
92 TH1F* doubleHits = new TH1F(Form("DoubleHits_FMD%d%c",det,ringChar),
93 Form("DoubleHits_FMD%d%c",det,ringChar),fNbinsEta, -6,6);
94 TH1F* allHits = new TH1F(Form("allHits_FMD%d%c",det,ringChar),
95 Form("allHits_FMD%d%c",det,ringChar), fNbinsEta, -6,6);
99 fListOfHits.Add(allHits);
100 fListOfHits.Add(doubleHits);
102 for(Int_t v=0; v<fNvtxBins;v++) {
103 TH2F* hHits = new TH2F(Form("hHits_FMD%d%c_vtx%d", det,ringChar,v),
104 Form("hHits_FMD%d%c_vtx%d", det,ringChar,v),
105 fNbinsEta, -6,6, nSec, 0, 2*TMath::Pi());
107 fListOfHits.Add(hHits);
113 TH1F* hEventsSelected = new TH1F("EventsSelected","EventsSelected",fNvtxBins,0,fNvtxBins);
114 TH1F* hEventsAll = new TH1F("EventsAll","EventsAll",fNvtxBins,0,fNvtxBins);
115 TH1F* hEventsSelectedVtx = new TH1F("EventsSelectedVtx","EventsSelectedVtx",fNvtxBins,0,fNvtxBins);
116 TH1F* hEventsSelectedTrigger = new TH1F("EventsSelectedTrigger","EventsSelectedTrigger",fNvtxBins,0,fNvtxBins);
120 // TH1F* hTriggered = new TH1F("Triggered","Triggered",fNvtxBins,0,fNvtxBins);
121 // TH1F* hTriggeredAll = new TH1F("TriggeredAll","TriggeredAll",fNvtxBins,0,fNvtxBins);
122 hEventsSelected->Sumw2();
124 fListOfHits.Add(hEventsSelected);
125 fListOfHits.Add(hEventsSelectedVtx);
126 fListOfHits.Add(hEventsSelectedTrigger);
127 fListOfPrimaries.Add(hEventsAll);
129 // fListOfHits.Add(hTriggered);
130 // fListOfPrimaries.Add(hTriggeredAll);
132 fVertexBins.SetName("VertexBins");
133 fVertexBins.GetXaxis()->Set(fNvtxBins,-1*fZvtxCut,fZvtxCut);
136 //_____________________________________________________________________
137 void AliFMDAnalysisTaskGenerateCorrection::Init()
139 fLastTrackByStrip.Reset(-1);
143 //_____________________________________________________________________
144 void AliFMDAnalysisTaskGenerateCorrection::UserExec(Option_t */*option*/)
147 fLastTrackByStrip.Reset(-1);
148 fHitsByStrip.Reset(0);
149 AliMCEvent* mcevent = MCEvent();
151 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
154 AliESDEvent* esdevent = (AliESDEvent*)InputEvent();
155 Double_t esdvertex[3];
156 Bool_t vtxStatus = pars->GetVertex(esdevent,esdvertex);
158 AliMCParticle* particle = 0;
159 AliStack* stack = mcevent->Stack();
161 UShort_t det,sec,strip;
164 Int_t nTracks = mcevent->GetNumberOfTracks();
165 AliHeader* header = mcevent->Header();
166 AliGenEventHeader* genHeader = header->GenEventHeader();
169 genHeader->PrimaryVertex(vertex);
171 if(TMath::Abs(vertex.At(2)) > fZvtxCut)
174 Double_t delta = 2*fZvtxCut/fNvtxBins;
175 Double_t vertexBinDouble = (vertex.At(2) + fZvtxCut) / delta;
176 Int_t vertexBin = (Int_t)vertexBinDouble;
178 // Vertex determination correction
179 TH1F* hEventsSelected = (TH1F*)fListOfHits.FindObject("EventsSelected");
180 TH1F* hEventsSelectedVtx = (TH1F*)fListOfHits.FindObject("EventsSelectedVtx");
181 TH1F* hEventsSelectedTrigger = (TH1F*)fListOfHits.FindObject("EventsSelectedTrigger");
182 TH1F* hEventsAll = (TH1F*)fListOfPrimaries.FindObject("EventsAll");
184 // TH1F* hTriggered = (TH1F*)fListOfHits.FindObject("Triggered");
185 // TH1F* hTriggeredAll = (TH1F*)fListOfPrimaries.FindObject("TriggeredAll");
187 Bool_t vtxFound = kTRUE;
191 Bool_t isTriggered = pars->IsEventTriggered(esdevent);
193 if(vtxFound && isTriggered) hEventsSelected->Fill(vertexBin);
195 if(vtxFound) hEventsSelectedVtx->Fill(vertexBin);
196 if(isTriggered) hEventsSelectedTrigger->Fill(vertexBin);
198 hEventsAll->Fill(vertexBin);
200 // if(!vtxFound || !isTriggered) return;
202 for(Int_t i = 0 ;i<nTracks;i++) {
203 particle = (AliMCParticle*) mcevent->GetTrack(i);
208 if(stack->IsPhysicalPrimary(i) && particle->Charge() != 0) {
211 TH2F* hPrimaryInner = (TH2F*)fListOfPrimaries.FindObject( Form("hPrimary_FMD_%c_vtx%d",'I',vertexBin));
212 TH2F* hPrimaryOuter = (TH2F*)fListOfPrimaries.FindObject( Form("hPrimary_FMD_%c_vtx%d",'O',vertexBin));
213 hPrimaryInner->Fill(particle->Eta(),particle->Phi());
214 hPrimaryOuter->Fill(particle->Eta(),particle->Phi());
217 for(Int_t j=0; j<particle->GetNumberOfTrackReferences();j++) {
219 AliTrackReference* ref = particle->GetTrackReference(j);
221 if(ref->DetectorId() != AliTrackReference::kFMD)
223 AliFMDStripIndex::Unpack(ref->UserId(),det,ring,sec,strip);
224 Float_t thisStripTrack = fLastTrackByStrip(det,ring,sec,strip);
225 if(particle->Charge() != 0 && i != thisStripTrack ) {
227 Float_t phi = pars->GetPhiFromSector(det,ring,sec);
228 Float_t eta = pars->GetEtaFromStrip(det,ring,sec,strip,vertex.At(2));
230 TH2F* hHits = (TH2F*)fListOfHits.FindObject(Form("hHits_FMD%d%c_vtx%d", det,ring,vertexBin));
231 hHits->Fill(eta,phi);
232 Float_t nstrips = (ring =='O' ? 256 : 512);
233 fHitsByStrip(det,ring,sec,strip) +=1;
234 TH1F* allHits = (TH1F*)fListOfHits.FindObject(Form("allHits_FMD%d%c",det,ring));
235 TH1F* doubleHits = (TH1F*)fListOfHits.FindObject(Form("DoubleHits_FMD%d%c",det,ring));
237 if(fHitsByStrip(det,ring,sec,strip) == 1)
240 doubleHits->Fill(eta);
242 fLastTrackByStrip(det,ring,sec,strip) = (Float_t)i;
244 fLastTrackByStrip(det,ring,sec,strip-1) = (Float_t)i;
245 if(strip < (nstrips - 1))
246 fLastTrackByStrip(det,ring,sec,strip+1) = (Float_t)i;
253 PostData(1, &fListOfHits);
254 PostData(2, &fListOfPrimaries);
255 PostData(3, &fVertexBins);
257 //_____________________________________________________________________
258 void AliFMDAnalysisTaskGenerateCorrection::Terminate(Option_t */*option*/)
260 /* TH1F* allHits = (TH1F*)fListOfHits.FindObject("allHits");
261 TH1F* doubleHits = (TH1F*)fListOfHits.FindObject("DoubleHits");
263 doubleHits->Divide(allHits);
264 GenerateCorrection();
265 PostData(1, &fListOfHits);
266 PostData(4, &fListOfCorrection);*/
269 //_____________________________________________________________________
270 void AliFMDAnalysisTaskGenerateCorrection::GenerateCorrection() {
272 fBackground = new AliFMDAnaCalibBackgroundCorrection();
273 fEventSelectionEff = new AliFMDAnaCalibEventSelectionEfficiency();
275 //TH1F* hTriggered = (TH1F*)fListOfHits.FindObject("Triggered");
276 //TH1F* hTriggeredAll = (TH1F*)fListOfPrimaries.FindObject("TriggeredAll");
278 TH1F* hEventsSelected = (TH1F*)fListOfHits.FindObject("EventsSelected");
279 TH1F* hEventsSelectedVtx = (TH1F*)fListOfHits.FindObject("EventsSelectedVtx");
280 TH1F* hEventsSelectedTrigger = (TH1F*)fListOfHits.FindObject("EventsSelectedTrigger");
281 TH1F* hEventsAll = (TH1F*)fListOfPrimaries.FindObject("EventsAll");
283 // hEventsAll->Divide(hEventsAll,hEventsSelected,1,1,"B");
284 hEventsSelectedVtx->Divide(hEventsAll);
285 hEventsSelectedTrigger->Divide(hEventsAll);
287 for(Int_t i = 1; i<=hEventsSelected->GetNbinsX(); i++) {
288 if(hEventsSelected->GetBinContent(i) == 0 )
290 Float_t b = hEventsSelected->GetBinContent(i);
291 Float_t db = hEventsSelected->GetBinError(i);
292 Float_t sum = hEventsAll->GetBinContent(i);
293 Float_t dsum = hEventsAll->GetBinError(i);
295 Float_t da = TMath::Sqrt(TMath::Power(db,2) + TMath::Power(dsum,2));
297 Float_t cor = sum / b;
298 Float_t ecor = TMath::Sqrt(TMath::Power(da,2) + TMath::Power(a/(b*db),2)) / b;
300 hEventsAll->SetBinContent(i,cor);
301 hEventsAll->SetBinError(i,ecor);
305 fEventSelectionEff->SetCorrection(hEventsAll);
307 for(Int_t det= 1; det <=3; det++) {
308 Int_t nRings = (det==1 ? 1 : 2);
310 for(Int_t iring = 0; iring<nRings; iring++) {
311 Char_t ring = (iring == 0 ? 'I' : 'O');
312 TH1F* allHits = (TH1F*)fListOfHits.FindObject(Form("allHits_FMD%d%c",det,ring));
313 TH1F* doubleHits = (TH1F*)fListOfHits.FindObject(Form("DoubleHits_FMD%d%c",det,ring));
314 allHits->Divide(doubleHits);
316 fBackground->SetDoubleHitCorrection(det,ring,allHits);
318 for(Int_t vertexBin=0;vertexBin<fNvtxBins ;vertexBin++) {
319 TH2F* hHits = (TH2F*)fListOfHits.FindObject(Form("hHits_FMD%d%c_vtx%d", det,ring,vertexBin));
320 TH2F* hPrimary = (TH2F*)fListOfPrimaries.FindObject( Form("hPrimary_FMD_%c_vtx%d",ring,vertexBin));
321 TH2F* hCorrection = (TH2F*)hHits->Clone(Form("FMD%d%c_vtxbin_%d_correction",det,ring,vertexBin));
322 hCorrection->Divide(hPrimary);
323 /*for(Int_t i = 1; i<=hCorrection->GetNbinsX();i++) {
324 for(Int_t j=1; j<=hCorrection->GetNbinsY();j++) {
325 if(hCorrection()->GetBinContent(i,j) == 0)
334 hCorrection->SetTitle(hCorrection->GetName());
335 fListOfCorrection.Add(hCorrection);
336 fBackground->SetBgCorrection(det,ring,vertexBin,hCorrection);
343 TAxis refAxis(fNvtxBins,-1*fZvtxCut,fZvtxCut);
344 fBackground->SetRefAxis(&refAxis);
347 //_____________________________________________________________________
348 void AliFMDAnalysisTaskGenerateCorrection::ReadFromFile(const Char_t* filename, Bool_t storeInOCDB, Int_t /*runNo*/) {
350 TFile infile(filename);
351 TH1F* hVertex = (TH1F*)infile.Get("VertexBins");
352 fZvtxCut = hVertex->GetXaxis()->GetXmax();
353 fNvtxBins = hVertex->GetXaxis()->GetNbins();
354 fVertexBins.SetName("VertexBins");
355 fVertexBins.GetXaxis()->Set(fNvtxBins,-1*fZvtxCut,fZvtxCut);
357 TList* listOfHits = (TList*)infile.Get("Hits");
358 TList* listOfPrim = (TList*)infile.Get("Primaries");
360 TH1F* hEventsSelected = (TH1F*)listOfHits->FindObject("EventsSelected");
361 TH1F* hEventsSelectedVtx = (TH1F*)listOfHits->FindObject("EventsSelectedVtx");
362 TH1F* hEventsSelectedTrigger = (TH1F*)listOfHits->FindObject("EventsSelectedTrigger");
363 TH1F* hEventsAll = (TH1F*)listOfPrim->FindObject("EventsAll");
365 fListOfHits.Add(hEventsSelected);
366 fListOfHits.Add(hEventsSelectedVtx);
367 fListOfHits.Add(hEventsSelectedTrigger);
368 fListOfPrimaries.Add(hEventsAll);
370 for(Int_t det =1; det<=3;det++)
372 Int_t nRings = (det==1 ? 1 : 2);
373 for(Int_t ring = 0;ring<nRings;ring++)
375 Char_t ringChar = (ring == 0 ? 'I' : 'O');
376 TH1F* allHits = (TH1F*)listOfHits->FindObject(Form("allHits_FMD%d%c",det,ringChar));
377 TH1F* doubleHits = (TH1F*)listOfHits->FindObject(Form("DoubleHits_FMD%d%c",det,ringChar));
378 fListOfHits.Add(allHits);
379 fListOfHits.Add(doubleHits);
380 for(Int_t v=0; v<fNvtxBins;v++)
383 TH2F* hHits = (TH2F*)listOfHits->FindObject(Form("hHits_FMD%d%c_vtx%d", det,ringChar,v));
384 fListOfHits.Add(hHits);
388 for(Int_t iring = 0; iring<2;iring++) {
389 Char_t ringChar = (iring == 0 ? 'I' : 'O');
390 for(Int_t v=0; v<fNvtxBins;v++) {
392 TH2F* hPrimary = (TH2F*)listOfPrim->FindObject( Form("hPrimary_FMD_%c_vtx%d",ringChar,v));
393 fListOfPrimaries.Add(hPrimary);
397 GenerateCorrection();
399 TFile fout("backgroundFromFile.root","recreate");
401 fListOfPrimaries.Write();
402 fListOfCorrection.Write();
406 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
408 TFile fbg(pars->GetPath(pars->GetBackgroundID()),"RECREATE");
409 fBackground->Write(AliFMDAnaParameters::GetBackgroundID());
411 TFile feselect(pars->GetPath(pars->GetEventSelectionEffID()),"RECREATE");
412 fEventSelectionEff->Write(AliFMDAnaParameters::GetEventSelectionEffID());
421 //_____________________________________________________________________