1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 ///////////////////////////////////////////////////////////////////////////////
20 // Here some comments on what this task does //
25 #include <TInterpreter.h>
32 #include "AliFMDAnalysisTaskCollector.h"
33 #include "AliAnalysisManager.h"
34 #include "AliESDFMD.h"
35 #include "AliESDEvent.h"
36 #include "AliAODEvent.h"
37 #include "AliAODHandler.h"
38 #include "AliMCEventHandler.h"
40 #include "AliMultiplicity.h"
41 #include "AliESDVertex.h"
42 #include "AliFMDAnaParameters.h"
43 #include "AliFMDAnaCalibBackgroundCorrection.h"
44 #include "AliFMDAnaCalibEnergyDistribution.h"
45 #include "AliFMDAnaCalibEventSelectionEfficiency.h"
46 #include "AliFMDAnaCalibSharingEfficiency.h"
48 //#include "AliFMDGeometry.h"
51 ClassImp(AliFMDAnalysisTaskCollector)
53 //____________________________________________________________________
54 Double_t AliFMDAnalysisTaskCollector::TripleLandau(Double_t *x, Double_t *par) {
56 Double_t energy = x[0];
57 Double_t constant = par[0];
58 Double_t mpv = par[1];
59 Double_t sigma = par[2];
60 Double_t alpha = par[3];
61 Double_t beta = par[4];
63 Double_t f = constant*(TMath::Landau(energy,mpv,sigma,kTRUE)+
64 alpha*TMath::Landau(energy,2*mpv+2*sigma*TMath::Log(2),2*sigma,kTRUE)+
65 beta*TMath::Landau(energy,3*mpv+3*sigma*TMath::Log(3),3*sigma,kTRUE) );
69 //____________________________________________________________________
71 AliFMDAnalysisTaskCollector::AliFMDAnalysisTaskCollector()
83 // Default constructor
87 //____________________________________________________________________
88 AliFMDAnalysisTaskCollector::AliFMDAnalysisTaskCollector(const char* name):
89 AliAnalysisTaskSE(name),
101 // Default constructor
103 DefineOutput(1, TList::Class());
104 fParam = AliFMDAnaParameters::Instance();
106 //____________________________________________________________________
107 void AliFMDAnalysisTaskCollector::UserCreateOutputObjects()
109 // Create the output container
110 printf("AnalysisTaskFMD::CreateOutPutData() \n");
112 fOutputList = new TList();//(TList*)GetOutputData(0);
113 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
115 fArray = new TObjArray();
116 fArray->SetName("FMD");
119 TH1F* hEmptyEdist = 0;
120 TH1F* hRingEdist = 0;
121 for(Int_t nEta = 0; nEta < pars->GetNetaBins(); nEta++) {
122 TObjArray* etaArray = new TObjArray();
123 fArray->AddAtAndExpand(etaArray,nEta);
124 for(Int_t det =1; det<=3;det++)
126 TObjArray* detArray = new TObjArray();
127 detArray->SetName(Form("FMD%d",det));
128 etaArray->AddAtAndExpand(detArray,det);
129 Int_t nRings = (det==1 ? 1 : 2);
130 for(Int_t ring = 0;ring<nRings;ring++)
132 Char_t ringChar = (ring == 0 ? 'I' : 'O');
133 hEdist = new TH1F(Form("FMD%d%c_etabin%d",det,ringChar,nEta),Form("FMD%d%c_etabin%d",det,ringChar,nEta),200,0,6);
134 hEdist->SetXTitle("#Delta E / E_{MIP}");
135 fOutputList->Add(hEdist);
136 detArray->AddAtAndExpand(hEdist,ring);
143 for(Int_t det =1; det<=3;det++)
145 Int_t nRings = (det==1 ? 1 : 2);
146 for(Int_t ring = 0;ring<nRings;ring++)
148 Char_t ringChar = (ring == 0 ? 'I' : 'O');
149 hRingEdist = new TH1F(Form("ringFMD%d%c",det,ringChar),Form("ringFMD%d%c",det,ringChar),200,0,6);
150 hRingEdist->SetXTitle("#Delta E / E_{MIP}");
151 fOutputList->Add(hRingEdist);
152 hEmptyEdist = new TH1F(Form("emptyFMD%d%c",det,ringChar),Form("emptyFMD%d%c",det,ringChar),200,0,6);
153 hEmptyEdist->SetXTitle("#Delta E / E_{MIP}");
154 fOutputList->Add(hEmptyEdist);
158 fZvtxDist = new TH1F("ZvtxDist","Vertex distribution",100,-30,30);
159 fZvtxDist->SetXTitle("z vertex");
160 fOutputList->Add(fZvtxDist);
163 //____________________________________________________________________
164 void AliFMDAnalysisTaskCollector::UserExec(Option_t */*option*/)
167 AliESDEvent* esd = (AliESDEvent*)InputEvent();
168 AliESD* old = esd->GetAliESDOld();
170 esd->CopyFromOldESD();
172 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
173 pars->SetTriggerStatus(esd);
175 pars->SetParametersFromESD(esd);
177 fFirstEvent = kFALSE;
180 TString triggers = esd->GetFiredTriggerClasses();
181 //if(!triggers.IsNull()) return;
182 //Bool_t trigger = pars->IsEventTriggered(esd);
184 Bool_t physics = pars->IsEventTriggered(AliFMDAnaParameters::kMB1);
185 Bool_t empty = pars->IsEventTriggered(AliFMDAnaParameters::kEMPTY);
186 //std::cout<<physics<<" "<<empty<<std::endl;
189 Double_t vertex[3] ={0,0,0};
191 Bool_t vtxStatus = pars->GetVertex(esd,vertex);
197 fZvtxDist->Fill(vertex[2]);
198 if(TMath::Abs(vertex[2]) > pars->GetVtxCutZ())
201 //std::cout<<"Bananer "<<vtxStatus<<" "<<physics<<std::endl;
202 AliESDFMD* fmd = esd->GetFMDData();
209 if(!physics && !empty)
212 const AliMultiplicity* spdMult = esd->GetMultiplicity();
214 fClusters+= (spdMult->GetNumberOfSingleClusters() + spdMult->GetNumberOfTracklets());
217 fClustersEmpty+= (spdMult->GetNumberOfSingleClusters() + spdMult->GetNumberOfTracklets());
220 std::cout<<spdMult->GetNumberOfSingleClusters()<<" "<<spdMult->GetNumberOfTracklets()<<std::endl;
223 TH1F* emptyEdist = 0;
225 for(UShort_t det=1;det<=3;det++) {
227 Int_t nRings = (det==1 ? 1 : 2);
228 for (UShort_t ir = 0; ir < nRings; ir++) {
229 Char_t ring = (ir == 0 ? 'I' : 'O');
230 emptyEdist = (TH1F*)fOutputList->FindObject(Form("emptyFMD%d%c",det,ring));
231 ringEdist = (TH1F*)fOutputList->FindObject(Form("ringFMD%d%c",det,ring));
232 UShort_t nsec = (ir == 0 ? 20 : 40);
233 UShort_t nstr = (ir == 0 ? 512 : 256);
235 for(UShort_t sec =0; sec < nsec; sec++) {
236 for(UShort_t strip = 0; strip < nstr; strip++) {
239 Float_t mult = fmd->Multiplicity(det,ring,sec,strip);
240 if(mult == AliESDFMD::kInvalidMult || mult == 0) continue;
242 Float_t eta = pars->GetEtaFromStrip(det,ring,sec,strip,vertex[2]);
244 Int_t nEta = pars->GetEtaBin(eta);
246 // std::cout<<det<<" "<<ring<<" "<<sec<<" "<<strip<<" "<<vertex[2]<<" "<<eta<<" "<<nEta<<std::endl;
248 Edist = (TH1F*)fOutputList->FindObject(Form("FMD%d%c_etabin%d",det,ring,nEta));
250 ringEdist->Fill(mult);
253 emptyEdist->Fill(mult);
257 AliWarning("Something is wrong - wrong trigger");
266 PostData(1, fOutputList);
270 //____________________________________________________________________
272 void AliFMDAnalysisTaskCollector::Terminate(Option_t */*option*/) {
273 std::cout<<"Analysed "<<fEvents<<" events and "<<fEmptyEvents<<" empty"<<std::endl;
274 std::cout<<fClusters / fEvents << " clusters per physics event and "<<fClustersEmpty / fEmptyEvents<< " clusters per empty event"<<std::endl;
276 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
279 for(Int_t det = 1; det<=3; det++) {
280 Int_t nRings = (det == 1 ? 1 : 2);
281 for(Int_t ring = 0;ring<nRings; ring++) {
283 Char_t ringChar = (ring == 0 ? 'I' : 'O');
284 TH1F* hRingEdist = (TH1F*)fOutputList->FindObject(Form("ringFMD%d%c",det,ringChar));
285 TH1F* hEmptyEdist = (TH1F*)fOutputList->FindObject(Form("emptyFMD%d%c",det,ringChar));
287 hEmptyEdist->Scale(1./(Float_t)fEmptyEvents);
290 hRingEdist->Scale(1./(Float_t)fEvents);
291 for(Int_t nEta = 0; nEta < pars->GetNetaBins(); nEta++) {
292 TH1F* hEdist = (TH1F*)fOutputList->FindObject(Form("FMD%d%c_etabin%d",det,ringChar,nEta));
294 hEdist->Scale(1./(Float_t)fEvents);
302 //____________________________________________________________________
303 void AliFMDAnalysisTaskCollector::ReadFromFile(const Char_t* filename, Bool_t store, Int_t speciesOption) {
307 //1: Pb+Pb triple landau convolution fit
309 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
310 //pars->Init(kTRUE,AliFMDAnaParameters::kBackgroundCorrection);
312 TFile fin(filename,"UPDATE");
314 TList* list = (TList*)fin.Get("energyDist");
316 AliFMDAnaCalibEnergyDistribution* EnergyDist = new AliFMDAnaCalibEnergyDistribution();
318 EnergyDist->SetNetaBins(pars->GetNetaBins());
319 EnergyDist->SetEtaLimits(pars->GetEtaMin(),pars->GetEtaMax());
323 for(Int_t det = 1; det<=3; det++) {
324 Int_t nRings = (det == 1 ? 1 : 2);
325 for(Int_t ring = 0;ring<nRings; ring++) {
326 Char_t ringChar = (ring == 0 ? 'I' : 'O');
327 TH1F* hEmptyEdist = (TH1F*)list->FindObject(Form("emptyFMD%d%c",det,ringChar));
328 TH1F* hRingEdist = (TH1F*)list->FindObject(Form("ringFMD%d%c",det,ringChar));
329 fitFunc = FitEnergyDistribution(hEmptyEdist, speciesOption) ;
331 fitFunc->Write(Form("emptyFMD%d%c_fitfunc",det,ringChar),TObject::kWriteDelete);
332 fitFunc = FitEnergyDistribution(hRingEdist, speciesOption) ;
334 fitFunc->Write(Form("FMD%d%c_fitfunc",det,ringChar),TObject::kWriteDelete);
337 EnergyDist->SetEmptyEnergyDistribution(det,ringChar,hEmptyEdist);
338 EnergyDist->SetRingEnergyDistribution(det,ringChar,hRingEdist);
339 for(Int_t nEta = 0; nEta < pars->GetNetaBins(); nEta++) {
340 TH1F* hEdist = (TH1F*)list->FindObject(Form("FMD%d%c_etabin%d",det,ringChar,nEta));
342 fitFunc = FitEnergyDistribution(hEdist, speciesOption) ;
344 fitFunc->Write(Form("FMD%d%c_etabin%d_fitfunc",det,ringChar,nEta),TObject::kWriteDelete);
345 EnergyDist->SetEnergyDistribution(det,ringChar,nEta,hEdist);
357 TFile fcalib(pars->GetPath(pars->GetEdistID() ),"RECREATE");
358 EnergyDist->Write(AliFMDAnaParameters::GetEdistID());
365 //____________________________________________________________________
366 TF1* AliFMDAnalysisTaskCollector::FitEnergyDistribution(TH1F* hEnergy, Int_t /*speciesOption*/) {
367 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
369 if(hEnergy->GetEntries() != 0) {
371 hEnergy->GetXaxis()->SetRangeUser(0.2,hEnergy->GetXaxis()->GetXmax());
373 if(pars->GetCollisionSystem() == 0)
374 fitFunc = new TF1("FMDfitFunc","landau",hEnergy->GetBinCenter(hEnergy->GetMaximumBin())-0.2,3);
375 if(pars->GetCollisionSystem() == 1) {
376 fitFunc = new TF1("FMDfitFunc",TripleLandau,hEnergy->GetBinCenter(hEnergy->GetMaximumBin())-0.2,5,5);
377 fitFunc->SetParNames("constant","MPV","sigma","2-Mip weight","3-Mip weight");
378 fitFunc->SetParameters(10,0.8,0.1,0.05,0.01);
379 fitFunc->SetParLimits(1,0.6,1.2);
380 fitFunc->SetParLimits(3,0,1);
381 fitFunc->SetParLimits(4,0,1);
384 hEnergy->Fit(fitFunc,"","",hEnergy->GetBinCenter(hEnergy->GetMaximumBin())-0.2,3);
390 //____________________________________________________________________