Adding new class AliTPCcalibTime
authormarian <marian@f7af4fe6-9843-0410-8265-dc069ae4e863>
Sat, 18 Oct 2008 13:11:23 +0000 (13:11 +0000)
committermarian <marian@f7af4fe6-9843-0410-8265-dc069ae4e863>
Sat, 18 Oct 2008 13:11:23 +0000 (13:11 +0000)
Removing obsolete selectors

TPC/AliTPCSelectorESD.cxx [deleted file]
TPC/AliTPCSelectorTracks.h [deleted file]
TPC/AliTPCcalibTime.cxx [new file with mode: 0644]
TPC/AliTPCcalibTime.h [new file with mode: 0644]
TPC/TPCcalibLinkDef.h
TPC/libTPCcalib.pkg

diff --git a/TPC/AliTPCSelectorESD.cxx b/TPC/AliTPCSelectorESD.cxx
deleted file mode 100644 (file)
index 54e38d7..0000000
+++ /dev/null
@@ -1,462 +0,0 @@
-// The class definition in esdClus.h has been generated automatically
-// by the ROOT utility TTree::MakeSelector(). This class is derived
-// from the ROOT class TSelector. For more information on the TSelector
-// framework see $ROOTSYS/README/README.SELECTOR or the ROOT User Manual.
-
-// The following methods are defined in this file:
-//    Begin():        called everytime a loop on the tree starts,
-//                    a convenient place to create your histograms.
-//    SlaveBegin():   called after Begin(), when on PROOF called only on the
-//                    slave servers.
-//    Process():      called for each event, in this function you decide what
-//                    to read and fill your histograms.
-//    SlaveTerminate: called at the end of the loop on the tree, when on PROOF
-//                    called only on the slave servers.
-//    Terminate():    called at the end of the loop on the tree,
-//                    a convenient place to draw/fit your histograms.
-//
-// To use this file, try the following session on your Tree T:
-//
-// Root > T->Process("esdClus.C")
-// Root > T->Process("esdClus.C","some options")
-// Root > T->Process("esdClus.C+")
-//
-// Modification log:
-// 05/11/2006 HH  Correct for large pads (outer sectors) in amplitude plots
-
-#include "TSystem.h"
-#include <TPDGCode.h>
-#include <TStyle.h>
-#include "TCint.h"
-#include "TH1I.h"
-#include "TTimeStamp.h"
-#include "TProof.h"
-#include "TTree.h"
-//
-#include "AliTracker.h"
-#include "AliMagF.h"
-// 
-#include "AliESDEvent.h"   // new container
-#include "AliESD.h"
-#include "AliESDtrack.h"
-#include "AliESDfriend.h"
-#include "AliESDfriendTrack.h"
-#include "AliTPCseed.h"
-#include "AliTPCclusterMI.h"
-//
-#include "AliSysInfo.h"
-#include "AliTPCSelectorESD.h" 
-
-
-
-
-AliTPCSelectorESD::AliTPCSelectorESD(TTree *tree) : 
-   TSelector(),
-   fChain(0),
-   fESDevent(0),
-   fESD(0),
-   fESDfriend(0),
-   fNtracks(0),       //! number of Tracks
-   fNtracksFriend(0), //! number of firend Tracks  
-   fNClusters(0),      //! number of clusters on track
-   fRegPath(0),       // path to store persistent data 
-   fFileNo(0),
-   fSysWatch(0),      // system info        
-   fFileWatch(0),      // file watch - write the status of the analyzed files
-   fDebugLevel(0)
- {
-   G__SetCatchException(0);     
-   //
-   //
-   //if (somthing){  
-   fSysWatch  = new fstream("syswatch2.log", ios_base::out|ios_base::trunc);
-   fFileWatch = new fstream("filewatch.log", ios_base::out|ios_base::trunc);
-   if (gProof) fDebugLevel = gProof->GetLogLevel();
-   if (tree) fChain=tree;
- }   
-
-
-void AliTPCSelectorESD::Begin(TTree * /*tree*/)
-{
-  // The Begin() function is called at the start of the query.
-  // When running with PROOF Begin() is only called on the client.
-  // The tree argument is deprecated (on PROOF 0 is passed).
-  
-  TString option = GetOption();
-
-}
-
-
-void    AliTPCSelectorESD::SetInputList(TList *input) { 
-  //
-  //
-  //
-  fInput = input; 
-  TNamed *regData = (TNamed*)input->FindObject("debugStreamPrefix");
-  if (regData) fRegPath = new TString(regData->GetTitle());
-
-}
-
-
-void AliTPCSelectorESD::SlaveBegin(TTree * tree)
-{
-   // The SlaveBegin() function is called after the Begin() function.
-   // When running with PROOF SlaveBegin() is called on each slave server.
-   // The tree argument is deprecated (on PROOF 0 is passed).
-  if (tree) fChain = tree;
-  Init(tree);
-  //
-  fNtracks       = new TH1I("ntracks","Number of tracks",100,0,400);
-  fNtracksFriend = new TH1I("ntracksF","Number of friend tracks",100,0,400);
-  fNClusters     = new TH1I("ncluster","Number of clusters",100,0,200);
-  fOutput->AddLast(fNtracks);
-  fOutput->AddLast(fNtracksFriend);
-  fOutput->AddLast(fNClusters);
-  
-
-}
-
-void   AliTPCSelectorESD::CleanESD(){
-  //
-  Bool_t isNew =  fESDevent!=0;
-  if (isNew) return;
-  
-
-  if (fESD!=0){
-    delete fESD;
-    fESD = 0;
-  }
-  if (fESDevent!=0){
-    delete fESDevent;
-    fESDevent=0;
-  }
-  if (fESDfriend){
-    delete fESDfriend;
-    fESDfriend =0;
-  }
-}
-
-Bool_t AliTPCSelectorESD::Process(Long64_t entry)
-{
-   // The Process() function is called for each entry in the tree (or possibly
-   // keyed object in the case of PROOF) to be processed. The entry argument
-   // specifies which entry in the currently loaded tree is to be processed.
-   // It can be passed to either AliTPCSelectorESD::GetEntry() or TBranch::GetEntry()
-   // to read either all or the required parts of the data. When processing
-   // keyed objects with PROOF, the object is already loaded and is available
-   // via the fObject pointer.
-   //
-   // This function should contain the "body" of the analysis. It can contain
-   // simple or elaborate selection criteria, run algorithms on the data
-   // of the event and typically fill histograms.
-   //
-   // The processing can be stopped by calling Abort().
-   //
-   // Use fStatus to set the return value of TTree::Process().
-   //
-   // The return value is currently not used.
-
-  Int_t status = ProcessIn(entry);
-  if (fFileWatch) {
-    (*fFileWatch) << "__" << status ;
-  }
-  return (status==0);
-}
-
-
-
-
-Int_t   AliTPCSelectorESD::ReadEvent(Long64_t entry){
-  //
-  //
-  //
-
-
-  if (!fChain) return -1;  
-  if (!fChain->GetTree()) return -1; 
-  try {
-    fChain->GetTree()->GetEntry(entry);
-  } catch (std::bad_alloc) {
-    printf("Pica vyjebana pojebany skurveny kokot piciak\n");
-    //    fESD =0;
-    //fESDfriend = 0;
-    //fESDevent=0;
-    return -1;
-  }
-  //
-  // Info("Procces","0");
-  if (!fESD && !fESDevent) { 
-    //fESD = 0;
-    //fESDfriend = 0;
-    //CleanESD();
-    return -2;
-  }
-  Int_t ntracks = (fESD) ? fESD->GetNumberOfTracks() : fESDevent->GetNumberOfTracks();   
-
-  if (fESDevent){
-    fESDevent->SetESDfriend(fESDfriend);   
-  }
-
-
-  fNtracks->Fill(ntracks);
-  Info("Procces", Form("entry\t%d: Ntracks = %d",entry, ntracks));
-  
-  if (!fESDfriend || fESDfriend->GetNumberOfTracks() != ntracks) {
-    try {
-      delete fESD;
-    }
-    catch (std::bad_alloc) {
-      printf("Pica vyjebana pojebany skurveny kokot piciak\n");
-      fESD =0;
-      return -1;
-    }
-    //fESD = 0;
-    //fESDfriend = 0;
-    //fESD = 0;
-    //    CleanESD(); 
-    if (fESDfriend) fNtracksFriend->Fill(fESDfriend->GetNumberOfTracks());
-    Info("Procces","2: PROBLEM");
-    return -3;
-  }
-  if (fESD) fESD->SetESDfriend(fESDfriend);
-  return 0;
-}
-
-
-Int_t AliTPCSelectorESD::ProcessIn(Long64_t entry)
-{
-  //
-  // User part of proccess method
-  //
-  //
-  // USER code to go here
-  //
-  Int_t status = ReadEvent(entry);
-  if (status<0) return status; 
-  Int_t ntracks = (fESD) ? fESD->GetNumberOfTracks() : fESDevent->GetNumberOfTracks();   
-  //
-  AliTPCseed *seed;
-  AliTPCclusterMI cl;
-  Info("Procces", Form("entry\t%d: NtracksF = %d",entry,fESDfriend->GetNumberOfTracks() ));
-
-  for (Int_t tr = 0; tr < ntracks; tr++){ 
-    AliESDtrack *esdTrack = fESD ? (AliESDtrack*) fESD->GetTrack(tr): (AliESDtrack*) fESDevent->GetTrack(tr);
-    AliESDfriendTrack *friendtrack = (AliESDfriendTrack*) esdTrack->GetFriendTrack();
-    seed = 0;
-    TObject *cobject=0;
-    for (Int_t i=0;;i++){
-      cobject = friendtrack->GetCalibObject(i);
-      if (!cobject) break;
-      seed = dynamic_cast<AliTPCseed*>(cobject);
-      if (seed) break;
-    }
-    //
-    //Info("Process",Form("Proccessing track%d\n",tr));
-    if (seed) { 
-      fNClusters->Fill(seed->GetNumberOfClusters());
-      //
-      //
-    }
-  }
-  CleanESD();
-  return 0;
-  
-}
-
-
-void AliTPCSelectorESD::SlaveTerminate()
-{
-   // The SlaveTerminate() function is called after all entries or objects
-   // have been processed. When running with PROOF SlaveTerminate() is called
-   // on each slave server.
-    printf ("SlaveTerminate.. \n");    
-    RegisterData();
-}
-
-void AliTPCSelectorESD::Terminate()
-{
-   // The Terminate() function is the last function to be called during
-   // a query. It always runs on the client, it can be used to present
-   // the results graphically or save the results to file.
-   
-  printf ("Terminate... \n");
-  if (!fOutput) return;
-  TFile file("Output.root","recreate");
-  printf("fOutput contains the following: \n");
-  fOutput->Print();
-  printf("Trying to write the file 'Output.root'... \n");
-  fOutput->Write();
-  file.Close();
-  
-  
-}
-
-
-
-void AliTPCSelectorESD::Init(TTree *tree) 
-{
-   // The Init() function is called when the selector needs to initialize
-   // a new tree or chain. Typically here the branch addresses and branch
-   // pointers of the tree will be set.
-   // It is normaly not necessary to make changes to the generated
-   // code, but the routine can be extended by the user if needed.
-   // Init() will be called many times when running on PROOF
-   // (once per file to be processed).
-
-   // Set branch addresses and branch pointers
-  static Int_t counter=0;
-  printf(Form("\nAliTPCSelectorESD::Init Accesing%d time\n",counter));
-  counter++;
-  if (!tree) return;
-  fChain = tree;
-  //if (counter>1) return;
-  tree->SetBranchStatus("*",1);
-  //
-  // New AliESDevent format
-  //
-  if (!fChain->GetBranch("ESD")){
-    //
-    //
-    //
-    if (fESDevent) delete fESDevent;
-     fESDevent = new AliESDEvent();
-     fESDevent->ReadFromTree(tree); // Attach the branch with ESD friends
-     fESDfriend = (AliESDfriend*)fESDevent->FindListObject("AliESDfriend");
-     tree->SetBranchAddress("ESDfriend.",&fESDfriend); 
-     return;
-  }
-  //
-  // if old format
-  //
-  
-
-
-   //   fChain->SetMakeClass(1);
-   fChain->SetBranchAddress("ESD",&fESD);
-   Info("Init","Enter");
-   Bool_t isOK=kFALSE;
-   if (fChain->GetBranch("ESDfriend")) {
-     fChain->SetBranchAddress("ESDfriend",&fESDfriend);
-     Info("Init","V0-ESDfriend.");
-     isOK=kTRUE;
-   }
-   if (fChain->GetBranch("ESDfriend.")){
-     Info("Init","V1-ESDfriend.");
-     fChain->SetBranchAddress("ESDfriend.",&fESDfriend);
-     isOK=kTRUE;
-   }
-   if (isOK) return;
-
-   //
-   // Try to solve problem
-   //
-
-   Info("Init","Problem");
-   if (tree->GetBranch("ESD")){
-     Info("InitTree",tree->GetBranch("ESD")->GetFile()->GetName());
-     char  fname[1000];
-     sprintf(fname,"%s/AliESDfriends.root",gSystem->DirName(tree->GetBranch("ESD")->GetFile()->GetName()));
-     Info("InitFile",fname);
-     if (tree->AddFriend("esdFriendTree",fname)){
-       Info("InitFileOK",fname);
-       if (fChain->GetBranch("ESDfriend")) {
-        fChain->SetBranchAddress("ESDfriend",&fESDfriend);
-        Info("Init","V0-ESDfriend.");
-        isOK=kTRUE;
-       }
-       if (fChain->GetBranch("ESDfriend.")){
-        Info("Init","V1-ESDfriend.");
-        fChain->SetBranchAddress("ESDfriend.",&fESDfriend);
-        isOK=kTRUE;
-       }       
-     }   
-   }
-}
-
-
-
-Bool_t AliTPCSelectorESD::Notify()
-{
-   // The Notify() function is called when a new file is opened. This
-   // can be either for a new TTree in a TChain or when when a new TTree
-   // is started when using PROOF. It is normaly not necessary to make changes
-   // to the generated code, but the routine can be extended by the
-   // user if needed. The return value is currently not used.
-
-  ++fFileNo;
-  const char * fname = "UNKNOWN";
-  const char * hname = gSystem->HostName();
-  if (!fChain) return kFALSE;
-  if (fChain->GetCurrentFile()){
-    fname = fChain->GetCurrentFile()->GetName();
-  }
-  Info("Notify",Form("Host %s processing file no %d %s\n",hname,fFileNo,fname));
-
-  //
-  // Print statistic to log file
-  //
-//   if (fname) {
-//     (*fFileWatch) << endl;
-//     (*fFileWatch) << hname   <<"\t"
-//               << fname   <<"\t";
-//   }
-  DumpSysInfo(-1);
-  
-  return kTRUE;
-}
-
-void    AliTPCSelectorESD::RegisterData(){
-  //
-  // Register persistent data
-  //
-  if (fRegPath){
-    gSystem->Exec(Form("mkdir %s/%s",fRegPath->Data(), gSystem->HostName()));
-    printf("Register data to\t%s\n",fRegPath->Data());
-    char command[1000];
-    sprintf(command,"cp *.log %s/%s/",fRegPath->Data(), gSystem->HostName());
-    gSystem->Exec(command);
-    sprintf(command,"cp *.root %s/%s/",fRegPath->Data(), gSystem->HostName());
-    gSystem->Exec(command);
-  }
-}
-
-
-void   AliTPCSelectorESD::DumpSysInfo(Int_t entry){
-  //
-  // dump system info to log file
-  // entry  - entry number in the chain
-  //
-  const char * fname = "UNKNOWN";
-  const char * hname = gSystem->HostName();
-  if (fChain->GetCurrentFile()){
-    fname = fChain->GetCurrentFile()->GetName();
-  }
-  //   //
-  if (fSysWatch){
-    TTimeStamp stamp;
-    CpuInfo_t  cpuInfo;
-    MemInfo_t  memInfo;
-    ProcInfo_t procInfo;
-    
-    gSystem->GetCpuInfo(&cpuInfo, 1000);
-    gSystem->GetMemInfo(&memInfo);
-    gSystem->GetProcInfo(&procInfo);
-    
-    (*fSysWatch) << hname   <<"\t"               // hname - hostname
-                << fname   <<"\t"               // fname - filename
-                << entry   <<"\t"               // entry - entry number
-                << stamp.GetSec()<<"\t"         // time  - time stamp in seconds
-                << memInfo.fMemUsed<<"\t"       //  
-                << memInfo.fSwapUsed<<"\t"      //
-                << procInfo.fMemResident<<"\t"  //
-                << procInfo.fMemVirtual<<"\t"   //    
-                << cpuInfo.fUser <<"\t"         //
-                << cpuInfo.fSys  <<"\t"         //
-                << procInfo.fCpuUser<<"\t"      //
-                << procInfo.fCpuSys<<"\t"       //
-                << endl;
-  }
-  AliSysInfo::AddStamp(fname);
-}
diff --git a/TPC/AliTPCSelectorTracks.h b/TPC/AliTPCSelectorTracks.h
deleted file mode 100644 (file)
index adfb64e..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-
-#ifndef AliTPCSelectorTracks_h
-#define AliTPCSelectorTracks_h
-
-#include <iostream>
-using namespace std;
-#include <TSelector.h>
-
-#include <TROOT.h>
-#include <TFile.h>
-
-
-class AliESD;
-class AliESDfriend;
-class TH1I;
-class AliTPCcalibTracks;
-class AliTPCcalibTracksGain;
-
-
-class AliTPCSelectorTracks : public AliTPCSelectorESD {
-public :
-   AliTPCSelectorTracks(TTree *tree=0);
-   virtual ~AliTPCSelectorTracks();
-   virtual void    SlaveBegin(TTree *tree);
-   virtual void    SlaveTerminate();
-   virtual Int_t   ProcessIn(Long64_t entry);
-   virtual void    Terminate();
-   void InitComponent();
-
-private:
-  Bool_t            fInit;                 //! flag - component initialized
-  AliTPCcalibTracks *fCalibTracks;         //! calib Tracks object
-  AliTPCcalibTracksGain *fCalibTracksGain; //! gain calibration object for tracks
-  static const char *fgkOutputFileName;    //! filename of the output root file
-//  Int_t              fDebugLevel;        // debug level
-  ClassDef(AliTPCSelectorTracks,1);
-};
-
-
-
-
-
-#endif
diff --git a/TPC/AliTPCcalibTime.cxx b/TPC/AliTPCcalibTime.cxx
new file mode 100644 (file)
index 0000000..8ad1839
--- /dev/null
@@ -0,0 +1,377 @@
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+
+/*
+    Comments to be written here:
+    1. What do we calibrate.
+
+Time dependence of gain and drift velocity in order to account for changes in: temperature, pressure, gas composition.
+
+  AliTPCcalibTime *calibTime = new AliTPCcalibTime("cosmicTime","cosmicTime",0, 1213.9e+06, 1213.96e+06, 0.04e+04, 0.04e+04);
+
+
+    2. How to interpret results
+    3. Simple example
+
+a.) determine the required time range:
+
+AliXRDPROOFtoolkit tool;
+TChain * chain = tool.MakeChain("pass2.txt","esdTree",0,6000);
+chain->Draw("GetTimeStamp()")
+
+b) analyse calibration object on Proof in calibration train 
+
+AliTPCcalibTime *calibTime = new AliTPCcalibTime("cosmicTime","cosmicTime", StartTimeStamp, EndTimeStamp, IntegrationTimeVdrift, IntegrationTimeDeDx);
+
+c) plot results
+
+TFile f("CalibObjects.root");
+AliTPCcalibTime *cal = f->Get("TPCCalib")->FindObject("cosmicTime");
+cal->GetHistVdrift()->Projection(1,0)->Draw()
+
+    4. Analysis using debug streamers.    
+
+*/
+
+
+#include "Riostream.h"
+#include "TChain.h"
+#include "TTree.h"
+#include "TH1F.h"
+#include "TH2F.h"
+#include "TH3F.h"
+#include "THnSparse.h"
+#include "TList.h"
+#include "TMath.h"
+#include "TCanvas.h"
+#include "TFile.h"
+#include "TF1.h"
+#include "TVectorD.h"
+#include "TProfile.h"
+#include "TGraphErrors.h"
+#include "TCanvas.h"
+
+#include "AliTPCclusterMI.h"
+#include "AliTPCseed.h"
+#include "AliESDVertex.h"
+#include "AliESDEvent.h"
+#include "AliESDfriend.h"
+#include "AliESDInputHandler.h"
+#include "AliAnalysisManager.h"
+
+#include "AliTracker.h"
+#include "AliMagFMaps.h"
+#include "AliTPCCalROC.h"
+
+#include "AliLog.h"
+
+#include "AliTPCcalibTime.h"
+
+#include "TTreeStream.h"
+#include "AliTPCTracklet.h"
+
+ClassImp(AliTPCcalibTime)
+
+
+AliTPCcalibTime::AliTPCcalibTime() 
+  :AliTPCcalibBase(),
+   fHistDeDxTgl(0),
+   fHistDeDx(0),
+   fHistVdrift(0),
+   fIntegrationTimeDeDx(0),
+   fIntegrationTimeVdrift(0),
+   fCutMaxD(5),        // maximal distance in rfi ditection
+   fCutTheta(0.03),    // maximal distan theta
+   fCutMinDir(-0.99)   // direction vector products
+
+{  
+  AliInfo("Default Constructor");  
+}
+
+
+AliTPCcalibTime::AliTPCcalibTime(const Text_t *name, const Text_t *title, ULong64_t TriggerMask, UInt_t StartTime, UInt_t EndTime, Int_t deltaIntegrationTimeDeDx, Int_t deltaIntegrationTimeVdrift)
+  :AliTPCcalibBase(),
+   fTriggerMask(0),
+   fHistDeDxTgl(0),
+   fHistDeDx(0),
+   fHistVdrift(0),
+   fIntegrationTimeDeDx(0),
+   fIntegrationTimeVdrift(0),
+   fCutMaxD(5),        // maximal distance in rfi ditection
+   fCutTheta(0.03),    // maximal distan theta
+   fCutMinDir(-0.99)   // direction vector products
+{
+  
+  SetName(name);
+  SetTitle(title);
+
+  AliInfo("Non Default Constructor");
+
+  fTriggerMask = TriggerMask;
+
+  fIntegrationTimeDeDx = deltaIntegrationTimeDeDx;
+  fIntegrationTimeVdrift = deltaIntegrationTimeVdrift;
+
+  Double_t deltaTime = EndTime - StartTime;
+  
+  Int_t binsVdrift[2] = {deltaTime/deltaIntegrationTimeVdrift, 100};
+  Double_t xminVdrift[2] = {StartTime, -20};
+  Double_t xmaxVdrift[2] = {EndTime, 20};
+  fHistVdrift = new THnSparseF("HistVdrift","vDrift; time;#Delta z",2,binsVdrift,xminVdrift,xmaxVdrift);
+
+  Int_t binsDeDxTgl[3] = {deltaTime/deltaIntegrationTimeDeDx,30,100};
+  Double_t xminDeDxTgl[3] = {StartTime,-1,0.7};
+  Double_t xmaxDeDxTgl[3] = {EndTime,1,1.3};
+  fHistDeDxTgl = new THnSparseF("HistDeDxTgl","dEdx vs tgl;time;tgl;dEdxUp/dEdxLow",3,binsDeDxTgl,xminDeDxTgl,xmaxDeDxTgl); 
+
+  Int_t binsDeDx[2] = {deltaTime/deltaIntegrationTimeDeDx,100};
+  Double_t xminDeDx[2] = {StartTime,1};
+  Double_t xmaxDeDx[2] = {EndTime,100};
+  fHistDeDx = new THnSparseF("HistDeDx","dEdx l;time;dEdx",2,binsDeDx,xminDeDx,xmaxDeDx);
+
+}
+
+
+
+AliTPCcalibTime::~AliTPCcalibTime(){
+  //
+  //
+  //
+}
+
+void AliTPCcalibTime::Process(AliESDEvent *event) {
+  //
+  //
+  //
+  
+  ProcessCosmic(event);
+
+}
+
+
+
+void AliTPCcalibTime::ProcessCosmic(AliESDEvent *event) {
+
+  if (!event) {
+    Printf("ERROR: ESD not available");
+    return;
+  }  
+  if (event->GetTimeStamp() == 0 ) {
+    Printf("no time stamp!");
+    return;
+  }
+
+  if (fTriggerMask != 0 && event->GetTriggerMask() != fTriggerMask) return;
+
+  UInt_t time = event->GetTimeStamp();
+
+  //
+  // Find cosmic pairs
+  // 
+  // Track0 is choosen in upper TPC part
+  // Track1 is choosen in lower TPC part
+  //
+  Int_t ntracks=event->GetNumberOfTracks();
+  if (ntracks==0) return;
+  if (ntracks > 10) return; // temporary debug to remove LASER events
+
+
+  if (GetDebugLevel()>1) printf("Hallo world: Im here\n");
+  AliESDfriend *ESDfriend=static_cast<AliESDfriend*>(event->FindListObject("AliESDfriend"));
+  
+  TObjArray  tpcSeeds(ntracks);
+  Double_t vtxx[3]={0,0,0};
+  Double_t svtxx[3]={0.000001,0.000001,100.};
+  AliESDVertex vtx(vtxx,svtxx);
+  //
+  // track loop
+  //
+  for (Int_t i=0;i<ntracks;++i) {
+   AliESDtrack *track = event->GetTrack(i);
+
+   const AliExternalTrackParam * trackIn = track->GetInnerParam();
+   const AliExternalTrackParam * trackOut = track->GetOuterParam();
+   if (!trackIn) continue;
+   if (!trackOut) continue;
+   
+   AliESDfriendTrack *friendTrack = ESDfriend->GetTrack(i);
+   TObject *calibObject;
+   AliTPCseed *seed = 0;
+   for (Int_t l=0;(calibObject=friendTrack->GetCalibObject(l));++l) {
+     if ((seed=dynamic_cast<AliTPCseed*>(calibObject))) break;
+   }
+   if (seed) { 
+     tpcSeeds.AddAt(seed,i);
+     if (track->GetTPCNcls() > 50) {
+       Double_t meanP = 0.5*(trackIn->GetP() + trackOut->GetP());
+       Double_t TPCsignal = seed->CookdEdxNorm(0.0,0.6,1,0,159,0x0,kTRUE,kTRUE);
+       Double_t vecDeDx[2] = {time, TPCsignal};
+       if (meanP > 12) fHistDeDx->Fill(vecDeDx);
+     }
+   }
+  }
+  
+  if (ntracks<2) return;
+  //
+  // Find pairs
+  //
+  for (Int_t i=0;i<ntracks;++i) {
+    AliESDtrack *track0 = event->GetTrack(i);     
+    // track0 - choosen upper part
+    if (!track0) continue;
+    if (!track0->GetOuterParam()) continue;
+    if (track0->GetOuterParam()->GetAlpha()<0) continue;
+    Double_t d1[3];
+    track0->GetDirection(d1);    
+    for (Int_t j=0;j<ntracks;++j) {
+      if (i==j) continue;
+       AliESDtrack *track1 = event->GetTrack(j);   
+       //track 1 lower part
+       if (!track1) continue;
+       if (!track1->GetOuterParam()) continue;
+       if (track1->GetOuterParam()->GetAlpha()>0) continue;
+       //
+       Double_t d2[3];
+       track1->GetDirection(d2);
+      
+       AliTPCseed * seed0 = (AliTPCseed*) tpcSeeds.At(i);
+       AliTPCseed * seed1 = (AliTPCseed*) tpcSeeds.At(j);
+       if (! seed0) continue;
+       if (! seed1) continue;
+       Float_t dir = (d1[0]*d2[0] + d1[1]*d2[1] + d1[2]*d2[2]);
+       Float_t d0  = track0->GetLinearD(0,0);
+       Float_t d1  = track1->GetLinearD(0,0);
+       //
+       // conservative cuts - convergence to be guarantied
+       // applying before track propagation
+       if (TMath::Abs(d0+d1)>fCutMaxD) continue;   // distance to the 0,0
+       if (dir>fCutMinDir) continue;               // direction vector product
+       Float_t bz = AliTracker::GetBz();
+       Float_t dvertex0[2];   //distance to 0,0
+       Float_t dvertex1[2];   //distance to 0,0 
+       track0->GetDZ(0,0,0,bz,dvertex0);
+       track1->GetDZ(0,0,0,bz,dvertex1);
+       if (TMath::Abs(dvertex0[1])>250) continue;
+       if (TMath::Abs(dvertex1[1])>250) continue;
+       //
+       //
+       //
+       Float_t dmax = TMath::Max(TMath::Abs(d0),TMath::Abs(d1));
+       AliExternalTrackParam param0(*track0);
+       AliExternalTrackParam param1(*track1);
+       //
+       // Propagate using Magnetic field and correct fo material budget
+       //
+       AliTracker::PropagateTrackTo(&param0,dmax+1,0.0005,3,kTRUE);
+       AliTracker::PropagateTrackTo(&param1,dmax+1,0.0005,3,kTRUE);
+       //
+       // Propagate rest to the 0,0 DCA - z should be ignored
+       //
+       Bool_t b0 = param0.PropagateToDCA(&vtx,bz,1000);
+       Bool_t b1 = param1.PropagateToDCA(&vtx,bz,1000);
+       //      
+       param0.GetDZ(0,0,0,bz,dvertex0);
+       param1.GetDZ(0,0,0,bz,dvertex1);
+       //
+       Double_t xyz0[3];//,pxyz0[3];
+       Double_t xyz1[3];//,pxyz1[3];
+       param0.GetXYZ(xyz0);
+       param1.GetXYZ(xyz1);
+       Bool_t isPair = IsPair(&param0,&param1);
+
+       Double_t z0 = track0->GetOuterParam()->GetZ();
+       Double_t z1 = track1->GetOuterParam()->GetZ();
+
+       Double_t z0inner = track0->GetInnerParam()->GetZ();
+       Double_t z1inner = track1->GetInnerParam()->GetZ();
+
+       if (isPair && z0>0 && z0inner>0 && z1<0 && z1inner<0) {
+        Double_t vecVdrift[2] = {time, param0.GetZ() - param1.GetZ()};
+        
+        if (track0->GetTPCNcls() > 80) fHistVdrift->Fill(vecVdrift);
+       }
+       if (isPair && z0 > 0 && z1 > 0) {
+        if (track1->GetTPCNcls()> 110 && track0->GetTPCNcls()> 110 && seed1->CookdEdxNorm(0,0.6,1,0,159,0,kFALSE,kTRUE) > 0) {
+          Double_t vecDeDxTgl[3] = {time, track0->GetTgl(), seed0->CookdEdxNorm(0,0.6,1,0,159,0,kFALSE,kTRUE)/seed1->CookdEdxNorm(0,0.6,1,0,159,0,kFALSE,kTRUE)};
+          fHistDeDxTgl->Fill(vecDeDxTgl);
+        }
+       }
+       
+    } // end 2nd order loop        
+  } // end 1st order loop
+
+}
+
+
+void AliTPCcalibTime::Analyze() {
+
+  TH2D * hVdrift = GetHistVdrift()->Projection(1,0);
+  
+
+}
+
+
+Long64_t AliTPCcalibTime::Merge(TCollection *li) {
+
+  TIterator* iter = li->MakeIterator();
+  AliTPCcalibTime* cal = 0;
+
+  while ((cal = (AliTPCcalibTime*)iter->Next())) {
+    if (!cal->InheritsFrom(AliTPCcalibTime::Class())) {
+      Error("Merge","Attempt to add object of class %s to a %s", cal->ClassName(), this->ClassName());
+      return -1;
+    }
+
+    // add histograms here...
+    fHistDeDxTgl->Add(cal->GetHistDeDxVsTgl());
+    fHistVdrift->Add(cal->GetHistVdrift());
+    fHistDeDx->Add(cal->GetHistDeDx());
+
+  }
+  
+  return 0;
+  
+}
+
+
+
+Bool_t  AliTPCcalibTime::IsPair(AliExternalTrackParam *tr0, AliExternalTrackParam *tr1){
+  //
+  //
+  /*
+  // 0. Same direction - OPOSITE  - cutDir +cutT    
+  TCut cutDir("cutDir","dir<-0.99")
+  // 1. 
+  TCut cutT("cutT","abs(Tr1.fP[3]+Tr0.fP[3])<0.03")
+  //
+  // 2. The same rphi 
+  TCut cutD("cutD","abs(Tr0.fP[0]+Tr1.fP[0])<5")
+  //
+  //
+  //
+  TCut cutPt("cutPt","abs(Tr1.fP[4]+Tr0.fP[4])<1&&abs(Tr0.fP[4])+abs(Tr1.fP[4])<10");  
+  // 1/Pt diff cut
+  */
+  const Double_t *p0 = tr0->GetParameter();
+  const Double_t *p1 = tr1->GetParameter();
+  if (TMath::Abs(p0[3]+p1[3])>fCutTheta) return kFALSE;
+  if (TMath::Abs(p0[0]+p1[0])>fCutMaxD)  return kFALSE;
+  Double_t d0[3], d1[3];
+  tr0->GetDirection(d0);    
+  tr1->GetDirection(d1);       
+  if (d0[0]*d1[0] + d0[1]*d1[1] + d0[2]*d1[2] >fCutMinDir) return kFALSE;
+  //
+  return kTRUE;  
+}
diff --git a/TPC/AliTPCcalibTime.h b/TPC/AliTPCcalibTime.h
new file mode 100644 (file)
index 0000000..4a53967
--- /dev/null
@@ -0,0 +1,68 @@
+#ifndef ALITPCCALIBTIME_H
+#define ALITPCCALIBTIME_H
+
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+#include "AliTPCcalibBase.h"
+#include "TH2F.h"
+#include "TF1.h"
+#include "TArrayD.h"
+#include "TObjArray.h"
+
+class TH1F;
+class TH3F;
+class TH2F;
+class THnSparse;
+class TList;
+class AliESDEvent;
+class AliESDtrack;
+
+#include "TTreeStream.h"
+
+class AliTPCcalibTime:public AliTPCcalibBase {
+public:
+  AliTPCcalibTime(); 
+  AliTPCcalibTime(const Text_t *name, const Text_t *title, ULong64_t TriggerMask, UInt_t StartTime, UInt_t EndTime, Int_t deltaIntegrationTimeDeDx, Int_t deltaIntegrationTimeVdrift);
+  virtual ~AliTPCcalibTime();
+  
+  virtual void           Process(AliESDEvent *event);
+  virtual Long64_t       Merge(TCollection *li);
+  virtual void           Analyze();
+  //
+  void                   ProcessCosmic(AliESDEvent *event);
+  Bool_t                 IsPair(AliExternalTrackParam *tr0, AliExternalTrackParam *tr1);
+  //
+  THnSparse *                 GetHistVdrift(){return (THnSparse*) fHistVdrift;};
+  THnSparse *                 GetHistDeDxVsTgl(){return (THnSparse*) fHistDeDxTgl;};
+  THnSparse *                 GetHistDeDx(){return (THnSparse*) fHistDeDx;};
+
+  
+
+private:
+
+  ULong64_t fTriggerMask;               // select certain trigger within one run
+
+  THnSparse * fHistDeDxTgl;             // dEdx vs. dip angle vs time histogram
+  THnSparse * fHistDeDx;                // dEdx vs. time histogram (cosmics: all particles on Fermi plateau)
+  THnSparse * fHistVdrift;              // drift velocity vs time histogram
+
+  Float_t fIntegrationTimeDeDx;         // required statistics for each dEdx time bin
+  Float_t fIntegrationTimeVdrift;       // required statistics for each Vdrift time bin
+
+  // cuts
+  //
+  Float_t fCutMaxD;     // maximal distance in rfi ditection
+  Float_t fCutTheta;    // maximal distance in theta ditection
+  Float_t fCutMinDir;   // direction vector products
+  AliTPCcalibTime(const AliTPCcalibTime&); 
+  AliTPCcalibTime& operator=(const AliTPCcalibTime&); 
+
+  ClassDef(AliTPCcalibTime, 1); 
+};
+
+#endif
+
+
index 20a500f..e869891 100644 (file)
@@ -16,8 +16,6 @@
 #pragma link C++ class  AliTPCFitPad+;
 #pragma link C++ class  AliTPCCalPadRegion+;
 
