]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - JETAN/AliAnalysisTaskJetCluster.cxx
Added Ecore; added check of TOF calculation
[u/mrichter/AliRoot.git] / JETAN / AliAnalysisTaskJetCluster.cxx
index 254e6ea3c17fa736e3c60e3ad1d6f61ddfd62829..e6639177642a62d682f8950e21bd61168fe519a9 100644 (file)
@@ -106,6 +106,7 @@ AliAnalysisTaskJetCluster::AliAnalysisTaskJetCluster():
   fEventSelection(kFALSE),     
   fRequireVZEROAC(kFALSE),     
   fRequireTZEROvtx(kFALSE),
+  fUseHFcuts(kFALSE),
   fFilterMask(0),
   fFilterMaskBestPt(0),
   fFilterType(0),
@@ -118,6 +119,8 @@ AliAnalysisTaskJetCluster::AliAnalysisTaskJetCluster():
   fAvgTrials(1),
   fExternalWeight(1),
   fTrackEtaWindow(0.9),    
+  fRequireITSRefit(0),
+  fApplySharedClusterCut(0),
   fRecEtaWindow(0.5),
   fTrackPtCut(0.),                                                     
   fJetOutputMinPt(0.150),
@@ -273,6 +276,7 @@ AliAnalysisTaskJetCluster::AliAnalysisTaskJetCluster(const char* name):
   fEventSelection(kFALSE),
   fRequireVZEROAC(kFALSE),     
   fRequireTZEROvtx(kFALSE), 
+  fUseHFcuts(kFALSE),
   fFilterMask(0),
   fFilterMaskBestPt(0),
   fFilterType(0),
@@ -285,6 +289,8 @@ AliAnalysisTaskJetCluster::AliAnalysisTaskJetCluster(const char* name):
   fAvgTrials(1),
   fExternalWeight(1),    
   fTrackEtaWindow(0.9),    
+  fRequireITSRefit(0),
+  fApplySharedClusterCut(0),
   fRecEtaWindow(0.5),
   fTrackPtCut(0.),                                                     
   fJetOutputMinPt(0.150),
@@ -907,8 +913,13 @@ void AliAnalysisTaskJetCluster::UserExec(Option_t */*option*/)
 
   //Check if information is provided detector level effects
   if(!fMomResH1 || !fMomResH2 || !fMomResH3) fUseTrPtResolutionSmearing = kFALSE;
-  if(!fhEffH1 || !fhEffH2 || !fhEffH3 )      fUseDiceEfficiency = kFALSE;
-  if(  fEfficiencyFixed < 1. )               fUseDiceEfficiency = kTRUE;  
+  if(  fEfficiencyFixed < 1. ) {
+     if (!fUseDiceEfficiency)
+       fUseDiceEfficiency = 1; // 1 is the default; 2 can be set by user
+  }
+  else {
+    if(!fhEffH1 || !fhEffH2 || !fhEffH3 )      fUseDiceEfficiency = kFALSE;
+  }
 
   Bool_t selectEvent =  false;
   Bool_t physicsSelection = true;// handled by the framework(fInputHandler->IsEventSelected()&AliVEvent::kMB)==AliVEvent::kMB;
@@ -996,6 +1007,7 @@ void AliAnalysisTaskJetCluster::UserExec(Option_t */*option*/)
 
   Int_t nT = GetListOfTracks(&recParticles,fTrackTypeRec);
   Float_t nCh = recParticles.GetEntries(); 
+  Float_t nGen=genParticles.GetEntries();
   fh1Nch->Fill(nCh);
   if(fDebug>2)Printf("%s:%d Selected Rec tracks: %d %d",(char*)__FILE__,__LINE__,nT,recParticles.GetEntries());
   nT = GetListOfTracks(&genParticles,fTrackTypeGen);
