]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ITS/ITSSPDVertexDiamondda.cxx
- fixing warnings/coverity
[u/mrichter/AliRoot.git] / ITS / ITSSPDVertexDiamondda.cxx
index 572eba98edd6fbacdb5c0be59e4ebcaa59ccb46c..e95177485cc71540211f93811d8bce67d583e6ad 100644 (file)
@@ -1,24 +1,17 @@
 /*
 Contact: cvetan.cheshkov@cern.ch
-Link: missing
+Link: http://alisoft.cern.ch/viewvc/trunk/ITS/ITSSPDVertexDiamondda.cxx?root=AliRoot&view=log , /afs/cern.ch/user/c/cheshkov/public/ITS/VD_da_test.date , /afs/cern.ch/user/c/cheshkov/public/08000058338016.30.root.date.gz
+Reference Run: 58338
 Run Type: PHYSICS
 DA Type: MON
-Number of events needed: 10000
-Input Files:
-Output Files:
-Trigger types used: PHYSICS
+Number of events needed: 100
+Input Files: GRP/Geometry/Data , ITS/Align/Data , spd_noisy_ocdb , spd_dead_ocdb , TRIGGER/SPD/PITConditions (all the files are taken from SPD daqDetDB)
+Output Files: SPDVertexDiamondDA.root
+Trigger types used: PHYSICS, SPD-F0 
 */
 
-#define X_LIMIT 2.0
-#define Y_LIMIT 2.0
-#define Z_LIMIT 50.0
-#define X_DELTA 0.02
-#define Y_DELTA 0.02
-#define Z_DELTA 0.2
 #define OUTPUT_FILE "SPDVertexDiamondDA.root"
-#define CDB_STORAGE "local://$ALICE_ROOT"
 #define N_EVENTS_AUTOSAVE 50
