4 #include <TInterpreter.h>
10 //#include "AliFMDDebug.h"
11 #include "AliFMDAnalysisTaskSharing.h"
12 #include "AliAnalysisManager.h"
13 #include "AliESDFMD.h"
14 //#include "AliFMDGeometry.h"
15 #include "AliMCEventHandler.h"
17 #include "AliESDVertex.h"
18 #include "AliMultiplicity.h"
19 #include "AliFMDAnaParameters.h"
20 //#include "/home/canute/ALICE/AliRoot/PWG0/AliPWG0Helper.h"
21 //#include "AliFMDParameters.h"
23 ClassImp(AliFMDAnalysisTaskSharing)
25 //_____________________________________________________________________
26 AliFMDAnalysisTaskSharing::AliFMDAnalysisTaskSharing()
39 // Default constructor
40 DefineInput (0, AliESDEvent::Class());
41 DefineOutput(0, AliESDFMD::Class());
42 DefineOutput(1, AliESDVertex::Class());
43 DefineOutput(2, AliESDEvent::Class());
44 DefineOutput(3, TList::Class());
46 //_____________________________________________________________________
47 AliFMDAnalysisTaskSharing::AliFMDAnalysisTaskSharing(const char* name, Bool_t SE):
48 AliAnalysisTask(name, "AnalysisTaskFMD"),
63 DefineInput (0, AliESDEvent::Class());
64 DefineOutput(0, AliESDFMD::Class());
65 DefineOutput(1, AliESDVertex::Class());
66 DefineOutput(2, AliESDEvent::Class());
67 DefineOutput(3, TList::Class());
70 //_____________________________________________________________________
71 void AliFMDAnalysisTaskSharing::CreateOutputObjects()
74 foutputESDFMD = new AliESDFMD();
77 fEsdVertex = new AliESDVertex();
80 fDiagList = new TList();
82 fDiagList->SetName("Sharing diagnostics");
83 for(Int_t det = 1; det<=3; det++) {
84 Int_t nRings = (det==1 ? 1 : 2);
86 for(Int_t iring = 0;iring<nRings; iring++) {
87 Char_t ringChar = (iring == 0 ? 'I' : 'O');
88 TH1F* hEdist = new TH1F(Form("Edist_before_sharing_FMD%d%c", det, ringChar),
89 Form("Edist_before_sharing_FMD%d%c", det, ringChar),
91 TH1F* hEdist_after = new TH1F(Form("Edist_after_sharing_FMD%d%c", det, ringChar),
92 Form("Edist_after_sharing_FMD%d%c", det, ringChar),
96 TH1F* hNstripsHit = new TH1F(Form("N_strips_hit_FMD%d%c",det,ringChar),
97 Form("N_strips_hit_FMD%d%c",det,ringChar),
99 fDiagList->Add(hEdist);
100 fDiagList->Add(hEdist_after);
101 fDiagList->Add(hNstripsHit);
106 //_____________________________________________________________________
107 void AliFMDAnalysisTaskSharing::ConnectInputData(Option_t */*option*/)
110 fESD = (AliESDEvent*)GetInputData(0);
112 //_____________________________________________________________________
113 void AliFMDAnalysisTaskSharing::Exec(Option_t */*option*/)
116 AliESD* old = fESD->GetAliESDOld();
118 fESD->CopyFromOldESD();
121 foutputESDFMD->Clear();
125 fEsdVertex->SetXYZ(vertex);
127 Bool_t isTriggered = AliPWG0Helper::IsEventTriggered(fESD, AliPWG0Helper::kMB1);
131 std::cout<<"no trigger"<<std::endl;
137 if(vertex[0] == 0 && vertex[1] == 0 && vertex[2] == 0) {
144 const AliMultiplicity* testmult = fESD->GetMultiplicity();
146 Int_t nTrackLets = testmult->GetNumberOfTracklets();
147 if(nTrackLets < 1000) foutputESDFMD->SetUniqueID(kTRUE);
148 else foutputESDFMD->SetUniqueID(kFALSE);
150 AliESDFMD* fmd = fESD->GetFMDData();
151 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
154 for(UShort_t det=1;det<=3;det++) {
155 Int_t nRings = (det==1 ? 1 : 2);
156 for (UShort_t ir = 0; ir < nRings; ir++) {
157 Char_t ring = (ir == 0 ? 'I' : 'O');
158 UShort_t nsec = (ir == 0 ? 20 : 40);
159 UShort_t nstr = (ir == 0 ? 512 : 256);
161 TH1F* hEdist = (TH1F*)fDiagList->FindObject(Form("Edist_before_sharing_FMD%d%c",det,ring));
163 for(UShort_t sec =0; sec < nsec; sec++) {
164 fSharedThis = kFALSE;
165 fSharedPrev = kFALSE;
168 for(UShort_t strip = 0; strip < nstr; strip++) {
169 foutputESDFMD->SetMultiplicity(det,ring,sec,strip,0.);
170 Float_t mult = fmd->Multiplicity(det,ring,sec,strip);
172 if(mult == AliESDFMD::kInvalidMult || mult == 0) continue;
174 //Double_t eta = EtaFromStrip(det,ring,sec,strip,vertex[2]);//fmd->Eta(det,ring,sec,strip);
175 //Double_t eta = fmd->Eta(det,ring,sec,strip);
176 Float_t eta = pars->GetEtaFromStrip(det,ring,sec,strip,vertex[2]);
177 //std::cout<<EtaFromStrip(det,ring,sec,strip,vertex[2]) <<" "<<fmd->Eta(det,ring,sec,strip)<<std::endl;
180 if(fmd->IsAngleCorrected())
181 mult = mult/TMath::Cos(Eta2Theta(eta));
185 if(fmd->Multiplicity(det,ring,sec,strip-1) != AliESDFMD::kInvalidMult) {
186 Eprev = fmd->Multiplicity(det,ring,sec,strip-1);
187 if(fmd->IsAngleCorrected())
188 Eprev = Eprev/TMath::Cos(Eta2Theta(fmd->Eta(det,ring,sec,strip-1)));
190 if(strip != nstr - 1)
191 if(fmd->Multiplicity(det,ring,sec,strip+1) != AliESDFMD::kInvalidMult) {
192 Enext = fmd->Multiplicity(det,ring,sec,strip+1);
193 if(fmd->IsAngleCorrected())
194 Enext = Enext/TMath::Cos(Eta2Theta(fmd->Eta(det,ring,sec,strip+1)));
197 Float_t merged_energy = GetMultiplicityOfStrip(mult,eta,Eprev,Enext,det,ring,sec,strip);
199 if(merged_energy > 0 )
201 foutputESDFMD->SetMultiplicity(det,ring,sec,strip,merged_energy);
202 foutputESDFMD->SetEta(det,ring,sec,strip,eta);
210 PostData(0, foutputESDFMD);
211 PostData(1, fEsdVertex);
213 PostData(3, fDiagList);
216 //_____________________________________________________________________
217 Float_t AliFMDAnalysisTaskSharing::GetMultiplicityOfStrip(Float_t mult,
224 UShort_t /*strip*/) {
225 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
227 Float_t merged_energy = 0;
228 //Float_t nParticles = 0;
229 Float_t cutLow = 0.15;
234 //AliFMDParameters* recopars = AliFMDParameters::Instance();
235 //cutLow = (5*recopars->GetPedestalWidth(det,ring,sec,strip))/(recopars->GetPulseGain(det,ring,sec,strip)*recopars->GetDACPerMIP());
239 Float_t cutHigh = pars->GetMPV(det,ring,eta) - 3*pars->GetSigma(det,ring,eta);
240 // Float_t cutPart = pars->GetMPV(det,ring,eta) - 5*pars->GetSigma(det,ring,eta);
241 Float_t Etotal = mult;
244 // std::cout<<mult<<" "<<det<<" "<<ring<<" "<<sec<<" "<<strip<<std::endl;
245 //Float_t slow_particle_cut = 2*pars->GetMPV(det,ring,eta);
247 //if(recopars->IsDead(det,ring,sec,strip))
248 // std::cout<<"dead channel"<<std::endl;
249 //if(foutputESDFMD->GetUniqueID() == kTRUE) {
250 // Float_t mpv = pars->GetMPV(det,ring,eta);
253 if(foutputESDFMD->GetUniqueID() == kFALSE) {
259 fEnergy = fEnergy + mult;
263 if( (Enext < cutLow && fEnergy > 0 ) || fNstrips >2 ){
265 //if((fEnergy*TMath::Cos(Eta2Theta(eta))) > cutPart || fNstrips > 1) {
267 merged_energy = fEnergy*TMath::Cos(Eta2Theta(eta));
268 TH1F* hEdist = (TH1F*)fDiagList.FindObject(Form("Edist_after_sharing_FMD%d%c",det,ring));
269 hEdist->Fill(fEnergy);
270 TH1F* hNstrips = (TH1F*)fDiagList.FindObject(Form("N_strips_hit_FMD%d%c",det,ring));
271 hNstrips->Fill(fNstrips);
272 // std::cout<<Form("Merged signals %f %f %f into %f , %f in det %d, ring %c, sec %d, strip %d",Eprev, mult, Enext, fEnergy/TMath::Cos(Eta2Theta(eta)),fEnergy,det,ring,sec,strip )<<std::endl;
276 //std::cout<<Form("NO HIT for %f %f %f into %f , %f in strip %d, sec %d, ring %c, det %d, cuts %f , %f",Eprev, mult, Enext, fEnergy/TMath::Cos(Eta2Theta(eta)),fEnergy,strip,sec,ring,det,cutPart,cutHigh )<<std::endl;
281 return merged_energy;
289 //std::cout<<det<<ring<<" "<<sec<<" "<<strip<<" "<<cutLow<<std::endl;
291 fSharedThis = kFALSE;
296 /* if(mult < 0.33*pars->GetMPV(det,ring,eta)) {
297 fSharedThis = kFALSE;
298 fSharedPrev = kFALSE;
301 if(mult<Enext && Enext>cutHigh && foutputESDFMD->GetUniqueID() == kTRUE)
303 fSharedThis = kFALSE;
304 fSharedPrev = kFALSE;
309 // std::cout<<"rejecting hit in FMD "<<det<<" "<<ring<<std::endl;
310 fSharedThis = kFALSE;
311 fSharedPrev = kFALSE;
315 if(Eprev > cutLow && Eprev < cutHigh && !fSharedPrev ) {
319 if(Enext > cutLow && Enext < cutHigh ) {
323 TH1F* hEdist = (TH1F*)fDiagList->FindObject(Form("Edist_after_sharing_FMD%d%c",det,ring));
324 hEdist->Fill(Etotal);
326 Etotal = Etotal*TMath::Cos(Eta2Theta(eta));
329 merged_energy = Etotal;
331 // if(det == 1 && ring =='I')
332 // std::cout<<Form("Merged signals %f %f %f into %f , %f in strip %d, sec %d, ring %c, det %d",Eprev, mult, Enext, Etotal/TMath::Cos(Eta2Theta(eta)),Etotal,strip,sec,ring,det )<<std::endl;
334 else{// if(Etotal > 0) {
335 //if(det == 3 && ring =='I')
336 // std::cout<<Form("NO HIT for %f %f %f into %f , %f in strip %d, sec %d, ring %c, det %d, cuts %f , %f",Eprev, mult, Enext, Etotal/TMath::Cos(Eta2Theta(eta)),Etotal,strip,sec,ring,det,cutPart,cutHigh )<<std::endl;
337 fSharedThis = kFALSE;
338 fSharedPrev = kFALSE;
340 // merged_energy = mult;
342 return merged_energy;
345 //_____________________________________________________________________
346 void AliFMDAnalysisTaskSharing::GetVertex(Double_t* vertexXYZ)
348 const AliESDVertex* vertex = 0;
349 vertex = fESD->GetPrimaryVertex();
350 if(!vertex || (vertexXYZ[0] == 0 && vertexXYZ[1] == 0 && vertexXYZ[2] == 0))
351 vertex = fESD->GetPrimaryVertexSPD();
352 if(!vertex || (vertexXYZ[0] == 0 && vertexXYZ[1] == 0 && vertexXYZ[2] == 0))
353 vertex = fESD->GetPrimaryVertexTPC();
354 if(!vertex || (vertexXYZ[0] == 0 && vertexXYZ[1] == 0 && vertexXYZ[2] == 0))
355 vertex = fESD->GetVertex();
356 if (vertex && (vertexXYZ[0] != 0 || vertexXYZ[1] != 0 || vertexXYZ[2] != 0)) {
357 vertex->GetXYZ(vertexXYZ);
358 //std::cout<<vertex->GetName()<<" "<< vertex->GetTitle() <<" "<< vertex->GetZv()<<std::endl;
361 else if (fESD->GetESDTZERO()) {
364 vertexXYZ[2] = fESD->GetT0zVertex();
372 //_____________________________________________________________________
373 Float_t AliFMDAnalysisTaskSharing::Eta2Theta(Float_t eta) {
375 Float_t theta = 2*TMath::ATan(TMath::Exp(-1*eta));
378 theta = theta-TMath::Pi();
380 // std::cout<<"From eta2Theta: "<<theta<<" "<<eta<<std::endl;
386 //_____________________________________________________________________
387 /*Double_t AliFMDAnalysisTaskSharing::EtaFromStrip(UShort_t det,
394 AliFMDGeometry* geo = AliFMDGeometry::Instance();
397 geo->Detector2XYZ(det,ring,sector,strip,x,y,z);
399 Double_t r = TMath::Sqrt(x*x+y*y);
401 Double_t z_real = z-zvtx;
402 Double_t theta = TMath::ATan2(r,z_real);
403 // std::cout<<"From EtaFromStrip "<<theta<<std::endl;
404 Double_t eta = -1*TMath::Log(TMath::Tan(0.5*theta));
406 // std::cout<<det<<" "<<ring<<" "<<sector<<" "<<strip<<" "<<r<<" "<<z_real<<" "<<theta<<" "<<eta<<std::endl;
410 //_____________________________________________________________________