]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGJE/EMCALJetTasks/AliJetModelBaseTask.cxx
Merge branch 'feature-movesplit'
[u/mrichter/AliRoot.git] / PWGJE / EMCALJetTasks / AliJetModelBaseTask.cxx
index 6f5dfc6ac9b07457ae91d34823413fbf491b0173..8e487b5b3ca7e2d1a34ce8a2ec9fa2079ebac237 100644 (file)
@@ -11,6 +11,7 @@
 #include <TLorentzVector.h>
 #include <TRandom3.h>
 #include <TList.h>
+#include <TF2.h>
 
 #include "AliVEvent.h"
 #include "AliAODCaloCluster.h"
@@ -41,6 +42,7 @@ AliJetModelBaseTask::AliJetModelBaseTask() :
   fOutCellsName(),
   fMCParticlesName(),
   fOutMCParticlesName(),
+  fPythiaInfoName(""),
   fIsMC(kFALSE),
   fSuffix(),
   fEtaMin(-1),
@@ -55,7 +57,13 @@ AliJetModelBaseTask::AliJetModelBaseTask() :
   fNTracks(0),
   fMarkMC(99999),
   fPtSpectrum(0),
+  fPtPhiEvPlDistribution(0),
+  fDensitySpectrum(0),
+  fDifferentialV2(0),
+  fAddV2(kFALSE),
+  fFlowFluctuations(kFALSE),
   fQAhistos(kFALSE),
+  fPsi(0),
   fIsInit(0),
   fGeom(0),
   fClusters(0),
@@ -71,9 +79,14 @@ AliJetModelBaseTask::AliJetModelBaseTask() :
   fOutMCParticlesMap(0),
   fMCLabelShift(0),
   fEsdMode(kFALSE),
-  fOutput(0)
+  fOutput(0),
+  fPythiaInfo(0x0)
 {
   // Default constructor.
+
+  fVertex[0] = 0;
+  fVertex[1] = 0;
+  fVertex[2] = 0;
 }
 
 //________________________________________________________________________
@@ -88,6 +101,7 @@ AliJetModelBaseTask::AliJetModelBaseTask(const char *name, Bool_t drawqa) :
   fOutCellsName(""),
   fMCParticlesName(""),
   fOutMCParticlesName(""),
+  fPythiaInfoName(""),
   fIsMC(kFALSE),
   fSuffix("Processed"),
   fEtaMin(-1),
@@ -102,7 +116,13 @@ AliJetModelBaseTask::AliJetModelBaseTask(const char *name, Bool_t drawqa) :
   fNTracks(1),
   fMarkMC(99999),
   fPtSpectrum(0),
+  fPtPhiEvPlDistribution(0),
+  fDensitySpectrum(0),
+  fDifferentialV2(0),
+  fAddV2(kFALSE),
+  fFlowFluctuations(kFALSE),
   fQAhistos(drawqa),
+  fPsi(0),
   fIsInit(0),
   fGeom(0),
   fClusters(0),
@@ -118,13 +138,18 @@ AliJetModelBaseTask::AliJetModelBaseTask(const char *name, Bool_t drawqa) :
   fOutMCParticlesMap(0),
   fMCLabelShift(0),
   fEsdMode(kFALSE),
-  fOutput(0)
+  fOutput(0),
+  fPythiaInfo(0x0)
 {
   // Standard constructor.
 
   if (fQAhistos) {
     DefineOutput(1, TList::Class()); 
   }
+
+  fVertex[0] = 0;
+  fVertex[1] = 0;
+  fVertex[2] = 0;
 }
 
 //________________________________________________________________________
@@ -158,6 +183,14 @@ void AliJetModelBaseTask::UserExec(Option_t *)
   if (!fIsInit)
     return;
 