-#define NFITPARAMS 5
 
 extern "C" {
 #include "daqDA.h"
@@ -32,26 +25,18 @@ extern "C" {
 //int amore::da::Updated(char const*) {}
 #endif
 
-#include <TTree.h>
-#include <TH1.h>
-#include <TH2.h>
-#include <TF2.h>
-#include <TFile.h>
 #include <TPluginManager.h>
 #include <TROOT.h>
-#include <TFitter.h>
+#include <TH1.h>
+#include <TH2.h>
+#include <TSystem.h>
+#include <TGeoGlobalMagField.h>
 
+#include "AliLog.h"
+#include "AliMagF.h"
 #include "AliRawReaderDate.h"
-#include "AliGeomManager.h"
 #include "AliCDBManager.h"
-#include "AliESDVertex.h"
-#include "AliITSDetTypeRec.h"
-#include "AliITSInitGeometry.h"
-#include "AliITSVertexer3DTapan.h"
-
-TF2 *fitFcn = 0x0;
-
-AliESDVertex* FitVertexDiamond(TH2F *hXY, TH1F *hZ);
+#include "AliITSMeanVertexer.h"
 
 int main(int argc, char **argv) {
 
@@ -60,8 +45,6 @@ int main(int argc, char **argv) {
                                        "TStreamerInfo",
                                        "RIO",
                                        "TStreamerInfo()"); 
-  TFitter *minuitFit = new TFitter(NFITPARAMS);
-  TVirtualFitter::SetFitter(minuitFit);
 
   int status;
   if (argc<2) {
@@ -105,29 +88,89 @@ int main(int argc, char **argv) {
   }
   int runNr = atoi(getenv("DATE_RUN_NUMBER"));
 
-  // Histograms initialization
-  TH2F *hXY = new TH2F("hXY","Vertex Diamond (Y vs X)",
-                      2*(Int_t)(X_LIMIT/X_DELTA),-X_LIMIT,X_LIMIT,
-                      2*(Int_t)(Y_LIMIT/Y_DELTA),-Y_LIMIT,Y_LIMIT);
-  TH1F *hZ  = new TH1F("hZ"," Longitudinal Vertex Profile",
-                      2*(Int_t)(Z_LIMIT/Z_DELTA),-Z_LIMIT,Z_LIMIT);
+  // Get the necessary OCDB files from the DAQ detector DB
+  if (gSystem->AccessPathName("localOCDB/GRP/Geometry/Data",kFileExists)) {
+    if (gSystem->mkdir("localOCDB/GRP/Geometry/Data",kTRUE) != 0) {
+      printf("Failed to create directory: localOCDB/GRP/Geometry/Data");
+      return -1;
+    }
+  }
+  status = daqDA_DB_getFile("GRP/Geometry/Data","localOCDB/GRP/Geometry/Data/Run0_999999999_v0_s0.root");
+  if (status) {
+    printf("Failed to get geometry file (GRP/Geometry/Data) from DAQdetDB, status=%d\n", status);
+    return -1;
+  }
+
+  if (gSystem->AccessPathName("localOCDB/ITS/Align/Data",kFileExists)) {
+    if (gSystem->mkdir("localOCDB/ITS/Align/Data",kTRUE) != 0) {
+      printf("Failed to create directory: localOCDB/ITS/Align/Data");
+      return -1;
+    }
+  }
+  status = daqDA_DB_getFile("ITS/Align/Data","localOCDB/ITS/Align/Data/Run0_999999999_v0_s0.root");
+  if (status) {
+    printf("Failed to get its-alignment file (ITS/Align/Data) from DAQdetDB, status=%d\n", status);
+    return -1;
+  }
+
+  if (gSystem->AccessPathName("localOCDB/ITS/Calib/SPDNoisy",kFileExists)) {
+    if (gSystem->mkdir("localOCDB/ITS/Calib/SPDNoisy",kTRUE) != 0) {
+      printf("Failed to create directory: localOCDB/ITS/Calib/SPDNoisy");
+      return -1;
+    }
+  }
+  status = daqDA_DB_getFile("spd_noisy_ocdb","localOCDB/ITS/Calib/SPDNoisy/Run0_999999999_v0_s0.root");
+  if (status) {
+    printf("Failed to get spd file (spd_noisy_ocdb) from DAQdetDB, status=%d\n", status);
+    return -1;
+  }
+
+  if (gSystem->AccessPathName("localOCDB/ITS/Calib/SPDDead",kFileExists)) {
+    if (gSystem->mkdir("localOCDB/ITS/Calib/SPDDead",kTRUE) != 0) {
+      printf("Failed to create directory: localOCDB/ITS/Calib/SPDDead");
+      return -1;
+    }
+  }
+  status = daqDA_DB_getFile("spd_dead_ocdb","localOCDB/ITS/Calib/SPDDead/Run0_999999999_v0_s0.root");
+  if (status) {
+    printf("Failed to get spd file (spd_dead_ocdb) from DAQdetDB, status=%d\n", status);
+    return -1;
+  }
+
+  if (gSystem->AccessPathName("localOCDB/TRIGGER/SPD/PITConditions",kFileExists)) {
+    if (gSystem->mkdir("localOCDB/TRIGGER/SPD/PITConditions",kTRUE) != 0) {
+      printf("Failed to create directory: localOCDB/TRIGGER/SPD/PITConditions");
+      return -1;
+    }
+  }
+  status = daqDA_DB_getFile("TRIGGER/SPD/PITConditions","localOCDB/TRIGGER/SPD/PITConditions/Run0_999999999_v0_s0.root");
+  if (status) {
+    printf("Failed to get spd trigger file (TRIGGER/SPD/PITConditions) from DAQdetDB, status=%d\n", status);
+    return -1;
+  }
+ status = daqDA_DB_getFile("mfchebKGI_sym.root","localOCDB/mfchebKGI_sym.root");
+  if (status) {
+    printf("Failed to get spd file (mfchebKGI_sym.root) from DAQdetDB, status=%d\n", status);
+    return -1;
+  }
 
   // Global initializations
+
+  // The B filed is required in AliITSClusterFinderV2SPD
+  // for the Lorentz angle correction. B set to 0.      
+  TGeoGlobalMagField::Instance()->SetField(new AliMagF("Maps","Maps", 0., 0., AliMagF::k5kGUniform,AliMagF::kBeamTypeAA,-1,2,15,"localOCDB/mfchebKGI_sym.root"));  
+  AliLog::SetGlobalLogLevel(AliLog::kError);
   AliCDBManager *man = AliCDBManager::Instance();
-  man->SetDefaultStorage(CDB_STORAGE);
+  man->SetDefaultStorage("local://localOCDB");
   man->SetRun(runNr);
-  AliGeomManager::LoadGeometry("geometry.root");
-  AliGeomManager::ApplyAlignObjsFromCDB("ITS");
-
-  // ITS initializations
-  AliITSInitGeometry initgeom;
-  AliITSgeom *geom = initgeom.CreateAliITSgeom();
-  printf("Geometry name: %s\n",(initgeom.GetGeometryName()).Data());
 
-  AliITSDetTypeRec *detTypeRec = new AliITSDetTypeRec();
-  detTypeRec->SetITSgeom(geom);
-  detTypeRec->SetDefaults();
-  detTypeRec->SetDefaultClusterFindersV2(kTRUE);
+  // Init mean vertexer
+  AliITSMeanVertexer *mv = new AliITSMeanVertexer();
+  if (!mv->Init()) {
+    printf("Initialization of mean vertexer object failed ! Check the log for details");
+    return -1;
+  }
 
   // Initialization of AMORE sender
 #ifdef ALI_AMORE
@@ -173,43 +216,21 @@ int main(int argc, char **argv) {
       nevents_physics++;
       AliRawReader *rawReader = new AliRawReaderDate((void*)event);
 
-      // Run SPD cluster finder
-      TTree* clustersTree = new TTree("TreeR", "Reconstructed Points Container"); //make a tree
-      detTypeRec->DigitsToRecPoints(rawReader,clustersTree,"SPD");
-
-      // Run vertex-finder
-      AliITSVertexer3DTapan *vertexer = new AliITSVertexer3DTapan(geom,1000);
-      AliESDVertex *vtx = vertexer->FindVertexForCurrentEvent(clustersTree);
-
-      if (TMath::Abs(vtx->GetChi2()) < 0.1) {
-       // Fill the vertex into the histos
-       nevents_with_vertex++;
-       hXY->Fill(vtx->GetXv(),vtx->GetYv());
-       hZ->Fill(vtx->GetZv());
-
-       // Auto save
-       if ((nevents_with_vertex%N_EVENTS_AUTOSAVE) == 0) {
-         TFile outFile(OUTPUT_FILE, "update");
-         AliESDVertex *fitVtx = FitVertexDiamond(hXY,hZ);
-         if (fitVtx) {
-           fitVtx->Write(fitVtx->GetName(),TObject::kOverwrite);
-           TH1 *fithXY = fitFcn->CreateHistogram();
-           fithXY->Write(fithXY->GetName(),TObject::kOverwrite);
-           delete fithXY;
-         }
-         hXY->Write(hXY->GetName(),TObject::kOverwrite);
-         hZ->Write(hZ->GetName(),TObject::kOverwrite);
-         outFile.Close();
-         delete fitVtx;
-       }
-      }
+      // Run mean-vertexer reco
+      if (mv->Reconstruct(rawReader)) nevents_with_vertex++;
 
-      delete vtx;
-      delete vertexer;
+      // Auto save
+      if ((nevents_physics%N_EVENTS_AUTOSAVE) == 0) {
+       mv->WriteVertices(OUTPUT_FILE);
 
-      delete clustersTree;
-      delete rawReader;
+#ifdef ALI_AMORE
+      // send the histos to AMORE pool
+       printf("AMORE send status: %d\n",vtxAmore.Send(mv->GetVertexXY()->GetName(),mv->GetVertexXY()));
+       printf("AMORE send status: %d\n",vtxAmore.Send(mv->GetVertexZ()->GetName(),mv->GetVertexZ()));
+#endif
+      }
 
+      delete rawReader;
     }
     
     /* free resources */
@@ -221,33 +242,16 @@ int main(int argc, char **argv) {
       break;
     }
   }
-  
-  if (detTypeRec) delete detTypeRec;
-
-  // Store the final histograms
-  TFile outFile(OUTPUT_FILE, "update");
-  if (nevents_with_vertex > N_EVENTS_AUTOSAVE) { 
-    // Fit XY & Z histograms
-    AliESDVertex *fitVtx = FitVertexDiamond(hXY,hZ);
-    if (fitVtx) {
-      fitVtx->Write(fitVtx->GetName(),TObject::kOverwrite);
-      TH1 *fithXY = fitFcn->CreateHistogram();
-      fithXY->Write(fithXY->GetName(),TObject::kOverwrite);
-      delete fithXY;
-    }
-    delete fitVtx;
-  }
-  hXY->Write(hXY->GetName(),TObject::kOverwrite);
-  hZ->Write(hZ->GetName(),TObject::kOverwrite);
-  outFile.Close();
+
+  mv->WriteVertices(OUTPUT_FILE);
 
 #ifdef ALI_AMORE
   // send the histos to AMORE pool
-  printf("AMORE send status: %d",vtxAmore.Send(hXY->GetName(),hXY));
+  printf("AMORE send status: %d\n",vtxAmore.Send(mv->GetVertexXY()->GetName(),mv->GetVertexXY()));
+  printf("AMORE send status: %d\n",vtxAmore.Send(mv->GetVertexZ()->GetName(),mv->GetVertexZ()));
 #endif
 
-  delete minuitFit;
-  TVirtualFitter::SetFitter(0);
+  delete mv;
 
   /* write report */
   printf("Run #%s, received %d events with vertex, out of %d physics and out of %d total events\n",getenv("DATE_RUN_NUMBER"),nevents_with_vertex,nevents_physics,nevents_total);
@@ -261,42 +265,3 @@ int main(int argc, char **argv) {
   
   return status;
 }
-
-Double_t fitFunction(Double_t *x, Double_t *par) {
-
-  Double_t t1 =   x[0] - par[1];
-  Double_t t2 =   x[1] - par[2];
-
-  return par[0]*TMath::Exp(-0.5*(t1*t1/(par[3]*par[3])+t2*t2/(par[4]*par[4])));
-}
-
-AliESDVertex* FitVertexDiamond(TH2F *hXY, TH1F *hZ)
-{
-
-  if (!fitFcn) {
-    fitFcn = new TF2("fitFcn",fitFunction,
-                    -X_LIMIT,X_LIMIT,
-                    -Y_LIMIT,Y_LIMIT,NFITPARAMS);
-    fitFcn->SetNpx(2*(Int_t)(X_LIMIT/X_DELTA));
-    fitFcn->SetNpy(2*(Int_t)(Y_LIMIT/Y_DELTA));
-    fitFcn->SetParameters(hXY->GetMaximum(),0,0,hXY->GetRMS(1),hXY->GetRMS(2));
-    fitFcn->Update();
-  }
-
-  if (hXY->Fit("fitFcn","L0V+") != 0) {
-    printf("XY fit failed!");
-    return 0x0;
-  }
-  
-  Double_t pos[3],poserr[3];
-  pos[0] = fitFcn->GetParameter(1);
-  pos[1] = fitFcn->GetParameter(2);
-  poserr[0] = fitFcn->GetParameter(3);
-  poserr[1] = fitFcn->GetParameter(4);
-
-  // Could be replaced by something more robust...
-  pos[2] = hZ->GetMean();
-  poserr[2] = hZ->GetRMS();
-  return new AliESDVertex(pos,poserr);
-}