From Francesco: Added AliFlowVZEROResults class
authoriseliouj <iseliouj@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 2 Mar 2012 09:40:15 +0000 (09:40 +0000)
committeriseliouj <iseliouj@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 2 Mar 2012 09:40:15 +0000 (09:40 +0000)
PWG/FLOW/Tasks/AliFlowVZEROResults.cxx [new file with mode: 0644]
PWG/FLOW/Tasks/AliFlowVZEROResults.h [new file with mode: 0644]

diff --git a/PWG/FLOW/Tasks/AliFlowVZEROResults.cxx b/PWG/FLOW/Tasks/AliFlowVZEROResults.cxx
new file mode 100644 (file)
index 0000000..7c25a0a
--- /dev/null
@@ -0,0 +1,303 @@
+#include<stdio.h>
+#include "AliFlowVZEROResults.h"
+
+
+ClassImp(AliFlowVZEROResults);
+
+AliFlowVZEROResults::AliFlowVZEROResults(const char *name,const Int_t nvar,const Int_t* binVar) :
+  TNamed(name,name),
+  fNbinVar(new TArrayI(nvar)),
+  fXmin(new TArrayF(nvar)),
+  fXmax(new TArrayF(nvar)),
+  fNameVar(new TClonesArray("TNamed")),
+  fV2(new TClonesArray("TProfile"))
+{
+
+  for(Int_t i=0;i < GetNvar();i++){
+    (*fNbinVar)[i] = binVar[i];
+  }
+  
+  for(Int_t i=0; i<GetNvar();i++){
+    new((*fNameVar)[i]) TNamed("","");
+  }
+}
+
+AliFlowVZEROResults::AliFlowVZEROResults() :
+  TNamed("v2","v2"),
+  fNbinVar(new TArrayI(0)),
+  fXmin(new TArrayF(0)),
+  fXmax(new TArrayF(0)),
+  fNameVar(new TClonesArray("TNamed")),
+  fV2(new TClonesArray("TProfile"))
+{
+  
+}
+
+AliFlowVZEROResults::~AliFlowVZEROResults(){
+  for(Int_t i=fNameVar->GetEntries();i>0;i--){
+    delete fNameVar->At(i-1);
+    fNameVar->RemoveAt(i-1);
+  }
+
+  for(Int_t i=fV2->GetEntries();i>0;i--){
+    delete fV2->At(i-1);
+    fV2->RemoveAt(i-1);
+  }
+
+  delete fNbinVar;
+  delete fXmin;
+  delete fXmax;
+}
+
+void AliFlowVZEROResults::Reset(){
+  for(Int_t i=fNameVar->GetEntries();i>0;i--){
+    delete fNameVar->At(i-1);
+    fNameVar->RemoveAt(i-1);
+  }
+
+  for(Int_t i=fV2->GetEntries();i>0;i--){
+    delete fV2->At(i-1);
+    fV2->RemoveAt(i-1);
+  }
+
+  delete fNbinVar;
+  delete fXmin;
+  delete fXmax;
+
+  fNbinVar = new TArrayI(0);
+  fXmin = new TArrayF(0);
+  fXmax = new TArrayF(0);
+
+}
+
+AliFlowVZEROResults::AliFlowVZEROResults(const AliFlowVZEROResults &old) :
+  TNamed(old),
+  fNbinVar(NULL),
+  fXmin(NULL),
+  fXmax(NULL),
+  fNameVar(new TClonesArray("TNamed")),
+  fV2(new TClonesArray("TProfile"))
+{
+
+  fNbinVar = new TArrayI(old.GetNvar());
+  fXmin = new TArrayF(old.GetNvar());
+  fXmax = new TArrayF(old.GetNvar());
+
+  for(Int_t i=0; i<old.GetNhistos();i++){
+    new((*fV2)[i]) TProfile(*((TProfile *) old.GetV2(i)));
+  }
+
+  for(Int_t i=0; i<old.GetNvar();i++){
+    new((*fNameVar)[i]) TNamed(old.GetVarName(i),old.GetVarName(i));
+  }
+
+  for(Int_t i=0;i < GetNvar();i++){
+    (*fNbinVar)[i] = (*old.fNbinVar)[i];
+    (*fXmin)[i] = (*old.fXmin)[i];
+    (*fXmax)[i] = (*old.fXmax)[i];
+   }
+
+}
+
+AliFlowVZEROResults& AliFlowVZEROResults::operator=(const AliFlowVZEROResults &old){
+
+  if(this != &old){
+     printf("different\n");
+   }
+
+   for(Int_t i=0; i<old.GetNhistos();i++){
+     new((*fV2)[i]) TProfile(*((TProfile *) old.GetV2(i)));
+   }
+   
+   fNbinVar = new TArrayI(old.GetNvar());
+   fXmin = new TArrayF(old.GetNvar());
+   fXmax = new TArrayF(old.GetNvar());
+   
+   for(Int_t i=0;i < old.GetNvar();i++){
+     (*fNbinVar)[i] = (*old.fNbinVar)[i];
+     (*fXmin)[i] = (*old.fXmin)[i];
+     (*fXmax)[i] = (*old.fXmax)[i];
+   }
+   
+   fNameVar = new TClonesArray("TNamed");
+   for(Int_t i=0; i<old.GetNvar();i++){
+     new((*fNameVar)[i]) TNamed(old.GetVarName(i),old.GetVarName(i));
+   }
+
+  return *this;
+}
+  
+Int_t AliFlowVZEROResults::GetNspecies() const{
+  Int_t n = fV2->GetEntries();
+
+  for(Int_t i=0;i < GetNvar();i++){
+    n /= (*fNbinVar)[i];
+  }
+
+  return n;
+}
+
+void AliFlowVZEROResults::AddSpecies(const char *name,Int_t nXbin,const Double_t *bin){
+  
+  Bool_t kErr = kFALSE;
+  for(Int_t i=0;i < GetNvar();i++){ // check the var ranges are set properly    
+    if((*fNbinVar)[i] < 1 || (*fXmin)[i] >= (*fXmax)[i]){
+    printf("var ranges are not set properly for variable %i please chek it before to define the species\n",i);
+       kErr = kTRUE;
+    }
+  }
+  if(kErr){
+    printf("AddSpecies: NOTHING DONE\n");
+    return;
+  }
+
+  Int_t ncomb = 1;
+  for(Int_t i=0;i < GetNvar();i++){
+    ncomb *= (*fNbinVar)[i];
+  }
+
+  char nameHisto[200];
+  char title[200];
+  for(Int_t i=0; i < ncomb;i++){
+    sprintf(nameHisto,"%s_%s_%i",GetName(),name,i);
+    sprintf(title,"%s",name);
+    Int_t ncombTemp = i;
+    for(Int_t j=0;j < GetNvar();j++){
+      Int_t ibin = ncombTemp%(*fNbinVar)[j];
+      sprintf(title,"%s_%04.1f<%s<%04.1f",title,(*fXmin)[j] + ((*fXmax)[j]-(*fXmin)[j])/(*fNbinVar)[j]*ibin,fNameVar->At(j)->GetName(),(*fXmin)[j] + ((*fXmax)[j]-(*fXmin)[j])/(*fNbinVar)[j]*(ibin+1));
+      ncombTemp /= (*fNbinVar)[j];
+    }
+
+    new((*fV2)[GetNhistos()]) TProfile(nameHisto,title,nXbin,bin);
+    ((TProfile *) GetV2(GetNhistos()-1))->GetXaxis()->SetTitle("p_{t} (GeV/c)");
+    ((TProfile *) GetV2(GetNhistos()-1))->GetYaxis()->SetTitle("v_{2}");
+  }
+}
+
+Int_t AliFlowVZEROResults::Add(const AliFlowVZEROResults *oth){
+  if(GetNhistos() == oth->GetNhistos()){
+    for(Int_t i=0;i < GetNhistos();i++){
+      GetV2(i)->Add(oth->GetV2(i));
+    }
+    return 0;
+  }
+  else{
+    printf("ADD error: number of objects is different (%i != %i)\n",GetNhistos(),oth->GetNhistos());
+    return 1;
+  }
+}
+
+void AliFlowVZEROResults::SetVarRange(Int_t ivar,Float_t xMin,Float_t xMax){
+  if(!GetNhistos()){
+    (*fXmin)[ivar]=xMin;
+    (*fXmax)[ivar]=xMax;
+  }
+  else{ // to avoid different range among the histos
+    printf("Ranges should be set before to define the species\nNOTHING DONE\n");
+  }
+
+}
+
+void AliFlowVZEROResults::Fill(Int_t species,Float_t pt,Float_t v2,Float_t x[]){
+  Int_t ncomb = 1;
+  Int_t histo = 1;
+  for(Int_t i=0;i < GetNvar();i++){
+    Int_t ibin = GetBin(i,x[i]);
+    if(ibin < 0 || ibin >= (*fNbinVar)[i]){
+      printf("%i) %i not good w.r.t. %i (%f) (%f,%f)\n",i,ibin,(*fNbinVar)[i],x[i],(*fXmin)[i],(*fXmax)[i]);
+      return;
+    }
+    histo += ncomb * ibin;
+    ncomb *= (*fNbinVar)[i];
+  }
+  histo += species*ncomb;
+  DirectFill(histo,pt,v2);
+ };
+
+TProfile *AliFlowVZEROResults::GetV2(Int_t species,Float_t x[]) const{
+  Int_t ncomb = 1;
+  Int_t histo = 1;
+  for(Int_t i=0;i < GetNvar();i++){
+    Int_t ibin = GetBin(i,x[i]);
+    if(ibin < 0 || ibin >= (*fNbinVar)[i]){
+      printf("%i) %i not good w.r.t. %i (%f) (%f,%f)\n",i,ibin,(*fNbinVar)[i],x[i],(*fXmin)[i],(*fXmax)[i]);
+      return NULL;
+    }
+    histo += ncomb * ibin;
+    ncomb *= (*fNbinVar)[i];
+  }
+  histo += species*ncomb;
+
+
+  return GetV2(histo);
+
+}
+
+TProfile *AliFlowVZEROResults::GetV2(Int_t species,Float_t xMin[],Float_t xMax[]) const{
+  if(GetNvar()){
+    char title[200];
+    Int_t ncomb = 1;
+    for(Int_t i=0;i < GetNvar();i++){
+      ncomb *= (*fNbinVar)[i];
+    }
+
+    TProfile *htemplate = GetV2(species*ncomb);
+    TProfile *temp = new TProfile(*htemplate);
+    temp->SetName("histo");
+    temp->Reset();
+    sprintf(title,"%i_",species);
+    for(Int_t i=0;i < GetNvar();i++){
+      Int_t imin = GetBin(i,xMin[i]);
+      if(imin < 0) imin = 0;
+      else if(imin >= (*fNbinVar)[i]) imin = (*fNbinVar)[i]-1;
+      Int_t imax = GetBin(i,xMax[i]);
+      if(imax < imin) imax = imin;
+      else if(imax >= (*fNbinVar)[i]) imax = (*fNbinVar)[i]-1;
+      sprintf(title,"%s_%04.1f<%s<%04.1f",title,
+                (*fXmin)[i] + ((*fXmax)[i]-(*fXmin)[i])/(*fNbinVar)[i]*imin,
+                fNameVar->At(i)->GetName(),
+                (*fXmin)[i] + ((*fXmax)[i]-(*fXmin)[i])/(*fNbinVar)[i]*(imax+1));
+    }
+    temp->SetTitle(title);
+
+    for(Int_t i=species*ncomb;i < (species+1)*ncomb;i++){
+      Bool_t kGood = kTRUE;
+
+      Int_t ncombTemp = i;
+      for(Int_t j=0;j < GetNvar();j++){
+       Int_t imin = GetBin(j,xMin[j]);
+       if(imin < 0) imin = 0;
+       else if(imin >= (*fNbinVar)[j]) imin = (*fNbinVar)[j]-1;
+       Int_t imax = GetBin(j,xMax[j]);
+       if(imax < imin) imax = imin;
+       else if(imax >= (*fNbinVar)[j]) imax = (*fNbinVar)[j]-1;
+       
+       Int_t ibin = ncombTemp%(*fNbinVar)[j];
+       ncombTemp /= (*fNbinVar)[j];
+
+       if(ibin < imin || ibin > imax){
+         kGood = kFALSE;
+         j = GetNvar();
+       }
+      }
+
+      if(kGood) temp->Add(GetV2(i));
+    }
+    return temp;
+  }
+
+  return GetV2(species);
+}
+
+Long64_t AliFlowVZEROResults::Merge(TCollection* list){
+  Long64_t res=0;
+  if (!list) return 0;
+  if (list->IsEmpty()) return 0;
+  
+  for(Int_t i=0;i < GetNhistos();i++){
+    res = GetV2(i)->Merge(list);
+  }
+  return res;
+}
diff --git a/PWG/FLOW/Tasks/AliFlowVZEROResults.h b/PWG/FLOW/Tasks/AliFlowVZEROResults.h
new file mode 100644 (file)
index 0000000..931fb3d
--- /dev/null
@@ -0,0 +1,72 @@
+#ifndef ALIFLOWVZERORESULTS_H
+#define ALIFLOWVZERORESULTS_H
+
+
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+/* $Id: AliFlowVZEROResults.h 49869 2011-05-18 04:49:51Z fnoferin $ */
+
+/////////////////////////////////////////////////
+//                                             //
+//         output v2-VZERO Class               //
+//           noferini@bo.infn.it               //
+/////////////////////////////////////////////////
+
+#include "TProfile.h"
+#include "TClonesArray.h"
+#include "TArrayI.h"
+#include "TArrayF.h"
+
+class AliFlowVZEROResults : public TNamed
+{
+ public:
+  AliFlowVZEROResults(const char *name,const Int_t nvar,const Int_t* binVar);
+  AliFlowVZEROResults();
+  ~AliFlowVZEROResults();
+  AliFlowVZEROResults(const AliFlowVZEROResults &old);
+  AliFlowVZEROResults& operator=(const AliFlowVZEROResults &source);
+
+  Int_t GetNhistos() const {return fV2->GetEntries();};
+  Int_t GetNspecies() const;
+  TProfile *GetV2(Int_t histo) const {return ((TProfile *) fV2->At(histo));};
+  TProfile *GetV2(Int_t species,Float_t x[]) const;
+  TProfile *GetV2(Int_t species,Float_t xMin[],Float_t xMax[]) const;
+  void DirectFill(Int_t histo,Float_t pt,Float_t v2){GetV2(histo)->Fill(pt,v2);};
+  void Fill(Int_t species,Float_t pt,Float_t v2,Float_t x[]);
+
+  void AddSpecies(const char *name,Int_t nXbin,const Double_t *bin);
+
+  const char *GetSpeciesName(Int_t species){return GetV2(species)->GetName();};
+
+  Int_t Add(const AliFlowVZEROResults *oth);
+
+  Int_t GetNvar() const {return fNbinVar->GetSize();};
+  Int_t GetNbinVar(Int_t ivar) const {return (*fNbinVar)[ivar];};
+
+  void SetVarRange(Int_t ivar,Float_t xMin,Float_t xMax);
+  void SetVarName(Int_t ivar,const char *name){TNamed *atemp = (TNamed *) fNameVar->At(ivar); atemp->SetName(name);};
+
+  Float_t GetXmin(Int_t ivar) const {return (*fXmin)[ivar];};
+  Float_t GetXmax(Int_t ivar) const {return (*fXmax)[ivar];};
+  const char *GetVarName(Int_t ivar) const {TNamed *atemp = (TNamed *) fNameVar->At(ivar); return atemp->GetName();};
+
+  Int_t GetBin(Int_t ivar,Float_t x) const {return Int_t((x-(*fXmin)[ivar])/((*fXmax)[ivar]-(*fXmin)[ivar])*(*fNbinVar)[ivar]);};
+
+  Long64_t Merge(TCollection* list);
+
+  void Reset();
+
+ private:
+  TArrayI *fNbinVar;
+  TArrayF *fXmin,*fXmax;
+  TClonesArray *fNameVar;
+
+  TClonesArray *fV2;
+
+
+  ClassDef(AliFlowVZEROResults,1)  // v2 vzero outuput object
+};
+#endif
+
+