#include #include #include #include #include #include #include #include //#include "AliFMDDebug.h" #include "AliFMDAnalysisTaskSharing.h" #include "AliAnalysisManager.h" #include "AliESDFMD.h" //#include "AliFMDGeometry.h" #include "AliMCEventHandler.h" #include "AliStack.h" #include "AliESDVertex.h" #include "AliMultiplicity.h" #include "AliFMDAnaParameters.h" //#include "AliFMDParameters.h" ClassImp(AliFMDAnalysisTaskSharing) //_____________________________________________________________________ AliFMDAnalysisTaskSharing::AliFMDAnalysisTaskSharing() : fDebug(0), fESD(0x0), foutputESDFMD(), fEnergy(0), fNstrips(0), fSharedThis(kFALSE), fSharedPrev(kFALSE), fDiagList(), fStandalone(kTRUE), fEsdVertex(0), fStatus(kTRUE) { // Default constructor DefineInput (0, AliESDEvent::Class()); DefineOutput(0, AliESDFMD::Class()); DefineOutput(1, AliESDVertex::Class()); DefineOutput(2, AliESDEvent::Class()); DefineOutput(3, TList::Class()); } //_____________________________________________________________________ AliFMDAnalysisTaskSharing::AliFMDAnalysisTaskSharing(const char* name, Bool_t SE): AliAnalysisTask(name, "AnalysisTaskFMD"), fDebug(0), fESD(0x0), foutputESDFMD(), fEnergy(0), fNstrips(0), fSharedThis(kFALSE), fSharedPrev(kFALSE), fDiagList(), fStandalone(kTRUE), fEsdVertex(0), fStatus(kTRUE) { fStandalone = SE; if(fStandalone) { DefineInput (0, AliESDEvent::Class()); DefineOutput(0, AliESDFMD::Class()); DefineOutput(1, AliESDVertex::Class()); DefineOutput(2, AliESDEvent::Class()); DefineOutput(3, TList::Class()); } } //_____________________________________________________________________ void AliFMDAnalysisTaskSharing::CreateOutputObjects() { if(!foutputESDFMD) foutputESDFMD = new AliESDFMD(); if(!fEsdVertex) fEsdVertex = new AliESDVertex(); //Diagnostics fDiagList.SetName("Sharing diagnostics"); for(Int_t det = 1; det<=3; det++) { Int_t nRings = (det==1 ? 1 : 2); for(Int_t iring = 0;iringGetAliESDOld(); if (old) { fESD->CopyFromOldESD(); } foutputESDFMD->Clear(); Double_t vertex[3]; GetVertex(vertex); fEsdVertex->SetXYZ(vertex); if(vertex[0] == 0 && vertex[1] == 0 && vertex[2] == 0) { fStatus = kFALSE; return; } else fStatus = kTRUE; const AliMultiplicity* testmult = fESD->GetMultiplicity(); Int_t nTrackLets = testmult->GetNumberOfTracklets(); if(nTrackLets < 1000) foutputESDFMD->SetUniqueID(kTRUE); else foutputESDFMD->SetUniqueID(kFALSE); AliESDFMD* fmd = fESD->GetFMDData(); AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance(); if (!fmd) return; Int_t nHits = 0; for(UShort_t det=1;det<=3;det++) { Int_t nRings = (det==1 ? 1 : 2); for (UShort_t ir = 0; ir < nRings; ir++) { Char_t ring = (ir == 0 ? 'I' : 'O'); UShort_t nsec = (ir == 0 ? 20 : 40); UShort_t nstr = (ir == 0 ? 512 : 256); TH1F* hEdist = (TH1F*)fDiagList.FindObject(Form("Edist_before_sharing_FMD%d%c",det,ring)); for(UShort_t sec =0; sec < nsec; sec++) { fSharedThis = kFALSE; fSharedPrev = kFALSE; fEnergy = 0; fNstrips = 0; for(UShort_t strip = 0; strip < nstr; strip++) { foutputESDFMD->SetMultiplicity(det,ring,sec,strip,0.); Float_t mult = fmd->Multiplicity(det,ring,sec,strip); if(mult == AliESDFMD::kInvalidMult || mult == 0) continue; //Double_t eta = EtaFromStrip(det,ring,sec,strip,vertex[2]);//fmd->Eta(det,ring,sec,strip); //Double_t eta = fmd->Eta(det,ring,sec,strip); Float_t eta = pars->GetEtaFromStrip(det,ring,sec,strip,vertex[2]); //std::cout<Eta(det,ring,sec,strip)<Fill(mult); if(fmd->IsAngleCorrected()) mult = mult/TMath::Cos(Eta2Theta(eta)); Float_t Eprev = 0; Float_t Enext = 0; if(strip != 0) if(fmd->Multiplicity(det,ring,sec,strip-1) != AliESDFMD::kInvalidMult) { Eprev = fmd->Multiplicity(det,ring,sec,strip-1); if(fmd->IsAngleCorrected()) Eprev = Eprev/TMath::Cos(Eta2Theta(fmd->Eta(det,ring,sec,strip-1))); } if(strip != nstr - 1) if(fmd->Multiplicity(det,ring,sec,strip+1) != AliESDFMD::kInvalidMult) { Enext = fmd->Multiplicity(det,ring,sec,strip+1); if(fmd->IsAngleCorrected()) Enext = Enext/TMath::Cos(Eta2Theta(fmd->Eta(det,ring,sec,strip+1))); } Float_t merged_energy = GetMultiplicityOfStrip(mult,eta,Eprev,Enext,det,ring,sec,strip); if(merged_energy > 0 ) nHits++; foutputESDFMD->SetMultiplicity(det,ring,sec,strip,merged_energy); foutputESDFMD->SetEta(det,ring,sec,strip,eta); } } } } if(fStandalone) { PostData(0, foutputESDFMD); PostData(1, fEsdVertex); PostData(2, fESD); PostData(3, &fDiagList); } } //_____________________________________________________________________ Float_t AliFMDAnalysisTaskSharing::GetMultiplicityOfStrip(Float_t mult, Float_t eta, Float_t Eprev, Float_t Enext, UShort_t det, Char_t ring, UShort_t sec, UShort_t strip) { AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance(); Float_t merged_energy = 0; //Float_t nParticles = 0; Float_t cutLow = 0.15; if(ring == 'I') cutLow = 0.1; //cutLow = 0; //AliFMDParameters* recopars = AliFMDParameters::Instance(); //cutLow = (5*recopars->GetPedestalWidth(det,ring,sec,strip))/(recopars->GetPulseGain(det,ring,sec,strip)*recopars->GetDACPerMIP()); Float_t cutHigh = pars->GetMPV(det,ring,eta) - 3*pars->GetSigma(det,ring,eta); // Float_t cutPart = pars->GetMPV(det,ring,eta) - 5*pars->GetSigma(det,ring,eta); Float_t Etotal = mult; //if(mult > 5) // std::cout<GetMPV(det,ring,eta); //if(recopars->IsDead(det,ring,sec,strip)) // std::cout<<"dead channel"<GetUniqueID() == kTRUE) { // Float_t mpv = pars->GetMPV(det,ring,eta); /* if(foutputESDFMD->GetUniqueID() == kFALSE) { if(mult > 15) return 0; if(mult > cutLow ) { fEnergy = fEnergy + mult; fNstrips++; } if( (Enext < cutLow && fEnergy > 0 ) || fNstrips >2 ){ //if((fEnergy*TMath::Cos(Eta2Theta(eta))) > cutPart || fNstrips > 1) { nParticles = 1; merged_energy = fEnergy*TMath::Cos(Eta2Theta(eta)); TH1F* hEdist = (TH1F*)fDiagList.FindObject(Form("Edist_after_sharing_FMD%d%c",det,ring)); hEdist->Fill(fEnergy); TH1F* hNstrips = (TH1F*)fDiagList.FindObject(Form("N_strips_hit_FMD%d%c",det,ring)); hNstrips->Fill(fNstrips); // std::cout<GetMPV(det,ring,eta)) { fSharedThis = kFALSE; fSharedPrev = kFALSE; return 0; }*/ if(multcutHigh && foutputESDFMD->GetUniqueID() == kTRUE) { fSharedThis = kFALSE; fSharedPrev = kFALSE; return 0; } if(mult > 15) { std::cout<<"rejecting hit in FMD "< cutLow && Eprev < cutHigh && !fSharedPrev ) { Etotal += Eprev; } if(Enext > cutLow && Enext < cutHigh ) { Etotal += Enext; fSharedThis = kTRUE; } TH1F* hEdist = (TH1F*)fDiagList.FindObject(Form("Edist_after_sharing_FMD%d%c",det,ring)); hEdist->Fill(Etotal); Etotal = Etotal*TMath::Cos(Eta2Theta(eta)); if(Etotal > 0) { merged_energy = Etotal; fSharedPrev = kTRUE; // if(det == 1 && ring =='I') // std::cout< 0) { //if(det == 3 && ring =='I') // std::cout<GetPrimaryVertex(); if(!vertex || (vertexXYZ[0] == 0 && vertexXYZ[1] == 0 && vertexXYZ[2] == 0)) vertex = fESD->GetPrimaryVertexSPD(); if(!vertex || (vertexXYZ[0] == 0 && vertexXYZ[1] == 0 && vertexXYZ[2] == 0)) vertex = fESD->GetPrimaryVertexTPC(); if(!vertex || (vertexXYZ[0] == 0 && vertexXYZ[1] == 0 && vertexXYZ[2] == 0)) vertex = fESD->GetVertex(); if (vertex && (vertexXYZ[0] != 0 || vertexXYZ[1] != 0 || vertexXYZ[2] != 0)) { vertex->GetXYZ(vertexXYZ); //std::cout<GetName()<<" "<< vertex->GetTitle() <<" "<< vertex->GetZv()<GetESDTZERO()) { vertexXYZ[0] = 0; vertexXYZ[1] = 0; vertexXYZ[2] = fESD->GetT0zVertex(); return; } return; } //_____________________________________________________________________ Float_t AliFMDAnalysisTaskSharing::Eta2Theta(Float_t eta) { Float_t theta = 2*TMath::ATan(TMath::Exp(-1*eta)); if(eta < 0) theta = theta-TMath::Pi(); // std::cout<<"From eta2Theta: "<Detector2XYZ(det,ring,sector,strip,x,y,z); Double_t r = TMath::Sqrt(x*x+y*y); Double_t z_real = z-zvtx; Double_t theta = TMath::ATan2(r,z_real); // std::cout<<"From EtaFromStrip "<