+  fVertex[0] = 0;
+  fVertex[1] = 0;
+  fVertex[2] = 0;
+
+  const AliVVertex *vert = InputEvent()->GetPrimaryVertex();
+  if (vert)
+    vert->GetXYZ(fVertex);
+
   if (fCopyArray) {
     if (fOutTracks)
       fOutTracks->Delete();
@@ -166,6 +199,12 @@ void AliJetModelBaseTask::UserExec(Option_t *)
     if (fOutMCParticles)
       fOutMCParticles->Delete();
   }
+
+  if (fDensitySpectrum) {
+    fNTracks = TMath::Nint(fDensitySpectrum->GetRandom());
+    fNCells = TMath::Nint(fDensitySpectrum->GetRandom());
+    fNClusters = TMath::Nint(fDensitySpectrum->GetRandom());
+  }
   
   // Clear map
   if (fOutMCParticlesMap)
@@ -181,9 +220,12 @@ void AliJetModelBaseTask::UserExec(Option_t *)
     }
   }
 
+  if (fPtPhiEvPlDistribution || fAddV2)
+    fPsi = gRandom->Rndm() * TMath::Pi();
+  
   Run();
-
-  if (fCaloCells) {
+  
+  if (fCaloCells && !fCopyArray) {
     delete fCaloCells;
     fCaloCells = tempCaloCells;
   }
@@ -249,7 +291,7 @@ Bool_t AliJetModelBaseTask::ExecOnce()
     }
   }
 
-  if (fNTracks > 0 && !fTracksName.IsNull()) {
+  if (!fTracksName.IsNull()) {
     fTracks = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fTracksName));
     if (!fTracks) {
       AliWarning(Form("%s: Couldn't retrieve tracks with name %s!", GetName(), fTracksName.Data()));
@@ -281,7 +323,11 @@ Bool_t AliJetModelBaseTask::ExecOnce()
     }
   }
 
