]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliReconstruction.cxx
Example train to produce HF candidates
[u/mrichter/AliRoot.git] / STEER / AliReconstruction.cxx
index ec1fb880cbc1439f78c94dca29a92ab58622ce81..ff6e2b5f3f8133e186cb64c4ec10d2a7b7fe5b76 100644 (file)
 //                                                                           //
 ///////////////////////////////////////////////////////////////////////////////
 
+#include <TArrayD.h>
 #include <TArrayF.h>
+#include <TArrayS.h>
+#include <TChain.h>
 #include <TFile.h>
-#include <TList.h>
-#include <TSystem.h>
-#include <TROOT.h>
-#include <TPluginManager.h>
+#include <TGeoGlobalMagField.h>
 #include <TGeoManager.h>
+#include <TList.h>
 #include <TLorentzVector.h>
-#include <TArrayS.h>
-#include <TArrayD.h>
-#include <TObjArray.h>
 #include <TMap.h>
-#include <TChain.h>
+#include <TObjArray.h>
+#include <TPRegexp.h>
+#include <TParameter.h>
+#include <TPluginManager.h>
 #include <TProof.h>
 #include <TProofOutputFile.h>
-#include <TParameter.h>
+#include <TROOT.h>
+#include <TSystem.h>
 
-#include "AliReconstruction.h"
+#include "AliAlignObj.h"
+#include "AliCDBEntry.h"
+#include "AliCDBManager.h"
+#include "AliCDBStorage.h"
+#include "AliCTPRawStream.h"
+#include "AliCascadeVertexer.h"
+#include "AliCentralTrigger.h"
 #include "AliCodeTimer.h"
-#include "AliReconstructor.h"
-#include "AliLog.h"
-#include "AliRunLoader.h"
-#include "AliRun.h"
-#include "AliRawReaderFile.h"
-#include "AliRawReaderDate.h"
-#include "AliRawReaderRoot.h"
-#include "AliRawEventHeaderBase.h"
-#include "AliRawEvent.h"
+#include "AliDAQ.h"
+#include "AliDetectorRecoParam.h"
+#include "AliESDCaloCells.h"
+#include "AliESDCaloCluster.h"
 #include "AliESDEvent.h"
 #include "AliESDMuonTrack.h"
-#include "AliESDfriend.h"
+#include "AliESDPmdTrack.h"
+#include "AliESDTagCreator.h"
 #include "AliESDVertex.h"
 #include "AliESDcascade.h"
+#include "AliESDfriend.h"
 #include "AliESDkink.h"
-#include "AliESDtrack.h"
-#include "AliESDCaloCluster.h"
-#include "AliESDCaloCells.h"
-#include "AliMultiplicity.h"
-#include "AliTracker.h"
-#include "AliVertexer.h"
-#include "AliVertexerTracks.h"
-#include "AliV0vertexer.h"
-#include "AliCascadeVertexer.h"
-#include "AliHeader.h"
-#include "AliGenEventHeader.h"
-#include "AliPID.h"
 #include "AliESDpid.h"
 #include "AliESDtrack.h"
-#include "AliESDPmdTrack.h"
-
-#include "AliESDTagCreator.h"
-
+#include "AliESDtrack.h"
+#include "AliEventInfo.h"
+#include "AliGRPObject.h"
+#include "AliGRPRecoParam.h"
+#include "AliGenEventHeader.h"
 #include "AliGeomManager.h"
-#include "AliTrackPointArray.h"
-#include "AliCDBManager.h"
-#include "AliCDBStorage.h"
-#include "AliCDBEntry.h"
-#include "AliAlignObj.h"
-
-#include "AliCentralTrigger.h"
-#include "AliTriggerConfiguration.h"
-#include "AliTriggerClass.h"
-#include "AliTriggerCluster.h"
-#include "AliCTPRawStream.h"
-
-#include "AliQADataMakerRec.h" 
 #include "AliGlobalQADataMaker.h" 
-#include "AliQA.h"
-#include "AliQADataMakerSteer.h"
-
+#include "AliHeader.h"
+#include "AliLog.h"
+#include "AliMagF.h"
+#include "AliMultiplicity.h"
+#include "AliPID.h"
 #include "AliPlaneEff.h"
-
-#include "AliSysInfo.h" // memory snapshots
+#include "AliQA.h"
+#include "AliQADataMakerRec.h" 
+#include "AliQAManager.h"
+#include "AliRawEvent.h"
+#include "AliRawEventHeaderBase.h"
 #include "AliRawHLTManager.h"
-
-#include "AliMagFCheb.h"
-
-#include "AliDetectorRecoParam.h"
-#include "AliGRPRecoParam.h"
+#include "AliRawReaderDate.h"
+#include "AliRawReaderFile.h"
+#include "AliRawReaderRoot.h"
+#include "AliReconstruction.h"
+#include "AliReconstructor.h"
+#include "AliRun.h"
 #include "AliRunInfo.h"
