/************************************************************************** * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * * * * Author: The ALICE Off-line Project. * * Contributors are mentioned in the code where appropriate. * * * * Permission to use, copy, modify and distribute this software and its * * documentation strictly for non-commercial purposes is hereby granted * * without fee, provided that the above copyright notice appears in all * * copies and that both the copyright notice and this permission notice * * appear in the supporting documentation. The authors make no claims * * about the suitability of this software for any purpose. It is * * provided "as is" without express or implied warranty. * **************************************************************************/ //============================================================================== // AliHMPIDTaskQA - Class representing a quality check tool of HMPID // A set of histograms is created. //============================================================================== #ifndef AliHMPIDTASKQA_CXX #define AliHMPIDTASKQA_CXX #include "TH1.h" #include "TH2.h" #include "TFile.h" #include "TCanvas.h" #include "TGraphErrors.h" #include "AliPID.h" #include "AliVEvent.h" #include "AliVParticle.h" #include "AliVTrack.h" #include "AliESDtrackCuts.h" #include "AliAnalysisFilter.h" #include "AliAnalysisManager.h" #include "AliESDInputHandler.h" #include "AliMCEventHandler.h" #include "AliMCEvent.h" #include "AliESDtrack.h" #include "AliPID.h" #include "AliLog.h" #include "AliHMPIDTaskQA.h" ClassImp(AliHMPIDTaskQA) //__________________________________________________________________________ AliHMPIDTaskQA::AliHMPIDTaskQA() : fESD(0x0),fMC(0x0),fUseMC(kTRUE), fHmpHistList(0x0), fHmpNevents(0x0), fZvertex(0x0), fTrackCuts(0x0), fTrackFilter(0x0), fTree(0x0) { // //Default ctor // for (Int_t i=0; i<23; i++) fVar[i]=0; } //___________________________________________________________________________ AliHMPIDTaskQA::AliHMPIDTaskQA(const Char_t* name) : AliAnalysisTaskSE(name), fESD(0x0), fMC(0x0), fUseMC(kTRUE), fHmpHistList(0x0), fHmpNevents(0x0), fZvertex(0x0), fTrackCuts(0x0), fTrackFilter(0x0), fTree(0x0) { // // Constructor. Initialization of Inputs and Outputs // for (Int_t i=0; i<23; i++) fVar[i]=0; DefineOutput(1,TList::Class()); DefineOutput(2,TTree::Class()); } //___________________________________________________________________________ AliHMPIDTaskQA& AliHMPIDTaskQA::operator=(const AliHMPIDTaskQA& c) { // // Assignment operator // if (this!=&c) { AliAnalysisTaskSE::operator=(c); fESD = c.fESD; fMC = c.fMC; fUseMC = c.fUseMC; fHmpHistList = c.fHmpHistList; fHmpNevents = c.fHmpNevents; fZvertex = c.fZvertex; fTrackCuts = c.fTrackCuts; fTrackFilter = c.fTrackFilter; fTree = c.fTree; for (Int_t i=0; i<23; i++) fVar[i]=c.fVar[i]; } return *this; } //___________________________________________________________________________ AliHMPIDTaskQA::AliHMPIDTaskQA(const AliHMPIDTaskQA& c) : AliAnalysisTaskSE(c), fESD(c.fESD),fMC(c.fMC),fUseMC(c.fUseMC), fHmpHistList(c.fHmpHistList), fHmpNevents(c.fHmpNevents), fZvertex(c.fZvertex), fTrackCuts(c.fTrackCuts), fTrackFilter(c.fTrackFilter), fTree(c.fTree) { // // Copy Constructor // for (Int_t i=0; i<23; i++) fVar[i]=c.fVar[i]; } //___________________________________________________________________________ AliHMPIDTaskQA::~AliHMPIDTaskQA() { // //destructor // Info("~AliHMPIDTaskQA","Calling Destructor"); if (fHmpHistList && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) delete fHmpHistList; } //___________________________________________________________________________ void AliHMPIDTaskQA::ConnectInputData(Option_t *) { // Connect ESD here AliESDInputHandler *esdH = dynamic_cast (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()); if (!esdH) { AliDebug(2,Form("ERROR: Could not get ESDInputHandler")); } else fESD = esdH->GetEvent(); if (fUseMC){ // Connect MC AliMCEventHandler *mcH = dynamic_cast (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler()); if (!mcH) { AliDebug(2,Form("ERROR: Could not get MCEventHandler")); fUseMC = kFALSE; } else fMC = mcH->MCEvent(); if (!fMC) AliDebug(2,Form("ERROR: Could not get MCEvent")); } fTrackCuts = new AliESDtrackCuts("fTrackCuts", "Standard"); fTrackCuts->SetAcceptKinkDaughters(kFALSE); fTrackCuts->SetMinNClustersTPC(70); // changed default value 80 -> 70 (mtangaro) fTrackCuts->SetMaxChi2PerClusterTPC(4); fTrackCuts->SetMaxDCAToVertexXY(3); fTrackCuts->SetMaxDCAToVertexZ(3); fTrackCuts->SetRequireTPCRefit(kTRUE); fTrackCuts->SetRequireITSRefit(kTRUE); fTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kAny); fTrackFilter = new AliAnalysisFilter("trackFilter"); fTrackFilter->AddCuts(fTrackCuts); } //*************************************************************************************************************************************************************************** void AliHMPIDTaskQA::UserExec(Option_t *) { fHmpNevents->Fill(0); const AliESDVertex *vertex = fESD->GetPrimaryVertexTracks(); if(!vertex || !vertex->GetStatus() || vertex->GetNContributors()<1) { // SPD vertex vertex = fESD->GetPrimaryVertexSPD(); if(!vertex) return; if(!vertex->GetStatus()) return; if(vertex->GetNContributors()<1) return; // no good vertex, skip event } fHmpNevents->Fill(1); Double_t vtxPos[3] = {999, 999, 999}; if(vertex) vertex->GetXYZ(vtxPos); fZvertex->Fill(vtxPos[2]); // vertex cut if (TMath::Abs(vtxPos[2]) > 10.) return; AliESDtrack *track = 0; Double_t ktol = 0.001; // // Main loop function, executed on Event basis // for (Int_t iTrack = 0; iTrackGetNumberOfTracks(); iTrack++) { track = fESD->GetTrack(iTrack); if(!track) continue; // pT min if ( track->Pt() < 0.2 ) continue; // TPC clust if( track->GetNcls(1) < 70 ) continue; // DCA cut Float_t b[2]; Float_t bCov[3]; track->GetImpactParameters(b,bCov); if( TMath::Sqrt(b[0]*b[0] + b[1]*b[1]) > 2 ) continue; // ITS-TPC refit if( !track->IsOn(AliESDtrack::kITSrefit) ) continue; if( !track->IsOn(AliESDtrack::kTPCrefit) ) continue; //HMPID cuts if(Equal(track->GetHMPIDsignal(),-20.,ktol)) continue; if(track->GetHMPIDcluIdx() < 0) continue; Int_t q, nph; Float_t x, y; Float_t xpc, ypc, th, ph; track->GetHMPIDmip(x,y,q,nph); track->GetHMPIDtrk(xpc,ypc,th,ph); if(Equal(x,0.,ktol) && Equal(y,0.,ktol) && Equal(xpc,0.,ktol) && Equal(ypc,0.,ktol)) continue; Double_t pHmp[3] = {0}, pHmp3 = 0; if (track->GetOuterHmpPxPyPz(pHmp)) pHmp3 = TMath::Sqrt(pHmp[0]*pHmp[0]+pHmp[1]*pHmp[1]+pHmp[2]*pHmp[2]); fVar[0] = track->GetHMPIDcluIdx()/1000000; fVar[1] = pHmp3; fVar[2] = (Float_t)track->P(); fVar[3] = xpc; fVar[4] = ypc; fVar[5] = x; fVar[6] = y; fVar[7] = (Float_t)track->GetHMPIDsignal(); fVar[8] = q; fVar[9] = th; fVar[10] = ph; fVar[11] = (Float_t)track->GetSign(); fVar[12] = (Float_t)nph; fVar[13] = track->GetHMPIDcluIdx()%1000000/1000; // cluster size fVar[14] = (Float_t)track->Eta(); fVar[15] = (Float_t)track->Phi(); fVar[16] = (Float_t)pHmp[0]; fVar[17] = (Float_t)pHmp[1]; fVar[18] = (Float_t)pHmp[2]; fVar[19] = (Float_t)track->Px(); fVar[20] = (Float_t)track->Py(); fVar[21] = (Float_t)track->Pz(); fVar[22] = (Float_t)track->GetHMPIDchi2(); fTree->Fill(); }//track loop /* PostData(0) is taken care of by AliAnalysisTaskSE */ PostData(1,fHmpHistList); PostData(2,fTree); } //___________________________________________________________________________ void AliHMPIDTaskQA::Terminate(Option_t*) { // The Terminate() function is the last function to be called during // a query. It always runs on the client, it can be used to present // the results graphically or save the results to file. Info("Terminate"," "); if (!fUseMC) return; fHmpHistList = dynamic_cast (GetOutputData(1)); if (!fHmpHistList) { AliError("Histogram List is not available"); return; } AliAnalysisTaskSE::Terminate(); } //___________________________________________________________________________ void AliHMPIDTaskQA::UserCreateOutputObjects() { // //HERE ONE CAN CREATE OUTPUT OBJECTS //TO BE SET BEFORE THE EXECUTION OF THE TASK // //slot #1 // OpenFile(1); fHmpHistList = new TList(); fHmpHistList->SetOwner(); fHmpNevents = new TH1F("fHmpNevents","Number of events",2,0,2); fHmpHistList->Add(fHmpNevents); fZvertex = new TH1F("fZvertex","Z primary vertex distribution",4000,-20,20); fHmpHistList->Add(fZvertex); // OpenFile(2); fTree = new TTree("Tree","Tree with data"); fTree->Branch("Chamber",&fVar[0]); fTree->Branch("pHmp3",&fVar[1]); fTree->Branch("P",&fVar[2]); fTree->Branch("Xpc",&fVar[3]); fTree->Branch("Ypc",&fVar[4]); fTree->Branch("X",&fVar[5]); fTree->Branch("Y",&fVar[6]); fTree->Branch("HMPIDsignal",&fVar[7]); fTree->Branch("Charge",&fVar[8]); fTree->Branch("Theta",&fVar[9]); fTree->Branch("Phi",&fVar[10]); fTree->Branch("Sign",&fVar[11]); fTree->Branch("NumPhotons",&fVar[12]); fTree->Branch("ClustSize",&fVar[13]); fTree->Branch("Eta",&fVar[14]); fTree->Branch("PhiTrack",&fVar[15]); fTree->Branch("pHmpX",&fVar[16]); fTree->Branch("pHmpY",&fVar[17]); fTree->Branch("pHmpZ",&fVar[18]); fTree->Branch("Px",&fVar[19]); fTree->Branch("Py",&fVar[20]); fTree->Branch("Pz",&fVar[21]); fTree->Branch("HmpSigma",&fVar[22]); PostData(1,fHmpHistList); PostData(2,fTree); } //____________________________________________________________________________________________________________________________________ Bool_t AliHMPIDTaskQA::Equal(Double_t x, Double_t y, Double_t tolerance) { return abs(x - y) <= tolerance ; } #endif