-  if (fNClusters > 0 && !fCaloName.IsNull()) {
+  if(fAddV2 && (!fDifferentialV2)) {
+    AliWarning(Form("%s: Cannot add v2 without diffential v2!", GetName()));
+  }
+
+  if (!fCaloName.IsNull()) {
     fClusters = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fCaloName));
  
     if (!fClusters) {
@@ -338,8 +384,8 @@ Bool_t AliJetModelBaseTask::ExecOnce()
 
       if (!fMCParticlesMap) {
        AliWarning(Form("%s: Could not retrieve map for MC particles %s! Will assume MC labels consistent with indexes...", GetName(), fMCParticlesName.Data())); 
-       fMCParticlesMap = new AliNamedArrayI(fMCParticlesName + "_Map", 9999);
-       for (Int_t i = 0; i < 9999; i++) {
+       fMCParticlesMap = new AliNamedArrayI(fMCParticlesName + "_Map", 99999);
+       for (Int_t i = 0; i < 99999; i++) {
          fMCParticlesMap->AddAt(i,i);
        }
       }
@@ -361,7 +407,7 @@ Bool_t AliJetModelBaseTask::ExecOnce()
          InputEvent()->AddObject(fOutMCParticles);
        }
 
-       fOutMCParticlesMap = new AliNamedArrayI(fOutMCParticlesName + "_Map",9999);
+       fOutMCParticlesMap = new AliNamedArrayI(fOutMCParticlesName + "_Map",99999);
        if (InputEvent()->FindListObject(fOutMCParticlesName + "_Map")) {
          AliFatal(Form("%s: Map %s_Map is already present in the event!", GetName(), fOutMCParticlesName.Data())); 
          return kFALSE;
@@ -447,12 +493,15 @@ Int_t AliJetModelBaseTask::AddCell(Double_t e, Int_t absId, Double_t time, Int_t
 {
   // Add a cell to the event.
 
-  if (label == 0)
-    label = fMarkMC;
-  else
-    label += fMCLabelShift;
+  if (label < 0)
+    label = 0;
+
+  label += fMarkMC + fMCLabelShift;
+
+  Short_t pos = -1;
+  if (fCaloCells)  
+    pos = fCaloCells->GetCellPosition(absId);
 
-  Short_t pos = fOutCaloCells->GetCellPosition(absId);
   Double_t efrac = 1;
   Bool_t increaseOnSuccess = kFALSE;
 
@@ -468,12 +517,14 @@ Int_t AliJetModelBaseTask::AddCell(Double_t e, Int_t absId, Double_t time, Int_t
     Double_t old_efrac = 0;
     fOutCaloCells->GetCell(pos, cellNumber, old_e, old_time, old_label, old_efrac);
     
-    if (e / (old_e + e) < old_efrac) {
+    efrac = e / (old_e + e);
+
+    if (old_label > 0 && e < old_efrac * old_e) {
       label = old_label;
+      efrac = old_efrac;
       time = old_time;
     }
     
-    efrac = (e + old_e * old_efrac) / (e + old_e);
     e += old_e;
   }
 
@@ -516,20 +567,31 @@ AliVCluster* AliJetModelBaseTask::AddCluster(AliVCluster *oc)
   //MC
   UInt_t nlabels = oc->GetNLabels();
   Int_t *labels = oc->GetLabels();
+  TArrayI parents;
+  if (nlabels != 0 && labels) 
+    parents.Set(nlabels, labels);
+  else {
+    nlabels = 1;
+    parents.Set(1);
+    parents[0] = 0;
+  }
 
-  if (nlabels != 0 && labels) {
-    AliESDCaloCluster *esdClus = dynamic_cast<AliESDCaloCluster*>(dc);
-    if (esdClus) {
-      TArrayI parents(nlabels, labels);
-      esdClus->AddLabels(parents); 
-    }
-    else {
-      AliAODCaloCluster *aodClus = dynamic_cast<AliAODCaloCluster*>(dc);
-      if (aodClus) 
-       aodClus->SetLabel(labels, nlabels); 
+  if (fMarkMC+fMCLabelShift != 0) {
+    for (UInt_t i = 0; i < nlabels; i++) {
+      parents[i] += fMarkMC+fMCLabelShift;
     }
   }
 
+  AliESDCaloCluster *esdClus = dynamic_cast<AliESDCaloCluster*>(dc);
+  if (esdClus) {
+    esdClus->AddLabels(parents); 
+  }
+  else {
+    AliAODCaloCluster *aodClus = dynamic_cast<AliAODCaloCluster*>(dc);
+    if (aodClus) 
+      aodClus->SetLabel(parents.GetArray(), nlabels); 
+  }
+
   return dc;
 }
 
@@ -600,10 +662,10 @@ AliVCluster* AliJetModelBaseTask::AddCluster(Double_t e, Int_t absId, Int_t labe
   cluster->SetEmcCpvDistance(-1);
 
   //MC label
-  if (label == 0)
-    label = fMarkMC;
-  else
-    label += fMCLabelShift;
+  if (label < 0)
+    label = 0;
+  label += fMarkMC+fMCLabelShift;
 
   if (fEsdMode) {
     AliESDCaloCluster *esdClus = static_cast<AliESDCaloCluster*>(cluster);
@@ -619,33 +681,42 @@ AliVCluster* AliJetModelBaseTask::AddCluster(Double_t e, Int_t absId, Int_t labe
 }
 
 //________________________________________________________________________
-AliPicoTrack* AliJetModelBaseTask::AddTrack(Double_t pt, Double_t eta, Double_t phi, Byte_t type, Double_t etaemc, Double_t phiemc, Bool_t ise, Int_t label)
+AliPicoTrack* AliJetModelBaseTask::AddTrack(Double_t pt, Double_t eta, Double_t phi, Byte_t type, Double_t etaemc, Double_t phiemc, Double_t ptemc, Bool_t ise, Int_t label, Short_t charge, Double_t mass)
 {
   // Add a track to the event.
-
-  const Int_t nTracks = fOutTracks->GetEntriesFast();
   
-  if (pt < 0) 
-    pt = GetRandomPt();
-  if (eta < -100) 
-    eta = GetRandomEta();
-  if (phi < 0) 
-    phi = GetRandomPhi();
+  if (pt < 0 && eta < -100 && phi < 0) {
+    GetRandomParticle(pt,eta,phi);
+  }
+  else {
+    if (pt < 0) 
+      pt = GetRandomPt();
+    if (eta < -100) 
+      eta = GetRandomEta();
+    if (phi < 0) 
+      phi = GetRandomPhi(pt);
+  }
+
+  if (label >= 0)
+    label += fMarkMC+fMCLabelShift;
+  else if (label < 0)
+    label -= fMarkMC+fMCLabelShift;
+  
+  if(fAddV2) AddV2(phi, pt);
 
-  if (label == 0)
-    label = fMarkMC;
-  else
-    label += fMCLabelShift;
+  const Int_t nTracks = fOutTracks->GetEntriesFast();
 
   AliPicoTrack *track = new ((*fOutTracks)[nTracks]) AliPicoTrack(pt, 
                                                                  eta, 
                                                                  phi, 
-                                                                 1,
+                                                                 charge,
                                                                  label,
                                                                  type, 
                                                                  etaemc, 
-                                                                 phiemc, 
-                                                                 ise);
+                                                                 phiemc,
+                                                                 ptemc,
+                                                                 ise,
+                                                                 mass);
 
   return track;
 }
@@ -657,6 +728,9 @@ AliAODMCParticle* AliJetModelBaseTask::AddMCParticle(AliAODMCParticle *part, Int
 
   AliAODMCParticle *aodpart = new ((*fOutMCParticles)[nPart]) AliAODMCParticle(*part);
 
+  if (origIndex + fMCLabelShift >= fOutMCParticlesMap->GetSize())
+    fOutMCParticlesMap->Set((origIndex + fMCLabelShift)*2);
+
   fOutMCParticlesMap->AddAt(nPart, origIndex + fMCLabelShift);
   AliDebug(2, Form("Setting bin %d to %d (fMCLabelShift=%d, origIndex=%d)", 
                   origIndex + fMCLabelShift, fOutMCParticlesMap->At(origIndex + fMCLabelShift), fMCLabelShift, origIndex));
@@ -664,12 +738,32 @@ AliAODMCParticle* AliJetModelBaseTask::AddMCParticle(AliAODMCParticle *part, Int
   return aodpart;
 }
 
-//________________________________________________________________________
+//_____________________________________________________________________________
+void AliJetModelBaseTask::AddV2(Double_t &phi, Double_t &pt) const
+{
+    // similar to AliFlowTrackSimple::AddV2, except for the flow fluctuations
+    Double_t phi0(phi), v2(0.), f(0.), fp(0.), phiprev(0.);
+    if(fDifferentialV2) v2 = fDifferentialV2->Eval(pt);
+    if(TMath::AreEqualAbs(v2, 0, 1e-5)) return; 
+    // introduce flow fluctuations (gaussian)
+    if(fFlowFluctuations) v2 += TMath::Sqrt(2*(v2*.25)*(v2*.25))*TMath::ErfInverse(2*(gRandom->Uniform(0, fFlowFluctuations))-1);
+    for (Int_t i(0); i < 100; i++) {
+        phiprev=phi; //store last value for comparison
+        f =  phi-phi0+v2*TMath::Sin(2.*(phi-fPsi));
+        fp = 1.0+2.0*v2*TMath::Cos(2.*(phi-fPsi)); //first derivative
+        phi -= f/fp;
+        if (TMath::AreEqualAbs(phiprev, phi, 1e-10)) break; 
+    }
+}
+
+//_____________________________________________________________________________
 void AliJetModelBaseTask::CopyCells()
 {
   if (!fCaloCells)
     return;
 
+  fAddedCells = 0;
+  fCaloCells->Sort();
   for (Short_t i = 0; i < fCaloCells->GetNumberOfCells(); i++) {
     Int_t mclabel = 0;
     Double_t efrac = 0.;
@@ -683,10 +777,9 @@ void AliJetModelBaseTask::CopyCells()
       mclabel = 0;
 
     fOutCaloCells->SetCell(i, cellNum, amp, time, mclabel, efrac);
+    fAddedCells++;
   }
 
-  fAddedCells = fCaloCells->GetNumberOfCells();
-
   AliDebug(2, Form("%d cells from the current event", fAddedCells));
 }
 
@@ -767,9 +860,12 @@ void AliJetModelBaseTask::CopyMCParticles()
     nCopiedPart++;
   }
 
-  if (!fMCParticlesMap)
+  if (!fMCParticlesMap || !fOutMCParticlesMap)
     return;
 
+  if (fOutMCParticlesMap->GetSize() < fMCParticlesMap->GetSize())
+    fOutMCParticlesMap->Set(fMCParticlesMap->GetSize() * 2);
+
   for (Int_t i = 0; i < fMCParticlesMap->GetSize(); i++) {
     fOutMCParticlesMap->AddAt(fMCParticlesMap->At(i), i);
     if (fMCParticlesMap->At(i) >= 0)
@@ -845,7 +941,9 @@ Double_t AliJetModelBaseTask::GetRandomPhi(Bool_t emcal)
     if (phimin < EmcalMinPhi) phimin = EmcalMinPhi;
   }
 
-  return gRandom->Rndm() * (phimax - phimin) + phimin;
+  Double_t result = gRandom->Rndm() * (phimax - phimin) + phimin;
+
+  return result;
 }
 
 //________________________________________________________________________
@@ -859,6 +957,46 @@ Double_t AliJetModelBaseTask::GetRandomPt()
     return gRandom->Rndm() * (fPtMax - fPtMin) + fPtMin;
 }
 
+//________________________________________________________________________
+void AliJetModelBaseTask::GetRandomParticle(Double_t &pt, Double_t &eta, Double_t &phi, Bool_t emcal)
+{
+  // Get a random particle.
+  
+  eta = GetRandomEta(emcal);
+
+  if (fPtPhiEvPlDistribution) {
+    Double_t phimax = fPhiMax;
+    Double_t phimin = fPhiMin;
+    
+    if (emcal) {
+      const Double_t EmcalMinPhi = fGeom->GetArm1PhiMin() * TMath::DegToRad();
+      const Double_t EmcalMaxPhi = fGeom->GetArm1PhiMax() * TMath::DegToRad();
+      
+      if (phimax > EmcalMaxPhi) phimax = EmcalMaxPhi;
+      if (phimax < EmcalMinPhi) phimax = EmcalMinPhi;
+      if (phimin > EmcalMaxPhi) phimin = EmcalMaxPhi;
+      if (phimin < EmcalMinPhi) phimin = EmcalMinPhi;
+    }
+    
+    if (fPtPhiEvPlDistribution->GetXmin() > phimax || fPtPhiEvPlDistribution->GetXmax() < phimin) {
+      AliWarning(Form("The hisogram %s does not overlap with the EMCal acceptance limits. It will be ignored.",fPtPhiEvPlDistribution->GetName()));
+      pt = GetRandomPt();
+      phi = GetRandomPhi(emcal);
+    }
+    else {
+      do {
+       fPtPhiEvPlDistribution->GetRandom2(pt,phi);
+       phi += fPsi;
+       if (phi > TMath::Pi() * 2) phi -= TMath::Pi() * 2;
+      } while (phi > phimax || phi < phimin);
+    }
+  }
+  else {
+    pt = GetRandomPt();
+    phi = GetRandomPhi(emcal);
+  }
+}
+
 //________________________________________________________________________
 void AliJetModelBaseTask::Run() 
 {