-#include "AliEventInfo.h"
-
-#include "AliDAQ.h"
-
-#include "AliGRPObject.h"
+#include "AliRunLoader.h"
+#include "AliSysInfo.h" // memory snapshots
+#include "AliTrackPointArray.h"
+#include "AliTracker.h"
+#include "AliTriggerClass.h"
+#include "AliTriggerCluster.h"
+#include "AliTriggerConfiguration.h"
+#include "AliV0vertexer.h"
+#include "AliVertexer.h"
+#include "AliVertexerTracks.h"
 
 ClassImp(AliReconstruction)
 
@@ -203,7 +195,6 @@ const char* AliReconstruction::fgkDetectorName[AliReconstruction::kNDetectors] =
 AliReconstruction::AliReconstruction(const char* gAliceFilename) :
   TSelector(),
   fUniformField(kFALSE),
-  fForcedFieldMap(NULL),
   fRunVertexFinder(kTRUE),
   fRunVertexFinderTracks(kTRUE),
   fRunHLTTracking(kFALSE),
@@ -245,6 +236,8 @@ AliReconstruction::AliReconstruction(const char* gAliceFilename) :
 
   fRecoParam(),
 
+  fSPDTrackleter(NULL),
+
   fDiamondProfileSPD(NULL),
   fDiamondProfile(NULL),
   fDiamondProfileTPC(NULL),
@@ -253,16 +246,18 @@ AliReconstruction::AliReconstruction(const char* gAliceFilename) :
 
   fAlignObjArray(NULL),
   fCDBUri(),
+  fQARefUri(),
   fSpecCDBUri(), 
   fInitCDBCalled(kFALSE),
   fSetRunNumberFromDataCalled(kFALSE),
   fQADetectors("ALL"), 
-  fQASteer(NULL),  
+  fQAManager(NULL),  
   fQATasks("ALL"), 
   fRunQA(kTRUE),  
   fRunGlobalQA(kTRUE),
   fSameQACycle(kFALSE),
-
+  fInitQACalled(kFALSE), 
+  fWriteQAExpertData(kTRUE), 
   fRunPlaneEff(kFALSE),
 
   fesd(NULL),
@@ -296,7 +291,6 @@ AliReconstruction::AliReconstruction(const char* gAliceFilename) :
 AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
   TSelector(),
   fUniformField(rec.fUniformField),
-  fForcedFieldMap(NULL),
   fRunVertexFinder(rec.fRunVertexFinder),
   fRunVertexFinderTracks(rec.fRunVertexFinderTracks),
   fRunHLTTracking(rec.fRunHLTTracking),
@@ -338,6 +332,8 @@ AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
 
   fRecoParam(rec.fRecoParam),
 
+  fSPDTrackleter(NULL),
+
   fDiamondProfileSPD(rec.fDiamondProfileSPD),
   fDiamondProfile(rec.fDiamondProfile),
   fDiamondProfileTPC(rec.fDiamondProfileTPC),
@@ -346,15 +342,18 @@ AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
 
   fAlignObjArray(rec.fAlignObjArray),
   fCDBUri(rec.fCDBUri),
+  fQARefUri(rec.fQARefUri),
   fSpecCDBUri(), 
   fInitCDBCalled(rec.fInitCDBCalled),
   fSetRunNumberFromDataCalled(rec.fSetRunNumberFromDataCalled),
   fQADetectors(rec.fQADetectors), 
-  fQASteer(NULL),  
+  fQAManager(NULL),  
   fQATasks(rec.fQATasks), 
   fRunQA(rec.fRunQA),  
   fRunGlobalQA(rec.fRunGlobalQA),
   fSameQACycle(rec.fSameQACycle),
+  fInitQACalled(rec.fInitQACalled),
+  fWriteQAExpertData(rec.fWriteQAExpertData), 
   fRunPlaneEff(rec.fRunPlaneEff),
 
   fesd(NULL),
@@ -402,7 +401,6 @@ AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec)
   if(&rec == this) return *this;
 
   fUniformField          = rec.fUniformField;
-  fForcedFieldMap        = NULL;
   fRunVertexFinder       = rec.fRunVertexFinder;
   fRunVertexFinderTracks = rec.fRunVertexFinderTracks;
   fRunHLTTracking        = rec.fRunHLTTracking;
@@ -461,6 +459,8 @@ AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec)
     fQACycles[iDet] = rec.fQACycles[iDet];
     fQAWriteExpert[iDet] = rec.fQAWriteExpert[iDet] ;
   } 
+
+  delete fSPDTrackleter; fSPDTrackleter = NULL;
     
   delete fDiamondProfileSPD; fDiamondProfileSPD = NULL;
   if (rec.fDiamondProfileSPD) fDiamondProfileSPD = new AliESDVertex(*rec.fDiamondProfileSPD);
