]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - JETAN/AliAnalysisTaskJetCluster.cxx
missing from rev 44785
[u/mrichter/AliRoot.git] / JETAN / AliAnalysisTaskJetCluster.cxx
index 408ad357b288e1fe9a5934488bb27097bcc482b6..518db6fcadd18717b666265c046559878d22b53d 100644 (file)
@@ -25,7 +25,7 @@
 #include <TSystem.h>
 #include <TInterpreter.h>
 #include <TChain.h>
-#include <TRandom.h>
+#include <TRefArray.h>
 #include <TFile.h>
 #include <TKey.h>
 #include <TH1F.h>
@@ -42,8 +42,6 @@
 #include "AliJetFinder.h"
 #include "AliJetHeader.h"
 #include "AliJetReader.h"
-#include "AliJetReaderHeader.h"
-#include "AliUA1JetHeaderV1.h"
 #include "AliESDEvent.h"
 #include "AliAODEvent.h"
 #include "AliAODHandler.h"
@@ -57,7 +55,7 @@
 #include "AliJetKineReaderHeader.h"
 #include "AliGenCocktailEventHeader.h"
 #include "AliInputEventHandler.h"
-
+#include "AliAODJetEventBackground.h"
 
 #include "fastjet/PseudoJet.hh"
 #include "fastjet/ClusterSequenceArea.hh"
 
 ClassImp(AliAnalysisTaskJetCluster)
 
+AliAnalysisTaskJetCluster::~AliAnalysisTaskJetCluster(){
+  delete fRef;
+}
+
 AliAnalysisTaskJetCluster::AliAnalysisTaskJetCluster(): AliAnalysisTaskSE(),
   fAOD(0x0),
+  fAODExtension(0x0),
+  fRef(new TRefArray),
   fUseAODTrackInput(kFALSE),
   fUseAODMCInput(kFALSE),
   fUseGlobalSelection(kFALSE),
+  fUseBackgroundCalc(kFALSE),
   fFilterMask(0),
   fTrackTypeRec(kTrackUndef),
-  fTrackTypeGen(kTrackUndef),
+  fTrackTypeGen(kTrackUndef),  
+  fNSkipLeadingRan(0),
   fAvgTrials(1),
   fExternalWeight(1),    
   fRecEtaWindow(0.5),
+  fTrackPtCut(0.),                                                     
+  fJetOutputMinPt(1),
+  fNonStdBranch(""),
+  fNonStdFile(""),
   fRparam(1.0), 
   fAlgorithm(fastjet::kt_algorithm),
   fStrategy(fastjet::Best),
   fRecombScheme(fastjet::BIpt_scheme),
   fAreaType(fastjet::active_area), 
+  fGhostArea(0.01),
+  fActiveAreaRepeats(1),
+  fGhostEtamax(1.5),
   fh1Xsec(0x0),
   fh1Trials(0x0),
   fh1PtHard(0x0),
@@ -135,26 +148,40 @@ AliAnalysisTaskJetCluster::AliAnalysisTaskJetCluster(): AliAnalysisTaskSE(),
   fh2TracksLeadingJetPhiPtWRan(0x0),
   fHistList(0x0)  
 {
-
+  for(int i = 0;i<3;i++){
+    fh1BiARandomCones[i] = 0;
+    fh1BiARandomConesRan[i] = 0;
+  }
 }
 
 AliAnalysisTaskJetCluster::AliAnalysisTaskJetCluster(const char* name):
   AliAnalysisTaskSE(name),
   fAOD(0x0),
+  fAODExtension(0x0),
+  fRef(new TRefArray),
   fUseAODTrackInput(kFALSE),
   fUseAODMCInput(kFALSE),
   fUseGlobalSelection(kFALSE),
+  fUseBackgroundCalc(kFALSE),
   fFilterMask(0),
   fTrackTypeRec(kTrackUndef),
   fTrackTypeGen(kTrackUndef),
+  fNSkipLeadingRan(0),
   fAvgTrials(1),
   fExternalWeight(1),    
   fRecEtaWindow(0.5),
