X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=PWG2%2FRESONANCES%2FAliRsnAnalysisMonitorTask.cxx;h=ad5f843eee002b6422319903b60cf398102d370c;hb=5870863d81884f7fe8b74c4c4d6c8dbc1a12db6f;hp=0dd224b61aa7d9b6ba34414ed8e604a831e1f8dc;hpb=19a7d46ce96f1750efc92bdf05b22328872c8020;p=u%2Fmrichter%2FAliRoot.git diff --git a/PWG2/RESONANCES/AliRsnAnalysisMonitorTask.cxx b/PWG2/RESONANCES/AliRsnAnalysisMonitorTask.cxx index 0dd224b61aa..ad5f843eee0 100644 --- a/PWG2/RESONANCES/AliRsnAnalysisMonitorTask.cxx +++ b/PWG2/RESONANCES/AliRsnAnalysisMonitorTask.cxx @@ -25,60 +25,52 @@ #include "AliCDBManager.h" #include "AliITSPIDResponse.h" #include "AliRsnMonitorTrack.h" +#include "AliRsnDaughter.h" +#include "AliRsnEvent.h" #include "AliRsnAnalysisMonitorTask.h" +ClassImp(AliRsnAnalysisMonitorTask) + //__________________________________________________________________________________________________ AliRsnAnalysisMonitorTask::AliRsnAnalysisMonitorTask(const char *name) : - AliAnalysisTaskSE(name), - fEventType(2), - fNTracks(0), - fOut(0x0), - fTracks(0x0), - fMaxITSband(1E6), - fTPCpLimit(0.35), - fLargeTPCband(-1E6), - fSmallTPCband( 1E6), - fESDtrackCutsTPC(), - fESDtrackCutsITS(), - fESDpid(0x0), - fTOFmaker(0x0), - fTOFcalib(0x0), - fTOFcalibrateESD(kFALSE), - fTOFcorrectTExp(kFALSE), - fTOFuseT0(kFALSE), - fTOFtuneMC(kFALSE), - fTOFresolution(0.0) - + AliAnalysisTaskSE(name), + fOut(0x0), + fTrack(0x0), + fESDpid(0x0), + fTOFmaker(0x0), + fTOFcalib(0x0), + fTOFcalibrateESD(kFALSE), + fTOFcorrectTExp(kFALSE), + fTOFuseT0(kFALSE), + fTOFtuneMC(kFALSE), + fTOFresolution(0.0), + fEventCuts("eventCuts", AliRsnCut::kEvent), + fTrackCuts("trackCuts", AliRsnCut::kDaughter) + { // // Constructor // - DefineOutput(1, TTree::Class()); + DefineOutput(1, TTree::Class()); } //__________________________________________________________________________________________________ AliRsnAnalysisMonitorTask::AliRsnAnalysisMonitorTask(const AliRsnAnalysisMonitorTask& copy) : - AliAnalysisTaskSE(copy), - fEventType(2), - fNTracks(0), - fOut(0x0), - fTracks(0x0), - fMaxITSband(copy.fMaxITSband), - fTPCpLimit(copy.fTPCpLimit), - fLargeTPCband(copy.fLargeTPCband), - fSmallTPCband(copy.fSmallTPCband), - fESDtrackCutsTPC(copy.fESDtrackCutsTPC), - fESDtrackCutsITS(copy.fESDtrackCutsITS), - fESDpid(0x0), - fTOFmaker(0x0), - fTOFcalib(0x0), - fTOFcalibrateESD(kFALSE), - fTOFcorrectTExp(kFALSE), - fTOFuseT0(kFALSE), - fTOFtuneMC(kFALSE), - fTOFresolution(0.0) + AliAnalysisTaskSE(copy), + fOut(0x0), + fTrack(0x0), + fESDpid(0x0), + fTOFmaker(0x0), + fTOFcalib(0x0), + fTOFcalibrateESD(kFALSE), + fTOFcorrectTExp(kFALSE), + fTOFuseT0(kFALSE), + fTOFtuneMC(kFALSE), + fTOFresolution(0.0), + fEventCuts(copy.fEventCuts), + fTrackCuts(copy.fTrackCuts) { // // Copy constructor @@ -92,22 +84,13 @@ AliRsnAnalysisMonitorTask& AliRsnAnalysisMonitorTask::operator=(const AliRsnAnal // Assignment operator // - fMaxITSband = copy.fMaxITSband; - - fTPCpLimit = copy.fTPCpLimit; - fLargeTPCband = copy.fSmallTPCband; - fSmallTPCband = copy.fLargeTPCband; - - fESDtrackCutsTPC = copy.fESDtrackCutsTPC; - fESDtrackCutsITS = copy.fESDtrackCutsITS; - - fTOFcalibrateESD = copy.fTOFcalibrateESD; - fTOFcorrectTExp = copy.fTOFcorrectTExp; - fTOFuseT0 = copy.fTOFuseT0; - fTOFtuneMC = copy.fTOFtuneMC; - fTOFresolution = copy.fTOFresolution; - - return (*this); + fTOFcalibrateESD = copy.fTOFcalibrateESD; + fTOFcorrectTExp = copy.fTOFcorrectTExp; + fTOFuseT0 = copy.fTOFuseT0; + fTOFtuneMC = copy.fTOFtuneMC; + fTOFresolution = copy.fTOFresolution; + + return (*this); } //__________________________________________________________________________________________________ @@ -117,8 +100,9 @@ AliRsnAnalysisMonitorTask::~AliRsnAnalysisMonitorTask() // Destructor // - if (fOut) delete fOut; - if (fESDpid) delete fESDpid; + if (fOut) delete fOut; + if (fESDpid) delete fESDpid; + if (fTrack) delete fTrack; } //__________________________________________________________________________________________________ @@ -128,27 +112,22 @@ void AliRsnAnalysisMonitorTask::UserCreateOutputObjects() // Create the output data container // - // setup TPC response - fESDpid = new AliESDpid; - fESDpid->GetTPCResponse().SetBetheBlochParameters(fTPCpar[0], fTPCpar[1], fTPCpar[2], fTPCpar[3], fTPCpar[4]); - - // setup TOF maker & calibration - fTOFcalib = new AliTOFcalib; - fTOFmaker = new AliTOFT0maker(fESDpid, fTOFcalib); - fTOFmaker->SetTimeResolution(fTOFresolution); - - // initialize all the branch arrays - fTracks = new TClonesArray("AliRsnMonitorTrack", 0); - - // create output tree - OpenFile(1); - fOut = new TTree("rsnMonitor", "Informations on single tracks for cut checking"); - - // link branches - fOut->Branch("ntracks", &fNTracks , "ntracks/I" ); - fOut->Branch("evtype" , &fEventType , "evtype/I" ); - fOut->Branch("vertex" , &fVertex , "vertex[3]/F"); - fOut->Branch("tracks" , "TClonesArray", &fTracks ); + // setup TPC response + fESDpid = new AliESDpid; + fESDpid->GetTPCResponse().SetBetheBlochParameters(fTPCpar[0], fTPCpar[1], fTPCpar[2], fTPCpar[3], fTPCpar[4]); + + // setup TOF maker & calibration + fTOFcalib = new AliTOFcalib; + fTOFmaker = new AliTOFT0maker(fESDpid, fTOFcalib); + fTOFmaker->SetTimeResolution(fTOFresolution); + + // create output branch object + fTrack = new AliRsnMonitorTrack; + + // create output tree + OpenFile(1); + fOut = new TTree("rsnMonitor", "Informations on single tracks for cut checking"); + fOut->Branch("tracks", "AliRsnMonitorTrack", &fTrack); } //__________________________________________________________________________________________________ @@ -163,31 +142,30 @@ void AliRsnAnalysisMonitorTask::UserExec(Option_t *) // 3 -- event bad // - static Int_t evNum = 0; - evNum++; - - // retrieve ESD event and related stack (if available) - AliESDEvent *esd = dynamic_cast(fInputEvent); - AliStack *stack = (fMCEvent ? fMCEvent->Stack() : 0x0); - - // check the event - EventEval(esd); - - // if processable, then process it - if (fEventType == 0) ProcessESD(esd, esd->GetPrimaryVertexTracks(), stack); - else if (fEventType == 1) ProcessESD(esd, esd->GetPrimaryVertexSPD() , stack); - else - { - fTracks->Delete(); - fTracks->Clear(); - fNTracks = 0; - } - - // add a new entry in the TTree - fOut->Fill(); - - // update histogram container - PostData(1, fOut); + // retrieve ESD event and related stack (if available) + AliESDEvent *esd = dynamic_cast(fInputEvent); + AliStack *stack = 0x0; + + // skip NULL events + if (!esd) return; + if (fMCEvent) stack = fMCEvent->Stack(); + + // create interface objects to AliRsnEvent to check event cuts + AliRsnEvent event; + event.SetRef(esd); + event.SetRefMC(fMCEvent); + if (!fEventCuts.IsSelected(&event)) return; + + // check the event + Int_t type = EventEval(esd); + + // if processable, then process it + if (type == 0) ProcessESD(esd, esd->GetPrimaryVertexTracks(), stack); + else if (type == 1) ProcessESD(esd, esd->GetPrimaryVertexSPD() , stack); + else return; + + // update histogram container + PostData(1, fOut); } //__________________________________________________________________________________________________ @@ -199,43 +177,28 @@ void AliRsnAnalysisMonitorTask::Terminate(Option_t *) } //__________________________________________________________________________________________________ -void AliRsnAnalysisMonitorTask::EventEval(AliESDEvent *esd) +Int_t AliRsnAnalysisMonitorTask::EventEval(AliESDEvent *esd) { // // Checks if the event is good for analysis. -// Sets the 'fEventType' flag to: +// Returns: // ---> 0 if a good primary vertex with tracks was found, // ---> 1 if a good SPD primary vertex was found // ---> 2 otherwise (event to be rejected) // In any case, adds an entry to the TTree, to keep trace of all events. // - - // get number of tracks - fNTracks = esd->GetNumberOfTracks(); - - // get the best primary vertex: - // first try that with tracks, then the SPD one - const AliESDVertex *vTrk = esd->GetPrimaryVertexTracks(); - const AliESDVertex *vSPD = esd->GetPrimaryVertexSPD(); - if(vTrk->GetNContributors() > 0) - { - fVertex[0] = vTrk->GetXv(); - fVertex[1] = vTrk->GetYv(); - fVertex[2] = vTrk->GetZv(); - fEventType = 0; - } - else if (vSPD->GetNContributors() > 0) - { - fVertex[0] = vSPD->GetXv(); - fVertex[1] = vSPD->GetYv(); - fVertex[2] = vSPD->GetZv(); - fEventType = 1; - } - else - { - fNTracks = 0; - fEventType = 2; - } + + // get the best primary vertex: + // first try that with tracks, then the SPD one + const AliESDVertex *vTrk = esd->GetPrimaryVertexTracks(); + const AliESDVertex *vSPD = esd->GetPrimaryVertexSPD(); + if (vTrk->GetNContributors() > 0) { + return 0; + } else if (vSPD->GetNContributors() > 0) { + return 1; + } else { + return 2; + } } //__________________________________________________________________________________________________ @@ -248,181 +211,129 @@ void AliRsnAnalysisMonitorTask::ProcessESD // TClonesArray which is one of the branches of the output TTree. // - // clear array - fTracks->Delete(); - fTracks->Clear(); - - // reject empty events - if (!fNTracks) return; - - // ITS stuff #1 - // create the response function and initialize it to MC or not - // depending if the AliStack object is there or not - Bool_t isMC = (stack != 0x0); - AliITSPIDResponse itsrsp(isMC); - - // TOF stuff #1: init OCDB - Int_t run = esd->GetRunNumber(); - AliCDBManager *cdb = AliCDBManager::Instance(); - cdb->SetDefaultStorage("raw://"); - cdb->SetRun(run); - // TOF stuff #2: init calibration - fTOFcalib->SetCorrectTExp(fTOFcorrectTExp); - fTOFcalib->Init(); - // TOF stuff #3: calibrate - if (fTOFcalibrateESD) fTOFcalib->CalibrateESD(esd); - if (fTOFtuneMC) fTOFmaker->TuneForMC(esd); - if (fTOFuseT0) - { - fTOFmaker->ComputeT0TOF(esd); - fTOFmaker->ApplyT0TOF(esd); - fESDpid->MakePID(esd, kFALSE, 0.); - } - // TOF stuff #4: define fixed functions for compatibility range - Double_t a1 = 0.01, a2 = -0.03; - Double_t b1 = 0.25, b2 = 0.25; - Double_t c1 = 0.05, c2 = -0.03; - Double_t ymax, ymin; - - // loop on all tracks - Int_t i, k, size, nITS; - Double_t tpcMaxNSigma, itsdedx[4], tofRef, tofRel; - Bool_t okTOF, okTrack, isTPC, isITSSA, matchedTOF; - UChar_t itsCluMap; - Float_t b[2], bCov[3]; - AliRsnMonitorTrack mon; - - for (i = 0; i < fNTracks; i++) - { - AliESDtrack *track = esd->GetTrack(i); - - // skip NULL pointers, kink daughters and tracks which - // cannot be propagated to primary vertex - if (!track) continue; - if ((Int_t)track->GetKinkIndex(0) > 0) continue; - if (!track->RelateToVertex(v, esd->GetMagneticField(), kVeryBig)) continue; - - // reset the output object - // 'usable' flag will need to be set to 'ok' - mon.Reset(); - - // get MC info if possible - if (stack) mon.AdoptMC(TMath::Abs(track->GetLabel()), stack); - - // copy general info - mon.Status() = (UInt_t)track->GetStatus(); - mon.Length() = (Double_t)track->GetIntegratedLength(); - mon.Charge() = (Int_t)track->Charge(); - mon.PrecX() = (Double_t)track->Px(); - mon.PrecY() = (Double_t)track->Py(); - mon.PrecZ() = (Double_t)track->Pz(); - - // evaluate some flags from the status to decide what to do next in some points - isTPC = ((mon.Status() & AliESDtrack::kTPCin) != 0); - isITSSA = ((mon.Status() & AliESDtrack::kTPCin) == 0 && (mon.Status() & AliESDtrack::kITSrefit) != 0 && (mon.Status() & AliESDtrack::kITSpureSA) == 0 && (mon.Status() & AliESDtrack::kITSpid) != 0); - matchedTOF = ((mon.Status() & AliESDtrack::kTOFout) != 0 && (mon.Status() & AliESDtrack::kTIME) != 0); - - // accept only tracks which are TPC+ITS or ITS standalone - if (!isTPC && !isITSSA) continue; - - // set the track type in the output object - mon.ITSsa() = isITSSA; - - // get DCA to primary vertex - track->GetImpactParameters(b, bCov); - mon.DCAr() = (Double_t)b[0]; - mon.DCAz() = (Double_t)b[1]; - - // get ITS info - track->GetITSdEdxSamples(itsdedx); - mon.ITSchi2() = track->GetITSchi2(); - mon.ITSsignal() = track->GetITSsignal(); - for (k = 0; k < 6; k++) - { - mon.ITSmap(k) = track->HasPointOnITSLayer(k); - if (k < 4) mon.ITSdedx(k) = itsdedx[k]; - } - - // get TPC info - if (isTPC) - { - mon.TPCcount() = (Int_t)track->GetTPCclusters(0); - mon.TPCdedx() = (Double_t)track->GetTPCsignal(); - mon.TPCchi2() = (Double_t)track->GetTPCchi2(); - mon.TPCnsigma() = fESDpid->NumberOfSigmasTPC(track, AliPID::kKaon); - mon.PtpcX() = mon.PtpcY() = mon.PtpcZ() = 1E10; - if (track->GetInnerParam()) - { - mon.PtpcX() = track->GetInnerParam()->Px(); - mon.PtpcY() = track->GetInnerParam()->Py(); - mon.PtpcZ() = track->GetInnerParam()->Pz(); - for (k = 0; k < AliPID::kSPECIES; k++) mon.TPCref(k) = fESDpid->GetTPCResponse().GetExpectedSignal(mon.Ptpc(), (AliPID::EParticleType)k); + // create interfacr objects + AliRsnEvent event; + AliRsnDaughter daughter; + event.SetRef(esd); + event.SetRefMC(fMCEvent); + + // ITS stuff #1 + // create the response function and initialize it to MC or not + // depending if the AliStack object is there or not + Bool_t isMC = (stack != 0x0); + AliITSPIDResponse itsrsp(isMC); + + // TOF stuff #1: init OCDB + Int_t run = esd->GetRunNumber(); + AliCDBManager *cdb = AliCDBManager::Instance(); + cdb->SetDefaultStorage("raw://"); + cdb->SetRun(run); + // TOF stuff #2: init calibration + fTOFcalib->SetCorrectTExp(fTOFcorrectTExp); + fTOFcalib->Init(); + // TOF stuff #3: calibrate + if (fTOFcalibrateESD) fTOFcalib->CalibrateESD(esd); + if (fTOFtuneMC) fTOFmaker->TuneForMC(esd); + if (fTOFuseT0) { + fTOFmaker->ComputeT0TOF(esd); + fTOFmaker->ApplyT0TOF(esd); + fESDpid->MakePID(esd, kFALSE, 0.); + } + + // loop on all tracks + Int_t i, k, nITS, ntracks = esd->GetNumberOfTracks();; + Bool_t isTPC, isITSSA, isTOF; + Float_t b[2], bCov[3]; + Double_t time[10]; + + for (i = 0; i < ntracks; i++) { + AliESDtrack *track = esd->GetTrack(i); + event.SetDaughter(daughter, i, AliRsnDaughter::kTrack); + + // reset the output object + // 'usable' flag will need to be set to 'ok' + fTrack->Reset(); + + // check cuts + fTrack->CutsPassed() = fTrackCuts.IsSelected(&daughter); + + // skip NULL pointers, kink daughters and tracks which + // cannot be propagated to primary vertex + if (!track) continue; + if ((Int_t)track->GetKinkIndex(0) > 0) continue; + if (!track->RelateToVertex(v, esd->GetMagneticField(), kVeryBig)) continue; + + // get MC info if possible + if (stack) fTrack->AdoptMC(TMath::Abs(track->GetLabel()), stack); + + // copy general info + fTrack->Status() = (UInt_t)track->GetStatus(); + fTrack->Length() = (Double_t)track->GetIntegratedLength(); + fTrack->Charge() = (Int_t)track->Charge(); + fTrack->PrecX() = (Double_t)track->Px(); + fTrack->PrecY() = (Double_t)track->Py(); + fTrack->PrecZ() = (Double_t)track->Pz(); + + // evaluate some flags from the status to decide what to do next in some points + isTPC = ((fTrack->Status() & AliESDtrack::kTPCin) != 0); + isITSSA = ((fTrack->Status() & AliESDtrack::kTPCin) == 0 && (fTrack->Status() & AliESDtrack::kITSrefit) != 0 && (fTrack->Status() & AliESDtrack::kITSpureSA) == 0 && (fTrack->Status() & AliESDtrack::kITSpid) != 0); + isTOF = ((fTrack->Status() & AliESDtrack::kTOFout) != 0 && (fTrack->Status() & AliESDtrack::kTIME) != 0); + + // accept only tracks which are TPC+ITS or ITS standalone + if (isITSSA) { + fTrack->ITSsa() = kTRUE; + fTrack->TOFok() = kFALSE; + } else if (isTPC) { + fTrack->ITSsa() = kFALSE; + fTrack->TOFok() = isTOF; + } else + continue; + + // get DCA to primary vertex + track->GetImpactParameters(b, bCov); + fTrack->DCAr() = (Double_t)b[0]; + fTrack->DCAz() = (Double_t)b[1]; + + // get ITS info + for (k = 0; k < 6; k++) { + fTrack->ITSmap(k) = track->HasPointOnITSLayer(k); } - } - - // get TOF info - Double_t time[10]; - track->GetIntegratedTimes(time); - mon.TOFsignal() = (Double_t)track->GetTOFsignal(); - for (k = 0; k < AliPID::kSPECIES; k++) - { - mon.TOFref(k) = time[k]; - mon.TOFsigma(k) = (Double_t)fTOFmaker->GetExpectedSigma(mon.Prec(), time[k], AliPID::ParticleMass(k)); - } - - // if we are here, the track is usable - mon.SetUsable(); - - // now check the track against its cuts - // and update the flag related to it - // first, assume that cuts were passed - // and if they aren't, just update the flag accordingly - mon.CutsPassed() = kTRUE; - if (TMath::Abs(mon.DCAz()) > 3.0) mon.CutsPassed() = kFALSE; - - if (isTPC) - { - // check standard ESD cuts - if (!fESDtrackCutsTPC.IsSelected(track)) mon.CutsPassed() = kFALSE; - - // check TPC dE/dx - if (mon.Ptpc() > fTPCpLimit) tpcMaxNSigma = fSmallTPCband; else tpcMaxNSigma = fLargeTPCband; - if (TMath::Abs(mon.TPCnsigma()) > tpcMaxNSigma) mon.CutsPassed() = kFALSE; - - // check TOF (only if momentum is large than function asymptote and flags are OK) - okTOF = kTRUE; - if (matchedTOF && mon.Prec() > TMath::Max(b1, b2)) - { - tofRef = mon.TOFref(AliPID::kKaon); - if (tofRef > 0.0) - { - tofRel = (mon.TOFsignal() - tofRef) / tofRef; - ymax = a1 / (mon.Prec() - b1) + c1; - ymin = a2 / (mon.Prec() - b2) + c2; - okTOF = (tofRel >= ymin && tofRel <= ymax); - } + if (isITSSA) { + fTrack->ITSchi2() = track->GetITSchi2(); + fTrack->ITSsignal() = track->GetITSsignal(); + nITS = fTrack->SSDcount() + fTrack->SDDcount(); + for (k = 0; k < AliPID::kSPECIES; k++) { + fTrack->ITSnsigma(k) = itsrsp.GetNumberOfSigmas(fTrack->Prec(), fTrack->ITSsignal(), (AliPID::EParticleType)k, nITS, kTRUE); + } + } + + // get TPC info + if (isTPC) { + fTrack->TPCcount() = (Int_t)track->GetTPCclusters(0); + fTrack->TPCchi2() = (Double_t)track->GetTPCchi2(); + fTrack->TPCsignal() = (Double_t)track->GetTPCsignal(); + fTrack->PtpcX() = fTrack->PtpcY() = fTrack->PtpcZ() = 1E10; + if (track->GetInnerParam()) { + fTrack->PtpcX() = track->GetInnerParam()->Px(); + fTrack->PtpcY() = track->GetInnerParam()->Py(); + fTrack->PtpcZ() = track->GetInnerParam()->Pz(); + for (k = 0; k < AliPID::kSPECIES; k++) { + fTrack->TPCnsigma(k) = fESDpid->NumberOfSigmasTPC(track, (AliPID::EParticleType)k); + } + } } - if (!okTOF) mon.CutsPassed() = kFALSE; - } - else - { - // check standard ESD cuts - if (!fESDtrackCutsITS.IsSelected(track)) mon.CutsPassed() = kFALSE; - - // check dE/dx - itsCluMap = track->GetITSClusterMap(); - nITS = 0; - for(k = 2; k < 6; k++) if(itsCluMap & (1 << k)) ++nITS; - if (nITS < 3) okTrack = kFALSE; // track not good for PID - mon.ITSnsigma() = itsrsp.GetNumberOfSigmas(mon.Prec(), mon.ITSsignal(), AliPID::kKaon, nITS, kTRUE); - if (TMath::Abs(mon.ITSnsigma()) > fMaxITSband) mon.CutsPassed() = kFALSE; - } - - // collect only tracks which are declared usable - if (mon.IsUsable()) - { - size = (Int_t)fTracks->GetEntriesFast(); - new ((*fTracks)[size]) AliRsnMonitorTrack(mon); - } - } + + // get TOF info + if (isTOF) { + track->GetIntegratedTimes(time); + fTrack->TOFsignal() = (Double_t)track->GetTOFsignal(); + for (k = 0; k < AliPID::kSPECIES; k++) { + fTrack->TOFref(k) = time[k]; + fTrack->TOFsigma(k) = (Double_t)fTOFmaker->GetExpectedSigma(fTrack->Prec(), time[k], AliPID::ParticleMass(k)); + } + } + + // add entry to TTree + fOut->Fill(); + } }