@@ -476,15 +476,18 @@ AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec)
   delete fAlignObjArray; fAlignObjArray = NULL;
 
   fCDBUri        = "";
+  fQARefUri      = rec.fQARefUri;
   fSpecCDBUri.Delete();
   fInitCDBCalled               = rec.fInitCDBCalled;
   fSetRunNumberFromDataCalled  = rec.fSetRunNumberFromDataCalled;
   fQADetectors                 = rec.fQADetectors;
-  fQASteer                     = NULL;  
+  fQAManager                     = NULL;  
   fQATasks                     = rec.fQATasks; 
   fRunQA                       = rec.fRunQA;  
   fRunGlobalQA                 = rec.fRunGlobalQA;
   fSameQACycle                 = rec.fSameQACycle;
+  fInitQACalled                = rec.fInitQACalled;
+  fWriteQAExpertData           = rec.fWriteQAExpertData;
   fRunPlaneEff                 = rec.fRunPlaneEff;
 
   fesd     = NULL;
@@ -508,17 +511,93 @@ AliReconstruction::~AliReconstruction()
 
   CleanUp();
   delete fGRPData;
-  delete fForcedFieldMap;
   fOptions.Delete();
   if (fAlignObjArray) {
     fAlignObjArray->Delete();
     delete fAlignObjArray;
   }
   fSpecCDBUri.Delete();
-  delete fQASteer;
+  delete fQAManager;
   AliCodeTimer::Instance()->Print();
 }
 
