fListQAtrd(0x0),
fListQAtof(0x0),
fListQAemcal(0x0),
+fListQAhmpid(0x0),
+fListQAtofhmpid(0x0),
fListQAtpctof(0x0)
{
//
fListQAtrd(0x0),
fListQAtof(0x0),
fListQAemcal(0x0),
+fListQAhmpid(0x0),
+fListQAtofhmpid(0x0),
fListQAtpctof(0x0)
{
//
//
// Destructor
//
-
+ delete fListQA;
}
//______________________________________________________________________________
fListQAitsSA=new TList;
fListQAitsSA->SetOwner();
- fListQAitsSA->SetName("ITS");
+ fListQAitsSA->SetName("ITS_SA");
fListQAitsPureSA=new TList;
fListQAitsPureSA->SetOwner();
- fListQAitsPureSA->SetName("ITS");
+ fListQAitsPureSA->SetName("ITS_PureSA");
fListQAtpc=new TList;
fListQAtpc->SetOwner();
fListQAemcal=new TList;
fListQAemcal->SetOwner();
fListQAemcal->SetName("EMCAL");
-
+
+ fListQAhmpid=new TList;
+ fListQAhmpid->SetOwner();
+ fListQAhmpid->SetName("HMPID");
+
fListQAtpctof=new TList;
fListQAtpctof->SetOwner();
fListQAtpctof->SetName("TPC_TOF");
+ fListQAtofhmpid=new TList;
+ fListQAtofhmpid->SetOwner();
+ fListQAtofhmpid->SetName("TOF_HMPID");
+
fListQA->Add(fListQAits);
fListQA->Add(fListQAitsSA);
fListQA->Add(fListQAitsPureSA);
fListQA->Add(fListQAtrd);
fListQA->Add(fListQAtof);
fListQA->Add(fListQAemcal);
+ fListQA->Add(fListQAhmpid);
fListQA->Add(fListQAtpctof);
+ fListQA->Add(fListQAtofhmpid);
SetupITSqa();
SetupTPCqa();
SetupTRDqa();
SetupTOFqa();
SetupEMCALqa();
+ SetupHMPIDqa();
SetupTPCTOFqa();
-
+ SetupTOFHMPIDqa();
+
PostData(1,fListQA);
}
FillTRDqa();
FillTOFqa();
FillEMCALqa();
+ FillHMPIDqa();
+
+ //combined detector QA
FillTPCTOFqa();
-
+ FillTOFHMPIDqa();
+
PostData(1,fListQA);
}
// not that nice. status bits not in virtual interface
// TPC refit + ITS refit + TPC pid
if (!( (status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
- !( (status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ||
- !( (status & AliVTrack::kTPCpid ) == AliVTrack::kTPCpid ) ) continue;
-
+ !( (status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ) continue;
+
+ // The TPC pid cut removes the light nuclei (>5 sigma from proton line)
+ //|| !( (status & AliVTrack::kTPCpid ) == AliVTrack::kTPCpid )
Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
if (track->GetTPCNclsF()>0) {
//
// Fill PID qa histograms for the TRD
//
+ AliVEvent *event=InputEvent();
+ Int_t ntracks = event->GetNumberOfTracks();
+ for(Int_t itrack = 0; itrack < ntracks; itrack++){
+ AliVTrack *track = (AliVTrack *)event->GetTrack(itrack);
+
+ //
+ //basic track cuts
+ //
+ ULong_t status=track->GetStatus();
+ // not that nice. status bits not in virtual interface
+ // TPC refit + ITS refit + TPC pid + TRD out
+ if (!( (status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
+ !( (status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ||
+// !( (status & AliVTrack::kTPCpid ) == AliVTrack::kTPCpid ) || //removes light nuclei. So it is out for the moment
+ !( (status & AliVTrack::kTRDout ) == AliVTrack::kTRDout )) continue;
+
+ Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
+ Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
+ if (track->GetTPCNclsF()>0) {
+ ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC/track->GetTPCNclsF();
+ }
+
+ if ( nCrossedRowsTPC<70 || ratioCrossedRowsOverFindableClustersTPC<.8 ) continue;
+ Double_t likelihoods[AliPID::kSPECIES];
+ if(fPIDResponse->ComputeTRDProbability(track, AliPID::kSPECIES, likelihoods) != AliPIDResponse::kDetPidOk) continue;
+ Int_t ntracklets = 0;
+ Double_t momentum = -1.;
+ for(Int_t itl = 0; itl < 6; itl++)
+ if(track->GetTRDmomentum(itl) > 0.){
+ ntracklets++;
+ if(momentum < 0) momentum = track->GetTRDmomentum(itl);
+ }
+ for(Int_t ispecie = 0; ispecie < AliPID::kSPECIES; ispecie++){
+ TH2F *hLike = (TH2F *)fListQAtrd->At(ntracklets*AliPID::kSPECIES+ispecie);
+ if (hLike) hLike->Fill(momentum,likelihoods[ispecie]);
+ }
+ }
}
//______________________________________________________________________________
void AliAnalysisTaskPIDqa::FillTOFqa()
{
//
- // Fill PID qa histograms for the TOF
+ // Fill TOF information
//
-
AliVEvent *event=InputEvent();
-
Int_t ntracks=event->GetNumberOfTracks();
Int_t tracksAtTof = 0;
for(Int_t itrack = 0; itrack < ntracks; itrack++){
TH2 *h=(TH2*)fListQAtof->FindObject("hSigP_TOF");
if (h) {
- Double_t sig=track->GetTOFsignal();
+ Double_t sig=track->GetTOFsignal()/1000.;
h->Fill(mom,sig);
}
- Double_t mask = (Double_t)fPIDResponse->GetTOFResponse().GetStartTimeMask(mom) + 0.5;
- ((TH1F*)fListQAtof->FindObject("hStartTimeMask_TOF"))->Fill(mask);
+ Int_t mask = fPIDResponse->GetTOFResponse().GetStartTimeMask(mom);
+ ((TH1F*)fListQAtof->FindObject("hStartTimeMask_TOF"))->Fill((Double_t)(mask+0.5));
+
+ if (mom >= 0.75 && mom <= 1.25 ) {
+ Double_t nsigma= fPIDResponse->NumberOfSigmasTOF(track, (AliPID::EParticleType)AliPID::kPion);
+ if (mask == 0) {
+ ((TH1F*)fListQAtof->FindObject("hNsigma_TOF_Pion_T0-Fill"))->Fill(nsigma);
+ } else if (mask == 1) {
+ ((TH1F*)fListQAtof->FindObject("hNsigma_TOF_Pion_T0-TOF"))->Fill(nsigma);
+ } else if ( (mask == 2) || (mask == 4) || (mask == 6) ) {
+ ((TH1F*)fListQAtof->FindObject("hNsigma_TOF_Pion_T0-T0"))->Fill(nsigma);
+ } else {
+ ((TH1F*)fListQAtof->FindObject("hNsigma_TOF_Pion_T0-Best"))->Fill(nsigma);
+ }
+ }
Double_t res = (Double_t)fPIDResponse->GetTOFResponse().GetStartTimeRes(mom);
((TH1F*)fListQAtof->FindObject("hStartTimeRes_TOF"))->Fill(res);
Int_t mask = fPIDResponse->GetTOFResponse().GetStartTimeMask(5.);
if (mask & 0x1) ((TH1F*)fListQAtof->FindObject("hT0MakerEff"))->Fill(tracksAtTof);
}
-
}
+
//______________________________________________________________________________
void AliAnalysisTaskPIDqa::FillEMCALqa()
{
if(nMatchClus > -1){
- AliVCluster *matchedClus = (AliVCluster*)event->GetCaloCluster(nMatchClus);
-
- if(matchedClus){
+ AliVCluster *matchedClus = (AliVCluster*)event->GetCaloCluster(nMatchClus);
- // matched cluster is EMCAL
- if(matchedClus->IsEMCAL()){
-
- Double_t fClsE = matchedClus->E();
- eop = fClsE/mom;
+ if(matchedClus){
- h->Fill(pt,eop);
-
- }
- }
- }
- else{
- Printf("status status = AliVTrack::kEMCALmatch, BUT no matched cluster!");
+ // matched cluster is EMCAL
+ if(matchedClus->IsEMCAL()){
+
+ Double_t fClsE = matchedClus->E();
+ eop = fClsE/mom;
+
+ h->Fill(pt,eop);
+
+ }
+ }
}
}
}
}
+
+//______________________________________________________________________________
+void AliAnalysisTaskPIDqa::FillHMPIDqa()
+{
+ //
+ // Fill PID qa histograms for the HMPID
+ //
+
+ AliVEvent *event=InputEvent();
+
+ Int_t ntracks=event->GetNumberOfTracks();
+ for(Int_t itrack = 0; itrack < ntracks; itrack++){
+ AliVTrack *track=(AliVTrack*)event->GetTrack(itrack);
+
+ //
+ //basic track cuts
+ //
+ ULong_t status=track->GetStatus();
+ // not that nice. status bits not in virtual interface
+ // TPC refit + ITS refit +
+ // TOF out + TOFpid +
+ // kTIME
+ if (!((status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
+ !((status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ) continue;
+
+ Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
+ Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
+ if (track->GetTPCNclsF()>0) {
+ ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC/track->GetTPCNclsF();
+ }
+
+ if ( nCrossedRowsTPC<70 || ratioCrossedRowsOverFindableClustersTPC<.8 ) continue;
+
+ Double_t mom = track->P();
+ Double_t ckovAngle = track->GetHMPIDsignal();
+
+ TH1F *hThetavsMom = (TH1F*)fListQAhmpid->At(0);;
+
+ hThetavsMom->Fill(mom,ckovAngle);
+
+ }
+}
+//______________________________________________________________________________
+void AliAnalysisTaskPIDqa::FillTOFHMPIDqa()
+{
+ //
+ // Fill PID qa histograms for the HMPID
+ //
+
+ AliVEvent *event=InputEvent();
+
+ Int_t ntracks=event->GetNumberOfTracks();
+ for(Int_t itrack = 0; itrack < ntracks; itrack++){
+ AliVTrack *track=(AliVTrack*)event->GetTrack(itrack);
+
+ //
+ //basic track cuts
+ //
+ ULong_t status=track->GetStatus();
+ // not that nice. status bits not in virtual interface
+ // TPC refit + ITS refit +
+ // TOF out + TOFpid +
+ // kTIME
+ if (!((status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
+ !((status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ||
+ !((status & AliVTrack::kTOFout ) == AliVTrack::kTOFout ) ||
+ !((status & AliVTrack::kTOFpid ) == AliVTrack::kTOFpid ) ||
+ !((status & AliVTrack::kTIME ) == AliVTrack::kTIME ) ) continue;
+
+ Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
+ Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
+ if (track->GetTPCNclsF()>0) {
+ ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC/track->GetTPCNclsF();
+ }
+
+ if ( nCrossedRowsTPC<70 || ratioCrossedRowsOverFindableClustersTPC<.8 ) continue;
+
+ Double_t mom = track->P();
+ Double_t ckovAngle = track->GetHMPIDsignal();
+
+ Double_t nSigmaTOF[3];
+ TH1F *h[3];
+
+ for (Int_t ispecie=2; ispecie<AliPID::kSPECIES; ++ispecie){
+ //TOF nSigma
+ nSigmaTOF[ispecie]=fPIDResponse->NumberOfSigmasTOF(track, (AliPID::EParticleType)ispecie);
+ h[ispecie-2] = (TH1F*)fListQAtofhmpid->At(ispecie-2);}
+
+ if(TMath::Abs(nSigmaTOF[0])<2) h[0]->Fill(mom,ckovAngle);
+
+ if(TMath::Abs(nSigmaTOF[1])<2 && TMath::Abs(nSigmaTOF[0])>3) h[1]->Fill(mom,ckovAngle);
+
+ if(TMath::Abs(nSigmaTOF[2])<2 && TMath::Abs(nSigmaTOF[1])>3 && TMath::Abs(nSigmaTOF[0])>3) h[2]->Fill(mom,ckovAngle);
+
+ }
+
+}
+
//______________________________________________________________________________
void AliAnalysisTaskPIDqa::FillTPCTOFqa()
{
// kTIME
if (!((status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
!((status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ||
- !( (status & AliVTrack::kTPCpid ) == AliVTrack::kTPCpid ) ||
+// !( (status & AliVTrack::kTPCpid ) == AliVTrack::kTPCpid ) || //removes light nuclei, so it is out for the moment
!((status & AliVTrack::kTOFout ) == AliVTrack::kTOFout ) ||
!((status & AliVTrack::kTOFpid ) == AliVTrack::kTOFpid ) ||
!((status & AliVTrack::kTIME ) == AliVTrack::kTIME ) ) continue;
//
// Create the TRD qa objects
//
-
+ TVectorD *vX=MakeLogBinning(200,.1,30);
+ for(Int_t itl = 0; itl < 6; ++itl){
+ for(Int_t ispecie = 0; ispecie < AliPID::kSPECIES; ispecie++){
+ TH2F *hLikeP = new TH2F(Form("hLikeP_TRD_%dtls_%s", itl, AliPID::ParticleName(ispecie)),
+ Form("TRD Likelihood to be %s %s for tracks having %d %s; p (GeV/c); TRD %s Likelihood", ispecie == 0 ? "an" : "a", AliPID::ParticleName(ispecie), itl+1, itl == 0 ? "tracklet" : "tracklets", AliPID::ParticleName(ispecie)),
+ vX->GetNrows()-1, vX->GetMatrixArray(),
+ 100, 0., 1.);
+ fListQAtrd->Add(hLikeP);
+ }
+ }
+ delete vX;
}
//______________________________________________________________________________
vX->GetNrows()-1,vX->GetMatrixArray(),
200,-10,10);
fListQAtof->Add(hNsigmaP);
- // to be added: t-texp without StartTime subtraction
}
+ // for Kaons PID we differentiate on Time Zero
+ TH1F *hnSigT0Fill = new TH1F("hNsigma_TOF_Pion_T0-Fill","TOF n#sigma (Pion) T0-FILL [0.75-1.25. GeV/c]",200,-10,10);
+ fListQAtof->Add(hnSigT0Fill);
+ TH1F *hnSigT0T0 = new TH1F("hNsigma_TOF_Pion_T0-T0","TOF n#sigma (Pion) T0-T0 [0.75-1.25 GeV/c]",200,-10,10);
+ fListQAtof->Add(hnSigT0T0);
+ TH1F *hnSigT0TOF = new TH1F("hNsigma_TOF_Pion_T0-TOF","TOF n#sigma (Pion) T0-TOF [0.75-1.25 GeV/c]",200,-10,10);
+ fListQAtof->Add(hnSigT0TOF);
+ TH1F *hnSigT0Best = new TH1F("hNsigma_TOF_Pion_T0-Best","TOF n#sigma (Pion) T0-Best [0.75-1.25 GeV/c]",200,-10,10);
+ fListQAtof->Add(hnSigT0Best);
TH2F *hSig = new TH2F("hSigP_TOF",
- "TOF signal vs. p;p [GeV]; TOF signal [arb. units]",
+ "TOF signal vs. p;p [GeV]; TOF signal [ns]",
vX->GetNrows()-1,vX->GetMatrixArray(),
- 300,0,300);
+ 300,0,30);
delete vX;
fListQAtof->Add(hSig);
- TH1F *hStartTimeMask_TOF = new TH1F("hStartTimeMask_TOF","StartTime mask",8,0,8);
- fListQAtof->Add(hStartTimeMask_TOF);
- TH1F *hStartTimeRes_TOF = new TH1F("hStartTimeRes_TOF","StartTime resolution [ps]",100,0,500);
- fListQAtof->Add(hStartTimeRes_TOF);
+ TH1F *hStartTimeMaskTOF = new TH1F("hStartTimeMask_TOF","StartTime mask",8,0,8);
+ fListQAtof->Add(hStartTimeMaskTOF);
+ TH1F *hStartTimeResTOF = new TH1F("hStartTimeRes_TOF","StartTime resolution [ps]",100,0,500);
+ fListQAtof->Add(hStartTimeResTOF);
- TH1F *hnTracksAt_TOF = new TH1F("hnTracksAt_TOF","Matched tracks at TOF",20,0,20);
- fListQAtof->Add(hnTracksAt_TOF);
+ TH1F *hnTracksAtTOF = new TH1F("hnTracksAt_TOF","Matched tracks at TOF",20,0,20);
+ fListQAtof->Add(hnTracksAtTOF);
TH1F *hT0MakerEff = new TH1F("hT0MakerEff","Events with T0-TOF vs nTracks",20,0,20);
fListQAtof->Add(hT0MakerEff);
// this in principle should stay on a T0 PID QA, but are just the data prepared for TOF use
- TH1F *hStartTimeA_T0 = new TH1F("hStartTimeA_T0","StartTime from T0A [ps]",1000,-1000,1000);
- fListQAtof->Add(hStartTimeA_T0);
- TH1F *hStartTimeC_T0 = new TH1F("hStartTimeC_T0","StartTime from T0C [ps]",1000,-1000,1000);
- fListQAtof->Add(hStartTimeC_T0);
- TH1F *hStartTimeAC_T0 = new TH1F("hStartTimeAC_T0","StartTime from T0AC [ps]",1000,-1000,1000);;
- fListQAtof->Add(hStartTimeAC_T0);
+ TH1F *hStartTimeAT0 = new TH1F("hStartTimeA_T0","StartTime from T0A [ps]",1000,-1000,1000);
+ fListQAtof->Add(hStartTimeAT0);
+ TH1F *hStartTimeCT0 = new TH1F("hStartTimeC_T0","StartTime from T0C [ps]",1000,-1000,1000);
+ fListQAtof->Add(hStartTimeCT0);
+ TH1F *hStartTimeACT0 = new TH1F("hStartTimeAC_T0","StartTime from T0AC [ps]",1000,-1000,1000);;
+ fListQAtof->Add(hStartTimeACT0);
}
//______________________________________________________________________________
delete vX;
}
+//______________________________________________________________________________
+void AliAnalysisTaskPIDqa::SetupHMPIDqa()
+{
+ //
+ // Create the HMPID qa objects
+ //
+
+ TH2F *hCkovAnglevsMom = new TH2F("hCkovAnglevsMom", "Cherenkov angle vs momnetum",500,0,5.,500,0,1);
+ fListQAhmpid->Add(hCkovAnglevsMom);
+
+}
+
+//______________________________________________________________________________
+void AliAnalysisTaskPIDqa::SetupTOFHMPIDqa()
+{
+ //
+ // Create the HMPID qa objects
+ //
+
+ TH2F *hCkovAnglevsMomPion = new TH2F("hCkovAnglevsMom_pion", "Cherenkov angle vs momnetum for pions",500,0,5.,500,0,1);
+ fListQAtofhmpid->Add(hCkovAnglevsMomPion);
+
+ TH2F *hCkovAnglevsMomKaon = new TH2F("hCkovAnglevsMom_kaon", "Cherenkov angle vs momnetum for kaons",500,0,5.,500,0,1);
+ fListQAtofhmpid->Add(hCkovAnglevsMomKaon);
+
+ TH2F *hCkovAnglevsMomProton = new TH2F("hCkovAnglevsMom_proton","Cherenkov angle vs momnetum for protons",500,0,5.,500,0,1);
+ fListQAtofhmpid->Add(hCkovAnglevsMomProton);
+
+
+}
+
//______________________________________________________________________________
void AliAnalysisTaskPIDqa::SetupTPCTOFqa()
{