+  fTrackPtCut(0.),                                                     
+  fJetOutputMinPt(1),
+  fNonStdBranch(""),
+  fNonStdFile(""),
   fRparam(1.0), 
   fAlgorithm(fastjet::kt_algorithm),
   fStrategy(fastjet::Best),
   fRecombScheme(fastjet::BIpt_scheme),
   fAreaType(fastjet::active_area), 
+  fGhostArea(0.01),
+  fActiveAreaRepeats(1),
+  fGhostEtamax(1.5),
   fh1Xsec(0x0),
   fh1Trials(0x0),
   fh1PtHard(0x0),
@@ -205,7 +232,11 @@ AliAnalysisTaskJetCluster::AliAnalysisTaskJetCluster(const char* name):
   fh2TracksLeadingJetPhiPtWRan(0x0),
   fHistList(0x0)
 {
-  DefineOutput(1, TList::Class());  
+  for(int i = 0;i<3;i++){
+    fh1BiARandomCones[i] = 0;
+    fh1BiARandomConesRan[i] = 0;
+  }
+ DefineOutput(1, TList::Class());  
 }
 
 
@@ -227,13 +258,68 @@ void AliAnalysisTaskJetCluster::UserCreateOutputObjects()
   //
 
 
+
+
   // Connect the AOD
 
 
   if (fDebug > 1) printf("AnalysisTaskJetCluster::UserCreateOutputObjects() \n");
 
+  
+
+  if(fNonStdBranch.Length()!=0)
+    {
+      // only create the output branch if we have a name
+      // Create a new branch for jets...
+      //  -> cleared in the UserExec....
+      // here we can also have the case that the brnaches are written to a separate file
+
+      TClonesArray *tca = new TClonesArray("AliAODJet", 0);
+      tca->SetName(fNonStdBranch.Data());
+      AddAODBranch("TClonesArray",&tca,fNonStdFile.Data());
+
+   
+      TClonesArray *tcaran = new TClonesArray("AliAODJet", 0);
+      tcaran->SetName(Form("%s_%s",fNonStdBranch.Data(),"random"));
+      AddAODBranch("TClonesArray",&tcaran,fNonStdFile.Data());
+
+
+      if(fUseBackgroundCalc){
+       if(!AODEvent()->FindListObject(Form("%s_%s",AliAODJetEventBackground::StdBranchName(),fNonStdBranch.Data()))){
+         AliAODJetEventBackground* evBkg = new AliAODJetEventBackground();
+         evBkg->SetName(Form("%s_%s",AliAODJetEventBackground::StdBranchName(),fNonStdBranch.Data()));
+         AddAODBranch("AliAODJetEventBackground",&evBkg,fNonStdFile.Data());  
+       }
+      }
+
+      if(fNonStdFile.Length()!=0){
+       // 
+       // case that we have an AOD extension we need to fetch the jets from the extended output
+       // we identifay the extension aod event by looking for the branchname
+       AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
+       TObjArray* extArray = aodH->GetExtensions();
+       if (extArray) {
+         TIter next(extArray);
+         while ((fAODExtension=(AliAODExtension*)next())){
+           TObject *obj = fAODExtension->GetAOD()->FindListObject(fNonStdBranch.Data());
+           if(fDebug>10){
+             Printf("%s:%d Dumping..",(char*)__FILE__,__LINE__);
+             fAODExtension->GetAOD()->Dump();
+           }
+           if(obj){
+             if(fDebug>1)Printf("AODExtension found for %s",fNonStdBranch.Data());
+             break;
+           }
+           fAODExtension = 0;
+         }
+       }
+      }
+    }
+
+
   OpenFile(1);
   if(!fHistList)fHistList = new TList();
+  fHistList->SetOwner();
 
   Bool_t oldStatus = TH1::AddDirectoryStatus();
   TH1::AddDirectory(kFALSE);