+//_____________________________________________________________________________
+void AliReconstruction::InitQA()
+{
+  //Initialize the QA and start of cycle 
+  AliCodeTimerAuto("");
+  
+  if (fInitQACalled) return;
+  fInitQACalled = kTRUE;
+  
+  fQAManager = AliQAManager::QAManager("rec") ; 
+  if (fWriteQAExpertData)
+    fQAManager->SetWriteExpert() ; 
+  if (fQAManager->IsDefaultStorageSet()) {
+    AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+    AliWarning("Default QA reference storage has been already set !");
+    AliWarning(Form("Ignoring the default storage declared in AliReconstruction: %s",fQARefUri.Data()));
+    AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+    fQARefUri = fQAManager->GetDefaultStorage()->GetURI();
+  } else {
+    if (fQARefUri.Length() > 0) {
+       AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+       AliDebug(2, Form("Default QA reference storage is set to: %s", fQARefUri.Data()));
+       AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+      } else {
+        fQARefUri="local://$ALICE_ROOT/QAref";
+        AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+        AliWarning("Default QA refeference storage not yet set !!!!");
+        AliWarning(Form("Setting it now to: %s", fQARefUri.Data()));
+        AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+               
+      }
+    fQAManager->SetDefaultStorage(fQARefUri);
+  }
+  
+  if (fRunQA) {
+  fQAManager->SetActiveDetectors(fQADetectors) ; 
+  for (Int_t det = 0 ; det < AliQA::kNDET ; det++) {
+    fQAManager->SetCycleLength(AliQA::DETECTORINDEX_t(det), fQACycles[det]) ;  
+    fQAManager->SetWriteExpert(AliQA::DETECTORINDEX_t(det)) ;
+  }
+  if (!fRawReader && fQATasks.Contains(AliQA::kRAWS))
+    fQATasks.ReplaceAll(Form("%d",AliQA::kRAWS), "") ;
+  fQAManager->SetTasks(fQATasks) ; 
+  fQAManager->InitQADataMaker(AliCDBManager::Instance()->GetRun()) ; 
+  }
+  if (fRunGlobalQA) {
+    Bool_t sameCycle = kFALSE ;
+    AliQADataMaker *qadm = fQAManager->GetQADataMaker(AliQA::kGLOBAL);
+    AliInfo(Form("Initializing the global QA data maker"));
+    if (fQATasks.Contains(Form("%d", AliQA::kRECPOINTS))) {
+      qadm->StartOfCycle(AliQA::kRECPOINTS, AliCDBManager::Instance()->GetRun(), sameCycle) ; 
+      TObjArray **arr=qadm->Init(AliQA::kRECPOINTS);
+      AliTracker::SetResidualsArray(arr);
+      sameCycle = kTRUE ; 
+    }
+    if (fQATasks.Contains(Form("%d", AliQA::kESDS))) {
+      qadm->StartOfCycle(AliQA::kESDS, AliCDBManager::Instance()->GetRun(), sameCycle) ; 
+      qadm->Init(AliQA::kESDS);
+    }
+  }
+    AliSysInfo::AddStamp("InitQA") ; 
+}
+
+//_____________________________________________________________________________
+void AliReconstruction::MergeQA()
+{
+  //Initialize the QA and start of cycle 
+  AliCodeTimerAuto("") ;
+  if ( ! fQAManager ) {
+    AliFatal("Hum... this should not happen") ; 
+  } else { 
+   fQAManager->Merge(AliCDBManager::Instance()->GetRun()) ; 
+  }
+  AliSysInfo::AddStamp("MergeQA") ; 
+}
+  
 //_____________________________________________________________________________
 void AliReconstruction::InitCDB()
 {
@@ -546,7 +625,7 @@ void AliReconstruction::InitCDB()
        AliDebug(2, Form("Default CDB storage is set to: %s", fCDBUri.Data()));
        AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
     } else {
-       fCDBUri="local://$ALICE_ROOT";
+       fCDBUri="local://$ALICE_ROOT/OCDB";
        AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
        AliWarning("Default CDB storage not yet set !!!!");
        AliWarning(Form("Setting it now to: %s", fCDBUri.Data()));
@@ -577,6 +656,15 @@ void AliReconstruction::SetDefaultStorage(const char* uri) {
 
 }
 
+//_____________________________________________________________________________
+void AliReconstruction::SetQARefDefaultStorage(const char* uri) {
+  // Store the desired default CDB storage location
+  // Activate it later within the Run() method
+  
+  fQARefUri = uri;
+  AliQA::SetQARefStorage(fQARefUri.Data()) ;
+  
+}
 //_____________________________________________________________________________
 void AliReconstruction::SetSpecificStorage(const char* calibType, const char* uri) {
 // Store a detector-specific CDB storage location
@@ -798,7 +886,10 @@ void AliReconstruction::SetRecoParam(const char* detector, AliDetectorRecoParam
 }
 
 //_____________________________________________________________________________
-Bool_t AliReconstruction::SetFieldMap(Float_t l3Current, Float_t diCurrent, Float_t factor, const char *path) {
+Bool_t AliReconstruction::SetFieldMap(Float_t l3Cur, Float_t diCur, Float_t l3Pol, 
+                                     Float_t diPol, Float_t beamenergy, 
+                                     const Char_t *beamtype, const Char_t *path) 
+{
   //------------------------------------------------
   // The magnetic field map, defined externally...
   // L3 current 30000 A  -> 0.5 T
@@ -812,53 +903,69 @@ Bool_t AliReconstruction::SetFieldMap(Float_t l3Current, Float_t diCurrent, Floa
 
   const Float_t tolerance=0.03; // relative current tolerance
   const Float_t zero=77.;       // "zero" current (A)
-
-  Int_t map=0;
-  Bool_t dipoleON=kFALSE;
-
-  TString s=(factor < 0) ? "L3: -" : "L3: +";
-
-  l3Current = TMath::Abs(l3Current);
-  if (TMath::Abs(l3Current-l3NominalCurrent1)/l3NominalCurrent1 < tolerance) {
-    map=AliMagFCheb::k5kG;
-    s+="0.5 T;  ";
-  } else
-  if (TMath::Abs(l3Current-l3NominalCurrent2)/l3NominalCurrent2 < tolerance) {
-    map=AliMagFCheb::k2kG;
-    s+="0.2 T;  ";
-  } else
-  if (l3Current < zero) {
-    map=AliMagFCheb::k2kG;
-    s+="0.0 T;  ";
-    factor=0.;                  // in fact, this is a global factor...
+  //
+  TString s=(l3Pol < 0) ? "L3: -" : "L3: +";
+  //
+  AliMagF::BMap_t map = AliMagF::k5kG;
+  //
+  double fcL3,fcDip;
+  //
+  l3Cur = TMath::Abs(l3Cur);
+  if (TMath::Abs(l3Cur-l3NominalCurrent1)/l3NominalCurrent1 < tolerance) {
+    fcL3 = l3Cur/l3NominalCurrent1;
+    map  = AliMagF::k5kG;
+    s   += "0.5 T;  ";
+  } else if (TMath::Abs(l3Cur-l3NominalCurrent2)/l3NominalCurrent2 < tolerance) {
+    fcL3 = l3Cur/l3NominalCurrent2;
+    map  = AliMagF::k2kG;
+    s   += "0.2 T;  ";
+  } else if (l3Cur <= zero) {
+    fcL3 = 0;
+    map  = AliMagF::k5kGUniform;
+    s   += "0.0 T;  ";
     fUniformField=kTRUE;        // track with the uniform (zero) B field
   } else {
-    AliError(Form("Wrong L3 current (%f A)!",l3Current));
+    AliError(Form("Wrong L3 current (%f A)!",l3Cur));
     return kFALSE;
   }
-
-  diCurrent = TMath::Abs(diCurrent);
-  if (TMath::Abs(diCurrent-diNominalCurrent)/diNominalCurrent < tolerance) {
+  //
+  diCur = TMath::Abs(diCur);
+  if (TMath::Abs(diCur-diNominalCurrent)/diNominalCurrent < tolerance) {
     // 3% current tolerance...
-    dipoleON=kTRUE;
-    s+="Dipole ON";
-  } else
-  if (diCurrent < zero) { // some small current..
-    dipoleON=kFALSE;
-    s+="Dipole OFF";
+    fcDip = diCur/diNominalCurrent;
+    s    += "Dipole ON";
+  } else if (diCur <= zero) { // some small current..
+    fcDip = 0.;
+    s    += "Dipole OFF";
   } else {
-    AliError(Form("Wrong dipole current (%f A)!",diCurrent));
+    AliError(Form("Wrong dipole current (%f A)!",diCur));
     return kFALSE;
   }
-
-  delete fForcedFieldMap;
-  fForcedFieldMap=
-    new AliMagFCheb("B field map  ",s,2,factor,10.,map,dipoleON,path);
-
-  fForcedFieldMap->Print();
-
-  AliTracker::SetFieldMap(fForcedFieldMap,fUniformField);    
-
+  //
+  if (l3Pol!=diPol && (map==AliMagF::k5kG || map==AliMagF::k2kG) && fcDip!=0) {
+    AliError("L3 and Dipole polarities must be the same");
+    return kFALSE;
+  }
+  //
+  if (l3Pol<0) fcL3  = -fcL3;
+  if (diPol<0) fcDip = -fcDip;
+  //
+  AliMagF::BeamType_t btype = AliMagF::kNoBeamField;
+  TString btypestr = beamtype;
+  btypestr.ToLower();
+  TPRegexp protonBeam("(proton|p)\\s*-?\\s*\\1");
+  TPRegexp ionBeam("(lead|pb|ion|a)\\s*-?\\s*\\1");
+  if (btypestr.Contains(ionBeam)) btype = AliMagF::kBeamTypeAA;
+  else if (btypestr.Contains(protonBeam)) btype = AliMagF::kBeamTypepp;
+  else {
+    AliInfo(Form("Cannot determine the beam type from %s, assume no LHC magnet field",beamtype));
+  }
+  
+  AliMagF* fld = new AliMagF("MagneticFieldMap", s.Data(), 2, fcL3, fcDip, 10., map, path, 
+                            btype,beamenergy);
+  TGeoGlobalMagField::Instance()->SetField( fld );
+  TGeoGlobalMagField::Instance()->Lock();
+  //
   return kTRUE;
 }
 
@@ -911,6 +1018,8 @@ Bool_t AliReconstruction::InitGRP() {
     AliError("GRP/GRP/Data entry:  missing value for the beam energy ! Using 0");
     beamEnergy = 0;
   }
+  // energy is provided in MeV*120
+  beamEnergy /= 120E3;
 
   TString runType = fGRPData->GetRunType();
   if (runType==AliGRPObject::GetInvalidString()) {
@@ -925,7 +1034,6 @@ Bool_t AliReconstruction::InitGRP() {
   }
 
   fRunInfo = new AliRunInfo(lhcState, beamType, beamEnergy, runType, activeDetectors);
-  printf("qqqqqqqqqqqqqqqqqqqqqqq %s %s %f %s %d\n", lhcState.Data(), beamType.Data(), beamEnergy, runType.Data(), activeDetectors);
   fRunInfo->Dump();
 
 
@@ -965,20 +1073,17 @@ Bool_t AliReconstruction::InitGRP() {
   AliInfo("===================================================================================");
 
   //*** Dealing with the magnetic field map
-  if (AliTracker::GetFieldMap()) {
-    AliInfo("Running with the externally set B field !");
-  } else {
+  if ( TGeoGlobalMagField::Instance()->IsLocked() ) {AliInfo("Running with the externally locked B field !");}
+  else {
     // Construct the field map out of the information retrieved from GRP.
-
     Bool_t ok = kTRUE;
-
     // L3
     Float_t l3Current = fGRPData->GetL3Current((AliGRPObject::Stats)0);
     if (l3Current == AliGRPObject::GetInvalidFloat()) {
       AliError("GRP/GRP/Data entry:  missing value for the L3 current !");
       ok = kFALSE;
     }
-
+    
     Char_t l3Polarity = fGRPData->GetL3Polarity();
     if (l3Polarity == AliGRPObject::GetInvalidChar()) {
       AliError("GRP/GRP/Data entry:  missing value for the L3 polarity !");
@@ -1028,27 +1133,14 @@ Bool_t AliReconstruction::InitGRP() {
     */
 
     if (ok) { 
-       Float_t l3Cur=TMath::Abs(l3Current);
-       Float_t diCur=TMath::Abs(diCurrent);
-       Float_t l3Pol=l3Polarity;
-       //       Float_t l3Cur=TMath::Abs(atof(l3Current->GetName()));
-       //Float_t diCur=TMath::Abs(atof(diCurrent->GetName()));
-       //Float_t l3Pol=atof(l3Polarity->GetName());
-       Float_t factor=1.;
-       if (l3Pol != 0.) factor=-1.;
-    
-
-      if (!SetFieldMap(l3Cur, diCur, factor)) {
-         AliFatal("Failed to creat a B field map ! Exiting...");
-      }
+      if ( !SetFieldMap(l3Current, diCurrent, l3Polarity ? -1:1, diPolarity ? -1:1) )
+       AliFatal("Failed to creat a B field map ! Exiting...");
       AliInfo("Running with the B field constructed out of GRP !");
     }
-    else {
-      AliFatal("B field is neither set nor constructed from GRP ! Exitig...");
-    }
-
+    else AliFatal("B field is neither set nor constructed from GRP ! Exitig...");
+    
   }
-
+  
   //*** Get the diamond profiles from OCDB
   entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexSPD");
   if (entry) {
@@ -1256,15 +1348,16 @@ void AliReconstruction::Begin(TTree *)
   }
   AliSysInfo::AddStamp("InitRecoParams");
 
-  if (fInput) {
+  if (fInput && gProof) {
     if (reco) *reco = *this;
-    fInput->Add(gGeoManager);
+
+    gProof->AddInputData(gGeoManager,kTRUE);
     gGeoManager = NULL;
-    fInput->Add(const_cast<TMap*>(AliCDBManager::Instance()->GetEntryCache()));
+    gProof->AddInputData(const_cast<TMap*>(AliCDBManager::Instance()->GetEntryCache()),kTRUE);
     fInput->Add(new TParameter<Int_t>("RunNumber",AliCDBManager::Instance()->GetRun()));
-    AliMagF *magFieldMap = (AliMagF*)AliTracker::GetFieldMap();
+    AliMagF *magFieldMap = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
     magFieldMap->SetName("MagneticFieldMap");
-    fInput->Add(magFieldMap);
+    gProof->AddInputData(magFieldMap,kTRUE);
   }
 
 }
@@ -1296,7 +1389,7 @@ void AliReconstruction::SlaveBegin(TTree*)
       }
     }
     if (AliMagF *map = (AliMagF*)fInput->FindObject("MagneticFieldMap")) {
-      AliTracker::SetFieldMap(map,fUniformField);
+      TGeoGlobalMagField::Instance()->SetField(map);
     }
     if (TNamed *outputFileName = (TNamed *) fInput->FindObject("PROOF_OUTPUTFILE")) {
       outProofFile = new TProofOutputFile(gSystem->BaseName(TUrl(outputFileName->GetTitle()).GetFile()));
@@ -1399,35 +1492,8 @@ void AliReconstruction::SlaveBegin(TTree*)
   
   //QA
   //Initialize the QA and start of cycle 
-  if (fRunQA) {
-    fQASteer = new AliQADataMakerSteer("rec") ; 
-    fQASteer->SetActiveDetectors(fQADetectors) ; 
-    for (Int_t det = 0 ; det < AliQA::kNDET ; det++) {
-      fQASteer->SetCycleLength(AliQA::DETECTORINDEX_t(det), fQACycles[det]) ;  
-      fQASteer->SetWriteExpert(AliQA::DETECTORINDEX_t(det)) ;
-    }
-    if (!fRawReader && fQATasks.Contains(AliQA::kRAWS))
-      fQATasks.ReplaceAll(Form("%d",AliQA::kRAWS), "") ;
-    fQASteer->SetTasks(fQATasks) ; 
-    fQASteer->InitQADataMaker(AliCDBManager::Instance()->GetRun()) ; 
-  }
-  
-  if (fRunGlobalQA) {
-    Bool_t sameCycle = kFALSE ;
-    if (!fQASteer) fQASteer = new AliQADataMakerSteer("rec") ; 
-    AliQADataMaker *qadm = fQASteer->GetQADataMaker(AliQA::kGLOBAL);
-    AliInfo(Form("Initializing the global QA data maker"));
-    if (fQATasks.Contains(Form("%d", AliQA::kRECPOINTS))) {
-      qadm->StartOfCycle(AliQA::kRECPOINTS, AliCDBManager::Instance()->GetRun(), sameCycle) ; 
-      TObjArray **arr=qadm->Init(AliQA::kRECPOINTS);
-      AliTracker::SetResidualsArray(arr);
-      sameCycle = kTRUE ; 
-    }
-    if (fQATasks.Contains(Form("%d", AliQA::kESDS))) {
-      qadm->StartOfCycle(AliQA::kESDS, AliCDBManager::Instance()->GetRun(), sameCycle) ; 
-      qadm->Init(AliQA::kESDS);
-    }
-  }
+  if (fRunQA || fRunGlobalQA) 
+    InitQA() ; 
 
   //Initialize the Plane Efficiency framework
   if (fRunPlaneEff && !InitPlaneEff()) {
@@ -1511,7 +1577,7 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
         const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet);
         reconstructor->SetRecoParam(par);
         if (fRunQA) {
-          fQASteer->SetRecoParam(iDet, par) ; 
+          fQAManager->SetRecoParam(iDet, par) ; 
         }
       }
     }
@@ -1519,8 +1585,8 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
 
     // QA on single raw 
   if (fRunQA) {
-    fQASteer->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
-    fQASteer->RunOneEvent(fRawReader) ;  
+    fQAManager->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
+    fQAManager->RunOneEvent(fRawReader) ;  
   }
     // local single event reconstruction
     if (!fRunLocalReconstruction.IsNull()) {
@@ -1562,6 +1628,13 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
       }
     }
 
+    // For Plane Efficiency: run the SPD trackleter
+    if (fRunPlaneEff && fSPDTrackleter) {
+      if (!RunSPDTrackleting(fesd)) {
+        if (fStopOnError) {CleanUp(); return kFALSE;}
+      }
+    }
+
     // Muon tracking
     if (!fRunTracking.IsNull()) {
       if (fRunMuonTracking) {
@@ -1737,15 +1810,15 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
     if (fCleanESD) CleanESD(fesd);
 
   if (fRunQA) {
-    fQASteer->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
-    fQASteer->RunOneEvent(fesd) ; 
+    fQAManager->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
+    fQAManager->RunOneEvent(fesd) ; 
   }
   if (fRunGlobalQA) {
-      AliQADataMaker *qadm = fQASteer->GetQADataMaker(AliQA::kGLOBAL);
+      AliQADataMaker *qadm = fQAManager->GetQADataMaker(AliQA::kGLOBAL);
       qadm->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
-      if (qadm && fQATasks.Contains(Form("%d", AliQA::kESDS)))
-        qadm->Exec(AliQA::kESDS, fesd);
-    }
+    if (qadm && fQATasks.Contains(Form("%d", AliQA::kESDS)))
+      qadm->Exec(AliQA::kESDS, fesd);
+  }
 
     if (fWriteESDfriend) {
       //      fesdf->~AliESDfriend();
@@ -1785,7 +1858,7 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
     }
        
   if (fRunQA || fRunGlobalQA) 
-      fQASteer->Increment() ; 
+      fQAManager->Increment() ; 
   
     return kTRUE;
 }
@@ -1849,10 +1922,10 @@ void AliReconstruction::SlaveTerminate()
 
   // End of cycle for the in-loop  
   if (fRunQA) 
-    fQASteer->EndOfCycle() ;
+    fQAManager->EndOfCycle() ;
   
   if (fRunGlobalQA) {
-    AliQADataMaker *qadm = fQASteer->GetQADataMaker(AliQA::kGLOBAL);
+    AliQADataMaker *qadm = fQAManager->GetQADataMaker(AliQA::kGLOBAL);
     if (qadm) {
       if (fQATasks.Contains(Form("%d", AliQA::kRECPOINTS))) 
         qadm->EndOfCycle(AliQA::kRECPOINTS);
@@ -1873,7 +1946,7 @@ void AliReconstruction::Terminate()
   AliCodeTimerAuto("");
 
   AliESDTagCreator *esdtagCreator = new AliESDTagCreator();
-  esdtagCreator->CreateESDTags(fFirstEvent,fLastEvent,fGRPData);
+  esdtagCreator->CreateESDTags(fFirstEvent,fLastEvent,fGRPData, AliQA::Instance()->GetQA(), AliQA::Instance()->GetEventSpecies(), AliQA::kNDET, AliRecoParam::kNSpecies);
 
   // Cleanup of CDB manager: cache and active storages!
   AliCDBManager::Instance()->ClearCache();
@@ -1945,8 +2018,8 @@ Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
 
                TString detQAStr(fQADetectors) ; 
                if (fRunQA) {
-      fQASteer->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
-                       fQASteer->RunOneEventInOneDetector(iDet, clustersTree) ; 
+      fQAManager->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
+                       fQAManager->RunOneEventInOneDetector(iDet, clustersTree) ; 
     }
        loader->WriteRecPoints("OVERWRITE");
        loader->UnloadRecPoints();
@@ -1960,6 +2033,55 @@ Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
   eventNr++;
   return kTRUE;
 }
+//_____________________________________________________________________________
+Bool_t AliReconstruction::RunSPDTrackleting(AliESDEvent*& esd)
+{
+// run the SPD trackleting (for SPD efficiency purpouses)
+
+  AliCodeTimerAuto("")
+
+  Double_t vtxPos[3] = {0, 0, 0};
+  Double_t vtxErr[3] = {0.0, 0.0, 0.0};
+/*
+  TArrayF mcVertex(3);
+  // if(MC)
+  if (fRunLoader->GetHeader() && fRunLoader->GetHeader()->GenEventHeader()) {
+    fRunLoader->GetHeader()->GenEventHeader()->PrimaryVertex(mcVertex);
+    for (Int_t i = 0; i < 3; i++) vtxPos[i] = mcVertex[i];
+  }
+*/
+  const AliESDVertex *vertex = esd->GetVertex();
+  if(!vertex){
+    AliWarning("Vertex not found");
+    return kFALSE;
+  }
+  vertex->GetXYZ(vtxPos);
+  vertex->GetSigmaXYZ(vtxErr);
+  if (fSPDTrackleter) {
+    AliInfo("running the SPD Trackleter for Plane Efficiency Evaluation");
+
+    // load clusters
+    fLoader[0]->LoadRecPoints("read");
+    TTree* tree = fLoader[0]->TreeR();
+    if (!tree) {
+      AliError("Can't get the ITS cluster tree");
+      return kFALSE;
+    }
+    fSPDTrackleter->LoadClusters(tree);
+    fSPDTrackleter->SetVertex(vtxPos, vtxErr);
+    // run trackleting
+    if (fSPDTrackleter->Clusters2Tracks(esd) != 0) {
+      AliError("AliITSTrackleterSPDEff Clusters2Tracks failed");
+     // fLoader[0]->UnloadRecPoints();
+      return kFALSE;
+    }
+//fSPDTrackleter->UnloadRecPoints();
+  } else {
+    AliWarning("SPDTrackleter not available");
+    return kFALSE;
+  }
+  return kTRUE;
+}
 
 //_____________________________________________________________________________
 Bool_t AliReconstruction::RunVertexFinder(AliESDEvent*& esd)
@@ -2645,6 +2767,9 @@ void AliReconstruction::CleanUp()
   delete fRunInfo;
   fRunInfo = NULL;
 
+  delete fSPDTrackleter;
+  fSPDTrackleter = NULL;
+
   delete ftVertexer;
   ftVertexer = NULL;
   
@@ -2681,6 +2806,7 @@ void AliReconstruction::WriteAlignmentData(AliESDEvent* esd)
       AliESDtrack *track = esd->GetTrack(itrack);
       Int_t nsp = 0;
       Int_t idx[200];
+      for (Int_t i=0; i<200; ++i) idx[i] = -1; //PH avoid uninitialized values
       for (Int_t iDet = 5; iDet >= 0; iDet--) {// TOF, TRD, TPC, ITS clusters
           nsp += track->GetNcls(iDet);
 
@@ -2817,10 +2943,10 @@ Bool_t AliReconstruction::FinishPlaneEff() {
  //  Return: kTRUE if all operations have been done properly, kFALSE otherwise
  //
  Bool_t ret=kFALSE;
- //for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
+ //for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
  for (Int_t iDet = 0; iDet < 1; iDet++) { // for the time being only ITS
    //if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
-   if(fTracker[iDet]) {
+   if(fTracker[iDet] && fTracker[iDet]->GetPlaneEff()) {
       AliPlaneEff *planeeff=fTracker[iDet]->GetPlaneEff();
       TString name=planeeff->GetName();
       name+=".root";
@@ -2833,6 +2959,15 @@ Bool_t AliReconstruction::FinishPlaneEff() {
         ret*=planeeff->WriteHistosToFile(hname,"RECREATE");
       }
    }
+   if(fSPDTrackleter) {
+     AliPlaneEff *planeeff=fSPDTrackleter->GetPlaneEff();
+      TString name="AliITSPlaneEffSPDtracklet.root";
+      TFile* pefile = TFile::Open(name, "RECREATE");
+      ret=(Bool_t)planeeff->Write();
+      pefile->Close();
+      AliESDEvent *dummy=NULL;
+      ret=(Bool_t)fSPDTrackleter->PostProcess(dummy); // take care of writing other files
+   }
  }
  return ret;
 }
@@ -2841,7 +2976,7 @@ Bool_t AliReconstruction::InitPlaneEff() {
 //
  // Here execute all the necessary operations, before of the tracking phase,
  // for the evaluation of PlaneEfficiencies, in case required for some detectors.
- // E.g., read from a DataBase file a first evaluation of the PlaneEfficiency 
+ // E.g., read from a DataBase file a first evaluation of the PlaneEfficiency
  // which should be updated/recalculated.
  //
  // This Preliminary version will work only FOR ITS !!!!!
@@ -2850,7 +2985,17 @@ Bool_t AliReconstruction::InitPlaneEff() {
  //  Input: none
  //  Return: kTRUE if all operations have been done properly, kFALSE otherwise
  //
- AliWarning(Form("Implementation of this method not yet done !! Method return kTRUE"));
+ AliWarning(Form("Implementation of this method not yet completed !! Method return kTRUE"));
+
+  fSPDTrackleter = NULL;
+  AliReconstructor* itsReconstructor = GetReconstructor(0);
+  if (itsReconstructor) {
+    fSPDTrackleter = itsReconstructor->CreateTrackleter(); // this is NULL unless required in RecoParam
+  }
+  if (fSPDTrackleter) { 
+    AliInfo("Trackleter for SPD has been created");
+  }
+
  return kTRUE;
 }