@@ -1033,6 +1045,9 @@ void AliAnalysisTaskJetCluster::UserExec(Option_t */*option*/)
       Double_t rnd = fRandom->Uniform(1.);
       if(  fEfficiencyFixed<1. ) {
        sumEff = fEfficiencyFixed;
+        if (fUseDiceEfficiency == 2) {
+           sumEff = (nCh - fEfficiencyFixed*nGen) / nCh;  // rescale eff; fEfficiencyFixed is wrt to nGen, but dicing is fraction of nCh
+        }
       } else {
 
        pT = vp->Pt();
@@ -1852,7 +1867,7 @@ Int_t  AliAnalysisTaskJetCluster::GetListOfTracks(TList *list,Int_t type){
   // get list of tracks/particles for different types
   //
 
-  if(fDebug>2)Printf("%s:%d Selecting tracks with %d",(char*)__FILE__,__LINE__,type);
+  if(fDebug>2) Printf("%s:%d Selecting tracks with %d",(char*)__FILE__,__LINE__,type);
 
   Int_t iCount = 0;
   if(type==kTrackAOD || type==kTrackAODextra || type==kTrackAODextraonly || type==kTrackAODMCextra || type==kTrackAODMCextraonly){
@@ -1876,6 +1891,28 @@ Int_t  AliAnalysisTaskJetCluster::GetListOfTracks(TList *list,Int_t type){
          if(fDebug>10)Printf("%s:%d Not matching filter %d/%d %d/%d",(char*)__FILE__,__LINE__,it,aod->GetNumberOfTracks(),fFilterMask,tr->GetFilterMap());     
          continue;
        }
+
+       // heavy flavor jets
+       if(fFilterMask==528 && fUseHFcuts){
+          Double_t ntpcClus = tr->GetTPCNcls();
+          Double_t trPt=tr->Pt();
+         TFormula NTPCClsCut("f1NClustersTPCLinearPtDep","70.+30./20.*x");
+       
+         if (trPt <= 20. && (ntpcClus < NTPCClsCut.Eval(trPt))) continue;
+         else if (trPt > 20. && ntpcClus < 100) continue;
+
+         Int_t idtr1 = tr->GetID(); 
+         Bool_t flagSame = kFALSE;
+         AvoidDoubleCountingHF(aod, idtr1, flagSame);
+         if (flagSame) continue; 
+       }
+       // 
+
+        if(fRequireITSRefit){if((tr->GetStatus()&AliESDtrack::kITSrefit)==0)continue;}
+        if (fApplySharedClusterCut) {
+           Double_t frac = Double_t(tr->GetTPCnclsS()) /Double_t(tr->GetTPCncls());
+           if (frac > 0.4) continue;
+        } 
        if(TMath::Abs(tr->Eta())>fTrackEtaWindow){
          if(fDebug>10)Printf("%s:%d Not matching eta %d/%d",(char*)__FILE__,__LINE__,it,aod->GetNumberOfTracks());     
          continue;
@@ -1910,8 +1947,16 @@ Int_t  AliAnalysisTaskJetCluster::GetListOfTracks(TList *list,Int_t type){
        else if(fFilterType == 1)bGood = trackAOD->IsHybridTPCConstrainedGlobal();
        else if(fFilterType == 2)bGood = trackAOD->IsHybridGlobalConstrainedGlobal();
        if((fFilterMask>0)&&((!trackAOD->TestFilterBit(fFilterMask)||(!bGood))))continue;
+        if(fRequireITSRefit){if((trackAOD->GetStatus()&AliESDtrack::kITSrefit)==0)continue;}
+         if (fApplySharedClusterCut) {
+           Double_t frac = Double_t(trackAOD->GetTPCnclsS()) /Double_t(trackAOD->GetTPCncls());
+           if (frac > 0.4) continue;
+        }
+
+
        if(TMath::Abs(trackAOD->Eta())>fTrackEtaWindow) continue;
        if(trackAOD->Pt()<fTrackPtCut) continue;
+       if(fDebug) printf("pt extra track %.2f \n", trackAOD->Pt());
        list->Add(trackAOD);
        iCount++;
       }
@@ -1928,14 +1973,37 @@ Int_t  AliAnalysisTaskJetCluster::GetListOfTracks(TList *list,Int_t type){
       if(!aodExtraTracks)return iCount;
       for(int it =0; it<aodExtraTracks->GetEntries(); it++) {
        AliVParticle *track = dynamic_cast<AliVParticle*> ((*aodExtraTracks)[it]);
-       if (!track) continue;
+       AliAODMCParticle *partmc = dynamic_cast<AliAODMCParticle*> ((*aodExtraTracks)[it]);
+       if (!track) {
+         if(fDebug>10)  printf("track %d does not exist\n",it);
+         continue;
+       }
+
+       if(!partmc) continue;
+       if(!partmc->IsPhysicalPrimary())continue;
+
+       if (track->Pt()<fTrackPtCut) {
+         if(fDebug>10)  printf("track %d has too low pt %.2f\n",it,track->Pt());
+         continue;
+       }
+
+       /*
+       AliAODTrack *trackAOD = dynamic_cast<AliAODTrack*>((*aodExtraTracks)[it]);//(track);
+
+       if(!trackAOD) {
+         if(fDebug>10) printf("trackAOD %d does not exist\n",it);
+         continue;
+       }
+       
+       trackAOD->SetFlags(AliESDtrack::kEmbedded);
+       trackAOD->SetFilterMap(fFilterMask);
+       */
+       if(fDebug>10) printf("pt extra track %.2f \n", track->Pt());        
+       
+       if(TMath::Abs(track->Eta())>fTrackEtaWindow) continue;
+       if(track->Pt()<fTrackPtCut) continue;
+       list->Add(track);
 
-       AliAODTrack *trackAOD = dynamic_cast<AliAODTrack*> (track);
-       if(!trackAOD)continue;
-        
-       if(TMath::Abs(trackAOD->Eta())>fTrackEtaWindow) continue;
-       if(trackAOD->Pt()<fTrackPtCut) continue;
-       list->Add(trackAOD);
        iCount++;
       }
     }
@@ -1990,10 +2058,74 @@ Int_t  AliAnalysisTaskJetCluster::GetListOfTracks(TList *list,Int_t type){
       }
     }
   }// AODMCparticle
+  else if (type == kTrackAODMCHF){
+         
+       AliAODEvent *aod = 0;
+    if(fUseAODMCInput)aod = dynamic_cast<AliAODEvent*>(InputEvent());
+    else aod = AODEvent();  
+       if(!aod)return iCount;
+       TClonesArray *tca = dynamic_cast<TClonesArray*>(aod->FindListObject(AliAODMCParticle::StdBranchName()));
+       if(!tca)return iCount;
+       for(int it = 0;it < tca->GetEntriesFast();++it){
+               AliAODMCParticle *part = (AliAODMCParticle*)(tca->At(it));
+               if(!part) continue;
+               int partpdg= part->PdgCode();
+               if(!part->IsPhysicalPrimary() && !IsBMeson(partpdg) && !IsDMeson(partpdg) )continue;
+               
+               if (IsBMeson(partpdg) || IsDMeson(partpdg)) {
+                       iCount+= AddDaughters( list , part,tca);
+                       }
+               else {
+                       
+                       if(part->Pt()<fTrackPtCut)      continue;
+                       if(TMath::Abs(part->Eta())>fTrackEtaWindow)     continue;
+                       if(part->Charge()==0)   continue;
+                       
+                       if((part->Pt()>=fTrackPtCut) && (TMath::Abs(part->Eta())<=fTrackEtaWindow) && (part->Charge()!=0))list->Add(part);
+                       iCount++;
+               }
+               }
+ }
+  
   list->Sort();
   return iCount;
 }
 
+Int_t AliAnalysisTaskJetCluster::AddDaughters(TList * list, AliAODMCParticle *part, TClonesArray * tca){
+       Int_t count=0;
+       Int_t nDaugthers = part->GetNDaughters();
+       for(Int_t i=0;i< nDaugthers;++i){
+               AliAODMCParticle *partdaughter = (AliAODMCParticle*)(tca->At(i));
+                       if(!partdaughter) continue;
+                       if(partdaughter->Pt()<fTrackPtCut)continue;
+                       if(TMath::Abs(partdaughter->Eta())>fTrackEtaWindow)continue;
+                       if(partdaughter->Charge()==0)continue;
+                       
+       if(!IsDMeson(partdaughter->PdgCode()) && !IsBMeson(partdaughter->PdgCode()) ){
+               list->Add(partdaughter);
+               count++;
+               }
+               else count+=AddDaughters(list,part,tca);
+       }                       
+return count;  
+}
+void AliAnalysisTaskJetCluster::AvoidDoubleCountingHF(AliAODEvent *aod, Int_t idtr1,  Bool_t &fFlagSameTr){
+  
+       Bool_t sametr = kFALSE;
+
+     for(int jt = 0;jt < aod->GetNumberOfTracks();++jt){
+
+       AliAODTrack *tr2 = aod->GetTrack(jt);
+       Int_t idtr2 = tr2->GetID();
+       if (idtr2>-1) continue;
+
+       idtr2=-1*idtr2;
+       if (idtr1==idtr2-1) sametr = kTRUE;
+       
+     }
+     fFlagSameTr = sametr;
+}
+
 void AliAnalysisTaskJetCluster::LoadTrPtResolutionRootFileFromOADB() {
 
    if (!gGrid) {
@@ -2151,3 +2283,21 @@ void AliAnalysisTaskJetCluster::FitMomentumResolution() {
 
   }
 */
+
+
+bool AliAnalysisTaskJetCluster::IsBMeson(int pc){
+       int bPdG[] = {511,521,10511,10521,513,523,10513,10523,20513,20523,20513,20523,515,525,531,
+       10531,533,10533,20533,535,541,10541,543,10543,20543,545,551,10551,100551,
+       110551,200551,210551,553,10553,20553,30553,100553,110553,120553,130553,200553,210553,220553,
+       300553,9000533,9010553,555,10555,20555,100555,110555,120555,200555,557,100557};
+       for(int i=0;i< (int)(sizeof(bPdG)/sizeof(int));++i) if(abs(pc) == bPdG[i]) return true;
+return false;
+}
+bool AliAnalysisTaskJetCluster::IsDMeson(int pc){
+       int bPdG[] = {411,421,10411,10421,413,423,10413,10423,20431,20423,415,
+       425,431,10431,433,10433,20433,435,441,10441,100441,443,10443,20443,
+       100443,30443,9000443,9010443,9020443,445,100445};
+       for(int i=0;i< (int)(sizeof(bPdG)/sizeof(int));++i) if(abs(pc) == bPdG[i]) return true;
+return false;
+}
+