#include "AliAnalysisNucleiInfo.h" // ROOT includes #include #include "TChain.h" // AliRoot includes #include "AliInputEventHandler.h" #include "AliAODEvent.h" #include "AliESDEvent.h" #include "AliVEvent.h" #include "AliAODTrack.h" #include "AliAODPid.h" #include "AliCentrality.h" #include "TH2F.h" #include "TH2D.h" #include "TH1F.h" #include "TF1.h" #include "TF2.h" #include "TGraph.h" #include "TProfile.h" #include "AliESDtrackCuts.h" #include "AliAnalysisManager.h" #include "TFile.h" ClassImp(AliAnalysisNucleiInfo) //_____________________________________________________________________________ AliAnalysisNucleiInfo::AliAnalysisNucleiInfo(): AliAnalysisTaskSE(), FilterBit(16), EtaLimit(), DCAxyCut(1000.), DCAzCut(1000.), NsigmaTpcCut(2.0), iBconf(0), kTOF(0), //iTriggerSel(-99), fAOD(NULL), fESD(NULL), fEvent(NULL), fPIDResponse(NULL) { EtaLimit[0]=-99.0; EtaLimit[1]=99.0; fList[0]=new TList(); fList[0]->SetName("results"); fList[1]=new TList(); fList[1]->SetName("results2"); } //______________________________________________________________________________ AliAnalysisNucleiInfo::AliAnalysisNucleiInfo(const char *name): AliAnalysisTaskSE(name), FilterBit(16), EtaLimit(), DCAxyCut(1000.), DCAzCut(1000.), NsigmaTpcCut(2.0), iBconf(0), kTOF(0), //iTriggerSel(-99), fAOD(NULL), fESD(NULL), fEvent(NULL), fPIDResponse(NULL) { EtaLimit[0]=-99.0; EtaLimit[1]=99.0; fList[0]=new TList(); DefineOutput(1, TList::Class()); fList[0]->SetName("results"); fList[1]=new TList(); DefineOutput(2, TList::Class()); fList[1]->SetName("results2"); } //_____________________________________________________________________________ AliAnalysisNucleiInfo::~AliAnalysisNucleiInfo() { if(fList[0]) delete fList[0]; if(fList[1]) delete fList[1]; } //______________________________________________________________________________ void AliAnalysisNucleiInfo::UserCreateOutputObjects() { Char_t namePart[nPart][30]; snprintf(namePart[0],30,"e"); snprintf(namePart[1],30,"mu"); snprintf(namePart[2],30,"pi"); snprintf(namePart[3],30,"K"); snprintf(namePart[4],30,"p"); snprintf(namePart[5],30,"d"); snprintf(namePart[6],30,"t"); snprintf(namePart[7],30,"He3"); snprintf(namePart[8],30,"He4"); Char_t name[nSpec][30]; snprintf(name[0],20,"e_plus"); snprintf(name[1],20,"mu_plus"); snprintf(name[2],20,"pi_plus"); snprintf(name[3],20,"K_plus"); snprintf(name[4],20,"p"); snprintf(name[5],20,"d"); snprintf(name[6],20,"t"); snprintf(name[7],20,"He3"); snprintf(name[8],20,"He4"); snprintf(name[9],20,"e_minus"); snprintf(name[10],20,"mu_plus"); snprintf(name[11],20,"pi_plus"); snprintf(name[12],20,"K_plus"); snprintf(name[13],20,"p_bar"); snprintf(name[14],20,"d_bar"); snprintf(name[15],20,"t_bar"); snprintf(name[16],20,"He3_bar"); snprintf(name[17],20,"He4_bar"); Int_t hbins[2]; for(Int_t iB=0;iBAdd(htemp[iB]); for(Int_t i=0;i<2;i++) fList[iB]->Add(htriggerbits[iB][i]); for(Int_t i=0;i<2;i++) fList[iB]->Add(hZvertex[iB][i]); fList[iB]->Add(hEta[iB]); fList[iB]->Add(hPhi[iB]); for(Int_t i=0;i<2;i++) fList[iB]->Add(fdEdxVSp[iB][i]); for(Int_t i=0;iAdd(hDeDxExp[iB][i]); } for(Int_t i=0;iAdd(fNsigmaTpc[iB][i]); } for(Int_t i=0;i<2;i++) fList[iB]->Add(fBetaTofVSp[iB][i]); for(Int_t i=0;iAdd(hBetaExp[iB][i]); } for(Int_t i=0;iAdd(fNsigmaTof[iB][i]); } for(Int_t i=0;iAdd(fTofMinusExp[iB][0][i]); } for(Int_t i=0;iAdd(fTofMinusExp[iB][1][i]); } for(Int_t iS=0;iSAdd(h2DCAap[iB][iS]); } // Post output data. PostData(1, fList[0]); PostData(2, fList[1]); }//end iB loop } //______________________________________________________________________________ void AliAnalysisNucleiInfo::UserExec(Option_t *) { // Main loop // Called for each event fAOD = dynamic_cast(InputEvent()); fESD = dynamic_cast(InputEvent()); if(!fAOD && !fESD){ Printf("%s:%d AODEvent and ESDEvent not found in Input Manager",(char*)__FILE__,__LINE__); return; } if(fESD) fEvent = fESD; else fEvent = fAOD; AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager(); AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler()); fPIDResponse=inputHandler->GetPIDResponse(); //--------------------------Magnetic field polarity-------------------- Double_t fBfield=fEvent->GetMagneticField(); if(fBfield<0.0) iBconf=0;//B-- else iBconf=1;//B++ for(Int_t i=0;iFill(fBfield); //-------------------------zVertex determination of event---------------- Double_t zvtx = 9999.9; const AliVVertex* vtxEVENT = fEvent->GetPrimaryVertex(); if(vtxEVENT->GetNContributors()>0) zvtx = vtxEVENT->GetZ(); hZvertex[iBconf][0]->Fill(zvtx); //---------------------------EVENT CUTS----------------------------- if(TMath::Abs(zvtx) < 10.0){ //TRIGGER SELECTION Int_t iTrigger=-2; if(inputHandler->IsEventSelected() & AliVEvent::kMB) iTrigger = 0; if(inputHandler->IsEventSelected() & AliVEvent::kCentral) iTrigger = 16; if(inputHandler->IsEventSelected() & AliVEvent::kSemiCentral) iTrigger = 17; //if((((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected()) & AliVEvent::kAny) iTrigger = 35; if(iTriggerSel!=-99) {//if a dedicated trigger is required if(iTrigger!=iTriggerSel) return; } for(Int_t i=0;i<32;i++) { Int_t bit=(1<IsEventSelected() & bit) htriggerbits[iBconf][0]->Fill(i); } if(inputHandler->IsEventSelected() & AliVEvent::kAny) htriggerbits[iBconf][0]->Fill(35); if(inputHandler->IsEventSelected() & AliVEvent::kAnyINT) htriggerbits[iBconf][0]->Fill(36); htriggerbits[iBconf][1]->Fill(iTrigger); hZvertex[iBconf][1]->Fill(zvtx); Int_t nTracks = fEvent->GetNumberOfTracks(); //----------------------loop on the TRACKS----------------------------- for(Int_t iT = 0; iT < nTracks; iT++) { AliVTrack* track = (AliVTrack *) fEvent->GetTrack(iT); if (!track){ continue; } //For the geometrical cuts Double_t eta = track->Eta(); Bool_t trkFlag = 0; trkFlag = ((AliAODTrack *) track)->TestFilterBit(FilterBit); //TestFilterBit(16) -- Standard Cuts with very loose DCA: GetStandardITSTPCTrackCuts2011(kFALSE) && SetMaxDCAToVertexXY(2.4) && SetMaxDCAToVertexZ(3.2) && SetDCaToVertex2D(kTRUE) //TestFilterBit(32) (STARDARD) -- Standard Cuts with very tight DCA cut ( 7sigma^primaries: 7*(0.0015+0.0050/pt^1.1) ) : GetStandardITSTPCTrackCuts2011(). //-------------------------------------start TRACK CUTS-------------------------------- if ((track->Pt() < 0.2) || (etaEtaLimit[1]) || !trkFlag) continue; //Vertex determination Double_t b[2] = {-99., -99.}; Double_t bCov[3] = {-99., -99., -99.}; if (!track->PropagateToDCA(fEvent->GetPrimaryVertex(), fEvent->GetMagneticField(), 100., b, bCov)) continue; Double_t DCAxy = b[0]; Double_t DCAz = b[1]; //Cut on the DCAxy Bool_t isDCAxyCut=kFALSE; if(TMath::Abs(DCAxy)Phi(); Double_t charge = (Double_t)track->Charge(); Double_t p = track->P(); Double_t pt = track->Pt(); Double_t dedx = track->GetTPCsignal(); Double_t pTPC = track->GetTPCmomentum(); Double_t tof = track->GetTOFsignal()-fPIDResponse->GetTOFResponse().GetStartTime(p); Double_t beta = 0.0; //Double_t M2 = 999.9; //Double_t Z2 = 999.9; kTOF = (track->GetStatus() & AliVTrack::kTOFout) && (track->GetStatus() & AliVTrack::kTIME); //-----------------------------TPC info------------------------------ Double_t nsigmaTPC[nPart]; Double_t expdedx[nPart]; Int_t stdFlagPid[9] = {1,2,4,8,16,32,64,128,256};//e,mu,pi,K,p,d,t,He3,He4 Int_t FlagPid = 0; for(Int_t iS=0;iS<9;iS++){ nsigmaTPC[iS] = fPIDResponse->NumberOfSigmasTPC(track,(AliPID::EParticleType) iS); //TPC identification: if(TMath::Abs(nsigmaTPC[iS])Fill(eta); hPhi[iBconf]->Fill(phi); //More TPC info: for(Int_t iS=0;iS<9;iS++){ expdedx[iS] = fPIDResponse->GetTPCResponse().GetExpectedSignal(track, (AliPID::EParticleType) iS, AliTPCPIDResponse::kdEdxDefault, kTRUE); hDeDxExp[iBconf][iS]->Fill(pTPC,expdedx[iS]); nsigmaTPC[iS] = fPIDResponse->NumberOfSigmasTPC(track,(AliPID::EParticleType) iS); //fNsigmaTpc[iBconf][iS]->Fill(pTPC,nsigmaTPC[iS]); if(charge>0) {//positive particle fNsigmaTpc[iBconf][iS]->Fill(pTPC,nsigmaTPC[iS]); } else {//negative particle fNsigmaTpc[iBconf][iS+nPart]->Fill(pTPC,nsigmaTPC[iS]); } } if(charge>0) fdEdxVSp[iBconf][0]->Fill(pTPC,dedx); else fdEdxVSp[iBconf][1]->Fill(pTPC,dedx); //ITS info for(Int_t iS=0;iS<9;iS++){ if(FlagPid & stdFlagPid[iS]) { if(pt<1.5) { if(charge>0) { h2DCAap[iBconf][iS]->Fill(DCAxy,DCAz); h2DCAap[iBconf][iS]->Fill(-DCAxy,-DCAz); } else { h2DCAap[iBconf][iS+nPart]->Fill(DCAxy,DCAz); h2DCAap[iBconf][iS+nPart]->Fill(-DCAxy,-DCAz); } } } } //-----------------------------TOF info------------------------------ Double_t massOverZ[9] = {0.000511,0.105658,0.139570,0.493677,0.938272,1.875612859,2.808921005,1.404195741,1.863689620}; //----------------------------------------kTOF available----------------------------- if(kTOF) { Double_t exptimes[9]; track->GetIntegratedTimes(exptimes); //Integrated times of the Nuclei: for(Int_t iN=5;iN<9;iN++) { exptimes[iN] = exptimes[4]*exptimes[4]*(massOverZ[iN]*massOverZ[iN]/p/p+1)/(massOverZ[4]*massOverZ[4]/p/p+1); exptimes[iN] = TMath::Sqrt(exptimes[iN]); } beta=exptimes[0]; beta=beta/tof;//beta = L/tof/c = t_e/tof Double_t nsigmaTOF[9]; for(Int_t iS=0;iS<9;iS++){ nsigmaTOF[iS] = fPIDResponse->NumberOfSigmasTOF(track,(AliPID::EParticleType) iS); if(charge>0) { hBetaExp[iBconf][iS]->Fill(p,exptimes[0]/exptimes[iS]); fNsigmaTof[iBconf][iS]->Fill(pt,nsigmaTOF[iS]); } else { hBetaExp[iBconf][iS+nPart]->Fill(p,exptimes[0]/exptimes[iS]); fNsigmaTof[iBconf][iS+nPart]->Fill(pt,nsigmaTOF[iS]); } } if(charge>0) fBetaTofVSp[iBconf][0]->Fill(p,beta); else fBetaTofVSp[iBconf][1]->Fill(p,beta); for(Int_t iS=0;iS<9;iS++){ if(charge>0) { fTofMinusExp[iBconf][0][iS]->Fill(pt,tof-exptimes[iS]); if(FlagPid & stdFlagPid[iS]) fTofMinusExp[iBconf][1][iS]->Fill(pt,tof-exptimes[iS]); } else { fTofMinusExp[iBconf][0][iS+nPart]->Fill(pt,tof-exptimes[iS]); if(FlagPid & stdFlagPid[iS]) fTofMinusExp[iBconf][1][iS+nPart]->Fill(pt,tof-exptimes[iS]); } } }//end kTOF available }//end track loop }//end loop on the events } //_____________________________________________________________________________ void AliAnalysisNucleiInfo::Terminate(Option_t *) { // Terminate loop Printf("Terminate()"); }