@@ -309,6 +395,12 @@ void AliAnalysisTaskJetCluster::UserCreateOutputObjects()
   fh1PtTracksGenIn  = new TH1F("fh1PtTracksGenIn","gen tracks P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
   fh1Nch = new TH1F("fh1Nch","charged multiplicity; N_{ch}",nChMax,-0.5,nChMax-0.5);
 
+
+  for(int i = 0;i<3;i++){
+    fh1BiARandomCones[i] = new TH1F(Form("fh1BiARandomCones%d",i),";B_{i}^{A} (GeV/c)",200,-100,100);
+    fh1BiARandomConesRan[i] =  new TH1F(Form("fh1BiARandomConesRan%d",i),";B_{i}^{A} (GeV/c)",200,-100,100);
+  }
+
   fh2NRecJetsPt = new TH2F("fh2NRecJetsPt","Number of jets above threshhold;p_{T,cut} (GeV/c);N_{jets}",nBinPt,binLimitsPt,50,-0.5,49.5);
   fh2NRecJetsPtRan = new TH2F("fh2NRecJetsPtRan","Number of jets above threshhold;p_{T,cut} (GeV/c);N_{jets}",nBinPt,binLimitsPt,50,-0.5,49.5);
   fh2NRecTracksPt = new TH2F("fh2NRecTracksPt","Number of tracks above threshhold;p_{T,cut} (GeV/c);N_{tracks}",nBinPt,binLimitsPt,50,-0.5,49.5);
@@ -389,6 +481,10 @@ void AliAnalysisTaskJetCluster::UserCreateOutputObjects()
     fHistList->Add(fh1NConstLeadingRecRan);
     fHistList->Add(fh1PtJetsRecInRan);
     fHistList->Add(fh1Nch);
+    for(int i = 0;i<3;i++){
+      fHistList->Add(fh1BiARandomCones[i]);
+      fHistList->Add(fh1BiARandomConesRan[i]);
+    }
     fHistList->Add(fh2NRecJetsPt);
     fHistList->Add(fh2NRecTracksPt);
     fHistList->Add(fh2NConstPt);
@@ -451,6 +547,28 @@ void AliAnalysisTaskJetCluster::UserExec(Option_t */*option*/)
     return;
   }
 
+  // handle and reset the output jet branch 
+  // only need this once
+  TClonesArray* jarray = 0;  
+  TClonesArray* jarrayran = 0;  
+  AliAODJetEventBackground*  evBkg = 0;
+  if(fNonStdBranch.Length()!=0) {
+    if(AODEvent())jarray = (TClonesArray*)(AODEvent()->FindListObject(fNonStdBranch.Data()));
+    if(!jarray)jarray = (TClonesArray*)(fAODExtension->GetAOD()->FindListObject(fNonStdBranch.Data()));
+    if(jarray)jarray->Delete();    // this is our responsibility, clear before filling again
+    if(AODEvent())jarrayran = (TClonesArray*)(AODEvent()->FindListObject(Form("%s_%s",fNonStdBranch.Data(),"random")));
+    if(!jarrayran)jarrayran = (TClonesArray*)(fAODExtension->GetAOD()->FindListObject(Form("%s_%s",fNonStdBranch.Data(),"random")));
+    if(jarrayran)jarrayran->Delete();    // this is our responsibility, clear before filling again
+
+    if(fUseBackgroundCalc){
+      if(AODEvent())evBkg = (AliAODJetEventBackground*)(AODEvent()->FindListObject(Form("%s_%s",AliAODJetEventBackground::StdBranchName(),fNonStdBranch.Data())));
+      if(!evBkg)  evBkg = (AliAODJetEventBackground*)(fAODExtension->GetAOD()->FindListObject(Form("%s_%s",AliAODJetEventBackground::StdBranchName(),fNonStdBranch.Data())));
+      if(evBkg)evBkg->Reset(); 
+    }
+  }
+
+
   //
   // Execute analysis for current event
   //
@@ -476,11 +594,13 @@ void AliAnalysisTaskJetCluster::UserExec(Option_t */*option*/)
   }
   
   Bool_t selectEvent =  false;
