]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG4/JetTasks/AliAnalysisTaskThreeJets.cxx
Added protection (Ernesto)
[u/mrichter/AliRoot.git] / PWG4 / JetTasks / AliAnalysisTaskThreeJets.cxx
index 58fe1e516db15465a75ec5dfc725491a6395db77..bac248488879d2b9c78a1ae2dccb23b05349a53e 100644 (file)
@@ -21,7 +21,8 @@
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
 
-
+#include <cstdlib>
+#include <iostream>
 #include <TFile.h>
 #include <TH1F.h>
 #include <TH2F.h>
 #include "AliAODHandler.h"
 #include "AliAODTrack.h"
 #include "AliAODJet.h"
-#include "AliGenPythiaEventHeader.h"
-#include "AliMCEvent.h"
-#include "AliStack.h"
+#include "AliAODMCParticle.h"
+//#include "AliGenPythiaEventHeader.h"
+//#include "AliMCEvent.h"
+//#include "AliStack.h"
 
 
 #include "AliAnalysisHelperJetTasks.h"
@@ -56,6 +58,7 @@ ClassImp(AliAnalysisTaskThreeJets)
   AliAnalysisTaskThreeJets::AliAnalysisTaskThreeJets() : AliAnalysisTaskSE(),
                                                   
                                                         fAOD(0x0),
+                                                        fUseMC(0x0),
                                                 
                                                         fBranchRec(""),
                                                         fBranchGen(""),
@@ -124,6 +127,7 @@ ClassImp(AliAnalysisTaskThreeJets)
 
                                                         fhdPhiThrustRec(0x0),
                                                         fhdPhiThrustRecALL(0x0)
+
 {
 
 }
@@ -132,6 +136,7 @@ AliAnalysisTaskThreeJets::AliAnalysisTaskThreeJets(const char * name):
   AliAnalysisTaskSE(name),
   
   fAOD(0x0),
+  fUseMC(0x0),
   
   fBranchRec(""),
   fBranchGen(""),
@@ -212,42 +217,29 @@ Bool_t AliAnalysisTaskThreeJets::Notify()
   // Implemented Notify() to read the cross sections
   // and number of trials from pyxsec.root
   // 
+
+
   TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
-  UInt_t   ntrials  = 0;
+  Float_t xsection = 0;
+  Float_t ftrials  = 1;
+
+  Float_t fAvgTrials = 1;
   if(tree){
     TFile *curfile = tree->GetCurrentFile();
     if (!curfile) {
       Error("Notify","No current file");
       return kFALSE;
     }
+    AliAnalysisHelperJetTasks::PythiaInfoFromFile(curfile->GetName(),xsection,ftrials);
+    // construct a poor man average trials 
+    Float_t nEntries = (Float_t)tree->GetTree()->GetEntries();
+    if(ftrials>=nEntries)fAvgTrials = ftrials/nEntries; // CKB take this into account for normalisation
+  }  
+
+  if(xsection>0)fXsection  = xsection;
 
-    TString fileName(curfile->GetName());
-    if(fileName.Contains("AliESDs.root")){
-        fileName.ReplaceAll("AliESDs.root", "pyxsec.root");
-    }
-    else if(fileName.Contains("AliAOD.root")){
-        fileName.ReplaceAll("AliAOD.root", "pyxsec.root");
-    }
-    else if(fileName.Contains("galice.root")){
-        // for running with galice and kinematics alone...                      
-        fileName.ReplaceAll("galice.root", "pyxsec.root");
-    }
-    TFile *fxsec = TFile::Open(fileName.Data());
-    if(!fxsec){
-      Printf("%s:%d %s not found in the Input",(char*)__FILE__,__LINE__,fileName.Data());
-      // no a severe condition
-      return kTRUE;
-    }
-    TTree *xtree = (TTree*)fxsec->Get("Xsection");
-    if(!xtree){
-      Printf("%s:%d tree not found in the pyxsec.root",(char*)__FILE__,__LINE__);
-    }
-    xtree->SetBranchAddress("xsection",&fXsection);
-    xtree->SetBranchAddress("ntrials",&ntrials);
-    xtree->GetEntry(0);
-  }
-  
   return kTRUE;
+
 }
 
 
@@ -259,22 +251,6 @@ void AliAnalysisTaskThreeJets::UserCreateOutputObjects()
   //
   //  Printf("Analysing event  %s :: # %5d\n", gSystem->pwd(), (Int_t) fEntry);
 
-  if(fUseAODInput){
-    fAOD = dynamic_cast<AliAODEvent*>(InputEvent());
-    if(!fAOD){
-      Printf("%s:%d AODEvent not found in Input Manager %d",(char*)__FILE__,__LINE__,fUseAODInput);
-      return;
-    }    
-  }
-  else{
-    //  assume that the AOD is in the general output...
-    fAOD  = AODEvent();
-    if(!fAOD){
-      Printf("%s:%d AODEvent not found in the Output",(char*)__FILE__,__LINE__);
-      return;
-    }    
-  }
-
   printf("AnalysisTaskJetSpectrum::UserCreateOutputObjects() \n");
 
   fList = new TList();
@@ -461,7 +437,7 @@ void AliAnalysisTaskThreeJets::UserCreateOutputObjects()
   fhdPhiThrustRecALL->Sumw2();
   fList->Add(fhdPhiThrustRecALL);
     