-#pragma link C++ class  AliTPCSelectorESD+;
-#pragma link C++ class  AliTPCSelectorTracks+;
 #pragma link C++ class  AliAnaTPCTrackBase+;
 #pragma link C++ class  AliTPCcalibBase+;
 #pragma link C++ class  AliTPCcalibCalib+;
@@ -31,6 +29,7 @@
 #pragma link C++ class AliTPCcalibLaser+;
 #pragma link C++ class AliTPCcalibCosmic+;
 #pragma link C++ class AliTPCLaserTrack+;
+#pragma link C++ class AliTPCcalibTime+;
 
 #endif
 
index 764fac0..b3996db 100644 (file)
@@ -1,7 +1,7 @@
 #-*- Mode: Makefile -*-
 
 SRCS = AliTPCcalibTracksCuts.cxx   AliTPCcalibTracks.cxx   AliTPCcalibTracksGain.cxx  \
-        AliTPCSelectorESD.cxx   AliTPCSelectorTracks.cxx   AliTPCCalPadRegion.cxx AliTPCFitPad.cxx AliAnaTPCTrackBase.cxx AliAnaTPCTrackCalib.cxx AliTPCcalibAlign.cxx AliTPCcalibAlignment.cxx  AliTPCcalibV0.cxx AliTPCCalibKr.cxx AliTPCcalibBase.cxx AliTPCAnalysisTaskcalib.cxx  AliTPCCalibKrTask.cxx AliTPCcalibLaser.cxx AliTPCcalibCosmic.cxx AliTPCLaserTrack.cxx AliTPCcalibCalib.cxx 
+        AliTPCSelectorESD.cxx   AliTPCSelectorTracks.cxx   AliTPCCalPadRegion.cxx AliTPCFitPad.cxx AliAnaTPCTrackBase.cxx AliAnaTPCTrackCalib.cxx AliTPCcalibAlign.cxx AliTPCcalibAlignment.cxx  AliTPCcalibV0.cxx AliTPCCalibKr.cxx AliTPCcalibBase.cxx AliTPCAnalysisTaskcalib.cxx  AliTPCCalibKrTask.cxx AliTPCcalibLaser.cxx AliTPCcalibCosmic.cxx AliTPCLaserTrack.cxx AliTPCcalibCalib.cxx   AliTPCcalibTime.cxx
 
 HDRS:= $(SRCS:.cxx=.h)