-  Bool_t physicsSelection = true; // fInputHandler->IsEventSelected();
+  Bool_t physicsSelection = true;// handled by the framework(fInputHandler->IsEventSelected()&AliVEvent::kMB)==AliVEvent::kMB;
 
   if(fAOD){
     const AliAODVertex *vtxAOD = fAOD->GetPrimaryVertex();
-    if(vtxAOD->GetNContributors()>0){
+    TString vtxTitle(vtxAOD->GetTitle());
+
+    if(vtxAOD->GetNContributors()>2&&!vtxTitle.Contains("TPCVertex")){
        Float_t zvtx = vtxAOD->GetZ();
        Float_t yvtx = vtxAOD->GetY();
        Float_t xvtx = vtxAOD->GetX();
@@ -520,6 +640,15 @@ void AliAnalysisTaskJetCluster::UserExec(Option_t */*option*/)
 
   vector<fastjet::PseudoJet> inputParticlesRec;
   vector<fastjet::PseudoJet> inputParticlesRecRan;
+
+
+  // create a random jet within the acceptance
+  const float rRandomCone2 = 0.4*0.4;
+  float etaRandomCone = gRandom->Rndm()-0.5; // +- 0.5
+  float phiRandomCone = gRandom->Rndm()*2.*TMath::Pi(); // 0 - 2pi
+  float ptRandomCone = 0;
+  float ptRandomConeRan = 0;
+
   for(int i = 0; i < recParticles.GetEntries(); i++){
     AliVParticle *vp = (AliVParticle*)recParticles.At(i);
     // Carefull energy is not well determined in real data, should not matter for p_T scheme?
@@ -528,23 +657,55 @@ void AliAnalysisTaskJetCluster::UserExec(Option_t */*option*/)
     jInp.set_user_index(i);
     inputParticlesRec.push_back(jInp);
 
-    // the randomized input changes eta and phi, but keeps the p_T
-    Double_t pT = vp->Pt();
-    Double_t eta = 1.8 * gRandom->Rndm() - 0.9;
-    Double_t phi = 2.* TMath::Pi() * gRandom->Rndm();
-
-
-    Double_t theta = 2.*TMath::ATan(TMath::Exp(-2.*eta));  
-    Double_t pZ = pT/TMath::Tan(theta);
-
-    Double_t pX = pT * TMath::Cos(phi);
-    Double_t pY = pT * TMath::Sin(phi);
-    Double_t p  = TMath::Sqrt(pT*pT+pZ*pZ); 
+    if(evBkg){
+      float deta = vp->Eta()-etaRandomCone;
+      float dphi = vp->Phi()-phiRandomCone;
+      if(dphi>TMath::Pi())dphi -= 2.*TMath::Pi();
+      if(dphi<-TMath::Pi())dphi += 2.*TMath::Pi();
+      float dr2 = dphi*dphi+deta*deta;
+      if(dr2<rRandomCone2){
+       // within random jet
+       ptRandomCone += vp->Pt();
+      }
+    }
 
-    fastjet::PseudoJet jInpRan(pX,pY,pZ,p);
-    jInpRan.set_user_index(i);
-    inputParticlesRecRan.push_back(jInpRan);
+    // the randomized input changes eta and phi, but keeps the p_T
+    if(i>=fNSkipLeadingRan){// eventually skip the leading particles
+      Double_t pT = vp->Pt();
+      Double_t eta = 1.8 * gRandom->Rndm() - 0.9;
+      Double_t phi = 2.* TMath::Pi() * gRandom->Rndm();
+      
+      Double_t theta = 2.*TMath::ATan(TMath::Exp(-2.*eta));  
+      Double_t pZ = pT/TMath::Tan(theta);
+
+      Double_t pX = pT * TMath::Cos(phi);
+      Double_t pY = pT * TMath::Sin(phi);
+      Double_t p  = TMath::Sqrt(pT*pT+pZ*pZ); 
+      fastjet::PseudoJet jInpRan(pX,pY,pZ,p);
+      jInpRan.set_user_index(i);
+      inputParticlesRecRan.push_back(jInpRan);
+
+      if(evBkg){
+       float deta = eta-etaRandomCone;
+       float dphi = phi-phiRandomCone;
+       if(dphi>TMath::Pi())dphi -= 2.*TMath::Pi();
+       if(dphi<-TMath::Pi())dphi += 2.*TMath::Pi();
+       float dr2 = dphi*dphi+deta*deta;
+       if(dr2<rRandomCone2){
+         // within random jet
+         ptRandomConeRan += pT;
+       }
+      }
+    }
 
+    // fill the tref array, only needed when we write out jets
+    if(jarray){
+      if(i == 0){
+       fRef->Delete(); // make sure to delete before placement new...
+       new(fRef) TRefArray(TProcessID::GetProcessWithUID(vp));
+      }
+      fRef->Add(vp);
+    }
   }
 
   if(inputParticlesRec.size()==0){
@@ -554,10 +715,32 @@ void AliAnalysisTaskJetCluster::UserExec(Option_t */*option*/)
   }
   
   // run fast jet
+  // employ setters for these...
+
+  // now create the object that holds info about ghosts                        
+  if(!fUseBackgroundCalc&& fNonStdBranch.Length()==0){
+    // reduce CPU time...
+    fGhostArea = 0.5; 
+    fActiveAreaRepeats = 0; 
+  }
+  fastjet::GhostedAreaSpec ghostSpec(fGhostEtamax, fActiveAreaRepeats, fGhostArea);
+  fastjet::AreaType areaType =   fastjet::active_area;
+  fastjet::AreaDefinition areaDef = fastjet::AreaDefinition(areaType,ghostSpec);
   fastjet::JetDefinition jetDef(fAlgorithm, fRparam, fRecombScheme, fStrategy);
   vector <fastjet::PseudoJet> inclusiveJets, sortedJets;
-  fastjet::ClusterSequence clustSeq(inputParticlesRec, jetDef);
+  fastjet::ClusterSequenceArea clustSeq(inputParticlesRec, jetDef,areaDef);
   
+  //range where to compute background
+  Double_t phiMin = 0, phiMax = 0, rapMin = 0, rapMax = 0;
+  phiMin = 0;
+  phiMax = 2*TMath::Pi();
+  rapMax = fGhostEtamax - fRparam;
+  rapMin = - fGhostEtamax + fRparam;
+  fastjet::RangeDefinition range(rapMin,rapMax, phiMin, phiMax);
+
+
   inclusiveJets = clustSeq.inclusive_jets();
   sortedJets    = sorted_by_pt(inclusiveJets);
  
@@ -565,11 +748,14 @@ void AliAnalysisTaskJetCluster::UserExec(Option_t */*option*/)
 
  // loop over all jets an fill information, first on is the leading jet
 
- Int_t nRecOver = inclusiveJets.size();
- Int_t nRec     = inclusiveJets.size();
- if(inclusiveJets.size()>0){
-   AliAODJet leadingJet (sortedJets[0].px(), sortedJets[0].py(), sortedJets[0].pz(), sortedJets[0].E());
 Int_t nRecOver = inclusiveJets.size();
 Int_t nRec     = inclusiveJets.size();
 if(inclusiveJets.size()>0){
+    AliAODJet leadingJet (sortedJets[0].px(), sortedJets[0].py(), sortedJets[0].pz(), sortedJets[0].E());
     Float_t pt = leadingJet.Pt();
+    Int_t nAodOutJets = 0;
+    Int_t nAodOutTracks = 0;
+    AliAODJet *aodOutJet = 0;
 
     Int_t iCount = 0;
     for(int i = 1;i <= fh2NRecJetsPt->GetNbinsX();i++){
@@ -588,12 +774,11 @@ void AliAnalysisTaskJetCluster::UserExec(Option_t */*option*/)
     if(phi<0)phi+=TMath::Pi()*2.;    
     Float_t eta = leadingJet.Eta();
     pt = leadingJet.Pt();
-
+    
     // correlation of leading jet with tracks
     TIterator *recIter = recParticles.MakeIterator();
-    AliVParticle *tmpRecTrack = (AliVParticle*)(recIter->Next());  
-
     recIter->Reset();
+    AliVParticle *tmpRecTrack = 0;
     while((tmpRecTrack = (AliVParticle*)(recIter->Next()))){
       Float_t tmpPt = tmpRecTrack->Pt();
       // correlation
@@ -602,64 +787,115 @@ void AliAnalysisTaskJetCluster::UserExec(Option_t */*option*/)
       Float_t dPhi = phi - tmpPhi;
       if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
       if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();      
-      //      Float_t dEta = eta - tmpRecTrack->Eta();
       fh2TracksLeadingJetPhiPt->Fill(dPhi,pt);
       fh2TracksLeadingJetPhiPtW->Fill(dPhi,pt,tmpPt);
-   }  
+    }  
+    
+   
+    
+   for(int j = 0; j < nRec;j++){
+     AliAODJet tmpRec (sortedJets[j].px(), sortedJets[j].py(), sortedJets[j].pz(), sortedJets[j].E());
+     aodOutJet = 0;
+     nAodOutTracks = 0;
+     Float_t tmpPt = tmpRec.Pt();  
+     fh1PtJetsRecIn->Fill(tmpPt);
+     // Fill Spectra with constituents
+     vector<fastjet::PseudoJet> constituents = clustSeq.constituents(sortedJets[j]);
+     fh1NConstRec->Fill(constituents.size());
+     fh2PtNch->Fill(nCh,tmpPt);
+     fh2PtNchN->Fill(nCh,tmpPt,constituents.size());
+     fh2NConstPt->Fill(tmpPt,constituents.size());
+     // loop over constiutents and fill spectrum
+
+     // Add the jet information and the track references to the output AOD
+     
+     if(tmpPt>fJetOutputMinPt&&jarray){
+       aodOutJet =  new ((*jarray)[nAodOutJets++]) AliAODJet(tmpRec);
+       Double_t area=clustSeq.area(sortedJets[j]);
+       
+       aodOutJet->SetEffArea(area,0);
+     }
 
+     
+     for(unsigned int ic = 0; ic < constituents.size();ic++){
+       AliVParticle *part = (AliVParticle*)recParticles.At(constituents[ic].user_index());
+       fh1PtJetConstRec->Fill(part->Pt());
+       if(aodOutJet){
+        aodOutJet->AddTrack(fRef->At(constituents[ic].user_index()));
+       }
+       if(j==0)fh1PtJetConstLeadingRec->Fill(part->Pt());
+     }
 
 
-    for(int j = 0; j < nRec;j++){
-      AliAODJet tmpRec (sortedJets[j].px(), sortedJets[j].py(), sortedJets[j].pz(), sortedJets[j].E());
-      Float_t tmpPt = tmpRec.Pt();
-      fh1PtJetsRecIn->Fill(tmpPt);
-      // Fill Spectra with constituents
-      vector<fastjet::PseudoJet> constituents = clustSeq.constituents(sortedJets[j]);
-      fh1NConstRec->Fill(constituents.size());
-      fh2PtNch->Fill(nCh,tmpPt);
-      fh2PtNchN->Fill(nCh,tmpPt,constituents.size());
-      fh2NConstPt->Fill(tmpPt,constituents.size());
-      // loop over constiutents and fill spectrum
-      for(unsigned int ic = 0; ic < constituents.size();ic++){
-       AliVParticle *part = (AliVParticle*)recParticles.At(constituents[ic].user_index());
-       fh1PtJetConstRec->Fill(part->Pt());
-       if(j==0)fh1PtJetConstLeadingRec->Fill(part->Pt());
-      }
 
-      // correlation
-      Float_t tmpPhi =  tmpRec.Phi();
-      Float_t tmpEta =  tmpRec.Eta();
-      if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;    
+     
+     
 
-      if(j==0){
-       fh1PtJetsLeadingRecIn->Fill(tmpPt);
-       fh2LeadingJetPhiEta->Fill(tmpPhi,tmpEta);
-       fh2LeadingJetEtaPt->Fill(tmpEta,tmpPt);
-       fh1NConstLeadingRec->Fill(constituents.size());
-       fh2NConstLeadingPt->Fill(tmpPt,constituents.size());
-       continue;
-      }
-      fh2JetPhiEta->Fill(tmpRec.Phi(),tmpEta);
-      fh2JetEtaPt->Fill(tmpEta,tmpPt);
-      Float_t dPhi = phi - tmpPhi;
-      if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
-      if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();      
-      Float_t dEta = eta - tmpRec.Eta();
-      fh2JetsLeadingPhiEta->Fill(dPhi,dEta);
-      fh2JetsLeadingPhiPt->Fill(dPhi,pt);
-      fh2JetsLeadingPhiPtW->Fill(dPhi,pt,tmpPt);
-    }
-    delete recIter;
- }
+
+     
+     // correlation
+     Float_t tmpPhi =  tmpRec.Phi();
+     Float_t tmpEta =  tmpRec.Eta();
+     if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;    
+     
+     if(j==0){
+       fh1PtJetsLeadingRecIn->Fill(tmpPt);
+       fh2LeadingJetPhiEta->Fill(tmpPhi,tmpEta);
+       fh2LeadingJetEtaPt->Fill(tmpEta,tmpPt);
+       fh1NConstLeadingRec->Fill(constituents.size());
+       fh2NConstLeadingPt->Fill(tmpPt,constituents.size());
+       continue;
+     }
+     fh2JetPhiEta->Fill(tmpRec.Phi(),tmpEta);
+     fh2JetEtaPt->Fill(tmpEta,tmpPt);
+     Float_t dPhi = phi - tmpPhi;
+     if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
+     if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();      
+     Float_t dEta = eta - tmpRec.Eta();
+     fh2JetsLeadingPhiEta->Fill(dPhi,dEta);
+     fh2JetsLeadingPhiPt->Fill(dPhi,pt);
+     fh2JetsLeadingPhiPtW->Fill(dPhi,pt,tmpPt);
+   }
+   delete recIter;
+
+      //background estimates:all bckg jets(0) & wo the 2 hardest(1)
  
+   if(evBkg){
+     vector<fastjet::PseudoJet> jets2=sortedJets;
+     if(jets2.size()>2) jets2.erase(jets2.begin(),jets2.begin()+2); 
+     Double_t bkg1=0;
+     Double_t sigma1=0.;
+     Double_t meanarea1=0.;
+     Double_t bkg2=0;
+     Double_t sigma2=0.;
+     Double_t meanarea2=0.;
+
+     float areaRandomCone = rRandomCone2 *TMath::Pi();         
+     clustSeq.get_median_rho_and_sigma(sortedJets, range, false, bkg1, sigma1, meanarea1, true);
+     evBkg->SetBackground(0,bkg1,sigma1,meanarea1);
+     fh1BiARandomCones[0]->Fill(ptRandomCone-(bkg1*areaRandomCone));    
+     fh1BiARandomConesRan[0]->Fill(ptRandomConeRan-(bkg1*areaRandomCone));    
+     
+     clustSeq.get_median_rho_and_sigma(jets2, range, false, bkg2, sigma2, meanarea2, true);
+     evBkg->SetBackground(1,bkg2,sigma2,meanarea2);
+     fh1BiARandomCones[1]->Fill(ptRandomCone-(bkg2*areaRandomCone));    
+     fh1BiARandomConesRan[1]->Fill(ptRandomConeRan-(bkg2*areaRandomCone));    
+   }
+  }
+  
 
- // fill track information
- Int_t nTrackOver = recParticles.GetSize();
+  
+  
+  // fill track information
+  Int_t nTrackOver = recParticles.GetSize();
   // do the same for tracks and jets
- if(nTrackOver>0){
+
+  if(nTrackOver>0){
    TIterator *recIter = recParticles.MakeIterator();
    AliVParticle *tmpRec = (AliVParticle*)(recIter->Next());  
    Float_t pt = tmpRec->Pt();
+
    //    Printf("Leading track p_t %3.3E",pt);
    for(int i = 1;i <= fh2NRecTracksPt->GetNbinsX();i++){
      Float_t ptCut = fh2NRecTracksPt->GetXaxis()->GetBinCenter(i);
@@ -707,7 +943,7 @@ void AliAnalysisTaskJetCluster::UserExec(Option_t */*option*/)
 
  // find the random jets
  vector <fastjet::PseudoJet> inclusiveJetsRan, sortedJetsRan;
- fastjet::ClusterSequence clustSeqRan(inputParticlesRecRan, jetDef);
+ fastjet::ClusterSequenceArea clustSeqRan(inputParticlesRecRan, jetDef, areaDef);
   
  inclusiveJetsRan = clustSeqRan.inclusive_jets();
  sortedJetsRan    = sorted_by_pt(inclusiveJetsRan);
@@ -752,13 +988,12 @@ void AliAnalysisTaskJetCluster::UserExec(Option_t */*option*/)
        Float_t dPhi = phi - tmpPhi;
        if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
        if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();      
-       //      Float_t dEta = eta - tmpRecTrack->Eta();
        fh2TracksLeadingJetPhiPtRan->Fill(dPhi,pt);
        fh2TracksLeadingJetPhiPtWRan->Fill(dPhi,pt,tmpPt);
       }  
 
-
-
+    Int_t nAodOutJetsRan = 0;
+     AliAODJet *aodOutJetRan = 0;
     for(int j = 0; j < nRecRan;j++){
       AliAODJet tmpRec (sortedJetsRan[j].px(), sortedJetsRan[j].py(), sortedJetsRan[j].pz(), sortedJetsRan[j].E());
       Float_t tmpPt = tmpRec.Pt();
@@ -769,6 +1004,27 @@ void AliAnalysisTaskJetCluster::UserExec(Option_t */*option*/)
       fh2NConstPtRan->Fill(tmpPt,constituents.size());
       fh2PtNchRan->Fill(nCh,tmpPt);
       fh2PtNchNRan->Fill(nCh,tmpPt,constituents.size());
+
+
+     if(tmpPt>fJetOutputMinPt&&jarrayran){
+       aodOutJetRan =  new ((*jarrayran)[nAodOutJetsRan++]) AliAODJet(tmpRec);
+       Double_t arearan=clustSeqRan.area(sortedJetsRan[j]);
+       
+       aodOutJetRan->SetEffArea(arearan,0);    }
+
+
+
+     
+     for(unsigned int ic = 0; ic < constituents.size();ic++){
+       // AliVParticle *part = (AliVParticle*)recParticles.At(constituents[ic].user_index());
+       // fh1PtJetConstRec->Fill(part->Pt());
+       if(aodOutJetRan){
+        aodOutJetRan->AddTrack(fRef->At(constituents[ic].user_index()));
+       }}
+      
+
+
+
       // correlation
       Float_t tmpPhi =  tmpRec.Phi();
       if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;    
@@ -780,6 +1036,21 @@ void AliAnalysisTaskJetCluster::UserExec(Option_t */*option*/)
        continue;
       }
     }  
+
+     
+    if(evBkg){
+     Double_t bkg3=0.;
+     Double_t sigma3=0.;
+     Double_t meanarea3=0.;
+     clustSeqRan.get_median_rho_and_sigma(sortedJetsRan ,range, false, bkg3, sigma3, meanarea3, true);
+     evBkg->SetBackground(2,bkg3,sigma3,meanarea3);
+     float areaRandomCone = rRandomCone2 *TMath::Pi();         
+     fh1BiARandomCones[2]->Fill(ptRandomCone-(bkg3*areaRandomCone));    
+     fh1BiARandomConesRan[2]->Fill(ptRandomConeRan-(bkg3*areaRandomCone));    
+    }
+
+
+
  }
  
 
@@ -842,7 +1113,7 @@ Int_t  AliAnalysisTaskJetCluster::GetListOfTracks(TList *list,Int_t type){
     TClonesArray *tca = dynamic_cast<TClonesArray*>(aod->FindListObject(AliAODMCParticle::StdBranchName()));
     if(!tca)return iCount;
     for(int it = 0;it < tca->GetEntriesFast();++it){
-      AliAODMCParticle *part = dynamic_cast<AliAODMCParticle*>(tca->At(it));
+      AliAODMCParticle *part = (AliAODMCParticle*)(tca->At(it));
       if(!part->IsPhysicalPrimary())continue;
       if(type == kTrackAODMCAll){
        list->Add(part);