-  Printf("UserCreateOutputObjects finished\n");
+  if(fDebug)Printf("UserCreateOutputObjects finished\n");
 }
 
 //__________________________________________________________________________________________________________________________________________
@@ -473,36 +449,42 @@ void AliAnalysisTaskThreeJets::Init()
 //____________________________________________________________________________________________________________________________________________
 void AliAnalysisTaskThreeJets::UserExec(Option_t * )
 {
-  //  if (fDebug > 1) printf("Analysing event # %5d\n", (Int_t) fEntry);
+  if (fDebug > 1) printf("AliAnlysisTaskThreeJets::Analysing event # %5d\n", (Int_t) fEntry);
 
-  
-  //create an AOD handler
-  AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
-  
-  if(!aodH)
-    {
-      Printf("%s:%d no output aodHandler found Jet",(char*)__FILE__,__LINE__);
+  if(fUseAODInput){
+    fAOD = dynamic_cast<AliAODEvent*>(InputEvent());
+    if(!fAOD){
+      Printf("%s:%d AODEvent not found in Input Manager %d",(char*)__FILE__,__LINE__,fUseAODInput);
       return;
-    }
-  
-  AliMCEvent* mcEvent =MCEvent();
-  if(!mcEvent){
-    Printf("%s:%d no mcEvent",(char*)__FILE__,__LINE__);
-    return;
+    }    
+  }
+  else{
+    //  assume that the AOD is in the general output...
+    fAOD  = AODEvent();
+    if(!fAOD){
+      Printf("%s:%d AODEvent not found in the Output",(char*)__FILE__,__LINE__);
+      return;
+    }    
   }
+
+//   AliMCEvent* mcEvent =MCEvent();
+//   if(!mcEvent){
+//     Printf("%s:%d no mcEvent",(char*)__FILE__,__LINE__);
+//     return;
+//   }
   
   if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
   
   //primary vertex
   AliAODVertex * pvtx = dynamic_cast<AliAODVertex*>(fAOD->GetPrimaryVertex());
-  if(!pvtx) return;
-  
-  AliAODJet genJetsPythia[kMaxJets];
-  Int_t nPythiaGenJets = 0;
-  
-  AliAODJet genJets[kMaxJets];
-  Int_t nGenJets = 0;
+  if(!pvtx){
+    if (fDebug > 1)     Printf("%s:%d AOD Vertex found",(char*)__FILE__,__LINE__);
+    return;
+  }
   
+//   AliAODJet genJetsPythia[kMaxJets];
+//   Int_t nPythiaGenJets = 0;
+
   AliAODJet recJets[kMaxJets];
   Int_t nRecJets = 0;
   
@@ -523,39 +505,43 @@ void AliAnalysisTaskThreeJets::UserExec(Option_t * )
      if(!tmp)continue;
      recJets[ir] = *tmp;
     }
+   
+  AliAODJet genJets[kMaxJets];
+  Int_t nGenJets = 0;
+  if(fUseMC){
   // If we set a second branch for the input jets fetch this
   TClonesArray * aodGenJets = dynamic_cast<TClonesArray*>(fAOD->FindListObject(fBranchGen.Data()));
-  
-  if(!aodGenJets)
-    {
-      printf("NO MC jets Found\n");
-      return;
-    }
-  
-  //   //Generated jets
-  nGenJets = aodGenJets->GetEntries();
-  nGenJets = TMath::Min(nGenJets, kMaxJets);
-  
-  for(Int_t ig =0 ; ig < nGenJets; ++ig)
-    {
-      AliAODJet * tmp = dynamic_cast<AliAODJet*>(aodGenJets->At(ig));
-      if(!tmp)continue;
-      genJets[ig] = * tmp;
-    }
-  
-  AliGenPythiaEventHeader*  pythiaGenHeader = AliAnalysisHelperJetTasks::GetPythiaEventHeader(mcEvent);
-  if(!pythiaGenHeader){
-    Printf("!!!NO GEN HEADER AVALABLE!!!");
-    return;
+    
+    if(!aodGenJets)
+      {
+       printf("NO MC jets Found\n");
+       return;
+      }
+    
+    //   //Generated jets
+    nGenJets = aodGenJets->GetEntries();
+    nGenJets = TMath::Min(nGenJets, kMaxJets);
+
+    for(Int_t ig =0 ; ig < nGenJets; ++ig)
+      {
+       AliAODJet * tmp = dynamic_cast<AliAODJet*>(aodGenJets->At(ig));
+       if(!tmp)continue;
+       genJets[ig] = * tmp;
+      }
   }
+  //   AliGenPythiaEventHeader*  pythiaGenHeader = AliAnalysisHelperJetTasks::GetPythiaEventHeader(mcEvent);
+//   if(!pythiaGenHeader){
+//     Printf("!!!NO GEN HEADER AVALABLE!!!");
+//     return;
+//   }
   
-  // Int_t ProcessType = pythiaGenHeader->ProcessType();
-  // if(ProcessType != 28) return;
-  fhXSec->Fill(pythiaGenHeader->GetPtHard(), fXsection);
-  nPythiaGenJets = pythiaGenHeader->NTriggerJets();
-  nPythiaGenJets = TMath::Min(nPythiaGenJets, kMaxJets);
+//   // Int_t ProcessType = pythiaGenHeader->ProcessType();
+//   // if(ProcessType != 28) return;
+//   nPythiaGenJets = pythiaGenHeader->NTriggerJets();
+//   nPythiaGenJets = TMath::Min(nPythiaGenJets, kMaxJets);
    
+//  fXsection = 1;
+
   Double_t eRec[kMaxJets];
   Double_t eGen[kMaxJets];
  
@@ -593,262 +579,295 @@ void AliAnalysisTaskThreeJets::UserExec(Option_t * )
 
   Double_t psumRestRec = 0;
   //  Double_t psumRestGen = 0;
-  //Pythia_________________________________________________________________________________________________________________
-
-  for(int ip = 0;ip < nPythiaGenJets;++ip)
-    {
-      if(ip>=kMaxJets)continue;
-      Float_t p[4];
-      pythiaGenHeader->TriggerJet(ip,p);
-      genJetsPythia[ip].SetPxPyPzE(p[0],p[1],p[2],p[3]);
-    }
+//   //Pythia_________________________________________________________________________________________________________________
+
+//   for(int ip = 0;ip < nPythiaGenJets;++ip)
+//     {
+//       if(ip>=kMaxJets)continue;
+//       Float_t p[4];
+//       pythiaGenHeader->TriggerJet(ip,p);
+//       genJetsPythia[ip].SetPxPyPzE(p[0],p[1],p[2],p[3]);
+//     }
   
 //_________________________________________________________________________________________________________________________
  
  
 //________histos for MC___________________________________________________________________________________________________________
-
   Int_t nGenSel = 0;
-  Int_t counter = 0;
-  Int_t tag = 0;
-
-  AliAODJet selJets[kMaxJets];
+  if(fUseMC){
+    Int_t counter = 0;
+    Int_t tag = 0;
+    
+    AliAODJet selJets[kMaxJets];
+    
+    for(Int_t i = 0; i < nGenJets; i++)
+      {
+       if(nGenJets == 1)
+         {
+           selJets[nGenSel] = genJets[i];
+           nGenSel++;
+         }
+       else
+         {
+           counter = 0;
+           tag = 0;
+           for(Int_t j = 0; j < nGenJets; j++)
+             {
+               if(i!=j)
+                 {
+                   Double_t dRij = genJets[i].DeltaR(&genJets[j]);
+                   counter++;
+                   if(dRij > 2*fR) tag++;
+                 }
+             }
+           if(counter!=0)
+             {
+               if(tag/counter == 1)
+                 {
+                   selJets[nGenSel] = genJets[i];
+                   nGenSel++;
+                 }
+             }
+         }
+      }
 
-  for(Int_t i = 0; i < nGenJets; i++)
-    {
-      if(nGenJets == 1)
+    if(nGenSel == 0) return;
+    
+    for (Int_t gj = 0; gj < nGenSel; gj++)
+      {
+       eGen[gj] = selJets[gj].E();
+      }
+    
+    TMath::Sort(nGenSel, eGen, idxGen);
+    for (Int_t ig = 0; ig < nGenSel; ig++)
+      {
+       jetGen[ig] = selJets[idxGen[ig]];
+      }
+    
+    fhXSec->Fill(jetGen[0].Pt(), fXsection);
+    //  AliStack * stack = mcEvent->Stack();
+    
+    Int_t nMCtracks = 0;
+    Double_t eTracksMC[kTracks];
+    Double_t pTracksMC[kTracks];
+    Int_t idxTracksMC[kTracks];
+    TLorentzVector jetTracksMC[kTracks];
+    TLorentzVector jetTracksSortMC[kTracks];
+    TVector3 pTrackMC[kTracks];
+    TLorentzVector vTrackMCAll[kTracks];
+    Double_t pTrackMCAll[kTracks];
+    TLorentzVector vTrackMC[kTracks];
+    TVector3 pTrackMCBoost[kTracks];
+    Double_t eventShapes[4];
+    
+    Int_t nAccTr = 0;
+    Int_t nInJet[kMaxJets];
+    TLorentzVector inJetPartV[kMaxJets][kTracks];
+    Int_t nAllTracksMC = 0;
+    TVector3 n01MC;
+
+    TClonesArray *tca = dynamic_cast<TClonesArray*>(fAOD->FindListObject(AliAODMCParticle::StdBranchName()));
+    if(!tca){
+      if(fDebug)Printf("NO Ref Tracks\n");
+      tca = 0;
+    }
+    else{
+      nMCtracks = tca->GetEntries();
+      for(Int_t iTrack = 0; iTrack < nMCtracks; iTrack++)
        {
-         selJets[nGenSel] = genJets[i];
-         nGenSel++;
+         //      TParticle * part = (TParticle*)stack->Particle(iTrack);
+         AliAODMCParticle *part = dynamic_cast<AliAODMCParticle*>(tca->At(iTrack));
+         if (!part) continue;
+         if(!part->IsPhysicalPrimary())continue;      
+         Double_t fEta = part->Eta();
+         if(TMath::Abs(fEta) > .9) continue;
+         vTrackMCAll[nAllTracksMC].SetPxPyPzE(part->Px(), part->Py(), part->Pz(), part->E());
+         pTrackMCAll[nAllTracksMC] = part->Pt();
+         nAllTracksMC++;
        }
-      else
+      if(nAllTracksMC == 0) return;
+      for(Int_t iJet = 0; iJet < nGenSel; iJet++)
        {
-         counter = 0;
-         tag = 0;
-         for(Int_t j = 0; j < nGenJets; j++)
+         Int_t nJetTracks = 0;
+         for(Int_t i = 0; i < nAllTracksMC; i++)
            {
-             if(i!=j)
+             Double_t dPhi = (jetGen[iJet].Phi()-vTrackMCAll[i].Phi());
+             if(dPhi > TMath::Pi()) dPhi = dPhi - 2.*TMath::Pi();
+             if(dPhi < (-1.*TMath::Pi())) dPhi = dPhi + 2.*TMath::Pi();
+             Double_t dEta = (jetGen[iJet].Eta()-vTrackMCAll[i].Eta());
+             Double_t deltaR = TMath::Sqrt(dPhi*dPhi+dEta*dEta);
+             if(deltaR < fR && vTrackMCAll[i].Pt() > 1.5)
                {
-                 Double_t dRij = genJets[i].DeltaR(&genJets[j]);
-                 counter++;
-                 if(dRij > 2*fR) tag++;
+                 jetTracksMC[nAccTr] = vTrackMCAll[i];
+                 eTracksMC[nAccTr] = vTrackMCAll[i].E();
+                 pTracksMC[nAccTr] = vTrackMCAll[i].Pt();
+                 inJetPartV[iJet][nJetTracks].SetPxPyPzE(vTrackMCAll[i].Px(), vTrackMCAll[i].Py(), vTrackMCAll[i].Pz(),vTrackMCAll[i].E());
+                 nAccTr++;
+                 nJetTracks++;
                }
            }
-         if(counter!=0)
+         nInJet[iJet] = nJetTracks;
+       }
+      
+      if(nAccTr == 0) return;
+      if(fDebug)Printf("*********** Number of Jets : %d ***************\n", nGenSel);  
+      Double_t pTav[kMaxJets];
+      for(Int_t i = 0; i < nGenSel; i++)
+       {
+         Double_t pTsum = 0;
+         if(fDebug)Printf("*********** Number of particles in Jet %d = %d *******************\n", i+3, nInJet[i]);
+         for(Int_t iT = 0; iT < nInJet[i]; iT++)
            {
-             if(tag/counter == 1)
-               {
-                 selJets[nGenSel] = genJets[i];
-                 nGenSel++;
-               }
+             Double_t pt = inJetPartV[i][iT].Pt();
+             pTsum += pt;
            }
+         pTav[i] = pTsum/nInJet[i]; 
        }
-    }
-
-  if(nGenSel == 0) return;
-
-  for (Int_t gj = 0; gj < nGenSel; gj++)
-    {
-      eGen[gj] = selJets[gj].E();
-    }
-  
-  TMath::Sort(nGenSel, eGen, idxGen);
-  for (Int_t ig = 0; ig < nGenSel; ig++)
-    {
-      jetGen[ig] = selJets[idxGen[ig]];
-    }
-  AliStack * stack = mcEvent->Stack();
-  Int_t nMCtracks = stack->GetNprimary();
-  Double_t * eTracksMC = new Double_t[kTracks];
-  Double_t pTracksMC[kTracks];
-  Int_t * idxTracksMC = new Int_t[kTracks];
-  TLorentzVector jetTracksMC[kTracks];
-  TLorentzVector jetTracksSortMC[kTracks];
-  TVector3 pTrackMC[kTracks];
-  TLorentzVector vTrackMCAll[kTracks];
-  Double_t pTrackMCAll[kTracks];
-  TLorentzVector vTrackMC[kTracks];
-  TVector3 pTrackMCBoost[kTracks];
-  Double_t eventShapes[4];
-
-  Int_t nAccTr = 0;
-  Int_t nInJet[kMaxJets];
-  TLorentzVector inJetPartV[kMaxJets][kTracks];
-  Int_t nAllTracksMC = 0;
-
-  for(Int_t iTrack = 0; iTrack < nMCtracks; iTrack++)
-    {
-      TParticle * part = (TParticle*)stack->Particle(iTrack);
-      if (!part) continue;
-      Double_t fEta = part->Eta();
-      if(TMath::Abs(fEta) > .9) continue;
-      if(!IsPrimChar(part, nMCtracks, 0)) continue;
-      vTrackMCAll[nAllTracksMC].SetPxPyPzE(part->Px(), part->Py(), part->Pz(), part->Energy());
-      pTrackMCAll[nAllTracksMC] = part->Pt();
-      nAllTracksMC++;
-    }
-  if(nAllTracksMC == 0) return;
-  for(Int_t iJet = 0; iJet < nGenSel; iJet++)
-    {
-      Int_t nJetTracks = 0;
+      
+      TMath::Sort(nAllTracksMC, pTrackMCAll, idxTracksMC);
       for(Int_t i = 0; i < nAllTracksMC; i++)
        {
-         Double_t dPhi = (jetGen[iJet].Phi()-vTrackMCAll[i].Phi());
-         if(dPhi > TMath::Pi()) dPhi = dPhi - 2.*TMath::Pi();
-         if(dPhi < (-1.*TMath::Pi())) dPhi = dPhi + 2.*TMath::Pi();
-         Double_t dEta = (jetGen[iJet].Eta()-vTrackMCAll[i].Eta());
-         Double_t deltaR = TMath::Sqrt(dPhi*dPhi+dEta*dEta);
-         if(deltaR < fR && vTrackMCAll[i].Pt() > 1.5)
+         jetTracksSortMC[i] = vTrackMCAll[idxTracksMC[i]];
+         pTrackMC[i].SetXYZ(jetTracksSortMC[i].Px(), jetTracksSortMC[i].Py(), jetTracksSortMC[i].Pz());
+         vTrackMC[i].SetPxPyPzE(jetTracksSortMC[i].Px(), jetTracksSortMC[i].Py(), jetTracksSortMC[i].Pz(), jetTracksSortMC[i].E());
+       }
+      
+      n01MC = pTrackMC[0].Unit();
+      n01MC.SetZ(0.);
+      
+      //Thrust calculation, iterative method
+      if(nGenSel > 1)
+       { 
+         //       if(fGlobVar == 1)
+         //    {
+         if(fDebug)Printf("**************Shapes for MC*************");
+         AliAnalysisHelperJetTasks::GetEventShapes(n01MC, pTrackMC, nAllTracksMC, eventShapes);
+         //    }
+         if(eventShapes[0] < 2/TMath::Pi()){
+           Double_t eventShapesTest[4];
+           TVector3 n01Test;
+           Int_t rnd_max = nAllTracksMC;
+           Int_t k = (rand()%rnd_max)+3;
+           while(TMath::Abs(pTrackMC[k].X()) < 10e-5 && TMath::Abs(pTrackMC[k].Y()) < 10e-5){
+             k--;
+           }
+           n01Test = pTrackMC[k].Unit();
+           n01Test.SetZ(0.);
+           AliAnalysisHelperJetTasks::GetEventShapes(n01Test, pTrackMC, nAllTracksMC, eventShapesTest);
+           eventShapes[0] = TMath::Max(eventShapes[0], eventShapesTest[0]);
+           if(TMath::Abs(eventShapes[0]-eventShapesTest[0]) < 10e-7) n01MC = n01Test;
+         }
+       
+         Double_t s = eventShapes[1];
+         Double_t a = eventShapes[2];
+         Double_t c = eventShapes[3];
+         
+         switch(nGenSel)
            {
-             jetTracksMC[nAccTr] = vTrackMCAll[i];
-             eTracksMC[nAccTr] = vTrackMCAll[i].E();
-             pTracksMC[nAccTr] = vTrackMCAll[i].Pt();
-             inJetPartV[iJet][nJetTracks].SetPxPyPzE(vTrackMCAll[i].Px(), vTrackMCAll[i].Py(), vTrackMCAll[i].Pz(),vTrackMCAll[i].E());
-             nAccTr++;
-             nJetTracks++;
+           case 2:
+             {
+               fhAGen2->Fill(a);
+               fhSGen2->Fill(s);
+               fhCGen2->Fill(c);
+             }
+             break;
+           case 3:
+             {
+               fhAGen3->Fill(a);
+               fhSGen3->Fill(s);
+               fhCGen3->Fill(c);
+             }
+             break;
+           }
+         Double_t thrust01MC = eventShapes[0];
+         
+         switch(nGenSel)
+           {
+           case 2:
+             fhThrustGen2->Fill(thrust01MC, fXsection);
+             break;
+           case 3:
+             fhThrustGen3->Fill(thrust01MC, fXsection);
+             break;
            }
        }
-      nInJet[iJet] = nJetTracks;
-    }
-
-  if(nAccTr == 0) return;
-  Printf("*********** Number of Jets : %d ***************\n", nGenSel);  
-  Double_t pTav[kMaxJets];
-  for(Int_t i = 0; i < nGenSel; i++)
-    {
-      Double_t pTsum = 0;
-      Printf("*********** Number of particles in Jet %d = %d *******************\n", i+3, nInJet[i]);
-      for(Int_t iT = 0; iT < nInJet[i]; iT++)
-       {
-         Double_t pt = inJetPartV[i][iT].Pt();
-         pTsum += pt;
-       }
-      pTav[i] = pTsum/nInJet[i]; 
     }
   
-  TMath::Sort(nAccTr, pTracksMC, idxTracksMC);
-  for(Int_t i = 0; i < nAccTr; i++)
-    {
-      jetTracksSortMC[i] = jetTracksMC[idxTracksMC[i]];
-      pTrackMC[i].SetXYZ(jetTracksSortMC[i].Px(), jetTracksSortMC[i].Py(), jetTracksSortMC[i].Pz());
-      vTrackMC[i].SetPxPyPzE(jetTracksSortMC[i].Px(), jetTracksSortMC[i].Py(), jetTracksSortMC[i].Pz(), jetTracksSortMC[i].E());
-    }
-
-  TVector3 n01MC = pTrackMC[0].Unit();
-  //Thrust calculation, iterative method
-  if(nGenSel > 1)
-    { 
-//       if(fGlobVar == 1)
-//     {
-      AliAnalysisHelperJetTasks::GetEventShapes(n01MC, pTrackMC, nAccTr, eventShapes);
-//     }
-      
-      Double_t s = eventShapes[1];
-      Double_t a = eventShapes[2];
-      Double_t c = eventShapes[3];
-
-      switch(nGenSel)
+    
+    //rest frame MC jets
+    for (Int_t i = 0; i < nGenSel; ++i)
+      {
+       vGen[i].SetPxPyPzE(jetGen[i].Px(), jetGen[i].Py(), jetGen[i].Pz(), jetGen[i].E());
+       pGen[i].SetXYZ(vGen[i].Px(), vGen[i].Py(), vGen[i].Pz());
+       vsumGen += vGen[i];
+      }
+    if(tca){
+      if(eventShapes[0] > 0.8 && nGenSel > 1)
        {
-       case 2:
-         {
-           fhAGen2->Fill(a);
-           fhSGen2->Fill(s);
-           fhCGen2->Fill(c);
-         }
-         break;
-       case 3:
-         {
-           fhAGen3->Fill(a);
-           fhSGen3->Fill(s);
-           fhCGen3->Fill(c);
-         }
-         break;
+         for(Int_t i = 0; i < nGenSel; i++)
+           fhdPhiThrustGen->Fill(n01MC.DeltaPhi(pGen[i]), jetGen[i].E());
        }
-      Double_t thrust01MC = eventShapes[0];
-      
-      switch(nGenSel)
+      if(eventShapes[0] <= 0.8 && nGenSel > 1)   
        {
-       case 2:
-         fhThrustGen2->Fill(thrust01MC, fXsection);
-         break;
-       case 3:
-         fhThrustGen3->Fill(thrust01MC, fXsection);
-         break;
+         for(Int_t i = 0; i < nGenSel; i++)
+           fhdPhiThrustGenALL->Fill(n01MC.DeltaPhi(pGen[i]), jetGen[i].E());
        }
     }
-  
-  
-  //rest frame MC jets
-  for (Int_t i = 0; i < nGenSel; ++i)
-    {
-      vGen[i].SetPxPyPzE(jetGen[i].Px(), jetGen[i].Py(), jetGen[i].Pz(), jetGen[i].E());
-      pGen[i].SetXYZ(vGen[i].Px(), vGen[i].Py(), vGen[i].Pz());
-      vsumGen += vGen[i];
-    }
-  if(eventShapes[0] >0.8 )
-    {
-      for(Int_t i = 0; i < nGenSel; i++)
-       fhdPhiThrustGen->Fill(n01MC.DeltaPhi(pGen[i]), jetGen[i].E());
-    }
-  if(eventShapes[0] <= 0.8)   
-    {
-      for(Int_t i = 0; i < nGenSel; i++)
-       fhdPhiThrustGenALL->Fill(n01MC.DeltaPhi(pGen[i]), jetGen[i].E());
-    }
-      
-  Double_t fPxGen = vsumGen.Px();
-  Double_t fPyGen = vsumGen.Py();
-  Double_t fPzGen = vsumGen.Pz();
-  Double_t fEGen = vsumGen.E();
-
-  Double_t eRestGen[kMaxJets];
-  for (Int_t j = 0; j < nGenSel; j++)
-    {
-      vGen[j].Boost(-fPxGen/fEGen, -fPyGen/fEGen, -fPzGen/fEGen);
-      eRestGen[j] = vGen[j].E();
-    }
-
-  for (Int_t j = 0; j < nAccTr; j++)
-    {
-      vTrackMC[j].Boost(-fPxGen/fEGen, -fPyGen/fEGen, -fPzGen/fEGen);
-      pTrackMCBoost[j].SetXYZ(vTrackMC[j].Px(),vTrackMC[j].Py(),vTrackMC[j].Pz());
-    }
-      
-  Int_t idxRestGen[kMaxJets];
-  TMath::Sort(nGenSel, eRestGen, idxRestGen);
-  for(Int_t j = 0; j < nGenSel; j++)
-    {
-      vRestGen[j] = vGen[idxRestGen[j]];
-      eSumGen += vRestGen[j].E();
-    }
-
-  if (nGenSel == 3)
-    {
-      //      if(nInJet[0] < 3 || nInJet[1] < 3 || nInJet[2] < 3) return;
-      //       if(pRestGen[1].DeltaPhi(pRestGen[2]) > 0.95 && pRestGen[1].DeltaPhi(pRestGen[2]) < 1.15)
-      //       {
+    
+    Double_t fPxGen = vsumGen.Px();
+    Double_t fPyGen = vsumGen.Py();
+    Double_t fPzGen = vsumGen.Pz();
+    Double_t fEGen = vsumGen.E();
+    
+    Double_t eRestGen[kMaxJets];
+    for (Int_t j = 0; j < nGenSel; j++)
+      {
+       vGen[j].Boost(-fPxGen/fEGen, -fPyGen/fEGen, -fPzGen/fEGen);
+       eRestGen[j] = vGen[j].E();
+      }
+    
+    for (Int_t j = 0; j < nAccTr; j++)
+      {
+       vTrackMC[j].Boost(-fPxGen/fEGen, -fPyGen/fEGen, -fPzGen/fEGen);
+       pTrackMCBoost[j].SetXYZ(vTrackMC[j].Px(),vTrackMC[j].Py(),vTrackMC[j].Pz());
+      }
+    
+    Int_t idxRestGen[kMaxJets];
+    TMath::Sort(nGenSel, eRestGen, idxRestGen);
+    for(Int_t j = 0; j < nGenSel; j++)
+      {
+       vRestGen[j] = vGen[idxRestGen[j]];
+       eSumGen += vRestGen[j].E();
+      }
+
+    if (nGenSel == 3)
+      {
+       //      if(nInJet[0] < 3 || nInJet[1] < 3 || nInJet[2] < 3) return;
+       //       if(pRestGen[1].DeltaPhi(pRestGen[2]) > 0.95 && pRestGen[1].DeltaPhi(pRestGen[2]) < 1.15)
+       //      {
       
-      for(Int_t i = 0; i < nGenSel; i++)
-       {
-         xGen[i] = 2*vRestGen[i].E()/eSumGen;
+       for(Int_t i = 0; i < nGenSel; i++)
+         {
+           xGen[i] = 2*vRestGen[i].E()/eSumGen;
        }
       
-      Printf("***************** Values of Dalitz variables are : %f, %f, %f ****************\n", xGen[0], xGen[1], xGen[2]);
-      
-      Printf("***************** fXSection = %f ******************\n", fXsection);
-      if(eSumGen <= 60)
-       fhX3X4Gen60->Fill(xGen[0], xGen[1], fXsection);
-      
-      if(eSumGen > 60 && eSumGen <= 100)
-       fhX3X4Gen60100->Fill(xGen[0], xGen[1], fXsection);
-      
-      if(eSumGen > 100)
-       fhX3X4Gen100->Fill(xGen[0], xGen[1], fXsection);
-         
-      FillTopology(fhX3X4Gen, fhMu34Gen, fhMu45Gen, fhMu35Gen, xGen, pRestGen, fXsection);
-    }
-  
+       if(fDebug)Printf("***************** Values of Dalitz variables are : %f, %f, %f ****************\n", xGen[0], xGen[1], xGen[2]);
+       
+       if(fDebug)Printf("***************** fXSection = %f ******************\n", fXsection);
+       if(eSumGen <= 60)
+         fhX3X4Gen60->Fill(xGen[0], xGen[1], fXsection);
+       
+       if(eSumGen > 60 && eSumGen <= 100)
+         fhX3X4Gen60100->Fill(xGen[0], xGen[1], fXsection);
+       
+       if(eSumGen > 100)
+         fhX3X4Gen100->Fill(xGen[0], xGen[1], fXsection);
+       
+       FillTopology(fhX3X4Gen, fhMu34Gen, fhMu45Gen, fhMu35Gen, xGen, pRestGen, fXsection);
+      }
+  }    
+
 
 
 //_______________________________________________histos for MC_____________________________________________________
@@ -903,9 +922,9 @@ void AliAnalysisTaskThreeJets::UserExec(Option_t * )
       eRec[rj] = recSelJets[rj].E();
     }
  
-  //  Int_t nAODtracks = fAOD->GetNumberOfTracks();
+  Int_t nAODtracks = fAOD->GetNumberOfTracks();
   Int_t nTracks = 0; //tracks accepted in the whole event
-  //  Int_t nTracksALL = 0;
+  Int_t nTracksALL = 0;
   TLorentzVector jetTracks[kTracks];
   TLorentzVector jetTracksSort[kTracks];
   Double_t * eTracks = new Double_t[kTracks];
@@ -935,10 +954,10 @@ void AliAnalysisTaskThreeJets::UserExec(Option_t * )
          AliAODTrack * track = (AliAODTrack*)jetTracksAOD->At(i);
          track->GetCovarianceXYZPxPyPz(cv);
          if(cv[14] > 1000.) continue;
-         jetTrack[nTracks] = *track;
-         jetTracks[nTracks].SetPxPyPzE(jetTrack[nTracks].Px(), jetTrack[nTracks].Py(), jetTrack[nTracks].Pz(), jetTrack[nTracks].E());
-         eTracks[nTracks] = jetTracks[nTracks].E();
-         pTracks[nTracks] = jetTracks[nTracks].Pt();
+         //      jetTrack[nTracks] = *track;
+         //      jetTracks[nTracks].SetPxPyPzE(jetTrack[nTracks].Px(), jetTrack[nTracks].Py(), jetTrack[nTracks].Pz(), jetTrack[nTracks].E());
+         //      eTracks[nTracks] = jetTracks[nTracks].E();
+         //      pTracks[nTracks] = jetTracks[nTracks].Pt();
          nTracks++;
          nJetTracks++;
        }
@@ -947,12 +966,26 @@ void AliAnalysisTaskThreeJets::UserExec(Option_t * )
       jetMult[nAccJets] = jetTracksAOD->GetEntries();
       nAccJets++;
     }
-  
   if (nAccJets == 0) return;
 
+  for(Int_t i = 0; i < nAODtracks; i++)
+    {
+      AliAODTrack * track = dynamic_cast<AliAODTrack*>(fAOD->GetTrack(i));
+      if(!track) continue;
+      track->GetCovarianceXYZPxPyPz(cv);
+      if(cv[14] > 1000.) continue;
+      jetTrack[nTracksALL] = *track;
+      jetTracks[nTracksALL].SetPxPyPzE(jetTrack[nTracksALL].Px(), jetTrack[nTracksALL].Py(), jetTrack[nTracksALL].Pz(), jetTrack[nTracksALL].E());
+      eTracks[nTracksALL] = jetTracks[nTracksALL].E();
+      pTracks[nTracksALL] = jetTracks[nTracksALL].Pt();
+      nTracksALL++;
+    }
+      
+
   TLorentzVector vTrack[kTracks];
-  TMath::Sort(nTracks, pTracks, idxTracks);
-  for(Int_t i = 0; i < nTracks; i++)
+  TMath::Sort(nTracksALL, pTracks, idxTracks);
+  for(Int_t i = 0; i < nTracksALL; i++)
     {
       jetTracksSort[i] = jetTracks[idxTracks[i]];
       pTrack[i].SetXYZ(jetTracksSort[i].Px(), jetTracksSort[i].Py(), jetTracksSort[i].Pz());
@@ -968,16 +1001,35 @@ void AliAnalysisTaskThreeJets::UserExec(Option_t * )
 
   //Thrust, iterative method, AODs
   TVector3 n01 = pTrack[0].Unit();
+  n01.SetZ(0.);
   if(nAccJets > 1)
     {
 //       if(fGlobVar == 1)
 //     {
-      AliAnalysisHelperJetTasks::GetEventShapes(n01, pTrack, nTracks, eventShapesRec);
-//     }
-//       fGlobVar = 0;      
-//       Double_t Max3 = TMath::Max(eventShapesRec0[0],eventShapesRec1[0]);
-//       Double_t Max4 = TMath::Max(eventShapesRec3[0],eventShapesRec2[0]);
+      if(fDebug)Printf("*********Shapes for AOD********");
+      AliAnalysisHelperJetTasks::GetEventShapes(n01, pTrack, nTracksALL, eventShapesRec);
+      //       }
+      if(eventShapesRec[0] < 2/TMath::Pi()){
+       Double_t eventShapesTest[4];
+       TVector3 n01Test;
+       Int_t rnd_max = nTracksALL;
+       Int_t k = (rand()%rnd_max)+3;
+       while(TMath::Abs(pTrack[k].X()) < 10e-5 && TMath::Abs(pTrack[k].Y()) < 10e-5){
+         k--;
+       }
+       
+       n01Test = pTrack[k].Unit();
+       n01Test.SetZ(0.);
+       AliAnalysisHelperJetTasks::GetEventShapes(n01Test, pTrack, nTracksALL, eventShapesTest);
+       eventShapesRec[0] = TMath::Max(eventShapesRec[0], eventShapesTest[0]);
+       if(TMath::Abs(eventShapesRec[0]-eventShapesTest[0]) < 10e-7) n01 = n01Test;
+      }
+    
+       
+      //       fGlobVar = 0;      
+      //       Double_t Max3 = TMath::Max(eventShapesRec0[0],eventShapesRec1[0]);
+      //       Double_t Max4 = TMath::Max(eventShapesRec3[0],eventShapesRec2[0]);
+      
       Double_t thrust = eventShapesRec[0];
       
       if(eventShapesRec[0] > 0.8)
@@ -1020,7 +1072,6 @@ void AliAnalysisTaskThreeJets::UserExec(Option_t * )
          }
          break;
        }
-      
     }
 
   //rest frame for reconstructed jets
@@ -1057,7 +1108,7 @@ void AliAnalysisTaskThreeJets::UserExec(Option_t * )
     {
 //       if(pRest[1].DeltaPhi(pRest[2]) > 0.95 && pRest[1].DeltaPhi(pRest[2]) < 1.15)
 //     {
-         fhInOut->Fill(nGenSel);
+         if(fUseMC) fhInOut->Fill(nGenSel);
 //       for(Int_t j = 0; j < nTracksALL; j++)
 //         {
 //           vTracksAll[j].Boost(-fPx/fE, -fPy/fE, -fPz/fE);
@@ -1086,18 +1137,18 @@ void AliAnalysisTaskThreeJets::UserExec(Option_t * )
          
          FillTopology(fhX3X4Rec, fhMu34Rec, fhMu45Rec, fhMu35Rec, xRec, pRestRec, fXsection);
     }
-  Printf("%s:%d",(char*)__FILE__,__LINE__);
+  if(fDebug)Printf("%s:%d",(char*)__FILE__,__LINE__);
   
   PostData(1, fList);
 
-  Printf("%s:%d Data Posted",(char*)__FILE__,__LINE__);
+  if(fDebug)Printf("%s:%d Data Posted",(char*)__FILE__,__LINE__);
   
 }
 
 //__________________________________________________________________________________________________________________________________________________
 void AliAnalysisTaskThreeJets::Terminate(Option_t *)
 {
-  printf("AnalysisJetCorrelation::Terminate()");
+  if(fDebug)printf(" AliAnalysisTaskThreeJets::Terminate()");
 
 } 
 
@@ -1171,7 +1222,7 @@ Bool_t AliAnalysisTaskThreeJets::IsPrimChar(TParticle* aParticle, Int_t aTotalPr
   {
     if (adebug)
       printf("Dropping particle because it is not charged.\n");
-    return kFALSE;
+    return kTRUE;
   }
 
   return kTRUE;