]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Merge branch 'master' into TPCdev
authormivanov <marian.ivanov@cern.ch>
Wed, 23 Jul 2014 13:51:24 +0000 (15:51 +0200)
committermivanov <marian.ivanov@cern.ch>
Wed, 23 Jul 2014 13:51:24 +0000 (15:51 +0200)
36 files changed:
PWGPP/AliAnalysisTaskFilteredTree.cxx
PWGPP/CalibMacros/AliOCDBtoolkit.sh
STAT/Macros/TStatToolkitTest.C
STEER/CDB/AliCDBManager.h
STEER/CDB/AliOCDBtoolkit.cxx
STEER/ESD/AliESDtrack.cxx
STEER/ESD/AliESDtrack.h
STEER/STEER/AliSimulation.cxx
STEER/STEERBase/TTreeStream.cxx
STEER/STEERBase/TTreeStream.h
TPC/Base/AliTPCParam.cxx
TPC/Calib/AliTPCPreprocessorOffline.cxx
TPC/Rec/AliTPCClusterParam.cxx
TPC/Rec/AliTPCClusterParam.h
TPC/Rec/AliTPCRecoParam.cxx
TPC/Rec/AliTPCRecoParam.h
TPC/Rec/AliTPCtracker.cxx
TPC/Rec/AliTPCtracker.h
TPC/Sim/AliTPCDigitizer.cxx
TPC/fastSimul/AliTPCclusterFast.cxx
TPC/scripts/calibPassX/README.PassX [deleted file]
TPC/scripts/calibPassX/mergeRecursiveMasked.sh [deleted file]
TPC/scripts/calibPassX/recPass0GSI.C [deleted file]
TPC/scripts/calibPassX/runPassX.sh [deleted file]
TPC/scripts/calibPassX/runPassXJob.sh [deleted file]
TPC/scripts/calibPassX/runTrainPassX.sh [deleted file]
TPC/scripts/calibPassX/submitPass0.sh [deleted file]
TPC/scripts/calibPassX/tpcPass0Env.sh [deleted file]
test/testAliAnalysisTaskFiltered/AliAnalysisTaskFilteredTest.C
test/testAliAnalysisTaskFiltered/AliAnalysisTaskFilteredTest.sh
test/testdEdx/CMakeLists.txt [new file with mode: 0644]
test/testdEdx/Config.C [new file with mode: 0644]
test/testdEdx/makeSummary.C [new file with mode: 0644]
test/testdEdx/rec.C [new file with mode: 0644]
test/testdEdx/sim.C [new file with mode: 0644]
test/testdEdx/submitSimJobs.sh [new file with mode: 0644]

