/* The class for calculating the global (not detector specific) quality assurance. It reuses the following TLists from its base class AliQADataMaker::fRecPointsQAList (for keeping the track residuals) AliQADataMaker::fESDsQAList (for keeping global ESD QA data) */ #include #include #include #include "AliQAChecker.h" #include "AliGlobalQADataMaker.h" #include "AliGeomManager.h" #include "AliESDEvent.h" #include "AliESDv0.h" #include "AliRawReader.h" #include "AliESDVZERO.h" #include "AliMultiplicity.h" ClassImp(AliGlobalQADataMaker) //____________________________________________________________________________ void AliGlobalQADataMaker::EndOfDetectorCycle(AliQAv1::TASKINDEX_t task, TObjArray ** list) { //Detector specific actions at end of cycle // do the QA checking AliQAChecker::Instance()->Run(AliQAv1::kGLOBAL, task, list) ; } //____________________________________________________________________________ void AliGlobalQADataMaker::InitRaws() { // create Raws histograms in Raws subdir } //____________________________________________________________________________ void AliGlobalQADataMaker::InitRecPoints() { //------------------------------------------------------ // This function books the histograms of *track*residuals* // as a part of global QA //------------------------------------------------------ const Char_t *name[]={ "hGlobalSPD1ResidualsY","SPD1ResidualsZ", "hGlobalSPD2ResidualsY","SPD2ResidualsZ", "hGlobalSDD1ResidualsY","SDD1ResidualsZ", "hGlobalSDD2ResidualsY","SDD2ResidualsZ", "hGlobalSSD1ResidualsY","SSD1ResidualsZ", "hGlobalSSD2ResidualsY","SSD2ResidualsZ", "hGlobalTPC1ResidualsY","TPC1ResidualsZ", "hGlobalTPC2ResidualsY","TPC2ResidualsZ", "hGlobalTRD1ResidualsY","TRD1ResidualsZ", "hGlobalTRD2ResidualsY","TRD2ResidualsZ", "hGlobalTRD3ResidualsY","TRD3ResidualsZ", "hGlobalTRD4ResidualsY","TRD4ResidualsZ", "hGlobalTRD5ResidualsY","TRD5ResidualsZ", "hGlobalTRD6ResidualsY","TRD6ResidualsZ", "hGlobalTOFResidualsY","TOFResidualsZ", "hGlobalPHOS1ResidualsY","PHOS1ResidualsZ", "hGlobalPHOS2ResidualsY","PHOS2ResidualsZ", "hGlobalHMPIDResidualsY","HMPIDResidualsZ", "hGlobalMUONResidualsY","MUONResidualsZ", "hGlobalEMCALResidualsY","EMCALResidualsZ" }; const Char_t *title[]={ "SPD1 residuals Y","SPD1 residuals Z", "SPD2 residuals Y","SPD2 residuals Z", "SDD1 residuals Y","SDD1 residuals Z", "SDD2 residuals Y","SDD2 residuals Z", "SSD1 residuals Y","SSD1 residuals Z", "SSD2 residuals Y","SSD2 residuals Z", "TPC1 residuals Y","TPC1 residuals Z", "TPC2 residuals Y","TPC2 residuals Z", "TRD1 residuals Y","TRD1 residuals Z", "TRD2 residuals Y","TRD2 residuals Z", "TRD3 residuals Y","TRD3 residuals Z", "TRD4 residuals Y","TRD4 residuals Z", "TRD5 residuals Y","TRD5 residuals Z", "TRD6 residuals Y","TRD6 residuals Z", "TOF residuals Y","TOF residuals Z", "PHOS1 residuals Y","PHOS1 residuals Z", "PHOS2 residuals Y","PHOS2 residuals Z", "HMPID residuals Y","HMPID residuals Z", "MUON residuals Y","MUON residuals Z", "EMCAL residuals Y","EMCAL residuals Z" }; for (Int_t m=1; mReset() ; } //____________________________________________________________________________ void AliGlobalQADataMaker::MakeESDs(AliESDEvent * event) { //----------------------------------------------------------- // This function fills the ESD QA histograms // as a part of global QA //----------------------------------------------------------- // Check id histograms already created for this Event Specie if ( ! GetESDsData(kClr0) ) InitESDs() ; const AliESDEvent *esd=event; Int_t ntrk=esd->GetNumberOfTracks() ; for (Int_t i=0; iGetTrack(i); // Cluster related QA if (track->IsOn(AliESDtrack::kITSrefit)) { Int_t n=track->GetITSclusters(0); GetESDsData(kClr0)->Fill(Float_t(n)/6.); //6 is the number of ITS layers } for (Int_t i=0; i<6; i++) { Int_t idet, sts; Float_t xloc,zloc; if (!track->GetITSModuleIndexInfo(i,idet,sts,xloc,zloc)) continue; if (i>=2) idet+=240; if (i>=4) idet+=260; if ((sts==1)||(sts==2)||(sts==4)) GetESDsData(kClr3)->Fill(idet); } if (track->IsOn(AliESDtrack::kTPCrefit)) { Int_t n =track->GetTPCNcls(); Int_t nf=track->GetTPCNclsF(); // number of crossed TPC pad rows if (nf>0) { Double_t val = n*1.0/nf; GetESDsData(kClr1)->Fill(val); } } if (track->IsOn(AliESDtrack::kTRDrefit)) { Int_t n=track->GetTRDclusters(0); GetESDsData(kClr2)->Fill(Float_t(n)/(6*24));//(6*24) is the number of TRD time bins } Double_t p=track->GetP(); // Track related QA if (track->IsOn(AliESDtrack::kTPCrefit)) { Float_t dz[2]; track->GetDZ(0.,0.,0.,esd->GetMagneticField(),dz); if ((TMath::Abs(dz[0])<3.) && (TMath::Abs(dz[1])<3.)) { // beam pipe Double_t phi=track->Phi(); GetESDsData(kTrk0)->Fill(phi); Double_t y=track->Eta(); GetESDsData(kTrk1)->Fill(y); if (TMath::Abs(y)<0.9) { GetESDsData(kTrk2)->Fill(p); if (track->IsOn(AliESDtrack::kITSrefit)) GetESDsData(kTrk3)->Fill(p); //if (track->IsOn(AliESDtrack::kTOFout)) GetESDsData(kTrk4)->Fill(p); if (track->GetTOFsignal()>0) GetESDsData(kTrk4)->Fill(p); } } } const AliExternalTrackParam *tpcTrack=track->GetTPCInnerParam(); const AliExternalTrackParam *innTrack=track->GetInnerParam(); if (tpcTrack) if (innTrack) { const AliESDVertex *vtx=esd->GetPrimaryVertex(); Double_t xv=vtx->GetXv(); Double_t yv=vtx->GetYv(); Double_t zv=vtx->GetZv(); Float_t dz[2]; tpcTrack->GetDZ(xv,yv,zv,esd->GetMagneticField(),dz); dz[0]*=10.; // in mm if (innTrack->GetZ() > 0) if (innTrack->GetTgl()> 0) { // TPC side A if (tpcTrack->GetSign() > 0) GetESDsData(kTrk7)->Fill(dz[0]); else GetESDsData(kTrk8)->Fill(dz[0]); } if (innTrack->GetZ() < 0) if (innTrack->GetTgl()< 0) { // TPC side C if (tpcTrack->GetSign() > 0) GetESDsData(kTrk9)->Fill(dz[0]); else GetESDsData(kTrk10)->Fill(dz[0]); } } // PID related QA if ((p>0.4) && (p<0.5)) { if (track->IsOn(AliESDtrack::kITSpid)) { Double_t dedx=track->GetITSsignal(); GetESDsData(kPid0)->Fill(dedx); } if (track->IsOn(AliESDtrack::kTPCpid)) { Double_t dedx=track->GetTPCsignal(); GetESDsData(kPid1)->Fill(dedx); } } if (p>1.0) { if (track->IsOn(AliESDtrack::kTOFpid)) { Double_t times[10]; track->GetIntegratedTimes(times); Double_t tof=track->GetTOFsignal(); GetESDsData(kPid2)->Fill(times[2]-tof); } } const AliExternalTrackParam *par=track->GetInnerParam(); if (par) { Double_t pp=par->GetP(); Double_t dedx=track->GetTPCsignal(); TH2F *h = dynamic_cast(GetESDsData(kPid3)); h->Fill(pp,dedx); } } // Multiplicity related QA AliESDVZERO *mltV0 =esd->GetVZEROData(); const AliMultiplicity *mltITS=esd->GetMultiplicity(); if (mltV0) if (mltITS) { Short_t nv0a=mltV0->GetNbPMV0A(); Short_t nv0c=mltV0->GetNbPMV0C(); Int_t nits=mltITS->GetNumberOfTracklets(); TH2F *h0=dynamic_cast(GetESDsData(kMlt0)); h0->Fill(nits,nv0a); TH2F *h1=dynamic_cast(GetESDsData(kMlt1)); h1->Fill(nits,nv0c); } TH1 *tpc=GetESDsData(kTrk2); tpc->Sumw2(); TH1 *its=GetESDsData(kTrk3); its->Sumw2(); TH1 *tof=GetESDsData(kTrk4); tof->Sumw2(); GetESDsData(kTrk5)->Divide(its,tpc,1,1.,"b"); GetESDsData(kTrk6)->Divide(tof,tpc,1,1.,"b"); // V0 related QA Int_t nV0=esd->GetNumberOfV0s(); for (Int_t i=0; iGetV0(i)); v0.ChangeMassHypothesis(kK0Short); mass=v0.GetEffMass(); if (v0.GetOnFlyStatus()) GetESDsData(kK0on)->Fill(mass); else GetESDsData(kK0off)->Fill(mass); v0.ChangeMassHypothesis(kLambda0); mass=v0.GetEffMass(); if (v0.GetOnFlyStatus()) GetESDsData(kL0on)->Fill(mass); else GetESDsData(kL0off)->Fill(mass); v0.ChangeMassHypothesis(kLambda0Bar); mass=v0.GetEffMass(); if (v0.GetOnFlyStatus()) GetESDsData(kL0on)->Fill(mass); else GetESDsData(kL0off)->Fill(mass); } }