index 52c875ebd97663a45a9e365fd562d78a1f1bb5f6..338a0273f734146dc54e3a4299cf96c5d626914e 100644 (file)
@@ -368,7 +368,7 @@ void AliAnalysisTaskFilteredTree::ProcessCosmics(AliESDEvent *const event, AliES
   Int_t ntracks=event->GetNumberOfTracks(); 
   UInt_t specie = event->GetEventSpecie();  // skip laser events
   if (specie==AliRecoParam::kCalib) return;
-
+  Int_t ntracksFriend = esdFriend->GetNumberOfTracks();
 
 
   for (Int_t itrack0=0;itrack0<ntracks;itrack0++) {
@@ -389,7 +389,11 @@ void AliAnalysisTaskFilteredTree::ProcessCosmics(AliESDEvent *const event, AliES
     //if (TMath::Abs(dcaTPC[1])<kMaxDelta[0]*2) continue;
     //    const AliExternalTrackParam * trackIn0 = track0->GetInnerParam();
     AliESDfriendTrack* friendTrack0=NULL;
-    if (esdFriend) {if (!esdFriend->TestSkipBit()) friendTrack0 = esdFriend->GetTrack(itrack0);} //this guy can be NULL
+    if (esdFriend &&!esdFriend->TestSkipBit()){
+      if (itrack0<ntracksFriend){
+       friendTrack0 = esdFriend->GetTrack(itrack0);
+      } //this guy can be NULL
+    }
 
     for (Int_t itrack1=itrack0+1;itrack1<ntracks;itrack1++) {
       AliESDtrack *track1 = event->GetTrack(itrack1);
@@ -444,7 +448,12 @@ void AliAnalysisTaskFilteredTree::ProcessCosmics(AliESDEvent *const event, AliES
       
 
       AliESDfriendTrack* friendTrack1=NULL;
-      if (esdFriend) {if (!esdFriend->TestSkipBit()) friendTrack1 = esdFriend->GetTrack(itrack1);} //this guy can be NULL
+      if (esdFriend &&!esdFriend->TestSkipBit()){
+       if (itrack1<ntracksFriend){
+         friendTrack1 = esdFriend->GetTrack(itrack1);
+       } //this guy can be NULL
+      }
+
       //
       AliESDfriendTrack *friendTrackStore0=friendTrack0;    // store friend track0 for later processing
       AliESDfriendTrack *friendTrackStore1=friendTrack1;    // store friend track1 for later processing
@@ -1833,8 +1842,13 @@ void AliAnalysisTaskFilteredTree::ProcessV0(AliESDEvent *const esdEvent, AliMCEv
       AliESDfriendTrack* friendTrack1=NULL;
       if (esdFriend)       {
         if (!esdFriend->TestSkipBit()){
-          friendTrack0 = esdFriend->GetTrack(v0->GetIndex(0)); //this guy can be NULL
-          friendTrack1 = esdFriend->GetTrack(v0->GetIndex(1)); //this guy can be NULL
+         Int_t ntracksFriend = esdFriend->GetNumberOfTracks();
+         if (v0->GetIndex(0)<ntracksFriend){
+           friendTrack0 = esdFriend->GetTrack(v0->GetIndex(0)); //this guy can be NULL
+         }
+         if (v0->GetIndex(1)<ntracksFriend){
+           friendTrack1 = esdFriend->GetTrack(v0->GetIndex(1)); //this guy can be NULL
+         }
         }
       }
       if (track0->GetSign()<0) {
@@ -1990,7 +2004,13 @@ void AliAnalysisTaskFilteredTree::ProcessdEdx(AliESDEvent *const esdEvent, AliMC
       AliESDtrack *track = esdEvent->GetTrack(iTrack);
       if(!track) continue;
       AliESDfriendTrack* friendTrack=NULL;
-      if (esdFriend) {if (!esdFriend->TestSkipBit()) friendTrack = esdFriend->GetTrack(iTrack);} //this guy can be NULL
+      if (esdFriend && !esdFriend->TestSkipBit()) {
+       Int_t ntracksFriend = esdFriend->GetNumberOfTracks();
+       if (iTrack<ntracksFriend){
+         friendTrack = esdFriend->GetTrack(iTrack);
+       } //this guy can be NULL        
+      }
+      
       if(track->Charge()==0) continue;
       if(!esdTrackCuts->AcceptTrack(track)) continue;
       if(!accCuts->AcceptTrack(track)) continue;
index 87c95bf96612f3402b55ce3ad85ae97499b7fe76..ce077ed990fafb46369ea58e0444d44e49a27504 100755 (executable)
@@ -72,10 +72,10 @@ dumpObject(){
     local ftype=${3}
     local outFile=${4}
     shift 4
-    if [ ! -f ${inFile} ] ; then 
-        echo ${inFile} not found!
-        return 1
-    fi
+#    if [ ! -f ${inFile} ] ; then 
+#        echo ${inFile} not found!
+#        return 1
+#    fi
     if [ -f ${outFile} ] ; then 
         >${outFile}
     fi
index d16794860eb35fdff19a3d18734fa7f3e9b04bc5..84bc737fde8bb6812e0ba8f9728cbf0081f78814 100644 (file)
 #include "TGraphErrors.h"
 #include "TCut.h"
 #include "TCanvas.h"
+#include "TLinearFitter.h"
 
 TObjArray arrayFit(3);
-Int_t kMarkers[10]={25,24,20,21};
-Int_t kColors[10]={1,2,4,3};
-const char * names[10] = {"LTM","LThisto","LTMhisto1"};
-const char * distNames[10] = {"Gauss","Gauss+flat","Gauss(m)+0.2*Gauss(m+5#sigma)","Gauss(m)+0.3*Gauss(m+3#sigma)"};
+Int_t kMarkers[10]={25,24,20,21,22};
+Int_t kColors[10]={1,2,4,3,6};
+const char * names[10] = {"LTM","LThisto","LTMhistoPar","Gaus fit", "Gaus in range"};
+const char * distNames[10] = {"Gauss","Gauss+flat","Gauss(m)+0.2*Gauss(m+5#sigma)","Gauss(m)+0.4*Gauss(m+5#sigma)"};
 
 
 void TestLTM(Int_t nevents=10000){
@@ -44,6 +45,10 @@ void TestLTM(Int_t nevents=10000){
   TVectorD sigmaLTMHisto(6);
   TVectorD meanLTMHisto1(6);
   TVectorD sigmaLTMHisto1(6);
+  TVectorD meanLTMHistoPar(6);
+  TVectorD sigmaLTMHistoPar(6);
+  TVectorD meanLTMHistoGausLim(6);
+  TVectorD sigmaLTMHistoGausLim(6);
   TVectorD paramLTM(10);
   //
   for (Int_t iltm=0; iltm<6; iltm++) vecLTM[iltm]=0.99999*(0.5+iltm/10.);
@@ -74,7 +79,7 @@ void TestLTM(Int_t nevents=10000){
        }
       }
       if (distType==3) {
-       if (gRandom->Rndm()>0.3) {                     //  gauss + second gaus 4 sigma away
+       if (gRandom->Rndm()>0.4) {                     //  gauss + second gaus 5 sigma away
          value=gRandom->Gaus(mean,sigma);
        }else{
          value=gRandom->Gaus(mean+5*sigma,sigma);
@@ -106,6 +111,49 @@ void TestLTM(Int_t nevents=10000){
       TStatToolkit::LTMHisto(&histo, paramLTM,  vecLTM[iltm]);
       meanLTMHisto[iltm]=paramLTM[1];
       sigmaLTMHisto[iltm]=paramLTM[2];
+      //
+      // graph fit
+      //
+      Int_t binC=histo.GetXaxis()->FindBin(paramLTM[1]);
+      Int_t bin0=TMath::Max(histo.GetXaxis()->FindBin(paramLTM[1]-5*paramLTM[2]),1);
+      Int_t bin1=TMath::Min(histo.GetXaxis()->FindBin(paramLTM[1]+5*paramLTM[2]),histo.GetXaxis()->GetNbins()) ;
+      if ( (bin0-bin1) <3){
+       bin0=TMath::Max(binC-2,1);
+       bin1=TMath::Min(binC+2, histo.GetXaxis()->GetNbins());
+      }
+      //
+      /* test input:
+        TH1F histo("aaa","aaa",100,-10,10);for (Int_t i=0; i<10000; i++) histo.Fill(gRandom->Gaus(2,1));
+      */
+      
+      TLinearFitter fitter(3,"hyp2");
+      for (Int_t ibin=bin0; ibin<bin1; ibin++){
+       Double_t x=histo.GetXaxis()->GetBinCenter(ibin);
+       Double_t y=histo.GetBinContent(ibin);
+       Double_t sy=histo.GetBinError(ibin);
+       Double_t xxx[3]={x,x*x};
+       if (y>3.*sy){
+         fitter.AddPoint(xxx,TMath::Log(y),sy/y);
+       }
+      }
+      if (fitter.GetNpoints()>3){
+       fitter.Eval();
+       // f(x)=[0]+[1]*x+[2]*x*x;
+       // f(x)=s*(x0-x0)^2+s
+       Double_t parSigma=TMath::Sqrt(2*TMath::Abs(fitter.GetParameter(2)));
+       Double_t parMean=-fitter.GetParameter(1)/(2.*fitter.GetParameter(2));  
+       histo.Fit(&fg,"QN","QN", paramLTM[1]-5*paramLTM[2], paramLTM[1]+5*paramLTM[2]);
+       meanLTMHistoPar[iltm]=parMean;
+       sigmaLTMHistoPar[iltm]=parSigma;
+       meanLTMHistoGausLim[iltm]=fg.GetParameter(1);
+       sigmaLTMHistoGausLim[iltm]=fg.GetParameter(2);
+      }else{
+       meanLTMHistoPar[iltm]=paramLTM[1];
+       sigmaLTMHistoPar[iltm]=paramLTM[2];
+       meanLTMHistoGausLim[iltm]=meanG;
+       sigmaLTMHistoGausLim[iltm]=rmsG;        
+      }
+
     }
     (*pcstream)<<"ltm"<<
       //Input
@@ -125,10 +173,13 @@ void TestLTM(Int_t nevents=10000){
       "meanLTM.="<<&meanLTM<<
       "meanLTMHisto.="<<&meanLTMHisto<<
       "meanLTMHisto1.="<<&meanLTMHisto1<<
+      "meanLTMHistoPar.="<<&meanLTMHistoPar<<
+      "meanLTMHistoGausLim.="<<&meanLTMHistoGausLim<<
       //
       "sigmaLTM.="<<&sigmaLTM<<
       "sigmaLTMHisto.="<<&sigmaLTMHisto<<
-      "sigmaLTMHisto1.="<<&sigmaLTMHisto1<<      
+      "sigmaLTMHistoPar.="<<&sigmaLTMHistoPar<<      
+      "sigmaLTMHistoGausLim.="<<&sigmaLTMHistoGausLim<<      
       "\n";
   }
   delete pcstream;
@@ -146,7 +197,7 @@ void TestLTM(Int_t nevents=10000){
   TH1 * hisResol[10]={0};
   TGraphErrors * grSigma[10]={0};
   TCanvas *canvasLTM= new TCanvas("canvasLTM","canvasLTM",800,700);
-  canvasLTM->Divide(2,2);
+  canvasLTM->Divide(2,2,0,0);
   for (Int_t itype=0; itype<4; itype++){
     canvasLTM->cd(itype+1);
     TCut cutType=TString::Format("distType==0%d",itype).Data();
@@ -154,15 +205,21 @@ void TestLTM(Int_t nevents=10000){
     hisLTMTrunc[0]= (TH2*)(tree->GetHistogram()->Clone());
     tree->Draw("sqrt(npoints-2)*(meanLTMHisto.fElements-mean)/sigma:vecLTM.fElements>>hisLTMHisto(6,0.45,1.05,100,-10,10)",cutType+"npoints>50&&sigma>0.1","colzgoff");
     hisLTMTrunc[1]= (TH2*)tree->GetHistogram()->Clone();
-    tree->Draw("sqrt(npoints-2)*(meanLTMHisto1.fElements-mean)/sigma:vecLTM.fElements>>hisLTMHist1(6,0.45,1.05,100,-10,10)",cutType+"npoints>50&&sigma>0.1","colzgoff");
+    tree->Draw("sqrt(npoints-2)*(meanLTMHistoPar.fElements-mean)/sigma:vecLTM.fElements>>hisLTMHist1(6,0.45,1.05,100,-10,10)",cutType+"npoints>50&&sigma>0.1","colzgoff");
     hisLTMTrunc[2]= (TH2*)tree->GetHistogram()->Clone();
-    TLegend * legend = new TLegend(0.5,0.7,0.9,0.9,distNames[itype]);
+    tree->Draw("sqrt(npoints-2)*(meanG-mean)/sigma:vecLTM.fElements>>hisLTMHist1(6,0.45,1.05,100,-10,10)",cutType+"npoints>50&&sigma>0.1","colzgoff");
+    hisLTMTrunc[3]= (TH2*)tree->GetHistogram()->Clone();
+    tree->Draw("sqrt(npoints-2)*(meanLTMHistoGausLim.fElements-mean)/sigma:vecLTM.fElements>>hisLTMHist1(6,0.45,1.05,100,-10,10)",cutType+"npoints>50&&sigma>0.1","colzgoff");
+    hisLTMTrunc[4]= (TH2*)tree->GetHistogram()->Clone();
+    TLegend * legend = new TLegend(0.5,0.7,0.88,0.88,distNames[itype]);
     legend->SetBorderSize(0);
-    for (Int_t ihis=0; ihis<3; ihis++){
+    for (Int_t ihis=0; ihis<5; ihis++){
       // MakeStat1D(TH2 * his, Int_t deltaBin, Double_t fraction, Int_t returnType, Int_t markerStyle, Int_t markerColor);
-      grSigma[ihis]=TStatToolkit::MakeStat1D( hisLTMTrunc[ihis],0,0.99,5,kMarkers[ihis],kColors[ihis]);
+      grSigma[ihis]=TStatToolkit::MakeStat1D( hisLTMTrunc[ihis],0,0.99,1,kMarkers[ihis],kColors[ihis]);
+      grSigma[ihis]->SetMaximum(5.0);
+      grSigma[ihis]->SetMinimum(0.5);
       grSigma[ihis]->GetXaxis()->SetTitle("LTM fraction");
-      grSigma[ihis]->GetYaxis()->SetTitle("#sigma_{meas}/sigma_{gauss}");
+      grSigma[ihis]->GetYaxis()->SetTitle("#sigma_{meas}/#sigma_{Theor.}");
       if (ihis==0)grSigma[ihis]->Draw("alp");
       if (ihis>0)grSigma[ihis]->Draw("lp");
       legend->AddEntry(grSigma[ihis],names[ihis],"p");
index c85c5bff96db85d422ad0fe906a5d71ac82c1b32..db77d59f57971c87b3d1f6d41b96747b28a86bb6 100644 (file)
@@ -139,6 +139,7 @@ class AliCDBManager: public TObject {
     Bool_t DiffObjects(const char *cdbFile1, const char *cdbFile2) const;
     void ExtractBaseFolder(TString& url); // remove everything but the url from OCDB path
 
+
   protected:
 
     static TString fgkCondUri; // URI of the Conditions data base folder
index db22acc8df801d4b258b81df50c485ecac33ea5f..275a9fc2013f1cd32b4c11251a70b04b5da0340b 100644 (file)
@@ -488,6 +488,7 @@ void AliOCDBtoolkit::DumpOCDB(const TMap *cdbMap0, const TList *cdbList0, const
   TString cdbPath="";
   TObjString *ostr;
   AliCDBEntry *cdbEntry=0;
+  TGrid *myGrid = NULL;
   UInt_t hash;
   TMessage * file;
   Int_t size; 
@@ -499,6 +500,13 @@ void AliOCDBtoolkit::DumpOCDB(const TMap *cdbMap0, const TList *cdbList0, const
     if(!ostr) ostr = (TObjString*)cdbMap0->GetValue("default");
     cdbPath = ostr->GetString();
     if(cdbPath.Contains("local://"))cdbPath=cdbPath(8,cdbPath.Length()).Data();
+    if(!myGrid && cdbPath.Contains("alien://")){        //check if connection to alien is initialized
+        myGrid = TGrid::Connect("alien://");            //Oddly this will return also a pointer if connection fails
+        if(myGrid->GetPort()==0){                       //if connection fails port 0 is saved, using this to check for successful connection
+            cerr << "Cannot connect to grid!" << endl;
+            continue;
+        }
+    }
     try {
       cdbEntry = (AliCDBEntry*) man->Get(*CDBId,kTRUE);
     }catch(const exception &e){
@@ -554,6 +562,13 @@ void AliOCDBtoolkit::DumpOCDBFile(const char *finput , const char *foutput, Bool
   //  DumpOCDBFile("$ALICE_ROOT/OCDB/ITS/Align/Data/Run0_999999999_v0_s0.root", "ITS_Align_Data_Run0_999999999_v0_s0.dump")
   //
   if (finput==0) return ;
+  if (TString(finput).Contains("alien://") && gGrid==0){
+    TGrid *myGrid = TGrid::Connect("alien://");            //Oddly this will return also a pointer if connection fails
+    if(myGrid->GetPort()==0){                       //if connection fails port 0 is saved, using this to check for successful connection
+      cerr << "Cannot connect to grid!" << endl;
+      return;
+    }
+  }
   TFile *falignITS  = TFile::Open(finput);
   AliCDBEntry *entry  = (AliCDBEntry*)falignITS->Get("AliCDBEntry");
   if (!entry) return; 
index 12c98c5ce4f4a58c1a49e7279abf0974d2487534..c2a98cbb15bda14c5ca5526b48b49019d5cd448a 100644 (file)
@@ -3299,3 +3299,56 @@ Double_t  AliESDtrack::GetdEdxInfo(Int_t regionID, Int_t calibID, Int_t qID, Int
   if (!fIp) return 0;
   return fTPCdEdxInfo->GetdEdxInfo(fIp, regionID, calibID, qID, valueID);
 }
+
+
+Double_t AliESDtrack::GetdEdxInfoTRD(Int_t method, Double_t p0, Double_t p1, Double_t p2){
+  //
+  // Methods
+  // mean values:
+  //     0.)   linear
+  //     1.)   logarithmic
+  //     2.)   1/sqrt
+  //     3.)   power()
+  // time COG:
+  //     4.)   linear
+  //     5.)   logarithmic
+  //     6.)   square
+  Int_t nSlicesPerLayer=GetNumberOfTRDslices();
+  Int_t nSlicesAll=GetNumberOfTRDslices()*kTRDnPlanes;
+
+  if (method<=3){
+    Double_t sumAmp=0;
+    Int_t    sumW=0;
+    for (Int_t ibin=0; ibin<nSlicesAll; ibin++){
+      if (fTRDslices[ibin]<=0) continue; 
+      sumW++;
+      if (method==0) sumAmp+=fTRDslices[ibin];
+      if (method==1) sumAmp+=TMath::Log(TMath::Abs(fTRDslices[ibin])+p0);
+      if (method==2) sumAmp+=1/TMath::Sqrt(TMath::Abs(fTRDslices[ibin])+p0);
+      if (method==3) sumAmp+=TMath::Power(TMath::Abs(fTRDslices[ibin])+p0,p1);
+    }
+    if (sumW==0) return 0;
+    Double_t dEdx=sumAmp/sumW;
+    if (method==1) dEdx= TMath::Exp(dEdx);
+    if (method==2) dEdx= 1/(dEdx*dEdx);
+    if (method==3) dEdx= TMath::Power(dEdx,1/p1);
+    return dEdx;
+  }
+  if (method>3){
+    Double_t sumWT=0;
+    Double_t sumW=0;
+    for (Int_t ibin=0; ibin<nSlicesAll; ibin++){
+      if (fTRDslices[ibin]<=0) continue; 
+      Double_t time=(ibin%nSlicesPerLayer);
+      Double_t weight=fTRDslices[ibin];
+      if (method==5) weight=TMath::Log((weight+p0)/p0);
+      if (method==6) weight=TMath::Power(weight+p0,p1);
+      sumWT+=time*weight;
+      sumW+=weight;
+    }
+    if (sumW<=0) return 0;
+    Double_t meanTime=sumWT/sumW;
+    return meanTime;
+  }
+  return 0;
+}
index 1970aed770d1db174dbdab9a8eebec301a67387c..1e807060507f8c3054a0548b4f09faa87cc0661d 100644 (file)
@@ -233,6 +233,7 @@ public:
   }
   void  SetTPCdEdxInfo(AliTPCdEdxInfo * dEdxInfo); 
   Double_t  GetdEdxInfo(Int_t regionID, Int_t calibID, Int_t qID,Int_t valueID);
+  Double_t GetdEdxInfoTRD(Int_t method, Double_t p0, Double_t p1, Double_t p2);
 
   AliTPCdEdxInfo * GetTPCdEdxInfo() const {return fTPCdEdxInfo;}
   Double_t GetTPCsignal() const {return fTPCsignal;}
index aba83883e4da5b934e8de03dcb486760b2d588b9..5f99f4b14755a246fa44f44cb57b10bf2a6d792e 100644 (file)
@@ -1330,7 +1330,7 @@ Bool_t AliSimulation::RunSDigitization(const char* detectors)
       AliCodeTimerStart(Form("creating summable digits for %s", det->GetName()));
       det->Hits2SDigits();
       AliCodeTimerStop(Form("creating summable digits for %s", det->GetName()));
-      AliSysInfo::AddStamp(Form("Digit_%s_%d",det->GetName(),eventNr), 0,1, eventNr);
+      AliSysInfo::AddStamp(Form("SDigit_%s_%d",det->GetName(),eventNr), 0,1, eventNr);
     }
   }
 
@@ -1351,7 +1351,6 @@ Bool_t AliSimulation::RunDigitization(const char* detectors,
                                      const char* excludeDetectors)
 {
 // run the digitization and produce digits from sdigits
-
   AliCodeTimerAuto("",0)
 
   // initialize CDB storage, run number, set CDB lock
@@ -1396,6 +1395,7 @@ Bool_t AliSimulation::RunDigitization(const char* detectors,
     }
     detArr.AddLast(digitizer);    
     AliInfo(Form("Created digitizer from SDigits -> Digits for %s", det->GetName()));    
+
   }
   //
   if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
@@ -1411,11 +1411,14 @@ Bool_t AliSimulation::RunDigitization(const char* detectors,
     digInp.InitEvent(); //this must be after call of Connect Input tress.
     if (outRl) outRl->SetEventNumber(eventsCreated-1);
     static_cast<AliStream*>(digInp.GetInputStream(0))->ImportgAlice(); // use gAlice of the first input stream
-    for (int id=0;id<ndigs;id++) ((AliDigitizer*)detArr[id])->Digitize("");
+    for (int id=0;id<ndigs;id++) {
+      ((AliDigitizer*)detArr[id])->Digitize("");
+      AliSysInfo::AddStamp(Form("Digit_%s_%d",detArr[id]->GetName(),eventsCreated), 0,2, eventsCreated);       
+    }
     digInp.FinishEvent();
   };
   digInp.FinishGlobal();
-  //
+  // 
   return kTRUE;
 }
 
index d53d3fbe5043552a3b0f710db187b4c96ee7e581..22245f2f4f04ac1df8be95fb3a5284df3f3ad86b 100644 (file)
@@ -187,16 +187,16 @@ void TTreeSRedirector::Test()
   //5.) and now see results in file testredirector.root 
 }
 
-void TTreeSRedirector::UnitTest(){
+void TTreeSRedirector::UnitTest(Int_t testEntries){
   //
   //
   //
-  UnitTestSparse(0.5);
-  UnitTestSparse(0.1);
-  UnitTestSparse(0.01);
+  UnitTestSparse(0.5,testEntries);
+  UnitTestSparse(0.1,testEntries);
+  UnitTestSparse(0.01,testEntries);
 }
 
-void TTreeSRedirector::UnitTestSparse(Double_t scale){
+void TTreeSRedirector::UnitTestSparse(Double_t scale, Int_t testEntries){
   //
   // Unit test for the TTreeSRedirector
   // 1.) Test TTreeRedirector 
@@ -213,10 +213,10 @@ void TTreeSRedirector::UnitTestSparse(Double_t scale){
   if (scale<=0) scale=1;
   if (scale>1) scale=1;
   TTreeSRedirector *pcstream = new TTreeSRedirector("testpcstreamSparse.root","recreate");
-  for (Int_t ientry=0; ientry<20000; ientry++){
-    TVectorD vecRandom(50);
-    TVectorD vecZerro(50);   // zerro vector
-    for (Int_t j=0; j<50; j++) vecRandom[j]=ientry+gRandom->Rndm();
+  for (Int_t ientry=0; ientry<testEntries; ientry++){
+    TVectorD vecRandom(200);
+    TVectorD vecZerro(200);   // zerro vector
+    for (Int_t j=0; j<200; j++) vecRandom[j]=j+ientry+0.1*gRandom->Rndm();
     Bool_t isSelected= (gRandom->Rndm()<scale);
     TVectorD *pvecFull   = &vecRandom;
     TVectorD *pvecSparse = isSelected ? &vecRandom:0;
@@ -262,13 +262,32 @@ void TTreeSRedirector::UnitTestSparse(Double_t scale){
   printf("#UnitTest:\tTTreeSRedirector::TestSparse(%f)\tRatioSkip0\t%f\n",scale,ratio0);
   printf("#UnitTest:\tTTreeSRedirector::TestSparse(%f)\tRatioZerro\t%f\n",scale,ratio1);
   //    b.) Integrity 
-  Int_t outlyersSparseSkip=treeSparseSkip->Draw("1","(vec.fElements-ientry-0.5)>0.5","goff");
-  Int_t outlyersSparseSkip0=treeSparseSkip0->Draw("1","(vec.fElements-ientry-0.5)>0.5","goff");
-  printf("#UnitTest:\tTTreeSRedirector::TestSparse(%f)\tOutlyersSkip\t%d\n",scale,outlyersSparseSkip);
-  printf("#UnitTest:\tTTreeSRedirector::TestSparse(%f)\tOutlyersSkip0\t%d\n",scale,outlyersSparseSkip);
-
-  Bool_t isOK=(ratio<1.2)&&(outlyersSparseSkip0);
+  Int_t outlyersSparseSkip=treeSparseSkip->Draw("1","(vec.fElements-ientry-Iteration$-0.5)>0.5","goff");
+  Int_t outlyersSparseSkip0=treeSparseSkip0->Draw("1","(vec.fElements-ientry-Iteration$-0.5)>0.5","goff");
+  printf("#UnitTest:\tTTreeSRedirector::TestSparse(%f)\tOutlyersSkip\t%d\n",scale,outlyersSparseSkip!=0);
+  printf("#UnitTest:\tTTreeSRedirector::TestSparse(%f)\tOutlyersSkip0\t%d\n",scale,outlyersSparseSkip0!=0);
+  //    c.) Number of entries
+  //
+  Int_t entries=treeFull->GetEntries();
+  Int_t entries0=treeSparseSkip0->GetEntries();
+  Bool_t  isOKStat =(entries==entries0);
+  printf("#UnitTest:\tTTreeSRedirector::TestSparse(%f)\tEntries\t%d\n",scale,isOKStat);
+  //
+  //   d.)Reading test
+  TVectorD *pvecRead   = 0;
+  treeSparseSkip0->SetBranchAddress("vec.",&pvecRead);
+  Bool_t readOK=kTRUE;
+  for (Int_t ientry=0; ientry<testEntries; ientry++){
+    if (!pvecRead) continue;
+    if (pvecRead->GetNrows()==0) continue;
+    if (TMath::Abs((*pvecRead)[0]-ientry)>0.5) readOK=kFALSE;
+  }
+  printf("#UnitTest:\tTTreeSRedirector::TestSparse(%f)\tReadOK\t%d\n",scale,readOK);
+  //
+  //   e.)Global test
+  Bool_t isOK=(outlyersSparseSkip0==0)&&isOKStat&&readOK;
   printf("#UnitTest:\tTTreeSRedirector::TestSparse(%f)\tisOk\t%d\n",scale,isOK);  
+
 }
 
 TTreeSRedirector::TTreeSRedirector(const char *fname,const char * option) :
@@ -561,7 +580,7 @@ Int_t TTreeStream::CheckIn(TObject *pObject){
   if (element->fClass==0) {
     element->fClass=pClass;
   }else{
-    if (element->fClass!=pClass){
+    if (element->fClass!=pClass && pClass!=0){
       fStatus++;
       return 1; //mismatched data element
     }
@@ -576,7 +595,12 @@ void TTreeStream::BuildTree(){
   // Build the Tree
   //
   //if (fTree && fTree->GetEntries()>0) return;
-  if (!fTree)  fTree = new TTree(GetName(),GetName());
+  Int_t entriesFilled=0;
+  if (!fTree)  {
+    fTree = new TTree(GetName(),GetName());
+  }else{
+    entriesFilled=fTree->GetEntries();
+  }
   Int_t entries = fElements->GetEntriesFast();  
   if (!fBranches) fBranches = new TObjArray(entries);
   
@@ -594,10 +618,20 @@ void TTreeStream::BuildTree(){
     if (element->fClass){
       if (element->fClass->GetBaseClass("TClonesArray")){
        TBranch * br = fTree->Branch(bname1,element->fClass->GetName(),&(element->fPointer));
+       if (entriesFilled!=0) {
+         br->SetAddress(0);
+         for (Int_t ientry=0; ientry<entriesFilled;ientry++) br->Fill();
+         br->SetAddress(&(element->fPointer));
+       }
        fBranches->AddAt(br,i);
       }else
        {
          TBranch * br = fTree->Branch(bname1,element->fClass->GetName(),&(element->fPointer));
+         if (entriesFilled!=0) {
+           br->SetAddress(0);
+           for (Int_t ientry=0; ientry<entriesFilled;ientry++) br->Fill();
+           br->SetAddress(&(element->fPointer));
+         }
          fBranches->AddAt(br,i);
        }
     }
@@ -605,6 +639,12 @@ void TTreeStream::BuildTree(){
       char bname2[1000];
       snprintf(bname2,1000,"B%d/%c",i,element->GetType());
       TBranch * br = fTree->Branch(bname1,element->fPointer,bname2);
+      if (entriesFilled!=0) {
+       br->SetAddress(0);
+       for (Int_t ientry=0; ientry<entriesFilled;ientry++) br->Fill();
+       br->SetAddress(element->fPointer);
+      }
+
       fBranches->AddAt(br,i);
     }
   }
index 09994fa779a9a6babfbc8f3b9825af4158b0c6cf..28b1985ecb3309461a2a1f481b9abae6f1f016db 100644 (file)
@@ -90,8 +90,8 @@ public:
   void Close();
   static void Test();
   static void Test2();
-  static void UnitTestSparse(Double_t scale);
-  static void UnitTest();
+  static void UnitTestSparse(Double_t scale, Int_t testEntries);
+  static void UnitTest(Int_t testEntries=5000);
   void StoreObject(TObject* object);
   TFile * GetFile() {return fDirectory->GetFile();}
   TDirectory * GetDirectory() {return fDirectory;}
index 6ca630b488151e476f207766c6c3746eece566f9..6a89611c89bc1365e87e40d2ffae1cb74852b533 100644 (file)
@@ -886,7 +886,7 @@ Int_t AliTPCParam::GetNPadsPerSegment(Int_t wireSegmentID) const
     segRowUp   = 48;
   } else if ( wireSegmentID == 3 || wireSegmentID == 7 ) {
     segRowDown = 48;
-    segRowUp   = 64;
+    segRowUp   = 63;
   } else if ( wireSegmentID == 8 ) {
     segRowDown = 64;
     segRowUp   = 75;
index 97527d820137338dd278098783a61d800e11050b..9813fd2cb76b3b709e2500e6451bad173507b407 100644 (file)
@@ -1170,8 +1170,11 @@ Bool_t AliTPCPreprocessorOffline::AnalyzeGainDipAngle(Int_t padRegion)  {
   // Analyze gain as a function of multiplicity and produce calibration graphs
   // padRegion -- 0: short, 1: medium, 2: long, 3: absolute calibration of full track
   //
+  Int_t kMarkers[10]={25,24,20,21,22};
+  Int_t kColors[10]={1,2,4,3,6};
   if (!fGainMult) return kFALSE;
   if (!(fGainMult->GetHistTopology())) return kFALSE;
+  const Double_t kMinStat=100;
   //
   // "dEdxRatioMax","dEdxRatioTot","padType","mult","driftlength"
   TObjArray arrMax;
@@ -1194,28 +1197,28 @@ Bool_t AliTPCPreprocessorOffline::AnalyzeGainDipAngle(Int_t padRegion)  {
     histQtot->SetName("fGainMult_GetHistPadEqual_00");
   }
   //  
-  histQmax->FitSlicesY(0,0,-1,0,"QNR",&arrMax);
-  TH1D * corrMax = (TH1D*)arrMax.At(1)->Clone();
-  histQtot->FitSlicesY(0,0,-1,0,"QNR",&arrTot);
-  TH1D * corrTot = (TH1D*)arrTot.At(1)->Clone();
-  AliInfo(Form("hisQtot.GetEntries()=%d",histQtot->GetEntries()));
-  AliInfo(Form("hisQmax.GetEntries()=%d",histQmax->GetEntries()));
-  if (histQmax->GetMean(2)<=0 || histQtot->GetMean(2)) {
+  
+  if (histQmax->GetEntries()<=kMinStat || histQtot->GetEntries()<=kMinStat) {
+    AliError(Form("hisQtot.GetEntries()=%f",histQtot->GetEntries()));
+    AliError(Form("hisQmax.GetEntries()=%f",histQmax->GetEntries()));
     return kFALSE;
   }
-  corrMax->Scale(1./histQmax->GetMean(2));
-  corrTot->Scale(1./histQtot->GetMean(2));
+
+  TGraphErrors * graphMax = TStatToolkit::MakeStat1D( histQmax,0,0.8,4,kMarkers[padRegion],kColors[padRegion]);
+  TGraphErrors * graphTot = TStatToolkit::MakeStat1D( histQtot,0,0.8,4,kMarkers[padRegion],kColors[padRegion]);
   //
   const char* names[4]={"SHORT","MEDIUM","LONG","ABSOLUTE"};
   //
-  TGraphErrors * graphMax = new TGraphErrors(corrMax);
-  TGraphErrors * graphTot = new TGraphErrors(corrTot);
   Double_t meanMax = TMath::Mean(graphMax->GetN(), graphMax->GetY());
   Double_t meanTot = TMath::Mean(graphTot->GetN(), graphTot->GetY());
+  if (meanMax<=0 || meanTot<=0){
+    AliError(Form("meanMax=%f",meanMax));
+    AliError(Form("meanTot=%f",meanTot));
+    return kFALSE;
+  }
   //
   for (Int_t ipoint=0; ipoint<graphMax->GetN(); ipoint++) {graphMax->GetY()[ipoint]/=meanMax;}
   for (Int_t ipoint=0; ipoint<graphTot->GetN(); ipoint++) {graphTot->GetY()[ipoint]/=meanTot;}
-
   //
   graphMax->SetNameTitle(Form("TGRAPHERRORS_QMAX_DIPANGLE_%s_BEAM_ALL",names[padRegion]),
                        Form("TGRAPHERRORS_QMAX_DIPANGLE_%s_BEAM_ALL",names[padRegion]));
index 94da4ccb59f627b72f8aca07f257a539a204461a..b7c02bfe49a4a31f66b31f538b34ca5a669a0de4 100644 (file)
@@ -1415,6 +1415,9 @@ void AliTPCClusterParam::Print(Option_t* /*option*/) const{
             TMath::Sqrt(TMath::Abs(fParamRMS0[1][ipad][3])));  
     }
   }
+  printf("\ndEdx  correction matrix used in GetQnormCorr\n");
+  fQNormCorr->Print();
+
 }
 
 
@@ -1500,7 +1503,7 @@ void AliTPCClusterParam::ResetQnormCorr(){
     } 
 }
 
-void AliTPCClusterParam::SetQnormCorr(Int_t ipad, Int_t itype, Int_t corrType, Float_t val){
+void AliTPCClusterParam::SetQnormCorr(Int_t ipad, Int_t itype, Int_t corrType, Float_t val, Int_t mode){
   //
   // ipad        - pad type
   // itype       - 0- qtot 1-qmax
@@ -1519,6 +1522,11 @@ void AliTPCClusterParam::SetQnormCorr(Int_t ipad, Int_t itype, Int_t corrType, F
   // rows
   // itype*3+ipad  - itype=0 qtot itype=1 qmax ipad=0
   // 
+  if (mode==1) { 
+    // mode introduced in 20.07.2014 - git describe ~ vAN-20140703-48-g3449a97 - to keep back compatibility with o
+    (*fQNormCorr)(itype*3+ipad, corrType) *= val;  // set value
+    return;
+  }
   if (itype<2) (*fQNormCorr)(itype*3+ipad, corrType) *= val;  // multiplicative correction
   if (itype>=2) (*fQNormCorr)(itype*3+ipad, corrType)+= val;  // additive       correction  
 }
index 805608288707e4940af7c2378eb5230492b7b1b6..baa695b8fd3927db8e4c147fba556b3996fc3a0e 100644 (file)
@@ -37,7 +37,7 @@ class AliTPCClusterParam : public TObject {
   void FitResol(TTree * tree);
   void FitRMS(TTree * tree);
   void SetQnorm(Int_t ipad, Int_t itype,  const TVectorD *const norm); 
-  void SetQnormCorr(Int_t ipad, Int_t itype, Int_t corrType, Float_t val); 
+  void SetQnormCorr(Int_t ipad, Int_t itype, Int_t corrType, Float_t val, Int_t mode=1); 
   Double_t  GetQnormCorr(Int_t ipad, Int_t itype, Int_t corrType) const;
   TMatrixD *GetQnormCorrMatrix(){return fQNormCorr;};
   void ResetQnormCorr(); 
index 61853ff7bb51d20e11558b0d19e3bd6523aa84a5..bd4f10416f50e2429e9745273f4ff99b9caa3479 100644 (file)
@@ -102,8 +102,9 @@ AliTPCRecoParam::AliTPCRecoParam():
   fUseMultiplicityCorrectionDedx(kTRUE), // use Dedx multiplicity correction
   fUseAlignmentTime(kTRUE),              // use time dependent alignment correction
   fUseIonTailCorrection(0),   // no ion tail correction for now
-  fCrosstalkCorrection(0),   // crosstalk correction factor (fro each signal substracted by (mean signal in wite patch)xfCrosstalkCorrection) - Effect important only after removing oc capacitors in 2012
-  //
+  fCrosstalkCorrection(0),   // crosstalk correction factor (from each signal substracted by (mean signal in wite patch)xfCrosstalkCorrection) - Effect important only after removing oc capacitors in 2012
+  fCrosstalkCorrectionMissingCharge(1),   // crosstalk correction factor - missing charge (from each signal substracted by (mean signal in wite patch)xfCrosstalkCorrection) - Effect important only after removing oc capacitors in 2012
+ //
   fUseTotCharge(kTRUE),          // switch use total or max charge
   fMinFraction(0.01),           // truncated mean - lower threshold
   fMaxFaction(0.7),            // truncated mean - upper threshold
index eba548e908e4b5b62cc2e0c7b616c7e390de903f..da508e6c8d3b1d86550491d35183e9002f5a2113 100644 (file)
@@ -108,7 +108,8 @@ class AliTPCRecoParam : public AliDetectorRecoParam
   void  SetUseTOFCorrection(Bool_t flag) {fUseTOFCorrection = flag;}
   void  SetUseIonTailCorrection(Int_t flag) {fUseIonTailCorrection = flag;}
   void  SetCrosstalkCorrection(Float_t crosstalkCorrection) {fCrosstalkCorrection= crosstalkCorrection; }
-  //
+  void  SetCrosstalkCorrectionMissingCharge(Float_t crosstalkCorrection) {fCrosstalkCorrectionMissingCharge= crosstalkCorrection; }
+ //
   Int_t GetUseFieldCorrection() const {return fUseFieldCorrection;}
   Int_t GetUseComposedCorrection() const {return fUseComposedCorrection;}
   Int_t GetUseRPHICorrection() const {return fUseRPHICorrection;}
@@ -122,6 +123,7 @@ class AliTPCRecoParam : public AliDetectorRecoParam
   Bool_t GetUseTOFCorrection() {return fUseTOFCorrection;}
   Int_t GetUseIonTailCorrection() const {return fUseIonTailCorrection;}
   Double_t GetCrosstalkCorrection() const {return fCrosstalkCorrection;}
+ Double_t GetCrosstalkCorrectionMissingCharge() const {return fCrosstalkCorrectionMissingCharge;}
 
   Bool_t GetUseMultiplicityCorrectionDedx() const {return fUseMultiplicityCorrectionDedx;}
   Int_t  GetGainCorrectionHVandPTMode() const  { return   fGainCorrectionHVandPTMode;}
@@ -208,7 +210,8 @@ class AliTPCRecoParam : public AliDetectorRecoParam
   Bool_t fUseAlignmentTime;              // use time dependent alignment correction
   Int_t fUseIonTailCorrection;   // use ion tail correction
   Double_t fCrosstalkCorrection;   // crosstalk correction factor (fro each signal substracted by (mean signal in wite patch)xfCrosstalkCorrection) - Effect important only after removing oc capacitors in 2012
-  //
+  Double_t fCrosstalkCorrectionMissingCharge;   // crosstalk correction factor - missing charge factor (from each signal substracted by (mean signal in wite patch)xfCrosstalkCorrection) - Effect important only after removing  capacitors in 2012
+ //
   // dEdx switches
   //
   Bool_t   fUseTotCharge;          // switch use total or max charge
@@ -230,7 +233,7 @@ public:
                                       // to be switched off for pass 0 reconstruction
                                       // Use static function, other option will be to use 
                                       // additional specific storage ?
-  ClassDef(AliTPCRecoParam, 19)
+  ClassDef(AliTPCRecoParam, 21)
 };
 
 
index 8ac4f8cfabb4765cb0ed769cf97c7213bd4013c0..8e1892dd03e9a90071778680cf3bf82ea42edaa6 100644 (file)
 #include <TFile.h>
 #include <TObjArray.h>
 #include <TTree.h>
+#include <TMatrixD.h>
 #include <TGraphErrors.h>
 #include <TTimeStamp.h>
 #include "AliLog.h"
@@ -210,6 +211,7 @@ AliTPCtracker::AliTPCtracker()
                 fkParam(0),
                 fDebugStreamer(0),
                 fUseHLTClusters(4),
+         fCrossTalkSignalArray(0),
                 fSeedsPool(0),
                 fFreeSeedsID(500),
                 fNFreeSeeds(0),
@@ -223,7 +225,6 @@ AliTPCtracker::AliTPCtracker()
     fYMax[irow]=0;
     fPadLength[irow]=0;
   }
-
 }
 //_____________________________________________________________________
 
@@ -308,6 +309,7 @@ Int_t AliTPCtracker::UpdateTrack(AliTPCseed * track, Int_t accept){
     TTreeSRedirector &cstream = *fDebugStreamer;
     cstream<<"Update"<<
       "cl.="<<c<<
+      "event="<<event<<
       "track.="<<&param<<
       "\n";
   }
@@ -436,9 +438,10 @@ AliTracker(),
                 fSeeds(0),
                 fIteration(0),
                 fkParam(0),
-                 fDebugStreamer(0),
-                 fUseHLTClusters(4),
-                 fSeedsPool(0),
+         fDebugStreamer(0),
+         fUseHLTClusters(4),
+         fCrossTalkSignalArray(0),
+         fSeedsPool(0),
                 fFreeSeedsID(500),
                 fNFreeSeeds(0),
                 fLastSeedID(-1)
@@ -476,6 +479,22 @@ AliTracker(),
   }
   //
   fSeedsPool = new TClonesArray("AliTPCseed",1000);
+
+  // crosstalk array and matrix initialization
+  Int_t nROCs   = 72;
+  Int_t nTimeBinsAll  = par->GetMaxTBin();
+  Int_t nWireSegments = 11;
+  fCrossTalkSignalArray = new TObjArray(nROCs);  // for 36 sectors 
+  fCrossTalkSignalArray->SetOwner(kTRUE);
+  for (Int_t isector=0; isector<nROCs; isector++){
+    TMatrixD * crossTalkSignal = new TMatrixD(nWireSegments,nTimeBinsAll);
+    for (Int_t imatrix = 0; imatrix<11; imatrix++)
+      for (Int_t jmatrix = 0; jmatrix<nTimeBinsAll; jmatrix++){
+        (*crossTalkSignal)[imatrix][jmatrix]=0.;
+      }
+    fCrossTalkSignalArray->AddAt(crossTalkSignal,isector);
+  }
+
 }
 //________________________________________________________________________
 AliTPCtracker::AliTPCtracker(const AliTPCtracker &t):
@@ -498,9 +517,10 @@ AliTPCtracker::AliTPCtracker(const AliTPCtracker &t):
                 fSeeds(0),
                 fIteration(0),
                 fkParam(0),
-                 fDebugStreamer(0),
-                 fUseHLTClusters(4),
-                 fSeedsPool(0),
+         fDebugStreamer(0),
+         fUseHLTClusters(4),
+         fCrossTalkSignalArray(0),
+         fSeedsPool(0),
                 fFreeSeedsID(500),
                 fNFreeSeeds(0),
                 fLastSeedID(-1)
@@ -534,6 +554,7 @@ AliTPCtracker::~AliTPCtracker() {
     fSeeds->Clear(); 
     delete fSeeds;
   }
+  if (fCrossTalkSignalArray) delete fCrossTalkSignalArray;
   if (fDebugStreamer) delete fDebugStreamer;
   if (fSeedsPool) delete fSeedsPool;
 }
@@ -1338,6 +1359,12 @@ Int_t  AliTPCtracker::LoadClusters()
   //
   //  TTree * tree = fClustersArray.GetTree();
   AliInfo("LoadClusters()\n");
+  // reset crosstalk matrix
+  //
+  for (Int_t isector=0; isector<72; isector++){  //set all ellemts of crosstalk matrix to 0
+    TMatrixD * crossTalkMatrix = (TMatrixD*)fCrossTalkSignalArray->At(isector);
+    if (crossTalkMatrix)(*crossTalkMatrix)*=0;
+  }
 
   TTree * tree = fInput;
   TBranch * br = tree->GetBranch("Segment");
@@ -1346,14 +1373,43 @@ Int_t  AliTPCtracker::LoadClusters()
   // Conversion of pad, row coordinates in local tracking coords.
   // Could be skipped here; is already done in clusterfinder
 
+
   Int_t j=Int_t(tree->GetEntries());
   for (Int_t i=0; i<j; i++) {
     br->GetEntry(i);
     //  
     Int_t sec,row;
     fkParam->AdjustSectorRow(clrow->GetID(),sec,row);
+    
+    // wire segmentID and nPadsPerSegment to be used for Xtalk calculation
+    Int_t wireSegmentID     = fkParam->GetWireSegment(sec,row);
+    Float_t nPadsPerSegment = (Float_t)(fkParam->GetNPadsPerSegment(wireSegmentID));
+    TMatrixD &crossTalkSignal =  *((TMatrixD*)fCrossTalkSignalArray->At(sec));
+    Int_t nCols=crossTalkSignal.GetNcols();
+    Double_t missingChargeFactor= AliTPCReconstructor::GetRecoParam()->GetCrosstalkCorrectionMissingCharge();
     for (Int_t icl=0; icl<clrow->GetArray()->GetEntriesFast(); icl++){
-      Transform((AliTPCclusterMI*)(clrow->GetArray()->At(icl)));
+      AliTPCclusterMI *clXtalk= static_cast<AliTPCclusterMI*>(clrow->GetArray()->At(icl));
+      Transform((AliTPCclusterMI*)(clXtalk));
+
+      Int_t timeBinXtalk = clXtalk->GetTimeBin();
+      Double_t qTotXtalk = 0.;   
+      Double_t rmsTime2   = clXtalk->GetSigmaZ2()/(fkParam->GetZWidth()*fkParam->GetZWidth()); 
+      Double_t rmsPad2    = clXtalk->GetSigmaY2()/(fkParam->GetPadPitchWidth(sec)*fkParam->GetPadPitchWidth(sec)); 
+
+      Double_t norm= 2.*TMath::Exp(-1.0/(2.*rmsTime2))+2.*TMath::Exp(-4.0/(2.*rmsTime2))+1.;
+      for (Int_t itb=timeBinXtalk-2, idelta=-2; itb<=timeBinXtalk+2; itb++,idelta++) {        
+        if (itb<0 || itb>=nCols) continue;
+        Double_t missingCharge=0;
+       Double_t trf= TMath::Exp(-idelta*idelta/(2.*rmsTime2));
+        if (missingChargeFactor>0) for (Int_t dpad=-2; dpad<=2; dpad++){
+         Double_t qPad =   clXtalk->GetMax()*TMath::Exp(-dpad*dpad/(2*rmsPad2));
+          if (qPad*trf<fkParam->GetZeroSup()){
+           missingCharge+=qPad*missingChargeFactor;
+         }
+       }
+        qTotXtalk = (clXtalk->GetQ()+missingCharge)*trf/norm;
+        crossTalkSignal[wireSegmentID][itb]+= qTotXtalk/nPadsPerSegment; 
+      }       
     }
     //
     AliTPCtrackerRow * tpcrow=0;
@@ -1381,7 +1437,14 @@ Int_t  AliTPCtracker::LoadClusters()
   clrow->Clear("C");
   LoadOuterSectors();
   LoadInnerSectors();
+
+  cout << " =================================================================================================================================== " << endl;
+  cout << " AliTPCReconstructor::GetRecoParam()->GetUseIonTailCorrection() =  " << AliTPCReconstructor::GetRecoParam()->GetUseIonTailCorrection() << endl;
+  cout << " AliTPCReconstructor::GetRecoParam()->GetCrosstalkCorrection()  =  " << AliTPCReconstructor::GetRecoParam()->GetCrosstalkCorrection()  << endl;
+  cout << " =================================================================================================================================== " << endl;
+
   if (AliTPCReconstructor::GetRecoParam()->GetUseIonTailCorrection()) ApplyTailCancellation();
+  if (AliTPCReconstructor::GetRecoParam()->GetCrosstalkCorrection()!=0.) ApplyXtalkCorrection();
   return 0;
 }
 
@@ -1502,6 +1565,67 @@ void   AliTPCtracker::Transform(AliTPCclusterMI * cluster){
   }
 }
 
+void  AliTPCtracker::ApplyXtalkCorrection(){
+  //
+  // ApplyXtalk correction 
+  // Loop over all clusters
+  //      add to each cluster signal corresponding to common Xtalk mode for given time bin at given wire segment
+  // cluster loop
+  for (Int_t isector=0; isector<36; isector++){  //loop tracking sectors
+    for (Int_t iside=0; iside<2; iside++){       // loop over sides A/C
+      AliTPCtrackerSector &sector= (isector<18)?fInnerSec[isector%18]:fOuterSec[isector%18];
+      Int_t nrows     = sector.GetNRows();       
+      for (Int_t row = 0;row<nrows;row++){           // loop over rows       
+       AliTPCtrackerRow&  tpcrow = sector[row];     // row object   
+       Int_t ncl = tpcrow.GetN1();                  // number of clusters in the row
+       if (iside>0) ncl=tpcrow.GetN2();
+       Int_t xSector=0;    // sector number in the TPC convention 0-72
+       if (isector<18){  //if IROC
+         xSector=isector+(iside>0)*18;
+       }else{
+         xSector=isector+18;  // isector -18 +36   
+         if (iside>0) xSector+=18;
+       }       
+       TMatrixD &crossTalkMatrix= *((TMatrixD*)fCrossTalkSignalArray->At(xSector));
+       Int_t wireSegmentID     = fkParam->GetWireSegment(xSector,row);
+       for (Int_t i=0;i<ncl;i++) {
+         AliTPCclusterMI *cluster= (iside>0)?(tpcrow.GetCluster2(i)):(tpcrow.GetCluster1(i));
+         Int_t iTimeBin=TMath::Nint(cluster->GetTimeBin());
+         Double_t xTalk= crossTalkMatrix[wireSegmentID][iTimeBin];
+         cluster->SetMax(cluster->GetMax()+xTalk);
+         const Double_t kDummy=4;
+         Double_t sumxTalk=xTalk*kDummy; // should be calculated via time response function
+         cluster->SetQ(cluster->GetQ()+sumxTalk);
+
+
+          if (AliTPCReconstructor::StreamLevel()==1) {
+            TTreeSRedirector &cstream = *fDebugStreamer;
+            if (gRandom->Rndm() > 0.){
+              cstream<<"Xtalk"<<
+                "isector=" << isector <<               // sector [0,36]
+                "iside=" << iside <<                   // side A or C
+                "row=" << row <<                       // padrow
+                "i=" << i <<                           // index of the cluster 
+                "xSector=" << xSector <<               // sector [0,72] 
+                "wireSegmentID=" << wireSegmentID <<   // anode wire segment id [0,10] 
+                "iTimeBin=" << iTimeBin <<             // timebin of the corrected cluster 
+                "xTalk=" << xTalk <<                   // Xtalk contribution added to Qmax
+                "sumxTalk=" << sumxTalk <<             // Xtalk contribution added to Qtot (roughly 3*Xtalk) 
+                "cluster.=" << cluster <<              // corrected cluster object 
+                "\n";
+            }
+          }// dump the results to the debug streamer if in debug mode
+
+
+
+
+
+       }
+      }
+    }
+  }
+}
+
 void  AliTPCtracker::ApplyTailCancellation(){
   //
   // Correct the cluster charge for the ion tail effect 
@@ -1594,8 +1718,7 @@ void  AliTPCtracker::ApplyTailCancellation(){
             
             if (!cl0) continue;
             Int_t nclPad=0;                       
-            for (Int_t icl1=0; icl1<ncl;icl1++){  // second loop over clusters
-          
+            for (Int_t icl1=0; icl1<ncl;icl1++){  // second loop over clusters    
               AliTPCclusterMI *cl1= static_cast<AliTPCclusterMI*>(rowClusterArray->At(sortedClusterIndex[icl1]));
              if (!cl1) continue;
              if (TMath::Abs(cl0->GetPad()-cl1->GetPad())>4) continue;           // no contribution if far away in pad direction
@@ -1667,8 +1790,10 @@ void AliTPCtracker::GetTailValue(Float_t ampfactor,Double_t &ionTailMax, Double_
 
   //
   // Function in order to calculate the amount of the correction to be added for a given cluster, return values are ionTailTaoltal and ionTailMax
+  // Parameters:
+  // cl0 -  cluster to be modified
+  // cl1 -  source cluster ion tail of this cluster will be added to the cl0 (accroding time and pad response function)
   // 
-
   const Double_t kMinPRF    = 0.5;                           // minimal PRF width
   ionTailTotal              = 0.;                            // correction value to be added to Qtot of cl0
   ionTailMax                = 0.;                            // correction value to be added to Qmax of cl0
@@ -1682,7 +1807,8 @@ void AliTPCtracker::GetTailValue(Float_t ampfactor,Double_t &ionTailMax, Double_
   const Int_t deltaTimebin  =  TMath::Nint(TMath::Abs(cl1->GetTimeBin()-cl0->GetTimeBin()))+12;  //distance between pads of cl1 and cl0 increased by 12 bins
   Double_t rmsPad1          = (cl1->GetSigmaY2()==0)?kMinPRF:(TMath::Sqrt(cl1->GetSigmaY2())/padWidth);
   Double_t rmsPad0          = (cl0->GetSigmaY2()==0)?kMinPRF:(TMath::Sqrt(cl0->GetSigmaY2())/padWidth);
+  
+   
   
   Double_t sumAmp1=0.;
   for (Int_t idelta =-2; idelta<=2;idelta++){
index 5a9d265e48f0caec0bb9dc8120d1f55470111ca9..7a060133cc168a68f9a5af1af89893146d5491f0 100644 (file)
@@ -1,3 +1,4 @@
+
 #ifndef ALITPCTRACKER_H
 #define ALITPCTRACKER_H
 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
@@ -14,6 +15,7 @@
 //-------------------------------------------------------
 
 #include <TArrayI.h>
+#include <TMatrixD.h>
 #include "AliTracker.h"
 #include "AliTPCreco.h"
 #include "AliTPCclusterMI.h"
@@ -58,6 +60,7 @@ public:
   virtual void FillClusterArray(TObjArray* array) const;
   void   Transform(AliTPCclusterMI * cluster);
   void ApplyTailCancellation();
+  void ApplyXtalkCorrection();
   void GetTailValue(Float_t ampfactor,Double_t &ionTailMax,Double_t &ionTailTotal,TGraphErrors **graphRes,Float_t *indexAmpGraphs,AliTPCclusterMI *cl0,AliTPCclusterMI *cl1);
   //
   void FillESD(const TObjArray* arr);
@@ -219,6 +222,8 @@ private:
    TTreeSRedirector *fDebugStreamer;     //!debug streamer
    Int_t  fUseHLTClusters;              // use HLT clusters instead of offline clusters
    //
+  
+   TObjArray * fCrossTalkSignalArray;  // for 36 sectors    
    TClonesArray* fSeedsPool;            //! pool of seeds
    TArrayI fFreeSeedsID;                //! array of ID's of freed seeds
    Int_t fNFreeSeeds;                   //! number of seeds freed in the pool
index c618d43b3e1b552392a2cf4fa5c03dbd44782b78..679c58e4a5599b42b66156df3fa3e37421403c9c 100644 (file)
@@ -81,7 +81,7 @@ AliTPCDigitizer::AliTPCDigitizer(AliDigitizationInput* digInput)
 // ctor which should be used
 //  
   AliDebug(2,"(AliDigitizationInput* digInput) was processed");
-  if (AliTPCReconstructor::StreamLevel()>0)  fDebugStreamer = new TTreeSRedirector("TPCDigitDebug.root");
+  if (AliTPCReconstructor::StreamLevel()>0)  fDebugStreamer = new TTreeSRedirector("TPCDigitDebug.root","recreate");
 
 }
 
@@ -106,8 +106,8 @@ Bool_t AliTPCDigitizer::Init()
 //------------------------------------------------------------------------
 void AliTPCDigitizer::Digitize(Option_t* option)
 {
-  DigitizeFast(option);  
-  //DigitizeWithTailAndCrossTalk(option);
+  //DigitizeFast(option);  
+  DigitizeWithTailAndCrossTalk(option);
   
 }
 //------------------------------------------------------------------------
@@ -617,13 +617,18 @@ void AliTPCDigitizer::DigitizeWithTailAndCrossTalk(Option_t* option)
   //       Wire segmentationn is obtatined from the      
   //       AliTPCParam::GetWireSegment(Int_t sector, Int_t row); // to be implemented
   //       AliTPCParam::GetNPadsPerSegment(Int_t segmentID); // to be implemented
+  //   3.) Substract form the signal contribution from the previous tracks - Ion tail in case speified in the AliTPCRecoParam
+  //        AliTPCRecoParam::GetUseIonTailCorrection()
   //
   // Ion tail simulation:
   //    1.) Needs signal from pad+-1, taking signal from history
   // merge input tree's with summable digits
   // output stored in TreeTPCD
-  //
-  
+  //  
+  AliTPCcalibDB* const calib=AliTPCcalibDB::Instance();
+  AliTPCRecoParam *recoParam = calib->GetRecoParam(0); 
+  AliDebug(1, Form(" recoParam->GetCrosstalkCorrection()  =   %f", recoParam->GetCrosstalkCorrection())); 
+  AliDebug(1,Form(" recoParam->GetUseIonTailCorrection() =  %f ", recoParam->GetUseIonTailCorrection()));
   Int_t nROCs = 72;
   char s[100]; 
   char ss[100];
@@ -769,22 +774,24 @@ void AliTPCDigitizer::DigitizeWithTailAndCrossTalk(Option_t* option)
   TObject *rocFactorOROC  = ionTailArr->FindObject("factorOROC");
   Float_t factorIROC      = (atof(rocFactorIROC->GetTitle()));
   Float_t factorOROC      = (atof(rocFactorOROC->GetTitle()));
+  Int_t nIonTailBins =0;
   TObjArray timeResFunc(nROCs); 
   for (Int_t isec = 0;isec<nROCs;isec++){        //loop overs sectors
     // Array of TGraphErrors for a given sector
     TGraphErrors ** graphRes   = new TGraphErrors *[20];
-    Float_t * indexAmpGraphs   = new Float_t[20];
+    Float_t * trfIndexArr    = new Float_t[20];
     for (Int_t icache=0; icache<20; icache++)
     {
       graphRes[icache]       = NULL;
-      indexAmpGraphs[icache] = 0;
+      trfIndexArr[icache] = 0;
     }
-    if (!AliTPCcalibDB::Instance()->GetTailcancelationGraphs(isec,graphRes,indexAmpGraphs)) continue;
+    if (!AliTPCcalibDB::Instance()->GetTailcancelationGraphs(isec,graphRes,trfIndexArr)) continue;
+    
     // fill all TGraphErrors of trfs (time response function) of a given sector to a TObjArray
     TObjArray *timeResArr = new TObjArray(20);  timeResArr -> SetOwner(kTRUE); 
     for (Int_t ires = 0;ires<20;ires++) timeResArr->AddAt(graphRes[ires],ires);
     timeResFunc.AddAt(timeResArr,isec); // Fill all trfs into a single TObjArray 
-    delete timeResArr;
+    nIonTailBins = graphRes[3]->GetN();
   }
 
   //
@@ -793,8 +800,8 @@ void AliTPCDigitizer::DigitizeWithTailAndCrossTalk(Option_t* option)
   
   TObjArray   crossTalkSignalArray(nROCs);  // for 36 sectors 
   TVectorD  * qTotSectorOld  = new TVectorD(nROCs);
-  TVectorD  * qTotSectorNew  = new TVectorD(nROCs);  
   Float_t qTotTPC = 0.;
+  Float_t qTotPerSector = 0.;
   Int_t nTimeBinsAll = 1100;
   Int_t nWireSegments=11;
   // 1.a) crorstalk matrix initialization
@@ -815,12 +822,12 @@ void AliTPCDigitizer::DigitizeWithTailAndCrossTalk(Option_t* option)
       continue;
     }
     // Calculate number of pads in a anode wire segment for normalization
-    Int_t anodeSegmentID    = param->GetWireSegment(sector,padRow);
-    Float_t nPadsPerSegment = (Float_t)(param->GetNPadsPerSegment(anodeSegmentID));
+    Int_t wireSegmentID    = param->GetWireSegment(sector,padRow);
+    Float_t nPadsPerSegment = (Float_t)(param->GetNPadsPerSegment(wireSegmentID));
     // structure with mean signal per pad to be filled for each timebin in first loop (11 anodeWireSegment and 1100 timebin)
     TMatrixD &crossTalkSignal =  *((TMatrixD*)crossTalkSignalArray.At(sector));
     AliTPCCalROC * gainROC = gainTPC->GetCalROC(sector);  // pad gains per given sector
-    digrow->SetID(globalRowID);
+    //  digrow->SetID(globalRowID);
     Int_t nTimeBins = 0;
     Int_t nPads = 0;
     Bool_t digitize = kFALSE;
@@ -840,7 +847,7 @@ void AliTPCDigitizer::DigitizeWithTailAndCrossTalk(Option_t* option)
       if (GetRegionOfInterest() && !digitize) break;
     }   
     if (!digitize) continue;
-    digrow->Allocate(nTimeBins,nPads);
+    //digrow->Allocate(nTimeBins,nPads);
     Float_t q    = 0;
     Int_t labptr = 0;
     Int_t nElems = nTimeBins*nPads; // element is a unit of a given row's pad-timebin space        
@@ -859,20 +866,15 @@ void AliTPCDigitizer::DigitizeWithTailAndCrossTalk(Option_t* option)
         q  += *(pdig[i]);
         pdig[i]++;
       }
+      if (q<=0) continue;   
       Int_t padNumber = elem/nTimeBins;
       Int_t timeBin   = elem%nTimeBins;      
-      q/=16.;                                              //conversion factor
       Float_t gain = gainROC->GetValue(padRow,padNumber);  // get gain for given - pad-row pad
       q*= gain;
-      
-      crossTalkSignal[anodeSegmentID][timeBin]+= q/nPadsPerSegment;        // Qtot per segment for a given timebin
+      crossTalkSignal[wireSegmentID][timeBin]+= q/nPadsPerSegment;        // Qtot per segment for a given timebin
       qTotSectorOld -> GetMatrixArray()[sector] += q;                      // Qtot for each sector
       qTotTPC += q;                                                        // Qtot for whole TPC       
     } // end of q loop
-
-    cout << " sector = " << sector << " row = " << padRow << " SegmentID = " << anodeSegmentID ;
-    cout << " nPadsPerSegment = " <<  nPadsPerSegment << " QtotSector = " << qTotSectorOld -> GetMatrixArray()[sector] <<  endl;
-
   } // end of global row loop
 
 
@@ -885,7 +887,10 @@ void AliTPCDigitizer::DigitizeWithTailAndCrossTalk(Option_t* option)
       cerr<<"AliTPC warning: invalid segment ID ! "<<globalRowID<<endl;
       continue;
     }
-    Int_t anodeSegmentID    = param->GetWireSegment(sector,padRow);
+    TObjArray *arrTRF = (TObjArray*)timeResFunc.At(sector);  
+    TGraphErrors  *graphTRF = (TGraphErrors*)arrTRF->At(1);
+    Int_t wireSegmentID    = param->GetWireSegment(sector,padRow);
+    Float_t nPadsPerSegment = (Float_t)(param->GetNPadsPerSegment(wireSegmentID));
     const Float_t ampfactor = (sector<36)?factorIROC:factorOROC;      // factor for the iontail which is ROC type dependent
     AliTPCCalROC * gainROC  = gainTPC->GetCalROC(sector);  // pad gains per given sector
     AliTPCCalROC * noiseROC = noiseTPC->GetCalROC(sector);  // noise per given sector
@@ -913,10 +918,11 @@ void AliTPCDigitizer::DigitizeWithTailAndCrossTalk(Option_t* option)
     digrow->Allocate(nTimeBins,nPads);
     digrow->AllocateTrack(3);
     
+    Int_t localPad = 0;
     Float_t q    = 0.;
-    Float_t qX   = 0.;
-    Float_t qIon = 0.;
-    Float_t qold = 0.;
+    Float_t qXtalk   = 0.;
+    Float_t qIonTail = 0.;
+    Float_t qOrig = 0.;
     Int_t label[1000]; //stack for 300 events 
     Int_t labptr = 0;
     Int_t nElems = nTimeBins*nPads; // element is a unit of a given row's pad-timebin space    
@@ -928,22 +934,15 @@ void AliTPCDigitizer::DigitizeWithTailAndCrossTalk(Option_t* option)
     Short_t *pdig1= digrow->GetDigits();
     Int_t   *ptr1= digrow->GetTracks() ;
     // loop over elements i.e pad-timebin space of a row
-    for (Int_t elem=0;elem<nElems; elem++) 
-    {     
+    for (Int_t elem=0;elem<nElems; elem++)     {     
       q=0; 
       labptr=0;
       // looop over digits 
-      for (Int_t i=0;i<nInputs; i++) if (active[i]) 
-      { 
-        //          q  += digarr[i]->GetDigitFast(rows,col);
+      for (Int_t i=0;i<nInputs; i++) if (active[i]){ 
         q  += *(pdig[i]);
-
-        for (Int_t tr=0;tr<3;tr++) 
-        {
-          //             Int_t lab = digarr[i]->GetTrackIDFast(rows,col,tr);
+        for (Int_t tr=0;tr<3;tr++)         {
           Int_t lab = ptr[i][tr*nElems];
-          if ( (lab > 1) && *(pdig[i])>zerosup) 
-          {
+          if ( (lab > 1) && *(pdig[i])>zerosup) {
             label[labptr]=lab+masks[i];
             labptr++;
           }          
@@ -953,51 +952,66 @@ void AliTPCDigitizer::DigitizeWithTailAndCrossTalk(Option_t* option)
       }
       Int_t padNumber = elem/nTimeBins;
       Int_t timeBin   = elem%nTimeBins;
-
-      q/=16.;                                              //conversion factor
+      localPad = padNumber-nPads/2;
+      
       Float_t gain = gainROC->GetValue(padRow,padNumber);  // get gain for given - pad-row pad
       //if (gain<0.5){
       //printf("problem\n");
       //}
       q*= gain;
-      qold = q;
-      // Crosstalk correction 
-      qX = (*(TMatrixD*)crossTalkSignalArray.At(sector))[anodeSegmentID][timeBin];
-      
-      // Ion tail correction:
-      //   elem=padNumber*nTimeBins+timeBin;
-      //    lowerElem=elem-nIonTailBins;    
-      //    if (lowerElem<0) lowerElem=0;
-      //    if (lowerElem in previospad) lowerElem = padNumber*nTimeBins;
-      // 
-      // for (Int_t celem=elem-1; celem>lowerElem; celem--){
-      //  Int_t deltaT=elem-celem;
-      //
-      // }
-      //
+      qOrig = q;
       Float_t noisePad = noiseROC->GetValue(padRow,padNumber);
-      //       Float_t noise  = gRandom->Gaus(0,param->GetNoise()*param->GetNoiseNormFac());  
-      Float_t noise  = pTPC->GetNoise();
-      q+=noise*noisePad;       
+      Float_t noise  = pTPC->GetNoise()*noisePad;
+      if ( (q/16.+noise)> zerosup){
+       // Crosstalk correction 
+       qXtalk = (*(TMatrixD*)crossTalkSignalArray.At(sector))[wireSegmentID][timeBin];
+       qTotPerSector = qTotSectorOld -> GetMatrixArray()[sector];    
+       
+       // Ion tail correction: being elem=padNumber*nTimeBins+timeBin;
+       Int_t lowerElem=elem-nIonTailBins;    
+       Int_t zeroElem =(elem/nTimeBins)*nTimeBins;
+       if (zeroElem<0) zeroElem=0;
+       if (lowerElem<zeroElem) lowerElem=zeroElem;
+       // 
+       qIonTail=0;
+       if (q>0 && recoParam->GetUseIonTailCorrection()){
+         for (Int_t i=0;i<nInputs; i++) if (active[i]){
+           Short_t *pdigC= digarr[i]->GetDigits();
+           for (Int_t celem=elem-1; celem>lowerElem; celem--){
+             //for Mesut - her we substact the ion tail        
+             Double_t qCElem=pdigC[celem];
+             if (graphTRF->GetY()[elem-celem]<0)qIonTail+=qCElem*graphTRF->GetY()[elem-celem];
+           }
+         }
+       }
+      }
+      //
+      q -= qXtalk*recoParam->GetCrosstalkCorrection();
+      q+=qIonTail;
+      q/=16.;                                              //conversion factor
+      q+=noise;        
       q=TMath::Nint(q);  // round to the nearest integer
       
       
       // fill info for degugging
-      if (AliTPCReconstructor::StreamLevel()==1) {
+      if (AliTPCReconstructor::StreamLevel()==1 && qOrig > zerosup ) {
         TTreeSRedirector &cstream = *fDebugStreamer;
         cstream <<"ionTailXtalk"<<
-         "sec="       << sector              <<   //
-         "row="       << globalRowID         <<
-         "pad="       << padNumber           <<
-         "tb="        << timeBin             <<          
-         // "qsecOld.="  << qTotSectorOld       <<   // vector of total charge in sector => number total charge in given sector
-         //"qsecNew.="  << qTotSectorNew       <<    // 
-         "qtpc="      << qTotTPC             <<      // acumulated charge without crosstalk and ion tail in full TPC
-         "qold="      << qold                <<      // charge in given pad-row,pad,time-bin
-         "qX="        << qX                  <<      // crosstal contribtion at given position
-         "qIon="      << qIon                <<      // ion tail cotribution from past signal
-         "q="         << q                   <<      // q=qold-qX-qIon - to check sign of the effects
-         // "mult="      << sec                 <<
+         "sector="<< sector<<   
+         "globalRowID="<<globalRowID<<
+         "padRow="<< padRow<<                 //pad row
+         "wireSegmentID="<< wireSegmentID<<   //wire segment 0-11, 0-3 in IROC 4-10 in OROC 
+         "localPad="<<localPad<<              // pad number -npads/2 .. npads/2
+         "padNumber="<<padNumber<<            // pad number 0..npads 
+         "timeBin="<< timeBin<<               // time bin 
+         "nPadsPerSegment="<<nPadsPerSegment<<// number of pads per wire segment         
+         "qTotPerSector="<<qTotPerSector<<    // total charge in sector 
+         //
+         "qTotTPC="<<qTotTPC<<                // acumulated charge without crosstalk and ion tail in full TPC
+         "qOrig="<< qOrig<<                   // charge in given pad-row,pad,time-bin
+         "q="<<q<<                            // q=qOrig-qXtalk-qIonTail - to check sign of the effects
+         "qXtalk="<<qXtalk<<                  // crosstal contribtion at given position
+         "qIonTail="<<qIonTail<<              // ion tail cotribution from past signal
          "\n";
       }// dump the results to the debug streamer if in debug mode
       
@@ -1014,6 +1028,15 @@ void AliTPCDigitizer::DigitizeWithTailAndCrossTalk(Option_t* option)
       pdig1++;
       ptr1++;
     }
+     
+   if (AliTPCReconstructor::StreamLevel()==1 && qOrig > zerosup ) { 
+      cout << " sector = " << sector  << " row = " << padRow << " localPad = " << localPad << " SegmentID = " << wireSegmentID << " nPadsPerSegment = " <<  nPadsPerSegment << endl;
+      cout << " qXtalk =   " <<  qXtalk ;
+      cout << " qOrig = " <<  qOrig ;
+      cout << " q = "    <<  q ;
+      cout << " qsec = " <<  qTotPerSector ;
+      cout << " qTotTPC "<<  qTotTPC << endl;
+   }
     //
     //  glitch filter
     //
index e3c1978ae7539d3829116e699e670ea1176b83c9..29e6197885b2ee96ad1a3a9e75ea7aebe5e5a98a 100644 (file)
@@ -43,6 +43,7 @@
 #include "TH1.h"
 #include "TClonesArray.h"
 #include "TTreeStream.h"
+#include "TGrid.h"
 
 class AliTPCclusterFast: public TObject {
 public:
@@ -166,12 +167,17 @@ void AliTPCtrackFast::MakeTrack(){
   //
   //
   if (!fCl) fCl = new TClonesArray("AliTPCclusterFast",160);
+  //
+  // 0.) Init data structure
+  //
   for (Int_t i=0;i<fN;i++){
     AliTPCclusterFast * cluster = (AliTPCclusterFast*) fCl->UncheckedAt(i);
     if (!cluster) cluster =   new ((*fCl)[i]) AliTPCclusterFast;
     cluster->Init();
   }
-
+  //
+  // 1.) Create hits - with crosstalk diffusion
+  //
   for (Int_t i=0;i<fN;i++){
     Double_t tY = i*fAngleY;
     Double_t tZ = i*fAngleZ;
@@ -185,8 +191,15 @@ void AliTPCtrackFast::MakeTrack(){
     cluster->SetParam(fMNprim,fDiff, fDiffLong, posY,posZ,fAngleY,fAngleZ); 
     //
     cluster->GenerElectrons(cluster, clusterm, clusterp);
+  }
+  //
+  // 2.) make digitization
+  //
+  for (Int_t i=0;i<fN;i++){
+    AliTPCclusterFast * cluster = (AliTPCclusterFast*) fCl->UncheckedAt(i);
     cluster->Digitize();
   }
+
 }
 
 Double_t  AliTPCtrackFast::CookdEdxNtot(Double_t f0,Float_t f1){
@@ -471,6 +484,7 @@ void AliTPCclusterFast::Init(){
     fPosY[i]=0;
     fPosZ[i]=0;
     fGain[i]=0;
+    fSec[i]=0;
   }
 }
 
@@ -492,7 +506,7 @@ Double_t AliTPCclusterFast::GetNsec(){
   // Generate number of secondary electrons
   // copy of procedure implemented in geant
   //
-  const Double_t FPOT=20.77E-9, EEND=10E-6, EEXPO=2.2, EEND1=1E-6;
+  const Double_t FPOT=20.77E-9, EEND=10E-6, EEXPO=2.2; // EEND1=1E-6;
   const Double_t XEXPO=-EEXPO+1, YEXPO=1/XEXPO;
   const Double_t W=20.77E-9;
   Float_t RAN = gRandom->Rndm();
@@ -509,17 +523,17 @@ void AliTPCclusterFast::GenerElectrons(AliTPCclusterFast *cl0, AliTPCclusterFast
   //
   const Int_t knMax=1000;
   cl0->fNprim = gRandom->Poisson(cl0->fMNprim);  //number of primary electrons
-  cl0->fNtot=0; //total number of electrons
-  cl0->fQtot=0; //total number of electrons after gain multiplification
+  // cl0->fNtot=0; //total number of electrons
+  // cl0->fQtot=0; //total number of electrons after gain multiplification
   //
   Double_t sumQ=0;
   Double_t sumYQ=0;
   Double_t sumZQ=0;
   Double_t sumY2Q=0;
   Double_t sumZ2Q=0;
-  for (Int_t i=0;i<knMax;i++){ 
-    cl0->fSec[i]=0;
-  }
+  //  for (Int_t i=0;i<knMax;i++){ 
+  //  cl0->fSec[i]=0;
+  //}
   for (Int_t iprim=0; iprim<cl0->fNprim;iprim++){
     Float_t dN   =  cl0->GetNsec();
     cl0->fSec[iprim]=dN;
@@ -545,11 +559,11 @@ void AliTPCclusterFast::GenerElectrons(AliTPCclusterFast *cl0, AliTPCclusterFast
       cl->fQtot+=gg;
       cl->fNtot++;
       //
-  //     cl->sumQ+=gg;
-//       cl->sumYQ+=gg*y;
-//       cl->sumY2Q+=gg*y*y;
-//       cl->sumZQ+=gg*z;
-//       cl->sumZ2Q+=gg*z*z;
+      //     cl->sumQ+=gg;
+      //       cl->sumYQ+=gg*y;
+      //       cl->sumY2Q+=gg*y*y;
+      //       cl->sumZQ+=gg*z;
+      //       cl->sumZ2Q+=gg*z*z;
       if (cl->fNtot>=knMax) continue;
     }
     if (cl0->fNtot>=knMax) break;
diff --git a/TPC/scripts/calibPassX/README.PassX b/TPC/scripts/calibPassX/README.PassX
deleted file mode 100644 (file)
index 6d95e5d..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-Scripts to test reconstruction/calibration chain
-marian.ivanov@cern.ch
-
-$ALICE_ROOT/TPC/scripts/calibPassX
-Content:
-README.PassX  
-runTrainPassX.sh   
-runPassXJob.sh  
-runPassX.sh  
-recPass0GSI.C  
-
-
-
-runTrainPassX.sh - test of the PassX reconstruction/calibration chain
-                 - filtering of the log files
-                 - merging of results
-                 - It is pseudo code
-
-submitPass0.sh   - submit reconstruction/calibration job 
-
-runPassXJob.sh   - wrapper around the script $ALICE_ROOT/TPC/scripts/runPassX.sh 
-                   to be run 
-                 - intermediate results on the local machine
-
-runPassX.sh      - copy from  $ALICE_ROOT/ANALYSIS/macros/runPassX.sh
-                 - Modification needed:                                           
-                   Provide the run number and number of events as argument
-
-recPass0GSI.C    - reconstruction script 
diff --git a/TPC/scripts/calibPassX/mergeRecursiveMasked.sh b/TPC/scripts/calibPassX/mergeRecursiveMasked.sh
deleted file mode 100755 (executable)
index 1e36592..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-#
-# recursive merging
-# 
-maxMerge=$1
-queue="$2"
-mask=$3
-output=$4
-reject=$5
-#
-counter=0;
-counter2=0;
-wdir=`pwd`
-rm -rf merge*
-mkdir merge$counter2 
-cd merge$counter
-for a in `cat ../calib.list`; do
-   let counter=counter+1;
-   echo $counter $counter2
-   echo $a >>calib.list
-   if [ $counter -gt $maxMerge ] ; then
-     echo    bsub -q $queue  -oo outMerge.log $ALICE_ROOT/ANALYSIS/CalibMacros/MergeCalibration/mergeCustom.C\(\"$output\",\"$mask\",\"$5\"\);
-     cat calib.list
-     bsub -q $queue  -oo outMerge.log aliroot -b -q  $ALICE_ROOT/ANALYSIS/CalibMacros/MergeCalibration/mergeCustom.C\(\"calib.list\",\"$output\",\"$mask\",\"$5\"\)
-     let counter2=counter2+1;
-     let counter=0;
-     cd $wdir
-     mkdir  merge$counter2 
-     cd merge$counter2
-     if [ -e calib.list ]; then
-        rm calib.list
-     fi;
-   fi;  
-done;
-
-bsub -q $queue  -oo outMerge.log aliroot -b -q  $ALICE_ROOT/ANALYSIS/CalibMacros/MergeCalibration/mergeCustom.C\(\"calib.list\",\"$output\",\"$mask\",\"$5\"\)
-
diff --git a/TPC/scripts/calibPassX/recPass0GSI.C b/TPC/scripts/calibPassX/recPass0GSI.C
deleted file mode 100644 (file)
index b4fab69..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-//
-//   rec.C to be used for pass0
-//   
-
-void rec(const char *filename="raw.root",Int_t nevents=-1)
-{
-  // Load some system libs for Grid and monitoring
-  // Set the CDB storage location
-  AliCDBManager * man = AliCDBManager::Instance();
-  //man->SetDefaultStorage("raw://");
-  man->SetDefaultStorage("local:///lustre/alice/alien/alice/data/2010/OCDB/");
-  // Reconstruction settings
-  AliReconstruction rec;
-
-  // Set protection against too many events in a chunk (should not happen)
-  if (nevents>0) rec.SetEventRange(0,nevents);
-
-  // Switch off HLT until the problem with schema evolution resolved
-  //rec.SetRunReconstruction("ALL-HLT");
-  //
-  // QA options
-  //
-  AliQAManager *qam = AliQAManager::QAManager(AliQAv1::kRECMODE) ;
-  rec.SetRunQA(":");
-  rec.SetRunGlobalQA(kFALSE);
-
-  // AliReconstruction settings
-  rec.SetWriteESDfriend(kTRUE);
-  rec.SetWriteAlignmentData();
-  rec.SetInput(filename);
-  rec.SetUseTrackingErrorsForAlignment("ITS");
-  rec.SetRunReconstruction("ITS TPC TRD TOF");
-  rec.SetFillESD("ITS TPC TRD TOF");
-
-  // switch off cleanESD
-  rec.SetCleanESD(kFALSE);
-
-  AliLog::Flush();
-  rec.Run();
-
-}
-
-
diff --git a/TPC/scripts/calibPassX/runPassX.sh b/TPC/scripts/calibPassX/runPassX.sh
deleted file mode 100755 (executable)
index eb112c1..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-#!/bin/bash
-
-# Script to run:
-#    1. reconstruction
-#    2. calibration and friend track filtering
-#    3. tag creation
-#
-# Files assumed to be in working directory:
-# rec.C               - reconstruction macro
-# runCalibTrain.C     - calibration/filtering macro
-# Arguments:
-#    1  - raw data file name
-#    2  - number of events to be processed
-#    3  - run number 
-
-# example:
-# runPassX.sh raw.root  50  104892
-
-#ALIEN setting
-#entries=1000
-# $1 = raw input filename
-#runnum=`echo $1 | cut -d "/" -f 6`
-
-#Local setting : setting variables 
-
-entries=$2
-runnum=$3
-source $HOME/alienSetup.sh
-
-echo File to be  processed $1
-echo Number of events to be processed $entries
-echo Run mumber $runnum
-
-echo ALICE_ROOT = $ALICE_ROOT
-echo AliROOT = $AliROOT
-cp $ALICE_ROOT/.rootrc ~/.rootrc
-cp $ALICE_ROOT/.rootrc $HOME
-#cat $HOME/.rootrc
-export GRID_TOKEN=OK
-
-echo ">>>>>>>>> PATH is..."
-echo $PATH
-echo ">>>>>>>>> LD_LIBRARY_PATH is..."
-echo $LD_LIBRARY_PATH
-echo ">>>>>>>>> rec.C is..."
-cat rec.C
-echo
-
-
-echo
-echo ">>>>>>> Running AliRoot to reconstruct $1. Run number is $runnum..."
-echo
-if [ -e AliESDs.root ]; then
-    echo AliESDs.root exist
-    ls -al AliESD*
-else
-    echo aliroot -l -b -q rec.C\(\"$1\",$2\) 2>&1 | tee rec.log
-    aliroot -l -b -q rec.C\(\"$1\",$2\) 2>&1 | tee rec.log
-    echo aliroot -l -b -q tag.C\(\) 2>&1 | tee tag.log
-    aliroot -l -b -q tag.C\(\) 2>&1 | tee tag.log
-fi
-
-echo
-echo ">>>>>>> Running AliRoot to make calibration..."
-echo 
-echo aliroot -l -b -q  runCalibTrain.C\($runnum\)   2>&1 | tee calib.log
-aliroot -l -b -q  runCalibTrain.C\($runnum\)   2>&1 | tee calib.log
-
-echo
-echo ">>>>>>> Running AliRoot to generate Tags..."
-echo
-echo aliroot -l -b -q tag.C\(\) 2>&1 | tee tag.log
-#aliroot -l -b -q tag.C\(\) 2>&1 | tee tag.log
diff --git a/TPC/scripts/calibPassX/runPassXJob.sh b/TPC/scripts/calibPassX/runPassXJob.sh
deleted file mode 100755 (executable)
index 2781d95..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-#
-# run PassX recosntruction/calibration jobs
-# 
-# Needed in order to run the jobs locally
-#
-#    1  - raw data file name
-#    2  - number of events to be processed
-#    3  - run number 
-
-
-echo Input file $1
-echo Run number $3
-echo Events to reconstruct/calibrate $2
-echo HOSTNAME $HOSTNAME
-
-outdir=`pwd`
-tmpdir=/tmp/$USER/`echo $outdir | sed s_/_x_g` 
-mkdirhier $tmpdir
-echo tmpdir = $tmpdir
-#
-cp  $outdir/*.C   $tmpdir/
-cp  $outdir/*.sh  $tmpdir/
-cp  $outdir/AliESDs.root        $tmpdir/
-cp  $outdir/AliESDfriends.root  $tmpdir/
-
-cd $tmpdir
-#
-#
-#
-echo tmpdir = `pwd`
-echo outdir = $outdir
-ls
-
-cp $1 .
-
-if [ -e root_archive.zip ]; then
-  echo unzip reconstructed file
-  unzip root_archive.zip
-  rm -f AliESDfriends_v1.root
-  rm   root_archive.zip
-fi;
-
-echo runPassX.sh   $1  $2  $3
-runPassX.sh        $1  $2  $3
-
-ls -alrt
-rm *ebug.root 
-cp -r $tmpdir/*      $outdir/
-rm -rf $tmpdir
-
-
diff --git a/TPC/scripts/calibPassX/runTrainPassX.sh b/TPC/scripts/calibPassX/runTrainPassX.sh
deleted file mode 100644 (file)
index dac3027..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-#
-# Sequence of steps to test Pass0 and PassX reconstruction/calibration which run on GRID 
-# by default               
-# 
-# Semi automatic test performed on the batch farm
-# Important features:
-# 1. Parsing of the log files                           
-# 2. Parsing stack traces
-   
-# author:  marian.ivanov@cern.ch
-
-
-#
-# 0. copy a template setup
-#   To be modified if necessary
-#  "standard scripts
-cp $ALICE_ROOT/ANALYSIS/macros/runCalibTrain.C  .
-#  scipts to run  on batch farm
-cp $ALICE_ROOT/TPC/scripts/calibPassX/recPass0GSI.C   rec.C 
-cp $ALICE_ROOT/TPC/scripts/calibPassX/runPassX.sh     .
-cp $ALICE_ROOT/TPC/scripts/calibPassX/submitPass0.sh  .
-cp $ALICE_ROOT/TPC/scripts/calibPassX/runPassXJob.sh  .
-
-cp ../lists/run.list .
-cp ../lists/raw.list .
-
-#
-# 1. Make workspace - directory structure with run and raw lists 
-#
-$ALICE_ROOT/TPC/scripts/makeWorkspace.sh run.list 
-#
-# 1.a clean the workspace all
-#
-find `pwd` | grep AliESD  | xargs rm
-find `pwd` | grep out     | xargs rm
-find `pwd` | grep log     | xargs rm
-#
-# 1.b clean workscpace  - rm root files if not tags found
-#
-find `pwd` | grep AliESDs.root > esd.txt
-for efile in `cat esd.txt`; do
-    dname=`dirname $efile` 
-    status=`ls $dname/*tag.root`; 
-    echo  CHECK  $efile $status
-    if [ -z $status ]; then 
-      echo NON OK  rm -r $dname/*.root
-      rm -r $dname/*.root
-    else
-      echo IS OK $status
-    fi; 
-done
-
-#
-# 2. Run reconstruction/calibration
-#
-bgroup=/recPass0/`pwd | xargs basename`
-bgadd $bgroup
-nEvents=500000
-submitPass0.sh run.list "alice-t3_8h -g  $bgroup" $nEvents | tee  submit.log
-
-
-#
-# 3. Run merging - run level
-#
-for arun in `cat run.list`; do
-    cd $arun
-    find `pwd`/ | grep AliESDfriends_v1.root > calib.list
-    echo bsub -q alice-t3_8h  -o outMerge.log  aliroot -b -q  $ALICE_ROOT/ANALYSIS/macros/mergeCalibObjects.C
-    bsub -q alice-t3_8h -o outMerge.log aliroot -b -q  $ALICE_ROOT/ANALYSIS/macros/mergeCalibObjects.C
-    cd ../
-done;
-
-#
-# 4. Merge all
-#
-ls `pwd`/*/CalibObjects.root  > calib.list
-aliroot -b -q  $ALICE_ROOT/ANALYSIS/macros/mergeCalibObjects.C
-
-#
-# 5. filter reconstruction  logs, make statistic of problems
-#
-mkdirhier logs/reco
-cd  logs/reco
-find `pwd`/../../ | grep rec.log > errRec.log
-$ALICE_ROOT/TPC/scripts/filterRecLog.sh
-cd ../..
-
-#
-# 6. filter calibration  logs, make statistic of problems
-#
-mkdirhier logs/calib
-cd  logs/calib
-find `pwd`/../../ | grep calib.log > errRec.log
-$ALICE_ROOT/TPC/scripts/filterRecLog.sh
-cd ../..
-
-
-#
-# 7. filter debug streamer
-#
-mkdir debug
-cd debug
-find  `pwd`/../*/ | grep V6 | grep .root  > debugall.txt
-cat  debugall.txt | grep calibTimeDebug > timeitstpc.txt
-
-
-
-
diff --git a/TPC/scripts/calibPassX/submitPass0.sh b/TPC/scripts/calibPassX/submitPass0.sh
deleted file mode 100755 (executable)
index 0ce5683..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-#!/bin/bash
-#
-# Submit jobs for reconstruction/calibration
-# Test - Equivalent of pass0/passX on the grid
-#
-
-# Parameters:
-# 1 - queue name
-# 2 - run number
-# 3 - number of events to be reconstructed
-# 4 - run.list
-# Example: submitPass0.sh run.list "alice-t3_8h" 1000 
-
-runList=$1
-qName=$2
-nEvents=$3
-workDir=`pwd`
-for arun in `cat $runList`; do
-    echo 
-    echo Run number $arun
-    echo 
-    #
-    cd $workDir/$arun
-    cp $workDir/*.C .
-    cp $workDir/*.sh .
-    cat ../../lists/raw.list | grep $arun >raw.list    
-    #
-    #
-    for afile in `cat raw.list | grep -v tag`; do 
-       echo $afile; 
-       cdir0=`basename $afile | sed s_.root__`
-       mkdir $cdir0
-       cd $cdir0
-       cp $workDir/$arun/*.C .
-       cp $workDir/$arun/*.sh .
-        echo
-        echo
-        pwd
-       echo bsub -q $qName -o out${cdir0}.log   runPassXJob.sh $afile  $nEvents  $arun
-       bsub      -q $qName -o out${cdir0}.log   runPassXJob.sh $afile  $nEvents  $arun 
-       cd ../
-        cd $workDir/$arun
-    done;
-    cd $workDir
-done
-
-
-
diff --git a/TPC/scripts/calibPassX/tpcPass0Env.sh b/TPC/scripts/calibPassX/tpcPass0Env.sh
deleted file mode 100755 (executable)
index 3663060..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-#
-# parameters:
-# 1 - basedir
-# Example: 
-# source  /usr/local/grid/AliRoot/HEAD0108/TPC/scripts/tpcPass0Env.sh `pwd`
-export balice=/u/miranov/.balice
-export aliensetup=$HOME/alienSetup.sh
-export PASS0_DIR=/usr/local/grid/AliRoot/HEAD0108
-source $balice
-#source $aliensetup >aliensetup.log
-#
-# Test setup
-#
-export workdir=$1
-if [ ! -n length ]; then 
-  echo \############################  
-  echo Directory was not specified. Exiting
-  echo \############################   
-  return;
-fi;
-if [ ! -r $workdir/lists/esd.list  ] ; then
- echo \############################   
- echo File esd list does not exist. Exiting
- echo \############################   
- return;
-fi; 
-if [ ! -r $workdir/lists/run.list  ] ; then
- echo \############################   
- echo File run list does not exist. Exiting
- echo \############################   
- return;
-fi; 
-
-#
-# Make directories
-#
-cd $workdir
-chgrp -R alice $workdir
-chmod -R g+rwx $workdir
-chmod -R o+rx $workdir
-mkdirhier  $workdir/calibNoDrift
-mkdirhier  $workdir/calibNoRefit
-mkdirhier  $workdir/calibQA
-#
-#modify ConfigOCDB.C
-#
-# copy predefined Config files 
-#
-cp   $PASS0_DIR/TPC/macros/CalibrateTPC.C      calibNoDrift/CalibrateTPC.C
-cat  $PASS0_DIR/TPC/macros/CalibrateTPC.C |    grep -v AddCalibCalib\(task\) > calibNoRefit/CalibrateTPC.C
-cp   $PASS0_DIR/TPC/macros/CalibrateTPC.C      calibQA/CalibrateTPC.C
-cp   $PASS0_DIR/TPC/macros/ConfigOCDBNoDrift.C calibNoDrift/ConfigOCDB.C
-cp   $PASS0_DIR/TPC/macros/ConfigOCDBNoRefit.C calibNoRefit/ConfigOCDB.C
-cp   $PASS0_DIR/TPC/macros/ConfigOCDBQA.C      calibQA/ConfigOCDB.C
-cp   lists/*.list calibNoDrift/
-cp   lists/*.list calibNoRefit/
-cp   lists/*.list calibQA/
-ln -sf $balice          calibNoDrift/balice.sh
-ln -sf $balice          calibNoRefit/balice.sh
-ln -sf $balice          calibQA/balice.sh
-ln -sf $aliensetup      calibNoDrift/alienSetup.sh
-ln -sf $aliensetup      calibNoRefit/alienSetup.sh
-ln -sf $aliensetup      calibQA/alienSetup.sh
-#  make workspaces
-#
-cd $workdir/calibNoDrift
-$PASS0_DIR/TPC/scripts/makeWorkspace.sh run.list 
-$PASS0_DIR/TPC/scripts/submitCalib.sh run.list alice-t3 20
-cd $workdir/calibNoRefit
-$PASS0_DIR/TPC/scripts/makeWorkspace.sh run.list 
-$PASS0_DIR/TPC/scripts/submitCalib.sh run.list alice-t3 20
-cd $workdir/calibQA
-$PASS0_DIR/TPC/scripts/makeWorkspace.sh run.list 
-$PASS0_DIR/TPC/scripts/submitCalib.sh run.list alice-t3 20
-cd $workdir/
-#
-#
-#
index efb442a97e0a2fb197f12cdd07b4a010a7dcd090..f45ac1daca0c07264bf8cec8d438c12c341cc874 100755 (executable)
@@ -115,5 +115,13 @@ void CheckOutput(){
   Double_t ratioPointsHighPt = highPt->GetBranch("friendTrack.fCalibContainer")->GetZipBytes()/Double_t(0.00001+highPt->GetZipBytes());
   printf("#UnitTest:\tAliAnalysisTaskFiltered\tRatioPointsV0\t%f\n",ratioPointsV0);
   printf("#UnitTest:\tAliAnalysisTaskFiltered\tRatioPointsHighPt\t%f\n",ratioPointsHighPt);
+  //
+  // a.) Check track correspondence
+  //
+  Int_t entries= highPt->Draw("(friendTrack.fTPCOut.fP[3]-esdTrack.fIp.fP[3])/sqrt(friendTrack.fTPCOut.fC[9]+esdTrack.fIp.fC[9])","friendTrack.fTPCOut.fP[3]!=0","");
+  // here we should check if the tracks
+  Double_t pulls=TMath::RMS(entries, highPt->GetV1());
+  printf("#UnitTest:\tAliAnalysisTaskFiltered\tFriendPull\t%2.4f\n",pulls);
+  printf("#UnitTest:\tAliAnalysisTaskFiltered\tFriendOK\t%d\n",pulls<10);
 
 }
index 732a6941109cb6a81c270eb4b01f8cd24ab5aa3e..c5de770abd524b938ab33ed3a5b8a98bb47f0551 100755 (executable)
@@ -31,11 +31,11 @@ source $UnitTestConfig
 #get path to input list
     inputListfiles=$TestData_pPb
 #get scale number for tracks
-    filterT=${2-100}
+    filterT=${2-20}
 #get scale number for V0s
-    filterV=${3-10}
-#get scale number of riends
-    filterFriend=${4--10}
+    filterV=${3-2}
+#get scale number of friends
+    filterFriend=${4--1}
 #get OCDB path (optional)
     OCDBpath=${5-"\"$OCDBPath_pPb\""}
 #get max number of files 
diff --git a/test/testdEdx/CMakeLists.txt b/test/testdEdx/CMakeLists.txt
new file mode 100644 (file)
index 0000000..43f9709
--- /dev/null
@@ -0,0 +1 @@
+add_test("testdEdx" runtest.sh)
\ No newline at end of file
diff --git a/test/testdEdx/Config.C b/test/testdEdx/Config.C
new file mode 100644 (file)
index 0000000..772c964
--- /dev/null
@@ -0,0 +1,1568 @@
+//Configuration of simulation
+
+enum PprRun_t 
+{
+  test50, testdEdx,
+    kParam_8000,   kParam_4000,  kParam_2000, 
+    kHijing_cent1, kHijing_cent2, 
+    kHijing_per1,  kHijing_per2, kHijing_per3, kHijing_per4,  kHijing_per5,
+    kHijing_jj25,  kHijing_jj50, kHijing_jj75, kHijing_jj100, kHijing_jj200, 
+    kHijing_gj25,  kHijing_gj50, kHijing_gj75, kHijing_gj100, kHijing_gj200,
+    kHijing_pA, kPythia6, 
+    kPythia6Jets20_24,   kPythia6Jets24_29,   kPythia6Jets29_35,
+    kPythia6Jets35_42,   kPythia6Jets42_50,   kPythia6Jets50_60,
+    kPythia6Jets60_72,   kPythia6Jets72_86,   kPythia6Jets86_104,
+    kPythia6Jets104_125, kPythia6Jets125_150, kPythia6Jets150_180,
+    kD0PbPb5500, kCharmSemiElPbPb5500, kBeautySemiElPbPb5500,
+    kCocktailTRD, kPyJJ, kPyGJ, 
+    kMuonCocktailCent1, kMuonCocktailPer1, kMuonCocktailPer4, 
+    kMuonCocktailCent1HighPt, kMuonCocktailPer1HighPt, kMuonCocktailPer4HighPt,
+    kMuonCocktailCent1Single, kMuonCocktailPer1Single, kMuonCocktailPer4Single,
+    kFlow_2_2000, kFlow_10_2000, kFlow_6_2000, kFlow_6_5000,
+    kHIJINGplus, kRunMax
+};
+
+const char* pprRunName[] = {
+  "test50", "testdEdx",
+    "kParam_8000",   "kParam_4000",  "kParam_2000", 
+    "kHijing_cent1", "kHijing_cent2", 
+    "kHijing_per1",  "kHijing_per2", "kHijing_per3", "kHijing_per4",  
+    "kHijing_per5",
+    "kHijing_jj25",  "kHijing_jj50", "kHijing_jj75", "kHijing_jj100", 
+    "kHijing_jj200", 
+    "kHijing_gj25",  "kHijing_gj50", "kHijing_gj75", "kHijing_gj100", 
+    "kHijing_gj200", "kHijing_pA", "kPythia6", 
+    "kPythia6Jets20_24",   "kPythia6Jets24_29",   "kPythia6Jets29_35",
+    "kPythia6Jets35_42",   "kPythia6Jets42_50",   "kPythia6Jets50_60",
+    "kPythia6Jets60_72",   "kPythia6Jets72_86",   "kPythia6Jets86_104",
+    "kPythia6Jets104_125", "kPythia6Jets125_150", "kPythia6Jets150_180",
+    "kD0PbPb5500", "kCharmSemiElPbPb5500", "kBeautySemiElPbPb5500",
+    "kCocktailTRD", "kPyJJ", "kPyGJ", 
+    "kMuonCocktailCent1", "kMuonCocktailPer1", "kMuonCocktailPer4",  
+    "kMuonCocktailCent1HighPt", "kMuonCocktailPer1HighPt", "kMuonCocktailPer4HighPt",
+    "kMuonCocktailCent1Single", "kMuonCocktailPer1Single", "kMuonCocktailPer4Single",
+    "kFlow_2_2000", "kFlow_10_2000", "kFlow_6_2000", "kFlow_6_5000", "kHIJINGplus"
+};
+
+enum PprRad_t
+{
+    kGluonRadiation, kNoGluonRadiation
+};
+
+enum PprTrigConf_t
+{
+    kDefaultPPTrig, kDefaultPbPbTrig
+};
+
+const char * pprTrigConfName[] = {
+    "p-p","Pb-Pb"
+};
+
+// This part for configuration    
+
+//static PprRun_t srun = kPythia6;
+static PprRun_t srun = testdEdx;
+static PprRad_t srad = kGluonRadiation;
+static AliMagF::BMap_t smag = AliMagF::k5kG;
+static Int_t    sseed = 0; //Set 0 to use the current time
+static PprTrigConf_t strig = kDefaultPPTrig; // default pp trigger configuration
+
+// Comment line 
+static TString  comment;
+
+// Functions
+Float_t EtaToTheta(Float_t arg);
+AliGenerator* GeneratorFactory(PprRun_t srun);
+AliGenHijing* HijingStandard();
+AliGenGeVSim* GeVSimStandard(Float_t, Float_t);
+void ProcessEnvironmentVars();
+
+void Config()
+{
+    // ThetaRange is (0., 180.). It was (0.28,179.72) 7/12/00 09:00
+    // Theta range given through pseudorapidity limits 22/6/2001
+
+    // Get settings from environment variables
+    ProcessEnvironmentVars();
+
+    // Set Random Number seed
+    gRandom->SetSeed(sseed);
+    cout<<"Seed for random number generation= "<<gRandom->GetSeed()<<endl; 
+
+
+   // libraries required by geant321 and Pythia: loaded in sim.C
+
+    new     TGeant3TGeo("C++ Interface to Geant3");
+
+  // Output every 100 tracks
+
+    TVirtualMC * vmc = TVirtualMC::GetMC();
+
+  ((TGeant3*)vmc)->SetSWIT(4,100);
+
+    AliRunLoader* rl=0x0;
+
+    AliLog::Message(AliLog::kInfo, "Creating Run Loader", "", "", "Config()"," ConfigPPR.C", __LINE__);
+
+    rl = AliRunLoader::Open("galice.root",
+                           AliConfig::GetDefaultEventFolderName(),
+                           "recreate");
+    if (rl == 0x0)
+      {
+       gAlice->Fatal("Config.C","Can not instatiate the Run Loader");
+       return;
+      }
+    rl->SetCompressionLevel(2);
+    rl->SetNumberOfEventsPerFile(100);
+    gAlice->SetRunLoader(rl);
+
+    // Set the trigger configuration
+    AliSimulation::Instance()->SetTriggerConfig(pprTrigConfName[strig]);
+    cout<<"Trigger configuration is set to  "<<pprTrigConfName[strig]<<endl;
+
+    //
+    // Set External decayer
+    AliDecayer *decayer = new AliDecayerPythia();
+
+
+    switch (srun) {
+    case kD0PbPb5500:
+      decayer->SetForceDecay(kHadronicD);
+      break;
+    case kCharmSemiElPbPb5500:
+      decayer->SetForceDecay(kSemiElectronic);
+      break;
+    case kBeautySemiElPbPb5500:
+      decayer->SetForceDecay(kSemiElectronic);
+      break;
+    default:
+      decayer->SetForceDecay(kAll);
+      break;
+    }
+    decayer->Init();
+    vmc->SetExternalDecayer(decayer);
+    //
+    //
+    //=======================================================================
+    //
+    //=======================================================================
+    // ************* STEERING parameters FOR ALICE SIMULATION **************
+    // --- Specify event type to be tracked through the ALICE setup
+    // --- All positions are in cm, angles in degrees, and P and E in GeV
+
+    vmc->SetProcess("DCAY",1);
+    vmc->SetProcess("PAIR",1);
+    vmc->SetProcess("COMP",1);
+    vmc->SetProcess("PHOT",1);
+    vmc->SetProcess("PFIS",0);
+    vmc->SetProcess("DRAY",0);
+    vmc->SetProcess("ANNI",1);
+    vmc->SetProcess("BREM",1);
+    vmc->SetProcess("MUNU",1);
+    vmc->SetProcess("CKOV",1);
+    vmc->SetProcess("HADR",1);
+    vmc->SetProcess("LOSS",2);
+    vmc->SetProcess("MULS",1);
+    vmc->SetProcess("RAYL",1);
+
+    Float_t cut = 1.e-3;        // 1MeV cut by default
+    Float_t tofmax = 1.e10;
+
+    vmc->SetCut("CUTGAM", cut);
+    vmc->SetCut("CUTELE", cut);
+    vmc->SetCut("CUTNEU", cut);
+    vmc->SetCut("CUTHAD", cut);
+    vmc->SetCut("CUTMUO", cut);
+    vmc->SetCut("BCUTE",  cut); 
+    vmc->SetCut("BCUTM",  cut); 
+    vmc->SetCut("DCUTE",  cut); 
+    vmc->SetCut("DCUTM",  cut); 
+    vmc->SetCut("PPCUTM", cut);
+    vmc->SetCut("TOFMAX", tofmax); 
+
+    // Generator Configuration
+    AliGenerator* gener = GeneratorFactory(srun);
+    gener->SetOrigin(0, 0, 0);    // vertex position
+    gener->SetSigma(0, 0, 5.3);   // Sigma in (X,Y,Z) (cm) on IP position
+    gener->SetCutVertexZ(1.);     // Truncate at 1 sigma
+    gener->SetVertexSmear(kPerEvent); 
+    gener->SetTrackingFlag(1);
+    gener->Init();
+    
+    if (smag == AliMagF::k2kG) {
+       comment = comment.Append(" | L3 field 0.2 T");
+    } else if (smag == AliMagF::k5kG) {
+       comment = comment.Append(" | L3 field 0.5 T");
+    }
+    
+    
+    if (srad == kGluonRadiation)
+    {
+       comment = comment.Append(" | Gluon Radiation On");
+       
+    } else {
+       comment = comment.Append(" | Gluon Radiation Off");
+    }
+
+    printf("\n \n Comment: %s \n \n", comment.Data());
+    
+    
+// Field
+    TGeoGlobalMagField::Instance()->SetField(new AliMagF("Maps","Maps", -1., -1., smag));
+
+    rl->CdGAFile();
+//
+    Int_t   iABSO   = 1;
+    Int_t   iDIPO   = 1;
+    Int_t   iFMD    = 1;
+    Int_t   iFRAME  = 1;
+    Int_t   iHALL   = 1;
+    Int_t   iITS    = 1;
+    Int_t   iMAG    = 1;
+    Int_t   iMUON   = 1;
+    Int_t   iPHOS   = 1;
+    Int_t   iPIPE   = 1;
+    Int_t   iPMD    = 1;
+    Int_t   iHMPID  = 1;
+    Int_t   iSHIL   = 1;
+    Int_t   iT0     = 1;
+    Int_t   iTOF    = 1;
+    Int_t   iTPC    = 1;
+    Int_t   iTRD    = 1;
+    Int_t   iZDC    = 1;
+    Int_t   iEMCAL  = 1;
+    Int_t   iVZERO  = 1;
+    Int_t   iACORDE = 1;
+    Int_t   iAD = 0;
+
+    //=================== Alice BODY parameters =============================
+    AliBODY *BODY = new AliBODY("BODY", "Alice envelop");
+
+
+    if (iMAG)
+    {
+        //=================== MAG parameters ============================
+        // --- Start with Magnet since detector layouts may be depending ---
+        // --- on the selected Magnet dimensions ---
+        AliMAG *MAG = new AliMAG("MAG", "Magnet");
+    }
+
+
+    if (iABSO)
+    {
+        //=================== ABSO parameters ============================
+        AliABSO *ABSO = new AliABSOv3("ABSO", "Muon Absorber");
+    }
+
+    if (iDIPO)
+    {
+        //=================== DIPO parameters ============================
+
+        AliDIPO *DIPO = new AliDIPOv3("DIPO", "Dipole version 3");
+    }
+
+    if (iHALL)
+    {
+        //=================== HALL parameters ============================
+
+        AliHALL *HALL = new AliHALLv3("HALL", "Alice Hall");
+    }
+
+
+    if (iFRAME)
+    {
+        //=================== FRAME parameters ============================
+
+        AliFRAMEv2 *FRAME = new AliFRAMEv2("FRAME", "Space Frame");
+       FRAME->SetHoles(1);
+    }
+
+    if (iSHIL)
+    {
+        //=================== SHIL parameters ============================
+
+        AliSHIL *SHIL = new AliSHILv3("SHIL", "Shielding Version 3");
+    }
+
+
+    if (iPIPE)
+    {
+        //=================== PIPE parameters ============================
+
+        AliPIPE *PIPE = new AliPIPEv3("PIPE", "Beam Pipe");
+    }
+    if (iITS)
+    {
+        //=================== ITS parameters ============================
+
+       AliITS *ITS  = new AliITSv11("ITS","ITS v11");
+    }
+
+    if (iTPC)
+    {
+      //============================ TPC parameters =====================
+        AliTPC *TPC = new AliTPCv2("TPC", "Default");
+    }
+
+
+    if (iTOF) {
+        //=================== TOF parameters ============================
+       AliTOF *TOF = new AliTOFv6T0("TOF", "normal TOF");
+    }
+
+
+    if (iHMPID)
+    {
+        //=================== HMPID parameters ===========================
+        AliHMPID *HMPID = new AliHMPIDv3("HMPID", "normal HMPID");
+
+    }
+
+
+    if (iZDC)
+    {
+        //=================== ZDC parameters ============================
+
+        AliZDC *ZDC = new AliZDCv4("ZDC", "normal ZDC");
+    }
+
+    if (iTRD)
+    {
+        //=================== TRD parameters ============================
+
+        AliTRD *TRD = new AliTRDv1("TRD", "TRD slow simulator");
+    }
+
+    if (iFMD)
+    {
+        //=================== FMD parameters ============================
+       AliFMD *FMD = new AliFMDv1("FMD", "normal FMD");
+   }
+
+    if (iMUON)
+    {
+        //=================== MUON parameters ===========================
+        // New MUONv1 version (geometry defined via builders)
+        AliMUON *MUON = new AliMUONv1("MUON", "default");
+    }
+    //=================== PHOS parameters ===========================
+
+    if (iPHOS)
+    {
+        AliPHOS *PHOS = new AliPHOSv1("PHOS", "IHEP");
+    }
+
+
+    if (iPMD)
+    {
+        //=================== PMD parameters ============================
+        AliPMD *PMD = new AliPMDv1("PMD", "normal PMD");
+    }
+
+    if (iT0)
+    {
+        //=================== T0 parameters ============================
+        AliT0 *T0 = new AliT0v1("T0", "T0 Detector");
+    }
+
+    if (iEMCAL)
+    {
+        //=================== EMCAL parameters ============================
+        AliEMCAL *EMCAL = new AliEMCALv2("EMCAL", "EMCAL_COMPLETEV1");
+    }
+
+     if (iACORDE)
+    {
+        //=================== ACORDE parameters ============================
+        AliACORDE *ACORDE = new AliACORDEv1("ACORDE", "normal ACORDE");
+    }
+
+     if (iVZERO)
+    {
+        //=================== VZERO parameters ============================
+        AliVZERO *VZERO = new AliVZEROv7("VZERO", "normal VZERO");
+    }
+      if (iAD)
+    {
+        //=================== AD parameters ============================
+        AliAD *AD = new AliADv1("AD", "normal AD test");
+       AD->SetADAToInstalled(kTRUE);
+       AD->SetADCToInstalled(kTRUE);
+    }
+        
+}
+
+Float_t EtaToTheta(Float_t arg){
+  return (180./TMath::Pi())*2.*atan(exp(-arg));
+}
+
+
+
+AliGenerator* GeneratorFactory(PprRun_t srun) {
+    Int_t isw = 3;
+    if (srad == kNoGluonRadiation) isw = 0;
+    
+
+    AliGenerator * gGener = 0x0;
+    switch (srun) {
+    case test50:
+      {
+       comment = comment.Append(":HIJINGparam test 50 particles");
+       AliGenHIJINGpara *gener = new AliGenHIJINGpara(50);
+       gener->SetMomentumRange(0, 999999.);
+       gener->SetPhiRange(0., 360.);
+       // Set pseudorapidity range from -8 to 8.
+       Float_t thmin = EtaToTheta(8);   // theta min. <---> eta max
+       Float_t thmax = EtaToTheta(-8);  // theta max. <---> eta min 
+       gener->SetThetaRange(thmin,thmax);
+       gGener=gener;
+      }
+      break;
+    case testdEdx:
+      {
+        // generator for the dEdx simulation study
+       gSystem->Getenv("TestdEdxNTracks");
+       Int_t ntracks =50;
+        if (gSystem->Getenv("TestdEdxNTracks")) ntracks= atoi(gSystem->Getenv("TestdEdxNTracks"));
+       comment = comment.Append(":HIJINGparam test N particles");
+       AliGenHIJINGpara *gener = new AliGenHIJINGpara(ntracks);
+       gener->SetMomentumRange(0, 999999.);
+       gener->SetPhiRange(0., 360.);
+       // Set pseudorapidity range from -8 to 8.
+       Float_t thmin = EtaToTheta(2);   // theta min. <---> eta max
+       Float_t thmax = EtaToTheta(-2);  // theta max. <---> eta min 
+       gener->SetThetaRange(thmin,thmax);
+       gGener=gener;
+      }
+      break;
+
+    case kParam_8000:
+      {
+       comment = comment.Append(":HIJINGparam N=8000");
+       AliGenHIJINGpara *gener = new AliGenHIJINGpara(86030);
+       gener->SetMomentumRange(0, 999999.);
+       gener->SetPhiRange(0., 360.);
+       // Set pseudorapidity range from -8 to 8.
+       Float_t thmin = EtaToTheta(8);   // theta min. <---> eta max
+       Float_t thmax = EtaToTheta(-8);  // theta max. <---> eta min 
+       gener->SetThetaRange(thmin,thmax);
+       gGener=gener;
+      }
+      break;
+    case kParam_4000:
+      {
+       comment = comment.Append("HIJINGparam N=4000");
+       AliGenHIJINGpara *gener = new AliGenHIJINGpara(43015);
+       gener->SetMomentumRange(0, 999999.);
+       gener->SetPhiRange(0., 360.);
+       // Set pseudorapidity range from -8 to 8.
+       Float_t thmin = EtaToTheta(8);   // theta min. <---> eta max
+       Float_t thmax = EtaToTheta(-8);  // theta max. <---> eta min 
+       gener->SetThetaRange(thmin,thmax);
+       gGener=gener;
+      }
+       break;
+    case kParam_2000:
+      {
+       comment = comment.Append("HIJINGparam N=2000");
+       AliGenHIJINGpara *gener = new AliGenHIJINGpara(21507);
+       gener->SetMomentumRange(0, 999999.);
+       gener->SetPhiRange(0., 360.);
+       // Set pseudorapidity range from -8 to 8.
+       Float_t thmin = EtaToTheta(8);   // theta min. <---> eta max
+       Float_t thmax = EtaToTheta(-8);  // theta max. <---> eta min 
+       gener->SetThetaRange(thmin,thmax);
+       gGener=gener;
+      }
+      break;
+//
+//  Hijing Central
+//
+    case kHijing_cent1:
+      {
+       comment = comment.Append("HIJING cent1");
+       AliGenHijing *gener = HijingStandard();
+// impact parameter range
+       gener->SetImpactParameterRange(0., 5.);
+       gGener=gener;
+      }
+      break;
+    case kHijing_cent2:
+      {
+       comment = comment.Append("HIJING cent2");
+       AliGenHijing *gener = HijingStandard();
+// impact parameter range
+       gener->SetImpactParameterRange(0., 2.);
+       gGener=gener;
+      }
+      break;
+//
+// Hijing Peripheral 
+//
+    case kHijing_per1:
+      {
+       comment = comment.Append("HIJING per1");
+       AliGenHijing *gener = HijingStandard();
+// impact parameter range
+       gener->SetImpactParameterRange(5., 8.6);
+       gGener=gener;
+      }
+      break;
+    case kHijing_per2:
+      {
+       comment = comment.Append("HIJING per2");
+       AliGenHijing *gener = HijingStandard();
+// impact parameter range
+       gener->SetImpactParameterRange(8.6, 11.2);
+       gGener=gener;
+      }
+      break;
+    case kHijing_per3:
+      {
+       comment = comment.Append("HIJING per3");
+       AliGenHijing *gener = HijingStandard();
+// impact parameter range
+       gener->SetImpactParameterRange(11.2, 13.2);
+       gGener=gener;
+      }
+      break;
+    case kHijing_per4:
+      {
+       comment = comment.Append("HIJING per4");
+       AliGenHijing *gener = HijingStandard();
+// impact parameter range
+       gener->SetImpactParameterRange(13.2, 15.);
+       gGener=gener;
+      }
+      break;
+    case kHijing_per5:
+      {
+       comment = comment.Append("HIJING per5");
+       AliGenHijing *gener = HijingStandard();
+// impact parameter range
+       gener->SetImpactParameterRange(15., 100.);
+       gGener=gener;
+      }
+      break;
+//
+//  Jet-Jet
+//
+    case kHijing_jj25:
+      {
+       comment = comment.Append("HIJING Jet 25 GeV");
+       AliGenHijing *gener = HijingStandard();
+// impact parameter range
+       gener->SetImpactParameterRange(0., 5.);
+       // trigger
+       gener->SetTrigger(1);
+       gener->SetPtJet(25.);
+       gener->SetRadiation(isw);
+       gener->SetSimpleJets(!isw);
+       gener->SetJetEtaRange(-0.3,0.3);
+       gener->SetJetPhiRange(75., 165.);   
+       gGener=gener;
+      }
+      break;
+
+    case kHijing_jj50:
+      {
+       comment = comment.Append("HIJING Jet 50 GeV");
+       AliGenHijing *gener = HijingStandard();
+// impact parameter range
+       gener->SetImpactParameterRange(0., 5.);
+       // trigger
+       gener->SetTrigger(1);
+       gener->SetPtJet(50.);
+       gener->SetRadiation(isw);
+       gener->SetSimpleJets(!isw);
+       gener->SetJetEtaRange(-0.3,0.3);
+       gener->SetJetPhiRange(75., 165.);   
+       gGener=gener;
+      }
+       break;
+
+    case kHijing_jj75:
+      {
+       comment = comment.Append("HIJING Jet 75 GeV");
+       AliGenHijing *gener = HijingStandard();
+// impact parameter range
+       gener->SetImpactParameterRange(0., 5.);
+       // trigger
+       gener->SetTrigger(1);
+       gener->SetPtJet(75.);
+       gener->SetRadiation(isw);
+       gener->SetSimpleJets(!isw);
+       gener->SetJetEtaRange(-0.3,0.3);
+       gener->SetJetPhiRange(75., 165.);   
+       gGener=gener;
+      }
+      break;
+
+    case kHijing_jj100:
+      {
+       comment = comment.Append("HIJING Jet 100 GeV");
+       AliGenHijing *gener = HijingStandard();
+// impact parameter range
+       gener->SetImpactParameterRange(0., 5.);
+       // trigger
+       gener->SetTrigger(1);
+       gener->SetPtJet(100.);
+       gener->SetRadiation(isw);
+       gener->SetSimpleJets(!isw);
+       gener->SetJetEtaRange(-0.3,0.3);
+       gener->SetJetPhiRange(75., 165.);   
+       gGener=gener;
+      }
+      break;
+
+    case kHijing_jj200:
+      {
+       comment = comment.Append("HIJING Jet 200 GeV");
+       AliGenHijing *gener = HijingStandard();
+// impact parameter range
+       gener->SetImpactParameterRange(0., 5.);
+       // trigger
+       gener->SetTrigger(1);
+       gener->SetPtJet(200.);
+       gener->SetRadiation(isw);
+       gener->SetSimpleJets(!isw);
+       gener->SetJetEtaRange(-0.3,0.3);
+       gener->SetJetPhiRange(75., 165.);   
+       gGener=gener;
+      }
+      break;
+//
+// Gamma-Jet
+//
+    case kHijing_gj25:
+      {
+       comment = comment.Append("HIJING Gamma 25 GeV");
+       AliGenHijing *gener = HijingStandard();
+// impact parameter range
+       gener->SetImpactParameterRange(0., 5.);
+       // trigger
+       gener->SetTrigger(2);
+       gener->SetPtJet(25.);
+       gener->SetRadiation(isw);
+       gener->SetSimpleJets(!isw);
+       gener->SetJetEtaRange(-0.12, 0.12);
+        gener->SetJetPhiRange(220., 320.);
+       gGener=gener;
+      }
+      break;
+
+    case kHijing_gj50:
+      {
+       comment = comment.Append("HIJING Gamma 50 GeV");
+       AliGenHijing *gener = HijingStandard();
+// impact parameter range
+       gener->SetImpactParameterRange(0., 5.);
+       // trigger
+       gener->SetTrigger(2);
+       gener->SetPtJet(50.);
+       gener->SetRadiation(isw);
+       gener->SetSimpleJets(!isw);
+       gener->SetJetEtaRange(-0.12, 0.12);
+        gener->SetJetPhiRange(220., 320.);
+       gGener=gener;
+      }
+      break;
+
+    case kHijing_gj75:
+      {
+       comment = comment.Append("HIJING Gamma 75 GeV");
+       AliGenHijing *gener = HijingStandard();
+// impact parameter range
+       gener->SetImpactParameterRange(0., 5.);
+       // trigger
+       gener->SetTrigger(2);
+       gener->SetPtJet(75.);
+       gener->SetRadiation(isw);
+       gener->SetSimpleJets(!isw);
+       gener->SetJetEtaRange(-0.12, 0.12);
+        gener->SetJetPhiRange(220., 320.);
+       gGener=gener;
+      }
+      break;
+
+    case kHijing_gj100:
+      {
+       comment = comment.Append("HIJING Gamma 100 GeV");
+       AliGenHijing *gener = HijingStandard();
+// impact parameter range
+       gener->SetImpactParameterRange(0., 5.);
+       // trigger
+       gener->SetTrigger(2);
+       gener->SetPtJet(100.);
+       gener->SetRadiation(isw);
+       gener->SetSimpleJets(!isw);
+       gener->SetJetEtaRange(-0.12, 0.12);
+        gener->SetJetPhiRange(220., 320.);
+       gGener=gener;
+      }
+      break;
+
+    case kHijing_gj200:
+      {
+       comment = comment.Append("HIJING Gamma 200 GeV");
+       AliGenHijing *gener = HijingStandard();
+// impact parameter range
+       gener->SetImpactParameterRange(0., 5.);
+       // trigger
+       gener->SetTrigger(2);
+       gener->SetPtJet(200.);
+       gener->SetRadiation(isw);
+       gener->SetSimpleJets(!isw);
+       gener->SetJetEtaRange(-0.12, 0.12);
+        gener->SetJetPhiRange(220., 320.);
+       gGener=gener;
+      }
+      break;
+    case kHijing_pA:
+      {
+       comment = comment.Append("HIJING pA");
+
+       AliGenCocktail *gener  = new AliGenCocktail();
+
+       AliGenHijing   *hijing = new AliGenHijing(-1);
+// centre of mass energy 
+       hijing->SetEnergyCMS(TMath::Sqrt(82./208.) * 14000.);
+// impact parameter range
+       hijing->SetImpactParameterRange(0., 15.);
+// reference frame
+       hijing->SetReferenceFrame("CMS");
+       hijing->SetBoostLHC(1);
+// projectile
+       hijing->SetProjectile("P", 1, 1);
+       hijing->SetTarget    ("A", 208, 82);
+// tell hijing to keep the full parent child chain
+       hijing->KeepFullEvent();
+// enable jet quenching
+       hijing->SetJetQuenching(0);
+// enable shadowing
+       hijing->SetShadowing(1);
+// Don't track spectators
+       hijing->SetSpectators(0);
+// kinematic selection
+       hijing->SetSelectAll(0);
+//
+       AliGenSlowNucleons*  gray    = new AliGenSlowNucleons(1);
+       AliSlowNucleonModel* model   = new AliSlowNucleonModelExp();
+       gray->SetSlowNucleonModel(model);
+       gray->SetDebug(1);
+       gener->AddGenerator(hijing,"Hijing pPb", 1);
+       gener->AddGenerator(gray,  "Gray Particles",1);
+       gGener=gener;
+      }
+      break;
+      case kPythia6:
+      {
+        comment = comment.Append(":Pythia p-p @ 14 TeV");
+        AliGenPythia *gener = new AliGenPythia(-1); 
+        gener->SetMomentumRange(0,999999);
+        gener->SetThetaRange(0., 180.);
+        gener->SetYRange(-12,12);
+        gener->SetPtRange(0,1000);
+        gener->SetProcess(kPyMb);
+        gener->SetEnergyCMS(14000.);
+        gener->SetProjectile("p", 1, 1) ; 
+        gener->SetTarget("p", 1, 1) ; 
+        gGener=gener;
+      }
+        break;
+      case kPythia6Jets20_24:
+      {
+        comment = comment.Append(":Pythia jets 20-24 GeV @ 5.5 TeV");
+        AliGenPythia * gener = new AliGenPythia(-1);
+        gener->SetEnergyCMS(5500.);//        Centre of mass energy
+        gener->SetProcess(kPyJets);//        Process type
+        gener->SetJetEtaRange(-0.5, 0.5);//  Final state kinematic cuts
+        gener->SetJetPhiRange(0., 360.);
+        gener->SetJetEtRange(10., 1000.);
+        gener->SetGluonRadiation(1,1);
+        //    gener->SetPtKick(0.);
+        //   Structure function
+        gener->SetStrucFunc(kCTEQ4L);
+        gener->SetPtHard(20., 24.);// Pt transfer of the hard scattering
+        gener->SetPycellParameters(2., 274, 432, 0., 4., 5., 1.0);
+        gener->SetForceDecay(kAll);//  Decay type (semielectronic, etc.)
+        gener->SetProjectile("p", 1, 1) ; 
+        gener->SetTarget("p", 1, 1) ; 
+        gGener=gener;
+      }
+        break;
+      case kPythia6Jets24_29:
+      {
+        comment = comment.Append(":Pythia jets 24-29 GeV @ 5.5 TeV");
+        AliGenPythia * gener = new AliGenPythia(-1);
+        gener->SetEnergyCMS(5500.);//        Centre of mass energy
+        gener->SetProcess(kPyJets);//        Process type
+        gener->SetJetEtaRange(-0.5, 0.5);//  Final state kinematic cuts
+        gener->SetJetPhiRange(0., 360.);
+        gener->SetJetEtRange(10., 1000.);
+        gener->SetGluonRadiation(1,1);
+        //    gener->SetPtKick(0.);
+        //   Structure function
+        gener->SetStrucFunc(kCTEQ4L);
+        gener->SetPtHard(24., 29.);// Pt transfer of the hard scattering
+        gener->SetPycellParameters(2., 274, 432, 0., 4., 5., 1.0);
+        gener->SetForceDecay(kAll);//  Decay type (semielectronic, etc.)
+        gener->SetProjectile("p", 1, 1) ; 
+        gener->SetTarget("p", 1, 1) ; 
+        gGener=gener;
+      }
+        break;
+      case kPythia6Jets29_35:
+      {
+        comment = comment.Append(":Pythia jets 29-35 GeV @ 5.5 TeV");
+        AliGenPythia * gener = new AliGenPythia(-1);
+        gener->SetEnergyCMS(5500.);//        Centre of mass energy
+        gener->SetProcess(kPyJets);//        Process type
+        gener->SetJetEtaRange(-0.5, 0.5);//  Final state kinematic cuts
+        gener->SetJetPhiRange(0., 360.);
+        gener->SetJetEtRange(10., 1000.);
+        gener->SetGluonRadiation(1,1);
+        //    gener->SetPtKick(0.);
+        //   Structure function
+        gener->SetStrucFunc(kCTEQ4L);
+        gener->SetPtHard(29., 35.);// Pt transfer of the hard scattering
+        gener->SetPycellParameters(2., 274, 432, 0., 4., 5., 1.0);
+        gener->SetForceDecay(kAll);//  Decay type (semielectronic, etc.)
+        gener->SetProjectile("p", 1, 1) ; 
+        gener->SetTarget("p", 1, 1) ; 
+        gGener=gener;
+      }
+        break;
+      case kPythia6Jets35_42:
+      {
+        comment = comment.Append(":Pythia jets 35-42 GeV @ 5.5 TeV");
+        AliGenPythia * gener = new AliGenPythia(-1);
+        gener->SetEnergyCMS(5500.);//        Centre of mass energy
+        gener->SetProcess(kPyJets);//        Process type
+        gener->SetJetEtaRange(-0.5, 0.5);//  Final state kinematic cuts
+        gener->SetJetPhiRange(0., 360.);
+        gener->SetJetEtRange(10., 1000.);
+        gener->SetGluonRadiation(1,1);
+        //    gener->SetPtKick(0.);
+        //   Structure function
+        gener->SetStrucFunc(kCTEQ4L);
+        gener->SetPtHard(35., 42.);// Pt transfer of the hard scattering
+        gener->SetPycellParameters(2., 274, 432, 0., 4., 5., 1.0);
+        gener->SetForceDecay(kAll);//  Decay type (semielectronic, etc.)
+        gener->SetProjectile("p", 1, 1) ; 
+        gener->SetTarget("p", 1, 1) ; 
+        gGener=gener;
+      }
+        break;
+      case kPythia6Jets42_50:
+      {
+        comment = comment.Append(":Pythia jets 42-50 GeV @ 5.5 TeV");
+        AliGenPythia * gener = new AliGenPythia(-1);
+        gener->SetEnergyCMS(5500.);//        Centre of mass energy
+        gener->SetProcess(kPyJets);//        Process type
+        gener->SetJetEtaRange(-0.5, 0.5);//  Final state kinematic cuts
+        gener->SetJetPhiRange(0., 360.);
+        gener->SetJetEtRange(10., 1000.);
+        gener->SetGluonRadiation(1,1);
+        //    gener->SetPtKick(0.);
+        //   Structure function
+        gener->SetStrucFunc(kCTEQ4L);
+        gener->SetPtHard(42., 50.);// Pt transfer of the hard scattering
+        gener->SetPycellParameters(2., 274, 432, 0., 4., 5., 1.0);
+        gener->SetForceDecay(kAll);//  Decay type (semielectronic, etc.)
+        gener->SetProjectile("p", 1, 1) ; 
+        gener->SetTarget("p", 1, 1) ; 
+        gGener=gener;
+      }
+      break;
+      case kPythia6Jets50_60:
+      {
+        comment = comment.Append(":Pythia jets 50-60 GeV @ 5.5 TeV");
+        AliGenPythia * gener = new AliGenPythia(-1);
+        gener->SetEnergyCMS(5500.);//        Centre of mass energy
+        gener->SetProcess(kPyJets);//        Process type
+        gener->SetJetEtaRange(-0.5, 0.5);//  Final state kinematic cuts
+        gener->SetJetPhiRange(0., 360.);
+        gener->SetJetEtRange(10., 1000.);
+        gener->SetGluonRadiation(1,1);
+        //    gener->SetPtKick(0.);
+        //   Structure function
+        gener->SetStrucFunc(kCTEQ4L);
+        gener->SetPtHard(50., 60.);// Pt transfer of the hard scattering
+        gener->SetPycellParameters(2., 274, 432, 0., 4., 5., 1.0);
+        gener->SetForceDecay(kAll);//  Decay type (semielectronic, etc.)
+        gGener=gener;
+      }
+        break;
+      case kPythia6Jets60_72:
+      {
+        comment = comment.Append(":Pythia jets 60-72 GeV @ 5.5 TeV");
+        AliGenPythia * gener = new AliGenPythia(-1);
+        gener->SetEnergyCMS(5500.);//        Centre of mass energy
+        gener->SetProcess(kPyJets);//        Process type
+        gener->SetJetEtaRange(-0.5, 0.5);//  Final state kinematic cuts
+        gener->SetJetPhiRange(0., 360.);
+        gener->SetJetEtRange(10., 1000.);
+        gener->SetGluonRadiation(1,1);
+        //    gener->SetPtKick(0.);
+        //   Structure function
+        gener->SetStrucFunc(kCTEQ4L);
+        gener->SetPtHard(60., 72.);// Pt transfer of the hard scattering
+        gener->SetPycellParameters(2., 274, 432, 0., 4., 5., 1.0);
+        gener->SetForceDecay(kAll);//  Decay type (semielectronic, etc.)
+        gener->SetProjectile("p", 1, 1) ; 
+        gener->SetTarget("p", 1, 1) ; 
+        gGener=gener;
+      }
+        break;
+      case kPythia6Jets72_86:
+      {
+        comment = comment.Append(":Pythia jets 72-86 GeV @ 5.5 TeV");
+        AliGenPythia * gener = new AliGenPythia(-1);
+        gener->SetEnergyCMS(5500.);//        Centre of mass energy
+        gener->SetProcess(kPyJets);//        Process type
+        gener->SetJetEtaRange(-0.5, 0.5);//  Final state kinematic cuts
+        gener->SetJetPhiRange(0., 360.);
+        gener->SetJetEtRange(10., 1000.);
+        gener->SetGluonRadiation(1,1);
+        //    gener->SetPtKick(0.);
+        //   Structure function
+        gener->SetStrucFunc(kCTEQ4L);
+        gener->SetPtHard(72., 86.);// Pt transfer of the hard scattering
+        gener->SetPycellParameters(2., 274, 432, 0., 4., 5., 1.0);
+        gener->SetForceDecay(kAll);//  Decay type (semielectronic, etc.)
+        gener->SetProjectile("p", 1, 1) ; 
+        gener->SetTarget("p", 1, 1) ; 
+        gGener=gener;
+      }
+      break;
+      case kPythia6Jets86_104:
+      {
+        comment = comment.Append(":Pythia jets 86-104 GeV @ 5.5 TeV");
+        AliGenPythia * gener = new AliGenPythia(-1);
+        gener->SetEnergyCMS(5500.);//        Centre of mass energy
+        gener->SetProcess(kPyJets);//        Process type
+        gener->SetJetEtaRange(-0.5, 0.5);//  Final state kinematic cuts
+        gener->SetJetPhiRange(0., 360.);
+        gener->SetJetEtRange(10., 1000.);
+        gener->SetGluonRadiation(1,1);
+        //    gener->SetPtKick(0.);
+        //   Structure function
+        gener->SetStrucFunc(kCTEQ4L);
+        gener->SetPtHard(86., 104.);// Pt transfer of the hard scattering
+        gener->SetPycellParameters(2., 274, 432, 0., 4., 5., 1.0);
+        gener->SetForceDecay(kAll);//  Decay type (semielectronic, etc.)
+        gener->SetProjectile("p", 1, 1) ; 
+        gener->SetTarget("p", 1, 1) ; 
+        gGener=gener;
+      }
+      break;
+    case kPythia6Jets104_125:
+      {
+        comment = comment.Append(":Pythia jets 105-125 GeV @ 5.5 TeV");
+        AliGenPythia * gener = new AliGenPythia(-1);
+        gener->SetEnergyCMS(5500.);//        Centre of mass energy
+        gener->SetProcess(kPyJets);//        Process type
+        gener->SetJetEtaRange(-0.5, 0.5);//  Final state kinematic cuts
+        gener->SetJetPhiRange(0., 360.);
+        gener->SetJetEtRange(10., 1000.);
+        gener->SetGluonRadiation(1,1);
+        //    gener->SetPtKick(0.);
+        //   Structure function
+        gener->SetStrucFunc(kCTEQ4L);
+        gener->SetPtHard(104., 125.);// Pt transfer of the hard scattering
+        gener->SetPycellParameters(2., 274, 432, 0., 4., 5., 1.0);
+        gener->SetForceDecay(kAll);//  Decay type (semielectronic, etc.)
+        gener->SetProjectile("p", 1, 1) ; 
+        gener->SetTarget("p", 1, 1) ; 
+        gGener=gener;
+      }
+        break;
+      case kPythia6Jets125_150:
+      {
+        comment = comment.Append(":Pythia jets 125-150 GeV @ 5.5 TeV");
+        AliGenPythia * gener = new AliGenPythia(-1);
+        gener->SetEnergyCMS(5500.);//        Centre of mass energy
+        gener->SetProcess(kPyJets);//        Process type
+        gener->SetJetEtaRange(-0.5, 0.5);//  Final state kinematic cuts
+        gener->SetJetPhiRange(0., 360.);
+        gener->SetJetEtRange(10., 1000.);
+        gener->SetGluonRadiation(1,1);
+        //    gener->SetPtKick(0.);
+        //   Structure function
+        gener->SetStrucFunc(kCTEQ4L);
+        gener->SetPtHard(125., 150.);// Pt transfer of the hard scattering
+        gener->SetPycellParameters(2., 274, 432, 0., 4., 5., 1.0);
+        gener->SetForceDecay(kAll);//  Decay type (semielectronic, etc.)
+        gGener=gener;
+      }
+        break;
+      case kPythia6Jets150_180:
+      {
+        comment = comment.Append(":Pythia jets 150-180 GeV @ 5.5 TeV");
+        AliGenPythia * gener = new AliGenPythia(-1);
+        gener->SetEnergyCMS(5500.);//        Centre of mass energy
+        gener->SetProcess(kPyJets);//        Process type
+        gener->SetJetEtaRange(-0.5, 0.5);//  Final state kinematic cuts
+        gener->SetJetPhiRange(0., 360.);
+        gener->SetJetEtRange(10., 1000.);
+        gener->SetGluonRadiation(1,1);
+        //    gener->SetPtKick(0.);
+        //   Structure function
+        gener->SetStrucFunc(kCTEQ4L);
+        gener->SetPtHard(150., 180.);// Pt transfer of the hard scattering
+        gener->SetPycellParameters(2., 274, 432, 0., 4., 5., 1.0);
+        gener->SetForceDecay(kAll);//  Decay type (semielectronic, etc.)
+        gener->SetProjectile("p", 1, 1) ; 
+        gener->SetTarget("p", 1, 1) ; 
+        gGener=gener;
+      }
+      break;
+      case kD0PbPb5500:
+      {
+        comment = comment.Append(" D0 in Pb-Pb at 5.5 TeV");
+        AliGenPythia * gener = new AliGenPythia(10);
+        gener->SetProcess(kPyD0PbPbMNR);
+        gener->SetStrucFunc(kCTEQ4L);
+        gener->SetPtHard(2.1,-1.0);
+        gener->SetEnergyCMS(5500.);
+        gener->SetNuclei(208,208);
+        gener->SetForceDecay(kHadronicD);
+        gener->SetYRange(-2,2);
+        gener->SetFeedDownHigherFamily(kFALSE);
+        gener->SetStackFillOpt(AliGenPythia::kParentSelection);
+        gener->SetCountMode(AliGenPythia::kCountParents);
+        gener->SetProjectile("A", 208, 82) ; 
+        gener->SetTarget("A", 208, 82) ; 
+        gGener=gener;
+      }
+      break;
+    case kCharmSemiElPbPb5500:
+      {
+        comment = comment.Append(" Charm in Pb-Pb at 5.5 TeV");
+        AliGenPythia * gener = new AliGenPythia(10);
+        gener->SetProcess(kPyCharmPbPbMNR);
+        gener->SetStrucFunc(kCTEQ4L);
+        gener->SetPtHard(2.1,-1.0);
+        gener->SetEnergyCMS(5500.);
+        gener->SetNuclei(208,208);
+        gener->SetForceDecay(kSemiElectronic);
+        gener->SetYRange(-2,2);
+        gener->SetFeedDownHigherFamily(kFALSE);
+        gener->SetCountMode(AliGenPythia::kCountParents);
+        gener->SetProjectile("A", 208, 82) ; 
+        gener->SetTarget("A", 208, 82) ; 
+        gGener=gener;
+      }
+      break;
+      case kBeautySemiElPbPb5500:
+      {
+        comment = comment.Append(" Beauty in Pb-Pb at 5.5 TeV");
+        AliGenPythia *gener = new AliGenPythia(10);
+        gener->SetProcess(kPyBeautyPbPbMNR);
+        gener->SetStrucFunc(kCTEQ4L);
+        gener->SetPtHard(2.75,-1.0);
+        gener->SetEnergyCMS(5500.);
+        gener->SetNuclei(208,208);
+        gener->SetForceDecay(kSemiElectronic);
+        gener->SetYRange(-2,2);
+        gener->SetFeedDownHigherFamily(kFALSE);
+        gener->SetCountMode(AliGenPythia::kCountParents);
+        gener->SetProjectile("A", 208, 82) ; 
+        gener->SetTarget("A", 208, 82) ; 
+        gGener=gener;
+      }
+        break;
+      case kCocktailTRD:
+      {
+        comment = comment.Append(" Cocktail for TRD at 5.5 TeV");
+        AliGenCocktail *gener  = new AliGenCocktail();
+        
+        AliGenParam *phi = new AliGenParam(10,
+                                           new AliGenMUONlib(),
+                                           AliGenMUONlib::kPhi,
+                                           "Vogt PbPb");
+        
+        phi->SetPtRange(0, 100);
+        phi->SetYRange(-1., +1.);
+        phi->SetForceDecay(kDiElectron);
+        
+        AliGenParam *omega = new AliGenParam(10,
+                                             new AliGenMUONlib(),
+                                             AliGenMUONlib::kOmega,
+                                             "Vogt PbPb");
+        
+        omega->SetPtRange(0, 100);
+        omega->SetYRange(-1., +1.);
+        omega->SetForceDecay(kDiElectron);
+        
+        AliGenParam *jpsi = new AliGenParam(10,
+                                            new AliGenMUONlib(),
+                                            AliGenMUONlib::kJpsiFamily,
+                                            "Vogt PbPb");
+        
+        jpsi->SetPtRange(0, 100);
+        jpsi->SetYRange(-1., +1.);
+        jpsi->SetForceDecay(kDiElectron);
+        
+        AliGenParam *ups = new AliGenParam(10,
+                                           new AliGenMUONlib(),
+                                           AliGenMUONlib::kUpsilonFamily,
+                                           "Vogt PbPb");
+        ups->SetPtRange(0, 100);
+        ups->SetYRange(-1., +1.);
+        ups->SetForceDecay(kDiElectron);
+        
+        AliGenParam *charm = new AliGenParam(10,
+                                             new AliGenMUONlib(), 
+                                             AliGenMUONlib::kCharm,
+                                             "central");
+        charm->SetPtRange(0, 100);
+        charm->SetYRange(-1.5, +1.5);
+        charm->SetForceDecay(kSemiElectronic);
+        
+        
+        AliGenParam *beauty = new AliGenParam(10,
+                                              new AliGenMUONlib(), 
+                                              AliGenMUONlib::kBeauty,
+                                              "central");
+        beauty->SetPtRange(0, 100);
+        beauty->SetYRange(-1.5, +1.5);
+        beauty->SetForceDecay(kSemiElectronic);
+        
+        AliGenParam *beautyJ = new AliGenParam(10,
+                                               new AliGenMUONlib(), 
+                                               AliGenMUONlib::kBeauty,
+                                               "central");
+        beautyJ->SetPtRange(0, 100);
+        beautyJ->SetYRange(-1.5, +1.5);
+        beautyJ->SetForceDecay(kBJpsiDiElectron);
+        
+        gener->AddGenerator(phi,"Phi",1);
+        gener->AddGenerator(omega,"Omega",1);
+        gener->AddGenerator(jpsi,"J/psi",1);
+        gener->AddGenerator(ups,"Upsilon",1);
+        gener->AddGenerator(charm,"Charm",1);
+        gener->AddGenerator(beauty,"Beauty",1);
+        gener->AddGenerator(beautyJ,"J/Psi from Beauty",1);
+        gener->SetProjectile("A", 208, 82) ; 
+        gener->SetTarget("A", 208, 82) ; 
+        gGener=gener;
+      }
+      break;
+    case kPyJJ:
+      {
+        comment = comment.Append(" Jet-jet at 5.5 TeV");
+        AliGenPythia *gener = new AliGenPythia(-1);
+        gener->SetEnergyCMS(5500.);
+        gener->SetProcess(kPyJets);
+        Double_t ptHardMin=10.0, ptHardMax=-1.0;
+        gener->SetPtHard(ptHardMin,ptHardMax);
+        gener->SetYHard(-0.7,0.7);
+        gener->SetJetEtaRange(-0.2,0.2);
+        gener->SetEventListRange(0,1);
+        gener->SetProjectile("p", 1, 1) ; 
+        gener->SetTarget("p", 1, 1) ; 
+        gGener=gener;
+      }
+        break;
+      case kPyGJ:
+      {
+        comment = comment.Append(" Gamma-jet at 5.5 TeV");
+        AliGenPythia *gener = new AliGenPythia(-1);
+        gener->SetEnergyCMS(5500.);
+        gener->SetProcess(kPyDirectGamma);
+        Double_t ptHardMin=10.0, ptHardMax=-1.0;
+        gener->SetPtHard(ptHardMin,ptHardMax);
+        gener->SetYHard(-1.0,1.0);
+        gener->SetGammaEtaRange(-0.13,0.13);
+        gener->SetGammaPhiRange(210.,330.);
+        gener->SetEventListRange(0,1);
+        gener->SetProjectile("p", 1, 1) ; 
+        gener->SetTarget("p", 1, 1) ; 
+        gGener=gener;
+      }
+        break;
+      case kMuonCocktailCent1:
+      {
+        comment = comment.Append(" Muon Cocktail Cent1");
+        AliGenMUONCocktail * gener = new AliGenMUONCocktail();
+        gener->SetPtRange(0.4,100.);       // Transverse momentum range   
+        gener->SetPhiRange(0.,360.);    // Azimuthal angle range  
+        gener->SetYRange(-4.0,-2.4);
+        gener->SetMuonPtCut(0.8);
+        gener->SetMuonThetaCut(171.,178.);
+        gener->SetMuonMultiplicity(2);
+        gener->SetImpactParameterRange(0.,5.);  //Centrality class Cent1 for PDC04
+        gGener=gener;
+        gener->SetProjectile("A", 208, 82) ; 
+        gener->SetTarget("A", 208, 82) ; 
+      }
+        break;
+      case kMuonCocktailPer1:
+      {
+        comment = comment.Append(" Muon Cocktail Per1");
+        AliGenMUONCocktail * gener = new AliGenMUONCocktail();
+        gener->SetPtRange(0.0,100.);       // Transverse momentum range   
+        gener->SetPhiRange(0.,360.);    // Azimuthal angle range  
+        gener->SetYRange(-4.0,-2.4);
+        gener->SetMuonPtCut(0.8);
+        gener->SetMuonThetaCut(171.,178.);
+        gener->SetMuonMultiplicity(2);
+        gener->SetImpactParameterRange(5.,8.6);//Centrality class Per1 for PDC04
+        gener->SetProjectile("A", 208, 82) ; 
+        gener->SetTarget("A", 208, 82) ; 
+        gGener=gener;
+      }
+      break;
+    case kMuonCocktailPer4:
+      {
+        comment = comment.Append(" Muon Cocktail Per4");
+        AliGenMUONCocktail * gener = new AliGenMUONCocktail();
+        gener->SetPtRange(0.0,100.);       // Transverse momentum range   
+        gener->SetPhiRange(0.,360.);    // Azimuthal angle range  
+        gener->SetYRange(-4.0,-2.4);
+        gener->SetMuonPtCut(0.8);
+        gener->SetMuonThetaCut(171.,178.);
+        gener->SetMuonMultiplicity(2);
+        gener->SetImpactParameterRange(13.2,15.0);//Centrality class Per4 for PDC04
+        gener->SetProjectile("A", 208, 82) ; 
+        gener->SetTarget("A", 208, 82) ; 
+        gGener=gener;
+      }
+        break;
+      case kMuonCocktailCent1HighPt:
+      {
+        comment = comment.Append(" Muon Cocktail HighPt Cent1");
+        AliGenMUONCocktail * gener = new AliGenMUONCocktail();
+        gener->SetPtRange(0.0,100.);       // Transverse momentum range   
+        gener->SetPhiRange(0.,360.);    // Azimuthal angle range  
+        gener->SetYRange(-4.0,-2.4);
+        gener->SetMuonPtCut(2.5);
+        gener->SetMuonThetaCut(171.,178.);
+        gener->SetMuonMultiplicity(2);
+        gener->SetImpactParameterRange(0.,5.);  //Centrality class Cent1 for PDC04
+        gener->SetProjectile("A", 208, 82) ; 
+        gener->SetTarget("A", 208, 82) ; 
+       gGener=gener;
+      }
+        break;
+      case kMuonCocktailPer1HighPt :
+      {
+        comment = comment.Append(" Muon Cocktail HighPt Per1");
+        AliGenMUONCocktail * gener = new AliGenMUONCocktail();
+        gener->SetPtRange(0.0,100.);       // Transverse momentum range   
+        gener->SetPhiRange(0.,360.);    // Azimuthal angle range  
+        gener->SetYRange(-4.0,-2.4);
+        gener->SetMuonPtCut(2.5);
+        gener->SetMuonThetaCut(171.,178.);
+        gener->SetMuonMultiplicity(2);
+        gener->SetImpactParameterRange(5.,8.6);//Centrality class Per1 for PDC04
+        gener->SetProjectile("A", 208, 82) ; 
+        gener->SetTarget("A", 208, 82) ; 
+        gGener=gener;
+      }
+        break;
+      case kMuonCocktailPer4HighPt:
+      {
+        comment = comment.Append(" Muon Cocktail HighPt Per4");
+        AliGenMUONCocktail * gener = new AliGenMUONCocktail();
+        gener->SetPtRange(0.0,100.);       // Transverse momentum range   
+        gener->SetPhiRange(0.,360.);    // Azimuthal angle range  
+        gener->SetYRange(-4.0,-2.4);
+        gener->SetMuonPtCut(2.5);
+        gener->SetMuonThetaCut(171.,178.);
+        gener->SetMuonMultiplicity(2);
+        gener->SetImpactParameterRange(13.2,15.0);//Centrality class Per4 for PDC04
+        gener->SetProjectile("A", 208, 82) ; 
+        gener->SetTarget("A", 208, 82) ; 
+        gGener=gener;
+      }
+        break;
+      case kMuonCocktailCent1Single:
+      {
+        comment = comment.Append(" Muon Cocktail Single Cent1");
+        AliGenMUONCocktail * gener = new AliGenMUONCocktail();
+        gener->SetPtRange(0.0,100.);       // Transverse momentum range   
+        gener->SetPhiRange(0.,360.);    // Azimuthal angle range  
+        gener->SetYRange(-4.0,-2.4);
+        gener->SetMuonPtCut(0.8);
+        gener->SetMuonThetaCut(171.,178.);
+        gener->SetMuonMultiplicity(1);
+        gener->SetImpactParameterRange(0.,5.);  //Centrality class Cent1 for PDC04
+        gener->SetProjectile("A", 208, 82) ; 
+        gener->SetTarget("A", 208, 82) ; 
+        gGener=gener;
+      }
+        break;
+      case kMuonCocktailPer1Single :
+      {
+        comment = comment.Append(" Muon Cocktail Single Per1");
+        AliGenMUONCocktail * gener = new AliGenMUONCocktail();
+        gener->SetPtRange(0.0,100.);       // Transverse momentum range   
+        gener->SetPhiRange(0.,360.);    // Azimuthal angle range  
+        gener->SetYRange(-4.0,-2.4);
+        gener->SetMuonPtCut(0.8);
+        gener->SetMuonThetaCut(171.,178.);
+        gener->SetMuonMultiplicity(1);
+        gener->SetImpactParameterRange(5.,8.6);//Centrality class Per1 for PDC04
+        gener->SetNumberOfParticipants(229.3);//Centrality class Per1 for PDC04
+        gener->SetProjectile("A", 208, 82) ; 
+        gener->SetTarget("A", 208, 82) ; 
+        gGener=gener;
+      }
+        break;
+      case kMuonCocktailPer4Single:
+      {
+        comment = comment.Append(" Muon Cocktail Single Per4");
+        AliGenMUONCocktail * gener = new AliGenMUONCocktail();
+        gener->SetPtRange(0.0,100.);       // Transverse momentum range   
+        gener->SetPhiRange(0.,360.);    // Azimuthal angle range  
+        gener->SetYRange(-4.0,-2.4);
+        gener->SetMuonPtCut(0.8);
+        gener->SetMuonThetaCut(171.,178.);
+        gener->SetMuonMultiplicity(1);
+        gener->SetImpactParameterRange(13.2,15.0);//Centrality class Per4 for PDC04
+        gener->SetProjectile("A", 208, 82) ; 
+        gener->SetTarget("A", 208, 82) ; 
+        gGener=gener;
+      }
+        break;
+      case kFlow_2_2000:
+      {
+        comment = comment.Append(" Flow with dN/deta  = 2000, vn = 2%");
+        gGener = GeVSimStandard(2000., 2.);
+      }
+        break;
+        
+      case kFlow_10_2000:
+      {
+        comment = comment.Append(" Flow with dN/deta  = 2000, vn = 10%");
+        gGener = GeVSimStandard(2000., 10.);
+      }
+        break;
+        
+      case kFlow_6_2000:
+      {
+        comment = comment.Append(" Flow with dN/deta  = 2000, vn = 6%");
+        gGener = GeVSimStandard(2000., 6.);
+      }
+        break;
+        
+      case kFlow_6_5000:
+      {
+        comment = comment.Append(" Flow with dN/deta  = 5000, vn = 6%");
+        gGener = GeVSimStandard(5000., 6.);
+      }
+        break;
+      case kHIJINGplus:
+      {
+        //
+        // The cocktail
+        AliGenCocktail *gener  = new AliGenCocktail();
+        
+        //
+        // Charm production by Pythia
+        AliGenPythia * genpyc = new AliGenPythia(230);
+        genpyc->SetProcess(kPyCharmPbPbMNR);
+        genpyc->SetStrucFunc(kCTEQ4L);
+        genpyc->SetPtHard(2.1,-1.0);
+        genpyc->SetEnergyCMS(5500.);
+        genpyc->SetNuclei(208,208);
+        genpyc->SetYRange(-999,999);
+        genpyc->SetForceDecay(kAll);
+        genpyc->SetFeedDownHigherFamily(kFALSE);
+        genpyc->SetCountMode(AliGenPythia::kCountParents);
+        //
+        // Beauty production by Pythia
+        AliGenPythia * genpyb = new AliGenPythia(9);
+        genpyb->SetProcess(kPyBeautyPbPbMNR);
+        genpyb->SetStrucFunc(kCTEQ4L);
+        genpyb->SetPtHard(2.75,-1.0);
+        genpyb->SetEnergyCMS(5500.);
+        genpyb->SetNuclei(208,208);
+        genpyb->SetYRange(-999,999);
+        genpyb->SetForceDecay(kAll);
+        genpyb->SetFeedDownHigherFamily(kFALSE);
+        genpyb->SetCountMode(AliGenPythia::kCountParents);
+        //
+        // Hyperons
+        //
+        AliGenSTRANGElib *lib = new AliGenSTRANGElib();
+        Int_t particle;
+        // Xi
+        particle = kXiMinus;
+        AliGenParam *genXi = new AliGenParam(16,lib,particle);
+        genXi->SetPtRange(0., 12.);
+        genXi->SetYRange(-1.1, 1.1);
+        genXi->SetForceDecay(kNoDecay);        
+        
+        //
+        // Omega
+        particle = kOmegaMinus;
+        AliGenParam *genOmega = new AliGenParam(10,lib,particle);
+        genOmega->SetPtRange(0, 12.);
+        genOmega->SetYRange(-1.1, 1.1);
+        genOmega->SetForceDecay(kNoDecay);
+        
+        //
+        // Central Hijing 
+        AliGenHijing *genHi = HijingStandard();
+        genHi->SwitchOffHeavyQuarks(kTRUE);
+        genHi->SetImpactParameterRange(0.,5.);
+        //
+        // Add everything to the cocktail and shake ...
+        gener->AddGenerator(genHi,    "Hijing cent1", 1);
+        gener->AddGenerator(genpyc,   "Extra charm",  1);
+        gener->AddGenerator(genpyb,   "Extra beauty", 1);
+        gener->AddGenerator(genXi,    "Xi"          , 1);
+        gener->AddGenerator(genOmega, "Omega",        1);
+        gener->SetProjectile("A", 208, 82) ; 
+        gener->SetTarget("A", 208, 82) ; 
+        gGener = gener;
+      }
+        break;
+      default: break;
+    }
+  
+  return gGener;
+}
+
+AliGenHijing* HijingStandard()
+{
+  AliGenHijing *gener = new AliGenHijing(-1);
+  // centre of mass energy 
+  gener->SetEnergyCMS(5500.);
+  // reference frame
+  gener->SetReferenceFrame("CMS");
+  // projectile
+  gener->SetProjectile("A", 208, 82);
+  gener->SetTarget    ("A", 208, 82);
+  // tell hijing to keep the full parent child chain
+  gener->KeepFullEvent();
+  // enable jet quenching
+  gener->SetJetQuenching(1);
+  // enable shadowing
+  gener->SetShadowing(1);
+  // neutral pion and heavy particle decays switched off
+  gener->SetDecaysOff(1);
+  // Don't track spectators
+  gener->SetSpectators(0);
+  // kinematic selection
+  gener->SetSelectAll(0);
+  return gener;
+}
+
+AliGenGeVSim* GeVSimStandard(Float_t mult, Float_t vn)
+{
+  AliGenGeVSim* gener = new AliGenGeVSim(0);
+  //
+  // Mult is the number of charged particles in |eta| < 0.5
+  // Vn is in (%)
+  //
+  // Sigma of the Gaussian dN/deta
+  Float_t sigma_eta  = 2.75;
+  //
+  // Maximum eta
+  Float_t etamax     = 7.00;
+  //
+  //
+  // Scale from multiplicity in |eta| < 0.5 to |eta| < |etamax|        
+  Float_t mm = mult * (TMath::Erf(etamax/sigma_eta/sqrt(2.)) / TMath::Erf(0.5/sigma_eta/sqrt(2.))); 
+  //
+  // Scale from charged to total multiplicity
+  // 
+  mm *= 1.587;
+  //
+  // Vn 
+  vn /= 100.;           
+  //
+  // Define particles
+  //
+  //
+  // 78% Pions (26% pi+, 26% pi-, 26% p0)              T = 250 MeV
+  AliGeVSimParticle *pp =  new AliGeVSimParticle(kPiPlus,  1, 0.26 * mm, 0.25, sigma_eta) ;
+  AliGeVSimParticle *pm =  new AliGeVSimParticle(kPiMinus, 1, 0.26 * mm, 0.25, sigma_eta) ;
+  AliGeVSimParticle *p0 =  new AliGeVSimParticle(kPi0,     1, 0.26 * mm, 0.25, sigma_eta) ;
+  //
+  // 12% Kaons (3% K0short, 3% K0long, 3% K+, 3% K-)   T = 300 MeV
+  AliGeVSimParticle *ks =  new AliGeVSimParticle(kK0Short, 1, 0.03 * mm, 0.30, sigma_eta) ;
+  AliGeVSimParticle *kl =  new AliGeVSimParticle(kK0Long,  1, 0.03 * mm, 0.30, sigma_eta) ;
+  AliGeVSimParticle *kp =  new AliGeVSimParticle(kKPlus,   1, 0.03 * mm, 0.30, sigma_eta) ;
+  AliGeVSimParticle *km =  new AliGeVSimParticle(kKMinus,  1, 0.03 * mm, 0.30, sigma_eta) ;
+  //
+  // 10% Protons / Neutrons (5% Protons, 5% Neutrons)  T = 250 MeV
+  AliGeVSimParticle *pr =  new AliGeVSimParticle(kProton,  1, 0.05 * mm, 0.25, sigma_eta) ;
+  AliGeVSimParticle *ne =  new AliGeVSimParticle(kNeutron, 1, 0.05 * mm, 0.25, sigma_eta) ;
+  //
+  // Set Elliptic Flow properties      
+  
+  Float_t pTsaturation = 2. ;
+  
+  pp->SetEllipticParam(vn,pTsaturation,0.) ;
+  pm->SetEllipticParam(vn,pTsaturation,0.) ;
+  p0->SetEllipticParam(vn,pTsaturation,0.) ;
+  pr->SetEllipticParam(vn,pTsaturation,0.) ;
+  ne->SetEllipticParam(vn,pTsaturation,0.) ;
+  ks->SetEllipticParam(vn,pTsaturation,0.) ;
+  kl->SetEllipticParam(vn,pTsaturation,0.) ;
+  kp->SetEllipticParam(vn,pTsaturation,0.) ;
+  km->SetEllipticParam(vn,pTsaturation,0.) ;
+  //
+  // Set Direct Flow properties        
+  pp->SetDirectedParam(vn,1.0,0.) ;
+  pm->SetDirectedParam(vn,1.0,0.) ;
+  p0->SetDirectedParam(vn,1.0,0.) ;
+  pr->SetDirectedParam(vn,1.0,0.) ;
+  ne->SetDirectedParam(vn,1.0,0.) ;
+  ks->SetDirectedParam(vn,1.0,0.) ;
+  kl->SetDirectedParam(vn,1.0,0.) ;
+  kp->SetDirectedParam(vn,1.0,0.) ;
+  km->SetDirectedParam(vn,1.0,0.) ;
+  //
+  // Add particles to the list
+  gener->AddParticleType(pp) ;
+  gener->AddParticleType(pm) ;
+  gener->AddParticleType(p0) ;
+  gener->AddParticleType(pr) ;
+  gener->AddParticleType(ne) ;
+  gener->AddParticleType(ks) ;
+  gener->AddParticleType(kl) ;
+  gener->AddParticleType(kp) ;
+  gener->AddParticleType(km) ;
+  //   
+  // Random Ev.Plane ----------------------------------
+  TF1 *rpa = new TF1("gevsimPsiRndm","1", 0, 360);
+  // --------------------------------------------------
+  gener->SetPtRange(0., 9.) ; // Use a resonable range! (used for bin size in numerical integration)
+  gener->SetPhiRange(0, 360);
+  //
+  // Set pseudorapidity range 
+  Float_t thmin = EtaToTheta(+etamax);   
+  Float_t thmax = EtaToTheta(-etamax);   
+  gener->SetThetaRange(thmin,thmax);     
+  return gener;
+}
+
+
+
+void ProcessEnvironmentVars()
+{
+    // Run type
+    if (gSystem->Getenv("CONFIG_RUN_TYPE")) {
+      for (Int_t iRun = 0; iRun < kRunMax; iRun++) {
+       if (strcmp(gSystem->Getenv("CONFIG_RUN_TYPE"), pprRunName[iRun])==0) {
+         srun = (PprRun_t)iRun;
+         cout<<"Run type set to "<<pprRunName[iRun]<<endl;
+       }
+      }
+    }
+
+    // Random Number seed
+    if (gSystem->Getenv("CONFIG_SEED")) {
+      sseed = atoi(gSystem->Getenv("CONFIG_SEED"));
+    }
+}
diff --git a/test/testdEdx/makeSummary.C b/test/testdEdx/makeSummary.C
new file mode 100644 (file)
index 0000000..ff6e087
--- /dev/null
@@ -0,0 +1,22 @@
+void DrawSysWatchTime(){
+  TString prefix="/hera/alice/marsland/MAF/MAFbenchmark/mcmaker/workdir/test_6_375000_25_20140713_20/";
+  TString listSyswatch = gSystem->GetFromPipe(Form("ls %s/*/mult_10000/event_1/simwatch.log",prefix.Data()));  
+  TObjArray * arraySyswatch= listSyswatch.Tokenize("\n");
+  Int_t nfiles= arraySyswatch->GetEntries();
+  TTree * treeSyswatch[] = new TTree*[nfiles];
+
+  
+  for (Int_t ifile=0; ifile<nfiles; ifile++){
+    treeSyswatch[ifile] = AliSysInfo::MakeTree(arraySyswatch->At(ifile)->GetName());    
+    treeSyswatch[0]->AddFriend( treeSyswatch[ifile],Form("T%d",ifile));
+  }
+
+  treeSyswatch[0]->Draw("deltaT:sname","deltaT>1","");
+  for (Int_t ifile=1; ifile<nfiles; ifile++){
+    treeSyswatch[0]->SetMarkerStyle(25);
+    treeSyswatch[0]->SetMarkerColor(1+ifile);
+    treeSyswatch[0]->Draw(Form("T%d.stampSec-T%d.stampOldSec:sname",ifile,ifile),"deltaT>1","same");    
+  }  
+}
+
diff --git a/test/testdEdx/rec.C b/test/testdEdx/rec.C
new file mode 100644 (file)
index 0000000..7e0900e
--- /dev/null
@@ -0,0 +1,72 @@
+const char * recoStorage="local:///cvmfs/alice.gsi.de/alice/data/2010/OCDB";
+Int_t run=0;
+
+
+void ModifyRecoParam(TObjArray* recoArray, Bool_t useIonTail, Double_t crossTalkCorrection){
+  //
+  // Modify reco param - and store it in the OCDB in local directory
+  //
+  AliCDBManager * man  =  AliCDBManager::Instance();
+  for (Int_t i=0; i<4; i++){
+    AliTPCRecoParam* p = ( AliTPCRecoParam*)recoArray->At(i);
+    p->SetUseIonTailCorrection(useIonTail);
+    p->SetCrosstalkCorrection(crossTalkCorrection);
+  }
+  TString localStorage = "local://"+gSystem->GetFromPipe("pwd")+"/OCDBrec";
+  AliCDBStorage*pocdbStorage = AliCDBManager::Instance()->GetStorage(localStorage.Data());  
+  AliCDBMetaData *metaData= new AliCDBMetaData();
+  AliCDBId*   id1=new AliCDBId("TPC/Calib/RecoParam/", man->GetRun(), man->GetRun());
+  pocdbStorage->Put(recoArray, (*id1), metaData);
+  AliCDBManager::Instance()->SetSpecificStorage("TPC/Calib/RecoParam/",localStorage.Data());
+}
+
+
+void rec(Bool_t useIonTail, Double_t crossTalkCorrection) {
+  //
+  // run reconstruction
+  // Parameters:
+  //   useIonTail - switch for using ion tail correction - OCDB entry will be overritten in  
+  //
+  // stard reco setting
+  //
+  AliCDBManager * man = AliCDBManager::Instance();
+  man->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
+  man->SetSpecificStorage("TPC/Calib/RecoParam/",recoStorage);
+  man->SetRun(run);
+  AliReconstruction reco;
+  reco.SetWriteESDfriend();
+  reco.SetWriteAlignmentData();
+  reco.SetDefaultStorage("local://$ALICE_ROOT/OCDB");
+  reco.SetSpecificStorage("GRP/GRP/Data",
+                         Form("local://%s",gSystem->pwd()));
+  reco.SetRunPlaneEff(kTRUE);
+  reco.SetRunQA(":"); 
+  reco.SetRunGlobalQA(kFALSE);
+  reco.ResetCheckRecoCDBvsSimuCDB();
+
+  //
+  //Switch Iontail in RecoParam. Creation of a new OCDB entry
+  //
+  AliCDBEntry* e = man->Get("TPC/Calib/RecoParam/",run); // get default
+  // modify content
+  TObjArray* recoArray = (TObjArray*)e->GetObject();
+  ModifyRecoParam(recoArray, useIonTail, crossTalkCorrection);
+  //
+  //
+  // Run reconstruction
+  //
+  TStopwatch timer;
+  timer.Start();
+  reco.Run();
+  timer.Stop();
+  timer.Print();
+  //
+  // Print the OCDB setup which we used
+  //
+  AliCDBEntry* ocdbEntry = man->Get("TPC/Calib/RecoParam/",run);
+  TObjArray* recoArray = (TObjArray*)ocdbEntry->GetObject();
+  for (Int_t i=0; i<4; i++){
+    AliTPCRecoParam* recoParam = ( AliTPCRecoParam*)recoArray->At(i);
+    printf("ipar=%d\t%d\t%f\n",i,recoParam->GetUseIonTailCorrection(), recoParam->GetCrosstalkCorrection());
+  } 
+}
diff --git a/test/testdEdx/sim.C b/test/testdEdx/sim.C
new file mode 100644 (file)
index 0000000..447a205
--- /dev/null
@@ -0,0 +1,80 @@
+//
+// parameter to take from config file
+//
+const char * recoStorage="local:///cvmfs/alice.gsi.de/alice/data/2010/OCDB";
+Int_t run=0;
+
+
+void ModifyRecoParam(TObjArray* recoArray, Bool_t useIonTail, Double_t crossTalkCorrection){
+  //
+  // Modify reco param - and store it in the OCDB in local directory
+  //
+  AliCDBManager * man  =  AliCDBManager::Instance();
+  for (Int_t i=0; i<4; i++){
+    AliTPCRecoParam* p = ( AliTPCRecoParam*)recoArray->At(i);
+    p->SetUseIonTailCorrection(useIonTail);
+    p->SetCrosstalkCorrection(crossTalkCorrection);
+  }
+  TString localStorage = "local://"+gSystem->GetFromPipe("pwd")+"/OCDBsim";
+  AliCDBStorage*pocdbStorage = AliCDBManager::Instance()->GetStorage(localStorage.Data());  
+  AliCDBMetaData *metaData= new AliCDBMetaData();
+  AliCDBId*   id1=new AliCDBId("TPC/Calib/RecoParam/", man->GetRun(), AliCDBRunRange::Infinity());
+  pocdbStorage->Put(recoArray, (*id1), metaData);
+  AliCDBManager::Instance()->SetSpecificStorage("TPC/Calib/RecoParam/",localStorage.Data());
+}
+
+
+void sim(Int_t nev, Bool_t useIonTail, Double_t crossTalkCorrection) {
+  gSystem->Load("liblhapdf");
+  gSystem->Load("libEGPythia6");
+  gSystem->Load("libpythia6");
+  gSystem->Load("libAliPythia6");
+  gSystem->Load("libhijing");
+  gSystem->Load("libTHijing");
+  gSystem->Load("libgeant321");
+
+  if (nev<0){
+    AliCDBManager * man = AliCDBManager::Instance();
+    man->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
+    man->SetSpecificStorage("TPC/Calib/RecoParam/",recoStorage);
+    man->SetRun(run);
+    AliCDBEntry* e = man->Get("TPC/Calib/RecoParam/",run); // get default
+    // modify content
+    TObjArray* recoArray = (TObjArray*)e->GetObject();
+    ModifyRecoParam(recoArray, useIonTail, crossTalkCorrection);
+    return;
+  }
+
+  if (gSystem->Getenv("EVENT")) nev = atoi(gSystem->Getenv("EVENT")) ;   
+  
+  AliSimulation simulator;
+  simulator.SetMakeSDigits("ITS TPC TRD TOF PHOS HMPID EMCAL MUON FMD ZDC PMD T0");
+  //simulator.SetMakeDigitsFromHits( "ITS TPC");
+  simulator.SetWriteRawData("ALL","raw.root",kTRUE);
+
+  simulator.SetDefaultStorage("local://$ALICE_ROOT/OCDB");
+  simulator.SetSpecificStorage("GRP/GRP/Data", Form("local://%s",gSystem->pwd()));
+  TString localStorage = "local://"+gSystem->GetFromPipe("pwd")+"/OCDBsim";
+  simulator.SetSpecificStorage("TPC/Calib/RecoParam/",localStorage.Data());
+  
+  simulator.SetRunQA(":") ; 
+  
+  TStopwatch timer;
+  timer.Start();
+  simulator.Run(nev);
+  timer.Stop();
+  timer.Print();
+  //
+  // Print the OCDB setup which we used
+  //
+  AliCDBManager * man = AliCDBManager::Instance();
+  AliCDBEntry* ocdbEntry = man->Get("TPC/Calib/RecoParam/",run);
+  TObjArray* recoArray = (TObjArray*)ocdbEntry->GetObject();
+  for (Int_t i=0; i<4; i++){
+    AliTPCRecoParam* recoParam = ( AliTPCRecoParam*)recoArray->At(i);
+    printf("ipar=%d\t%d\t%f\n",i,recoParam->GetUseIonTailCorrection(), recoParam->GetCrosstalkCorrection());
+  } 
+
+
+   
+}
diff --git a/test/testdEdx/submitSimJobs.sh b/test/testdEdx/submitSimJobs.sh
new file mode 100644 (file)
index 0000000..06572f4
--- /dev/null
@@ -0,0 +1,221 @@
+#!/bin/sh
+
+###############################################################################
+#
+# Aim is to submit simulation/reconstruction jobs for multiplicity dependence check
+# For local running one can use the instructions in runSim() function.
+#    submitMultiplicityScan() --> main function to submit jobs for each event with a given multiplicity
+#    runSim()                 --> runs the macros for simulation and reconstruction
+# To see how to run these functions look below
+#
+###############################################################################
+
+# global variables to be set
+DATE=`date +%Y_%m_%d_%H`
+nEvents=1               #fixed to 1 to make an event by event job submission
+
+###############################################################################
+submitIonTailXTalkScan()
+{
+
+  #
+  # cals the submitMultiplicityScan fuction for 
+  #  --> IonTail ON/OFF, XTALK ON/OFF, in reconstruction  and MC
+  ###############################################################################
+  ## example  --> for 5 multiplicity bins, each most central event having 15000 track multiplicity. 
+  ##              For each multiplicity bin total statistic is 75000   
+  if [ 1 -eq 0 ]; then
+    cd $ALICE_ROOT/test/testdEdx
+    source submitSimJobs.sh 
+    submitIonTailXTalkScan 8 1000000 50 /hera/alice/marsland/software/bin/set_private_TPCdev.sh > out.log 2>&1 &
+  fi
+  ###############################################################################
+
+  # inputs
+  nMultBins=$1
+  maxNTracks=$2
+  nEventsCentral=$3
+  alirootSourceFile=$4
+
+  if [ $# -ne 4 ]; then 
+    echo "4 parameters needed --> multiplicity bins, maximum number of tracks, maximum number of central events, source file for root"
+    return 1
+  fi
+
+  baseDir=$(pwd)
+  testDir=$baseDir/test_$nMultBins\_$maxNTracks\_$nEventsCentral\_$DATE
+  DirCheckCreate $testDir
+  cd $testDir
+
+  for ((iontail=0; iontail<2 ; iontail=iontail+1))
+  do
+    for ((xtalk=0; xtalk<2 ; xtalk=xtalk+1))
+    do
+
+      MultiplicityScan $nMultBins $maxNTracks $nEventsCentral $alirootSourceFile $iontail $xtalk
+
+    done  
+  done
+
+}
+###############################################################################
+runSim(){
+
+  #
+  # Function which runs rec.C and sim.C for given multiplicity and event number. 
+  # (if submitMultiplicityScan function is called, this parameter is always fixed to 1, i.e event by event)
+  # Input parameters are
+  # 1) total track multiplicity 
+  # 2) number of events to be processed for given total track multiplicity (if submitMultiplicityScan() is called, it is 1)
+  # 3) script to source a specific aliroot
+  #
+  ###############################################################################
+  ## example --> 2 events with total multiplicity of 1000 tracks
+  if [ 1 -eq 0 ]; then
+    cd $ALICE_ROOT/test/testdEdx
+    source submitSimJobs.sh
+    runSim 100 1  0 0 /hera/alice/marsland/software/bin/set_private_TPCdev.sh > out.log 2>&1 &
+  fi
+  ###############################################################################
+
+  export TestdEdxNTracks=$1
+  nevents=$2
+  ionTail=$3
+  xTalk=$4
+  alirootSourceFile=$5
+
+  if [ $# -ne 4 ]; then
+    echo "5 parameters needed --> multiplicity, number of events, source file for aliroot, iontail switch (0 or 1), xTalk switch (0 or 1)"
+    return 1
+  fi
+
+  echo " Running dEdx digitzer test job" 
+  echo " NEvents = $nevents" 
+  echo " NTracks per event  $TestdEdxNTracks"
+
+
+  ## main body of the simulation part
+  rm -rf *.root *.dat *.log fort* hlt hough raw* recraw/*.root recraw/*.log GRP* 
+  printf   "\n ======================================================================\n\n"
+  echo Running: aliroot -b -q sim.C\($nevents,$ionTail,$xTalk\)     
+  aliroot -b -q sim.C\(-1,$ionTail,$xTalk\)            2>&1 | tee sim.log    #  make a specific OCDB for simulation
+  aliroot -b -q sim.C\($nevents,$ionTail,$xTalk\)            2>&1 | tee sim.log
+  mv syswatch.log simwatch.log
+  printf   "\n ======================================================================\n\n"
+  echo Running: aliroot -b -q rec.C\($ionTail\,$xTalk\) 
+  aliroot -b -q rec.C\($ionTail\,$xTalk\)    2>&1 | tee rec.log    
+  mv syswatch.log recwatch.log
+  ## OCDB entries to be dumped in human readable format
+  source $ALICE_ROOT/PWGPP/CalibMacros/AliOCDBtoolkit.sh
+  printf   "\n ======================================================================\n\n"
+  echo Running: ocdbMakeTable AliESDs.root "ESD" OCDBrec.list
+  ocdbMakeTable AliESDs.root "ESD" OCDBrec.list
+  printf   "\n ======================================================================\n\n"
+  echo Running: ocdbMakeTable galice.root MC OCDBsim.list
+  ocdbMakeTable galice.root MC OCDBsim.list
+  ocdbFileName=$(cat OCDBrec.list | grep "TPC/Calib/RecoParam" | gawk '{print $2"/"$3}' )
+  printf   "\n ======================================================================\n\n"
+  echo Running: dumpObject $ocdbFileName  "object" "XML" RecoParam
+  dumpObject $ocdbFileName  "object" "XML" RecoParam
+
+  return 1;
+
+}
+###############################################################################
+MultiplicityScan(){
+  #
+  # Here we submit the jobs for the simulation//reconstruction for one setting of IonTail and XTalk configuration
+  # Parameters:
+  #   1. multiplicity bins to be investigated  (default 5)
+  #   2. max multiplicity for whole processing (default 75000 tracks --> 5 central PbPb event )
+  #   3. number of central events to be used   (default 5)
+  #   4. file to source aliroot
+  # (2)/(3) should be a reasonable multiplicity estimate (e.g. 15000 tracks which is 1 central PbPb event)
+  # Jobs will be submitted per event     
+  #
+  # For each setting new directory will be created - indicating muiltiplicity
+  # dir<ntracks>/dir<eventNr>  
+  #
+  ###############################################################################
+  ## example  --> for 5 multiplicity bins, each most central event having 15000 track multiplicity. 
+  ##              For each multiplicity bin total statistic is 75000   
+  if [ 1 -eq 0 ]; then
+    cd $ALICE_ROOT/test/testdEdx
+    source submitSimJobs.sh 
+    MultiplicityScan 8 1000000 50 /hera/alice/marsland/software/bin/set_private_TPCdev.sh 0 1 > out.log 2>&1 &
+  fi
+  ###############################################################################
+
+  # inputs
+  nMultBins=$1
+  maxNTracks=$2
+  nEventsCentral=$3
+  alirootSourceFile=$4
+  ionTail=$5
+  xTalk=$6
+
+  if [ $# -ne 6 ]; then 
+    echo "6 parameters needed --> multiplicity bins, maximum number of tracks, maximum number of central events, source file for root, iontail switch (0 or 1), xTalk switch (0 or 1)"
+    return 1
+  fi
+
+  baseDir=$(pwd)
+  testDir=$baseDir/IonTail_XTalk_$ionTail\_$xTalk
+  DirCheckCreate $testDir
+  cd $testDir
+
+  # create multiplicity bins 
+  multPerCentralEvent=$(echo $maxNTracks/$nEventsCentral | bc)
+  echo "multiplicity per most central event is $multPerCentralEvent"
+  for ((i=0; i<$nMultBins ; i=i+1))
+  do
+
+    multSteps=$(echo $multPerCentralEvent/$nMultBins | bc)
+    multBin=$(echo $multPerCentralEvent - $multSteps*$i | bc)
+    multBinDir=$testDir/mult_$multBin
+    DirCheckCreate $multBinDir
+    cd $multBinDir
+    echo $multBinDir
+
+    nEventsPerMultBin=$(echo $maxNTracks/$multBin | bc)
+    echo $nEventsPerMultBin
+    for ((j=1; j<$(echo $nEventsPerMultBin+1 | bc) ; j=j+1))
+    do
+
+      eventDir=$multBinDir/event_$j
+      DirCheckCreate $eventDir
+      cd $eventDir
+      cp -r $ALICE_ROOT/test/testdEdx/GRP $ALICE_ROOT/test/testdEdx/OCDB* $ALICE_ROOT/test/testdEdx/*.* .   
+      #cp $ALICE_ROOT/test/testdEdx/*.* .      
+
+      qsub -V -cwd -l h_rt=24:0:0,h_rss=6G -P alice -b y -r y -o outSim.log -e errSim.log $baseDir/submitSimJobs.sh runSim $multBin $nEvents $4 $5 $6
+    done  
+  done
+
+  cd $baseDir 
+}
+###############################################################################
+DirCheckCreate()
+{
+
+  #
+  # check if the directory exist. If so, delete it
+  #
+
+  dirName=$1
+  if [ -d "$dirName" ]; then
+    echo " $dirName already exist delete it and create a new one  "
+    rm -rf $dirName 
+  fi
+  mkdir $dirName
+
+}
+###############################################################################
+main()
+{
+  eval "$@"
+}
+
+main $@
+