]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliReconstruction.cxx
Moved AliLHCDipValT and AliLHCData to from STEERBase to STEER
[u/mrichter/AliRoot.git] / STEER / AliReconstruction.cxx
index 25991ce494ba9cf13f1906489405200714551864..1b1fccc090e03a53734780c38614511cc0462259 100644 (file)
 #include "AliV0vertexer.h"
 #include "AliVertexer.h"
 #include "AliVertexerTracks.h"
+#include "AliTriggerRunScalers.h"
+#include "AliCTPTimeParams.h" 
+#include "AliESDHLTDecision.h"
 
 ClassImp(AliReconstruction)
 
@@ -204,7 +207,7 @@ AliReconstruction::AliReconstruction(const char* gAliceFilename) :
   fRunMuonTracking(kFALSE),
   fRunV0Finder(kTRUE),
   fRunCascadeFinder(kTRUE),
-  fStopOnError(kFALSE),
+  fStopOnError(kTRUE),
   fWriteAlignmentData(kFALSE),
   fWriteESDfriend(kFALSE),
   fFillTriggerESD(kTRUE),
@@ -223,6 +226,10 @@ AliReconstruction::AliReconstruction(const char* gAliceFilename) :
   fGAliceFileName(gAliceFilename),
   fRawInput(""),
   fESDOutput(""),
+  fProofOutputFileName(""),
+  fProofOutputLocation(""),
+  fProofOutputDataset(kFALSE),
+  fProofOutputArchive(""),
   fEquipIdMap(""),
   fFirstEvent(0),
   fLastEvent(-1),
@@ -234,6 +241,7 @@ AliReconstruction::AliReconstruction(const char* gAliceFilename) :
   fRunInfo(NULL),
   fEventInfo(),
   fRunScalers(NULL),
+  fCTPTimeParams(NULL),  
 
   fRunLoader(NULL),
   fRawReader(NULL),
@@ -320,6 +328,10 @@ AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
   fGAliceFileName(rec.fGAliceFileName),
   fRawInput(rec.fRawInput),
   fESDOutput(rec.fESDOutput),
+  fProofOutputFileName(rec.fProofOutputFileName),
+  fProofOutputLocation(rec.fProofOutputLocation),
+  fProofOutputDataset(rec.fProofOutputDataset),
+  fProofOutputArchive(rec.fProofOutputArchive),
   fEquipIdMap(rec.fEquipIdMap),
   fFirstEvent(rec.fFirstEvent),
   fLastEvent(rec.fLastEvent),
@@ -331,6 +343,7 @@ AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
   fRunInfo(NULL),
   fEventInfo(),
   fRunScalers(NULL),
+  fCTPTimeParams(NULL),
 
   fRunLoader(NULL),
   fRawReader(NULL),
@@ -431,6 +444,10 @@ AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec)
   fGAliceFileName                = rec.fGAliceFileName;
   fRawInput                      = rec.fRawInput;
   fESDOutput                     = rec.fESDOutput;
+  fProofOutputFileName           = rec.fProofOutputFileName;
+  fProofOutputLocation           = rec.fProofOutputLocation;
+  fProofOutputDataset            = rec.fProofOutputDataset;
+  fProofOutputArchive            = rec.fProofOutputArchive;
   fEquipIdMap                    = rec.fEquipIdMap;
   fFirstEvent                    = rec.fFirstEvent;
   fLastEvent                     = rec.fLastEvent;
@@ -452,7 +469,9 @@ AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec)
   delete fRunScalers; fRunScalers = NULL;
   if (rec.fRunScalers) fRunScalers = new AliTriggerRunScalers(*rec.fRunScalers); 
 
-  
+  delete fCTPTimeParams; fCTPTimeParams = NULL;
+  if (rec.fCTPTimeParams) fCTPTimeParams = new AliCTPTimeParams(*rec.fCTPTimeParams);
+
   fRunLoader       = NULL;
   fRawReader       = NULL;
   fParentRawReader = NULL;
@@ -528,6 +547,7 @@ AliReconstruction::~AliReconstruction()
   }
   delete fGRPData;
   delete fRunScalers;
+  delete fCTPTimeParams;
   fOptions.Delete();
   if (fAlignObjArray) {
     fAlignObjArray->Delete();
@@ -542,7 +562,7 @@ AliReconstruction::~AliReconstruction()
 void AliReconstruction::InitQA()
 {
   //Initialize the QA and start of cycle 
-  AliCodeTimerAuto("");
+  AliCodeTimerAuto("",0);
   
   if (fInitQACalled) return;
   fInitQACalled = kTRUE;
@@ -579,7 +599,7 @@ void AliReconstruction::InitQA()
     qam->SetCycleLength(AliQAv1::DETECTORINDEX_t(det), fQACycles[det]) ;  
     qam->SetWriteExpert(AliQAv1::DETECTORINDEX_t(det)) ;
   }
-  if (!fRawReader && !fInput && fQATasks.Contains(AliQAv1::kRAWS))
+  if (!fRawReader && !fInput && IsInTasks(AliQAv1::kRAWS))
     fQATasks.ReplaceAll(Form("%d",AliQAv1::kRAWS), "") ;
   qam->SetTasks(fQATasks) ; 
   qam->InitQADataMaker(AliCDBManager::Instance()->GetRun()) ; 
@@ -588,13 +608,13 @@ void AliReconstruction::InitQA()
     Bool_t sameCycle = kFALSE ;
     AliQADataMaker *qadm = qam->GetQADataMaker(AliQAv1::kGLOBAL);
     AliInfo(Form("Initializing the global QA data maker"));
-    if (fQATasks.Contains(Form("%d", AliQAv1::kRECPOINTS))) {
+    if (IsInTasks(AliQAv1::kRECPOINTS)) {
       qadm->StartOfCycle(AliQAv1::kRECPOINTS, AliCDBManager::Instance()->GetRun(), sameCycle) ; 
       TObjArray **arr=qadm->Init(AliQAv1::kRECPOINTS);
       AliTracker::SetResidualsArray(arr);
       sameCycle = kTRUE ; 
     }
-    if (fQATasks.Contains(Form("%d", AliQAv1::kESDS))) {
+    if (IsInTasks(AliQAv1::kESDS)) {
       qadm->StartOfCycle(AliQAv1::kESDS, AliCDBManager::Instance()->GetRun(), sameCycle) ; 
       qadm->Init(AliQAv1::kESDS);
     }
@@ -606,7 +626,7 @@ void AliReconstruction::InitQA()
 void AliReconstruction::MergeQA(const char *fileName)
 {
   //Initialize the QA and start of cycle 
-  AliCodeTimerAuto("") ;
+  AliCodeTimerAuto("",0) ;
   AliQAManager::QAManager()->Merge(AliCDBManager::Instance()->GetRun(),fileName) ; 
   AliSysInfo::AddStamp("MergeQA") ; 
 }
@@ -617,7 +637,7 @@ void AliReconstruction::InitCDB()
 // activate a default CDB storage
 // First check if we have any CDB storage set, because it is used 
 // to retrieve the calibration and alignment constants
-  AliCodeTimerAuto("");
+  AliCodeTimerAuto("",0);
 
   if (fInitCDBCalled) return;
   fInitCDBCalled = kTRUE;
@@ -637,15 +657,21 @@ void AliReconstruction::InitCDB()
        AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
        AliDebug(2, Form("Default CDB storage is set to: %s", fCDBUri.Data()));
        AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
-    } else {
-       fCDBUri="local://$ALICE_ROOT/OCDB";
+       man->SetDefaultStorage(fCDBUri);
+    } 
+    else if (!man->GetRaw()){
+       fCDBUri="local://$ALICE_ROOT/OCDB";
        AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
        AliWarning("Default CDB storage not yet set !!!!");
        AliWarning(Form("Setting it now to: %s", fCDBUri.Data()));
        AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
-               
+       man->SetDefaultStorage(fCDBUri);
+    }
+    else {    
+       AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+       AliWarning("Default storage will be set after setting the Run Number!!!");
+       AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");                    
     }
-    man->SetDefaultStorage(fCDBUri);
   }
 
   // Now activate the detector specific CDB storage locations
@@ -871,7 +897,7 @@ void AliReconstruction::SetOutput(const char* output)
   // Set the output ESD filename
   // 'output' is a normalt ROOT url
   // The method is used in case of raw-data reco with PROOF
-  if (output) fESDOutput.SetUrl(output);
+  if (output) fESDOutput = output;
 }
 
 //_____________________________________________________________________________
@@ -908,90 +934,6 @@ void AliReconstruction::SetRecoParam(const char* detector, AliDetectorRecoParam
 }
 
 //_____________________________________________________________________________
-Bool_t AliReconstruction::SetFieldMap(Float_t l3Cur, Float_t diCur, Float_t l3Pol, 
-                                 Float_t diPol, Int_t convention, Bool_t uniform,
-                                 Float_t beamenergy, const Char_t *beamtype, const Char_t *path) 
-{
-  //------------------------------------------------
-  // The magnetic field map, defined externally...
-  // L3 current 30000 A  -> 0.5 T
-  // L3 current 12000 A  -> 0.2 T
-  // dipole current 6000 A
-  // The polarities must match the convention (LHC or DCS2008) 
-  // unless the special uniform map was used for MC
-  //------------------------------------------------
-  const Float_t l3NominalCurrent1=30000.; // (A)
-  const Float_t l3NominalCurrent2=12000.; // (A)
-  const Float_t diNominalCurrent =6000. ; // (A)
-
-  const Float_t tolerance=0.03; // relative current tolerance
-  const Float_t zero=77.;       // "zero" current (A)
-  //
-  AliMagF::BMap_t map;
-  double sclL3,sclDip;
-  //
-  l3Cur = TMath::Abs(l3Cur);
-  diCur = TMath::Abs(diCur);
-  //
-  if (TMath::Abs((sclDip=diCur/diNominalCurrent)-1.) > tolerance && !uniform) {
-    if (diCur <= zero) sclDip = 0.; // some small current.. -> Dipole OFF
-    else {
-      AliError(Form("Wrong dipole current (%f A)!",diCur));
-      return kFALSE;
-    }
-  }
-  //
-  if (uniform) { 
-    // special treatment of special MC with uniform mag field (normalized to 0.5 T)
-    // no check for scaling/polarities are done
-    map   = AliMagF::k5kGUniform;
-    sclL3 = l3Cur/l3NominalCurrent1; 
-  }
-  else {
-    if      (TMath::Abs((sclL3=l3Cur/l3NominalCurrent1)-1.) < tolerance) map  = AliMagF::k5kG;
-    else if (TMath::Abs((sclL3=l3Cur/l3NominalCurrent2)-1.) < tolerance) map  = AliMagF::k2kG;
-    else if (l3Cur <= zero)                                { sclL3 = 0;  map  = AliMagF::k5kGUniform;}
-    else {
-      AliError(Form("Wrong L3 current (%f A)!",l3Cur));
-      return kFALSE;
-    }
-  }
-  //
-  if (sclDip!=0 && (map==AliMagF::k5kG || map==AliMagF::k2kG) &&
-      ((convention==AliMagF::kConvLHC     && l3Pol!=diPol) ||
-       (convention==AliMagF::kConvDCS2008 && l3Pol==diPol)) ) { 
-    AliError(Form("Wrong combination for L3/Dipole polarities (%c/%c) in %s convention",
-                 l3Pol>0?'+':'-',diPol>0?'+':'-',convention==AliMagF::kConvDCS2008?"DCS2008":"LHC"));
-    return kFALSE;
-  }
-  //
-  if (l3Pol<0) sclL3  = -sclL3;
-  if (diPol<0) sclDip = -sclDip;
-  //
-  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("Assume no LHC magnet field for the beam type %s, ",beamtype));
-  //
-  char ttl[80];
-  sprintf(ttl,"L3: %+5d Dip: %+4d kA; %s | Polarities in %s convention",(int)TMath::Sign(l3Cur,float(sclL3)),
-         (int)TMath::Sign(diCur,float(sclDip)),uniform ? " Constant":"",
-         convention==AliMagF::kConvLHC ? "LHC":"DCS2008");
-  // LHC and DCS08 conventions have opposite dipole polarities
-  if ( AliMagF::GetPolarityConvention() != convention) sclDip = -sclDip;
-  //
-  AliMagF* fld = new AliMagF("MagneticFieldMap", ttl, 2, sclL3, sclDip, 10., map, path, 
-                            btype,beamenergy);
-  TGeoGlobalMagField::Instance()->SetField( fld );
-  TGeoGlobalMagField::Instance()->Lock();
-  //
-  return kTRUE;
-}
-
 Bool_t AliReconstruction::InitGRP() {
   //------------------------------------
   // Initialization of the GRP entry 
@@ -1044,8 +986,6 @@ Bool_t AliReconstruction::InitGRP() {
     AliError("GRP/GRP/Data entry:  missing value for the beam energy ! Using 0");
     beamEnergy = 0;
   }
-  // LHC: "multiply by 120 to get the energy in MeV"
-  beamEnergy *= 0.120;
 
   TString runType = fGRPData->GetRunType();
   if (runType==AliGRPObject::GetInvalidString()) {
@@ -1076,9 +1016,11 @@ Bool_t AliReconstruction::InitGRP() {
                  fFillESD.Data(),
                  fQADetectors.Data());
     fLoadCDB = MatchDetectorList(fLoadCDB,detMask);
-    if (!((detMask >> AliDAQ::DetectorID("ITSSPD")) & 0x1)) {
+    if (!((detMask >> AliDAQ::DetectorID("ITSSPD")) & 0x1) &&
+       !((detMask >> AliDAQ::DetectorID("ITSSDD")) & 0x1) &&
+       !((detMask >> AliDAQ::DetectorID("ITSSSD")) & 0x1) ) {
       // switch off the vertexer
-      AliInfo("SPD is not in the list of active detectors. Vertexer switched off.");
+      AliInfo("SPD,SDD,SSD is not in the list of active detectors. Vertexer switched off.");
       fRunVertexFinder = kFALSE;
     }
     if (!((detMask >> AliDAQ::DetectorID("TRG")) & 0x1)) {
@@ -1143,10 +1085,15 @@ Bool_t AliReconstruction::InitGRP() {
     Bool_t uniformB = fGRPData->IsUniformBMap();
 
     if (ok) { 
-      if ( !SetFieldMap(l3Current, diCurrent, l3Polarity ? -1:1, diPolarity ? -1:1, 
-                       polConvention,uniformB,beamEnergy, beamType.Data()))
-       AliFatal("Failed to creat a B field map ! Exiting...");
-      AliInfo("Running with the B field constructed out of GRP !");
+      AliMagF* fld = AliMagF::CreateFieldMap(TMath::Abs(l3Current) * (l3Polarity ? -1:1), 
+                                            TMath::Abs(diCurrent) * (diPolarity ? -1:1), 
+                                            polConvention,uniformB,beamEnergy, beamType.Data());
+      if (fld) {
+       TGeoGlobalMagField::Instance()->SetField( fld );
+       TGeoGlobalMagField::Instance()->Lock();
+       AliInfo("Running with the B field constructed out of GRP !");
+      }
+      else AliFatal("Failed to create a B field map !");
     }
     else AliFatal("B field is neither set nor constructed from GRP ! Exitig...");
   }
@@ -1190,7 +1137,7 @@ Bool_t AliReconstruction::InitGRP() {
 //_____________________________________________________________________________
 Bool_t AliReconstruction::LoadCDB()
 {
-  AliCodeTimerAuto("");
+  AliCodeTimerAuto("",0);
 
   AliCDBManager::Instance()->Get("GRP/CTP/Config");
 
@@ -1199,12 +1146,19 @@ Bool_t AliReconstruction::LoadCDB()
     if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
     AliCDBManager::Instance()->GetAll(Form("%s/Calib/*",fgkDetectorName[iDet]));
   }
+
+  // Temporary fix - one has to define the correct policy in order
+  // to load the trigger OCDB entries only for the detectors that
+  // in the trigger or that are needed in order to put correct
+  // information in ESD
+  AliCDBManager::Instance()->GetAll("TRIGGER/*/*");
+
   return kTRUE;
 }
 //_____________________________________________________________________________
 Bool_t AliReconstruction::LoadTriggerScalersCDB()
 {
-  AliCodeTimerAuto("");
+  AliCodeTimerAuto("",0);
 
   AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/CTP/Scalers");
 
@@ -1219,10 +1173,25 @@ Bool_t AliReconstruction::LoadTriggerScalersCDB()
   return kTRUE;
 }
 //_____________________________________________________________________________
+Bool_t AliReconstruction::LoadCTPTimeParamsCDB()
+{
+  AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/CTP/CTPtiming");
+
+  if (entry) {
+
+       AliInfo("Found an AliCTPTimeParams in GRP/CTP/CTPtiming, reading it");
+       fCTPTimeParams = dynamic_cast<AliCTPTimeParams*> (entry->GetObject());
+       entry->SetOwner(0);
+       return kTRUE;
+  }
+  
+  return kFALSE; 
+}
+//_____________________________________________________________________________
 Bool_t AliReconstruction::Run(const char* input)
 {
   // Run Run Run
-  AliCodeTimerAuto("");
+  AliCodeTimerAuto("",0);
 
   InitRun(input);
   if (GetAbort() != TSelector::kContinue) return kFALSE;
@@ -1232,6 +1201,8 @@ Bool_t AliReconstruction::Run(const char* input)
     Long64_t nEntries = (fLastEvent < 0) ? (TChain::kBigNumber) : (fLastEvent - fFirstEvent + 1);
     // Proof mode
     if (gProof) {
+      // Temporary fix for long raw-data runs (until socket timeout handling in PROOF is revised)
+      gProof->Exec("gEnv->SetValue(\"Proof.SocketActivityTimeout\",-1)", kTRUE);
 
       if (gGrid)
        gProof->Exec("TGrid::Connect(\"alien://\")",kTRUE);
@@ -1240,13 +1211,9 @@ Bool_t AliReconstruction::Run(const char* input)
       gProof->Exec("TMessage::EnableSchemaEvolutionForAll(kTRUE)",kTRUE);
 
       gProof->AddInput(this);
-      if (!fESDOutput.IsValid()) {
-       fESDOutput.SetProtocol("root",kTRUE);
-       fESDOutput.SetHost(gSystem->HostName());
-       fESDOutput.SetFile(Form("%s/AliESDs.root",gSystem->pwd()));
-      }
-      AliInfo(Form("Output file with ESDs is %s",fESDOutput.GetUrl()));
-      gProof->AddInput(new TNamed("PROOF_OUTPUTFILE",fESDOutput.GetUrl()));
+
+      if (!ParseOutput()) return kFALSE;
+
       gProof->SetParameter("PROOF_MaxSlavesPerNode", 9999);
       chain->SetProof();
       chain->Process("AliReconstruction","",nEntries,fFirstEvent);
@@ -1283,14 +1250,20 @@ Bool_t AliReconstruction::Run(const char* input)
 //_____________________________________________________________________________
 void AliReconstruction::InitRawReader(const char* input)
 {
-  AliCodeTimerAuto("");
+  AliCodeTimerAuto("",0);
 
   // Init raw-reader and
   // set the input in case of raw data
   if (input) fRawInput = input;
   fRawReader = AliRawReader::Create(fRawInput.Data());
-  if (!fRawReader)
-    AliInfo("Reconstruction will run over digits");
+  if (!fRawReader) {
+    if (fRawInput.IsNull()) {
+      AliInfo("Reconstruction will run over digits");
+    }
+    else {
+      AliFatal("Can not create raw-data reader ! Exiting..."); 
+    }
+  }
 
   if (!fEquipIdMap.IsNull() && fRawReader)
     fRawReader->LoadEquipmentIdsMap(fEquipIdMap);
@@ -1314,7 +1287,7 @@ void AliReconstruction::InitRun(const char* input)
 {
   // Initialization of raw-reader,
   // run number, CDB etc.
-  AliCodeTimerAuto("");
+  AliCodeTimerAuto("",0);
   AliSysInfo::AddStamp("Start");
 
   // Initialize raw-reader if any
@@ -1342,7 +1315,7 @@ void AliReconstruction::Begin(TTree *)
   // going into the event loop
   // Should follow the TSelector convention
   // i.e. initialize only the object on the client side
-  AliCodeTimerAuto("");
+  AliCodeTimerAuto("",0);
 
   AliReconstruction *reco = NULL;
   if (fInput) {
@@ -1395,6 +1368,11 @@ void AliReconstruction::Begin(TTree *)
   }
   AliSysInfo::AddStamp("LoadTriggerScalersCDB");
 
+  if (!LoadCTPTimeParamsCDB()) {
+    Abort("LoadCTPTimeParamsCDB", TSelector::kAbortProcess);
+    return;
+  }
+  AliSysInfo::AddStamp("LoadCTPTimeParamsCDB");
 
   // Read the reconstruction parameters from OCDB
   if (!InitRecoParams()) {
@@ -1405,6 +1383,7 @@ void AliReconstruction::Begin(TTree *)
   if (fInput && gProof) {
     if (reco) *reco = *this;
 
+    gGeoManager->SetName("Geometry");
     gProof->AddInputData(gGeoManager,kTRUE);
     gGeoManager = NULL;
     gProof->AddInputData(const_cast<TMap*>(AliCDBManager::Instance()->GetEntryCache()),kTRUE);
@@ -1422,10 +1401,12 @@ void AliReconstruction::SlaveBegin(TTree*)
   // Initialization related to run-loader,
   // vertexer, trackers, recontructors
   // In proof mode it is executed on the slave
-  AliCodeTimerAuto("");
+  AliCodeTimerAuto("",0);
 
   TProofOutputFile *outProofFile = NULL;
-  if (fInput) { 
+  if (fInput) {
+    if (AliDebugLevel() > 0) fInput->Print();
+    if (AliDebugLevel() > 10) fInput->Dump();
     if (AliReconstruction *reco = (AliReconstruction*)fInput->FindObject("AliReconstruction")) {
       *this = *reco;
     }
@@ -1443,11 +1424,33 @@ void AliReconstruction::SlaveBegin(TTree*)
       }
     }
     if (AliMagF *map = (AliMagF*)fInput->FindObject("MagneticFieldMap")) {
-      TGeoGlobalMagField::Instance()->SetField(map);
-    }
-    if (TNamed *outputFileName = (TNamed *) fInput->FindObject("PROOF_OUTPUTFILE")) {
-      outProofFile = new TProofOutputFile(gSystem->BaseName(TUrl(outputFileName->GetTitle()).GetFile()));
-      outProofFile->SetOutputFileName(outputFileName->GetTitle());
+      AliMagF *newMap = new AliMagF(*map);
+      if (!newMap->LoadParameterization()) {
+       Abort("AliMagF::LoadParameterization", TSelector::kAbortProcess);
+       return;
+      }
+      TGeoGlobalMagField::Instance()->SetField(newMap);
+      TGeoGlobalMagField::Instance()->Lock();
+    }
+    if (TNamed *outputFileName = (TNamed*)fInput->FindObject("PROOF_OUTPUTFILE"))
+      fProofOutputFileName = outputFileName->GetTitle();
+    if (TNamed *outputLocation = (TNamed*)fInput->FindObject("PROOF_OUTPUTFILE_LOCATION"))
+      fProofOutputLocation = outputLocation->GetTitle();
+    if (fInput->FindObject("PROOF_OUTPUTFILE_DATASET"))
+      fProofOutputDataset = kTRUE;
+    if (TNamed *archiveList = (TNamed*)fInput->FindObject("PROOF_OUTPUTFILE_ARCHIVE"))
+      fProofOutputArchive = archiveList->GetTitle();
+    if (!fProofOutputFileName.IsNull() &&
+       !fProofOutputLocation.IsNull() &&
+       fProofOutputArchive.IsNull()) {
+      if (!fProofOutputDataset) {
+       outProofFile = new TProofOutputFile(fProofOutputFileName.Data(),"M");
+       outProofFile->SetOutputFileName(Form("%s%s",fProofOutputLocation.Data(),fProofOutputFileName.Data()));
+      }
+      else {
+       outProofFile = new TProofOutputFile(fProofOutputFileName.Data(),"DROV",fProofOutputLocation.Data());
+      }
+      if (AliDebugLevel() > 0) outProofFile->Dump();
       fOutput->Add(outProofFile);
     }
     AliSysInfo::AddStamp("ReadInputInSlaveBegin");
@@ -1479,6 +1482,8 @@ void AliReconstruction::SlaveBegin(TTree*)
     }
   }
   else {
+    AliInfo(Form("Opening output PROOF file: %s/%s",
+                outProofFile->GetDir(), outProofFile->GetFileName()));
     if (!(ffile = outProofFile->OpenFile("RECREATE"))) {
       Abort(Form("Problems opening output PROOF file: %s/%s",
                 outProofFile->GetDir(), outProofFile->GetFileName()),
@@ -1490,6 +1495,10 @@ void AliReconstruction::SlaveBegin(TTree*)
   ftree = new TTree("esdTree", "Tree with ESD objects");
   fesd = new AliESDEvent();
   fesd->CreateStdContent();
+  if (fesd->GetESDRun()) ((AliESDRun*)fesd->GetESDRun())->SetBeamEnergyIsSqrtSHalfGeV();
+  // add a so far non-std object to the ESD, this will
+  // become part of the std content
+  fesd->AddObject(new AliESDHLTDecision);
 
   fesd->WriteToTree(ftree);
   if (fWriteESDfriend) {
@@ -1512,7 +1521,7 @@ void AliReconstruction::SlaveBegin(TTree*)
   fhlttree = new TTree("HLTesdTree", "Tree with HLT ESD objects");
   fhltesd = new AliESDEvent();
   fhltesd->CreateStdContent();
-
+  if (fhltesd->GetESDRun()) ((AliESDRun*)fhltesd->GetESDRun())->SetBeamEnergyIsSqrtSHalfGeV();
   // read the ESD template from CDB
   // HLT is allowed to put non-std content to its ESD, the non-std
   // objects need to be created before invocation of WriteToTree in
@@ -1566,7 +1575,7 @@ Bool_t AliReconstruction::Process(Long64_t entry)
 {
   // run the reconstruction over a single entry
   // from the chain with raw data
-  AliCodeTimerAuto("");
+  AliCodeTimerAuto("",0);
 
   TTree *currTree = fChain->GetTree();
   AliRawVEvent *event = NULL;
@@ -1597,7 +1606,11 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
   // run the reconstruction over a single event
   // The event loop is steered in Run method
 
-  AliCodeTimerAuto("");
+  static Long_t oldMres=0;
+  static Long_t oldMvir=0;
+  static Float_t oldCPU=0;
+
+  AliCodeTimerAuto("",0);
 
   if (iEvent >= fRunLoader->GetNumberOfEvents()) {
     fRunLoader->SetEventNumber(iEvent);
@@ -1612,14 +1625,13 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
     return kTRUE;
   }
 
-  AliInfo(Form("processing event %d", iEvent));
 
   fRunLoader->GetEvent(iEvent);
 
   // Fill Event-info object
   GetEventInfo();
   fRecoParam.SetEventSpecie(fRunInfo,fEventInfo,fListOfCosmicTriggers);
-  AliInfo(Form("Current event specie: %s",fRecoParam.PrintEventSpecie()));
+  AliInfo(Form("================================= Processing event %d of type %-10s ==================================", iEvent,fRecoParam.PrintEventSpecie()));
 
   // Set the reco-params
   {
@@ -1630,17 +1642,20 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
       if (reconstructor && fRecoParam.GetDetRecoParamArray(iDet)) {
         const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet);
         reconstructor->SetRecoParam(par);
-       reconstructor->SetEventInfo(&fEventInfo);
+        reconstructor->SetEventInfo(&fEventInfo);
         if (fRunQA) {
           AliQAManager::QAManager()->SetRecoParam(iDet, par) ; 
           AliQAManager::QAManager()->SetEventSpecie(AliRecoParam::Convert(par->GetEventSpecie())) ;
         }
       }
     }
+    const AliDetectorRecoParam *grppar = fRecoParam.GetDetRecoParam(kNDetectors);
+    AliQAManager::QAManager()->SetRecoParam(AliQAv1::kGLOBAL, grppar) ; 
+    AliQAManager::QAManager()->SetEventSpecie(AliRecoParam::Convert(grppar->GetEventSpecie())) ;
   }
 
     // QA on single raw 
-  if (fRunQA) {
+  if (fRunQA && IsInTasks(AliQAv1::kRAWS)) {
     AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
     AliQAManager::QAManager()->RunOneEvent(fRawReader) ;  
   }
@@ -1656,19 +1671,47 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
       detectors=fRunLocalReconstruction;
       detectors.ReplaceAll("HLT", "");
       if (!RunLocalEventReconstruction(detectors)) {
-       if (fStopOnError) {CleanUp(); return kFALSE;}
+        if (fStopOnError) {
+          CleanUp(); 
+          return kFALSE;
+        }
       }
     }
 
+  
+    // fill Event header information from the RawEventHeader
+    if (fRawReader){FillRawEventHeaderESD(fesd);}
+    if (fRawReader){FillRawEventHeaderESD(fhltesd);}
+
     fesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
     fhltesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
     fesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
     fhltesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
+
+    fesd->SetEventSpecie(fRecoParam.GetEventSpecie());
+    fhltesd->SetEventSpecie(fRecoParam.GetEventSpecie());
     
     // Set magnetic field from the tracker
     fesd->SetMagneticField(AliTracker::GetBz());
     fhltesd->SetMagneticField(AliTracker::GetBz());
-
+    //
+    AliMagF* fld = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
+    if (fld) { // set info needed for field initialization
+      fesd->SetCurrentL3(fld->GetCurrentSol());
+      fesd->SetCurrentDip(fld->GetCurrentDip());
+      fesd->SetBeamEnergy(fld->GetBeamEnergy());
+      fesd->SetBeamType(fld->GetBeamTypeText());
+      fesd->SetUniformBMap(fld->IsUniform());
+      fesd->SetBInfoStored();
+      //
+      fhltesd->SetCurrentL3(fld->GetCurrentSol());
+      fhltesd->SetCurrentDip(fld->GetCurrentDip());
+      fhltesd->SetBeamEnergy(fld->GetBeamEnergy());
+      fhltesd->SetBeamType(fld->GetBeamTypeText());
+      fhltesd->SetUniformBMap(fld->IsUniform());
+      fhltesd->SetBInfoStored();
+    }
+    //
     // Set most probable pt, for B=0 tracking
     // Get the global reco-params. They are atposition 16 inside the array of detectors in fRecoParam
     const AliGRPRecoParam *grpRecoParam = dynamic_cast<const AliGRPRecoParam*>(fRecoParam.GetDetRecoParam(kNDetectors));
@@ -1730,11 +1773,7 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
        if (fStopOnError) {CleanUp(); return kFALSE;}
       }
     }
-  
-    // fill Event header information from the RawEventHeader
-    if (fRawReader){FillRawEventHeaderESD(fesd);}
-    if (fRawReader){FillRawEventHeaderESD(fhltesd);}
-
     // combined PID
     AliESDpid::MakePID(fesd);
 
@@ -1755,7 +1794,6 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
     // Propagate track to the beam pipe  (if not already done by ITS)
     //
     const Int_t ntracks = fesd->GetNumberOfTracks();
-    const Double_t kBz = fesd->GetMagneticField();
     const Double_t kRadius  = 2.8; //something less than the beam pipe radius
 
     TObjArray trkArray;
@@ -1773,7 +1811,7 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
       ok = kFALSE;
       if (tpcTrack)
        ok = AliTracker::
-         PropagateTrackTo(tpcTrack,kRadius,track->GetMass(),kMaxStep,kFALSE);
+         PropagateTrackToBxByBz(tpcTrack,kRadius,track->GetMass(),kMaxStep,kFALSE);
 
       if (ok) {
        Int_t n=trkArray.GetEntriesFast();
@@ -1785,8 +1823,10 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
       if (track->IsOn(AliESDtrack::kITSrefit)) continue;
 
       AliTracker::
-         PropagateTrackTo(track,kRadius,track->GetMass(),kMaxStep,kFALSE);
-      track->RelateToVertex(fesd->GetPrimaryVertexSPD(), kBz, kVeryBig);
+         PropagateTrackToBxByBz(track,kRadius,track->GetMass(),kMaxStep,kFALSE);
+      Double_t x[3]; track->GetXYZ(x);
+      Double_t b[3]; AliTracker::GetBxByBz(x,b);
+      track->RelateToVertexBxByBz(fesd->GetPrimaryVertexSPD(), b, kVeryBig);
 
     }
 
@@ -1821,9 +1861,12 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
              fesd->SetPrimaryVertexTracks(pvtx);
              for (Int_t i=0; i<ntracks; i++) {
                 AliESDtrack *t = fesd->GetTrack(i);
-                 t->RelateToVertex(pvtx, kBz, kVeryBig);
+                 Double_t x[3]; t->GetXYZ(x);
+                 Double_t b[3]; AliTracker::GetBxByBz(x,b);
+                 t->RelateToVertexBxByBz(pvtx, b, kVeryBig);
              } 
           }
+         delete pvtx; pvtx=NULL;
        }
 
        // TPC-only primary vertex
@@ -1845,9 +1888,12 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
              fesd->SetPrimaryVertexTPC(pvtx);
              for (Int_t i=0; i<ntracks; i++) {
                 AliESDtrack *t = fesd->GetTrack(i);
-                 t->RelateToVertexTPC(pvtx, kBz, kVeryBig);
+                 Double_t x[3]; t->GetXYZ(x);
+                 Double_t b[3]; AliTracker::GetBxByBz(x,b);
+                 t->RelateToVertexTPCBxByBz(pvtx, b, kVeryBig);
              } 
           }
+         delete pvtx; pvtx=NULL;
        }
 
     }
@@ -1871,17 +1917,26 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
     // write ESD
     if (fCleanESD) CleanESD(fesd);
 
-  if (fRunQA) {
+  if (fRunQA && IsInTasks(AliQAv1::kESDS)) {
     AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
-    AliQAManager::QAManager()->RunOneEvent(fesd) ; 
+    AliQAManager::QAManager()->RunOneEvent(fesd, fhltesd) ; 
   }
   if (fRunGlobalQA) {
     AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL);
       qadm->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
-    if (qadm && fQATasks.Contains(Form("%d", AliQAv1::kESDS)))
+    if (qadm && IsInTasks(AliQAv1::kESDS))
       qadm->Exec(AliQAv1::kESDS, fesd);
   }
 
+  // copy HLT decision from HLTesd to esd
+  // the most relevant information is stored in a reduced container in the esd,
+  // while the full information can be found in the HLTesd
+  TObject* pHLTSrc=fhltesd->FindListObject(AliESDHLTDecision::Name());
+  TObject* pHLTTgt=fesd->FindListObject(AliESDHLTDecision::Name());
+  if (pHLTSrc && pHLTTgt) {
+    pHLTSrc->Copy(*pHLTTgt);
+  }
+
     if (fWriteESDfriend) {
       //      fesdf->~AliESDfriend();
       //  new (fesdf) AliESDfriend(); // Reset...
@@ -1911,7 +1966,12 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
  
     ProcInfo_t procInfo;
     gSystem->GetProcInfo(&procInfo);
-    AliInfo(Form("Event %d -> Current memory usage %d %d",iEvent, procInfo.fMemResident, procInfo.fMemVirtual));
+    AliInfo(Form("========================= End Event %d: memory res %d(%3d) vir %d(%3d) CPU %5.2f =====================",
+                iEvent, procInfo.fMemResident/1024, (procInfo.fMemResident-oldMres)/1024, 
+                procInfo.fMemVirtual/1024,(procInfo.fMemVirtual-oldMvir)/1024,procInfo.fCpuUser+procInfo.fCpuSys-oldCPU));
+    oldMres=procInfo.fMemResident;
+    oldMvir=procInfo.fMemVirtual;
+    oldCPU=procInfo.fCpuUser+procInfo.fCpuSys;
   
     fEventInfo.Reset();
     for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
@@ -1934,7 +1994,7 @@ void AliReconstruction::SlaveTerminate()
   // Finalize the run on the slave side
   // Called after the exit
   // from the event loop
-  AliCodeTimerAuto("");
+  AliCodeTimerAuto("",0);
 
   if (fIsNewRunLoader) { // galice.root didn't exist
     fRunLoader->WriteHeader("OVERWRITE");
@@ -1986,31 +2046,22 @@ void AliReconstruction::SlaveTerminate()
   }
 
   // End of cycle for the in-loop  
-  if (fRunQA) 
-    AliQAManager::QAManager()->EndOfCycle() ;
-  
-  if (fRunGlobalQA) {
-    AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL);
-    if (qadm) {
-      if (fQATasks.Contains(Form("%d", AliQAv1::kRECPOINTS))) 
-        qadm->EndOfCycle(AliQAv1::kRECPOINTS);
-      if (fQATasks.Contains(Form("%d", AliQAv1::kESDS))) 
-        qadm->EndOfCycle(AliQAv1::kESDS);
-      qadm->Finish();
-    }
-  }
 
   if (fRunQA || fRunGlobalQA) {
-    if (fInput) { 
-      if (TNamed *outputFileName = (TNamed *) fInput->FindObject("PROOF_OUTPUTFILE")) {
-       TString qaOutputFile = outputFileName->GetTitle();
-       qaOutputFile.ReplaceAll(gSystem->BaseName(TUrl(outputFileName->GetTitle()).GetFile()),
-                               Form("Merged.%s.Data.root",AliQAv1::GetQADataFileName()));
-       TProofOutputFile *qaProofFile = new TProofOutputFile(Form("Merged.%s.Data.root",AliQAv1::GetQADataFileName()));
-       qaProofFile->SetOutputFileName(qaOutputFile.Data());
-       fOutput->Add(qaProofFile);
-       MergeQA(qaProofFile->GetFileName());
-      }
+    AliQAManager::QAManager()->EndOfCycle() ;
+    if (fInput &&
+       !fProofOutputLocation.IsNull() &&
+       fProofOutputArchive.IsNull() &&
+       !fProofOutputDataset) {
+      TString qaOutputFile(Form("%sMerged.%s.Data.root",
+                               fProofOutputLocation.Data(),
+                               AliQAv1::GetQADataFileName()));
+      TProofOutputFile *qaProofFile = new TProofOutputFile(Form("Merged.%s.Data.root",
+                                                               AliQAv1::GetQADataFileName()));
+      qaProofFile->SetOutputFileName(qaOutputFile.Data());
+      if (AliDebugLevel() > 0) qaProofFile->Dump();
+      fOutput->Add(qaProofFile);
+      MergeQA(qaProofFile->GetFileName());
     }
     else {
       MergeQA();
@@ -2019,6 +2070,29 @@ void AliReconstruction::SlaveTerminate()
 
   gROOT->cd();
   CleanUp();
+
+  if (fInput) {
+    if (!fProofOutputFileName.IsNull() &&
+       !fProofOutputLocation.IsNull() &&
+       fProofOutputDataset &&
+       !fProofOutputArchive.IsNull()) {
+      TProofOutputFile *zipProofFile = new TProofOutputFile(fProofOutputFileName.Data(),
+                                                           "DROV",
+                                                           fProofOutputLocation.Data());
+      if (AliDebugLevel() > 0) zipProofFile->Dump();
+      fOutput->Add(zipProofFile);
+      TString fileList(fProofOutputArchive.Data());
+      fileList.ReplaceAll(","," ");
+      TString command;
+#if ROOT_SVN_REVISION >= 30174
+      command.Form("zip -n root %s/%s %s",zipProofFile->GetDir(kTRUE),zipProofFile->GetFileName(),fileList.Data());
+#else
+      command.Form("zip -n root %s/%s %s",zipProofFile->GetDir(),zipProofFile->GetFileName(),fileList.Data());
+#endif
+      AliInfo(Form("Executing: %s",command.Data()));
+      gSystem->Exec(command.Data());
+    }
+  }
 }
     
 //_____________________________________________________________________________
@@ -2026,12 +2100,13 @@ void AliReconstruction::Terminate()
 {
   // Create tags for the events in the ESD tree (the ESD tree is always present)
   // In case of empty events the tags will contain dummy values
-  AliCodeTimerAuto("");
+  AliCodeTimerAuto("",0);
 
   // Do not call the ESD tag creator in case of PROOF-based reconstruction
   if (!fInput) {
     AliESDTagCreator *esdtagCreator = new AliESDTagCreator();
     esdtagCreator->CreateESDTags(fFirstEvent,fLastEvent,fGRPData, AliQAv1::Instance()->GetQA(), AliQAv1::Instance()->GetEventSpecies(), AliQAv1::kNDET, AliRecoParam::kNSpecies);
+    delete esdtagCreator;
   }
 
   // Cleanup of CDB manager: cache and active storages!
@@ -2044,7 +2119,7 @@ Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
 // run the local reconstruction
 
   static Int_t eventNr=0;
-  AliCodeTimerAuto("")
+  AliCodeTimerAuto("",0)
 
   TString detStr = detectors;
   for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
@@ -2072,7 +2147,7 @@ Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
       AliInfo(Form("converting raw data digits into root objects for %s", 
                   fgkDetectorName[iDet]));
 //      AliCodeTimerAuto(Form("converting raw data digits into root objects for %s", 
-//                            fgkDetectorName[iDet]));
+//                            fgkDetectorName[iDet]),0);
       loader->LoadDigits("update");
       loader->CleanDigits();
       loader->MakeDigitsContainer();
@@ -2083,7 +2158,7 @@ Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
     }
     // local reconstruction
     AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
-    //AliCodeTimerAuto(Form("running reconstruction for %s", fgkDetectorName[iDet]));
+    //AliCodeTimerAuto(Form("running reconstruction for %s", fgkDetectorName[iDet]),0);
     loader->LoadRecPoints("update");
     loader->CleanRecPoints();
     loader->MakeRecPointsContainer();
@@ -2095,17 +2170,18 @@ Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
       TTree* digitsTree = loader->TreeD();
       if (!digitsTree) {
         AliError(Form("Can't get the %s digits tree", fgkDetectorName[iDet]));
-        if (fStopOnError) return kFALSE;
+        if (fStopOnError) 
+          return kFALSE;
       } else {
         reconstructor->Reconstruct(digitsTree, clustersTree);
-        if (fRunQA) {
+        if (fRunQA && IsInTasks(AliQAv1::kDIGITSR)) {
           AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
           AliQAManager::QAManager()->RunOneEventInOneDetector(iDet, digitsTree) ; 
         }
       }
       loader->UnloadDigits();
     }
-               if (fRunQA) {
+               if (fRunQA && IsInTasks(AliQAv1::kRECPOINTS)) {
       AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
                        AliQAManager::QAManager()->RunOneEventInOneDetector(iDet, clustersTree) ; 
     }
@@ -2113,10 +2189,12 @@ Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
     loader->UnloadRecPoints();
     AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr), iDet,1,eventNr);
   }
+  IsSelected("CTP", detStr);
   if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
     AliError(Form("the following detectors were not found: %s",
                   detStr.Data()));
-    if (fStopOnError) return kFALSE;
+    if (fStopOnError) 
+      return kFALSE;
   }
   eventNr++;
   return kTRUE;
@@ -2126,7 +2204,7 @@ Bool_t AliReconstruction::RunSPDTrackleting(AliESDEvent*& esd)
 {
 // run the SPD trackleting (for SPD efficiency purpouses)
 
-  AliCodeTimerAuto("")
+  AliCodeTimerAuto("",0)
 
   Double_t vtxPos[3] = {0, 0, 0};
   Double_t vtxErr[3] = {0.0, 0.0, 0.0};
@@ -2176,7 +2254,7 @@ Bool_t AliReconstruction::RunVertexFinder(AliESDEvent*& esd)
 {
 // run the barrel tracking
 
-  AliCodeTimerAuto("")
+  AliCodeTimerAuto("",0)
 
   AliVertexer *vertexer = CreateVertexer();
   if (!vertexer) return kFALSE;
@@ -2238,7 +2316,7 @@ Bool_t AliReconstruction::RunHLTTracking(AliESDEvent*& esd)
 {
 // run the HLT barrel tracking
 
-  AliCodeTimerAuto("")
+  AliCodeTimerAuto("",0)
 
   if (!fRunLoader) {
     AliError("Missing runLoader!");
@@ -2294,7 +2372,7 @@ Bool_t AliReconstruction::RunMuonTracking(AliESDEvent*& esd)
 {
 // run the muon spectrometer tracking
 
-  AliCodeTimerAuto("")
+  AliCodeTimerAuto("",0)
 
   if (!fRunLoader) {
     AliError("Missing runLoader!");
@@ -2324,18 +2402,18 @@ Bool_t AliReconstruction::RunMuonTracking(AliESDEvent*& esd)
   
   Int_t rv = tracker->Clusters2Tracks(esd);
   
-  if ( rv )
-  {
-    AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
-    return kFALSE;
-  }
-  
   fLoader[iDet]->UnloadRecPoints();
 
   tracker->UnloadClusters();
   
   delete tracker;
   
+  if ( rv )
+  {
+    AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
+    return kFALSE;
+  }
+  
   return kTRUE;
 }
 
@@ -2345,7 +2423,7 @@ Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd)
 {
 // run the barrel tracking
   static Int_t eventNr=0;
-  AliCodeTimerAuto("")
+  AliCodeTimerAuto("",0)
 
   AliInfo("running tracking");
 
@@ -2530,7 +2608,7 @@ Bool_t AliReconstruction::FillESD(AliESDEvent*& esd, const TString& detectors)
 {
 // fill the event summary data
 
-  AliCodeTimerAuto("")
+  AliCodeTimerAuto("",0)
     static Int_t eventNr=0; 
   TString detStr = detectors;
   
@@ -2569,7 +2647,8 @@ Bool_t AliReconstruction::FillESD(AliESDEvent*& esd, const TString& detectors)
       fLoader[iDet]->UnloadRecPoints();
     }
   }
-
+  
+  IsSelected("CTP", detStr);
   if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
     AliError(Form("the following detectors were not found: %s", 
                   detStr.Data()));
@@ -2587,7 +2666,7 @@ Bool_t AliReconstruction::FillTriggerESD(AliESDEvent*& esd)
   // stored in Trigger.root file and fills
   // the corresponding esd entries
 
-  AliCodeTimerAuto("")
+  AliCodeTimerAuto("",0)
   
   AliInfo("Filling trigger information into the ESD");
 
@@ -2630,7 +2709,7 @@ Bool_t AliReconstruction::FillTriggerScalers(AliESDEvent*& esd)
      //AliTimeStamp* timestamp = new AliTimeStamp(10308000, 0, (ULong64_t)486238);
      AliESDHeader* esdheader = fesd->GetHeader();
      for(Int_t i=0;i<50;i++){
-          if((1<<i) & esd->GetTriggerMask()){
+          if((1ull<<i) & esd->GetTriggerMask()){
           AliTriggerScalersESD* scalesd = fRunScalers->GetScalersForEventClass( timestamp, i+1);
           if(scalesd)esdheader->SetTriggerScalersRecord(scalesd);
         }
@@ -2701,7 +2780,12 @@ Bool_t AliReconstruction::InitRunLoader()
   if (gAlice) delete gAlice;
   gAlice = NULL;
 
-  if (!gSystem->AccessPathName(fGAliceFileName.Data())) { // galice.root exists
+  TFile *gafile = TFile::Open(fGAliceFileName.Data());
+  //  if (!gSystem->AccessPathName(fGAliceFileName.Data())) { // galice.root exists
+  if (gafile) { // galice.root exists
+    gafile->Close();
+    delete gafile;
+
     // load all base libraries to get the loader classes
     TString libs = gSystem->GetLibraries();
     for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
@@ -2937,7 +3021,6 @@ void AliReconstruction::CleanUp()
     AliQAManager::QAManager()->ShowQA() ; 
   AliQAManager::Destroy() ; 
   
-  TGeoGlobalMagField::Instance()->SetField(NULL);
 }
 
 void AliReconstruction::WriteAlignmentData(AliESDEvent* esd)
@@ -2953,9 +3036,9 @@ void AliReconstruction::WriteAlignmentData(AliESDEvent* esd)
       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);
+          nsp += (iDet==GetDetIndex("TRD")) ? track->GetTRDntracklets():track->GetNcls(iDet);
 
-          if (iDet==0) { // ITS "extra" clusters
+          if (iDet==GetDetIndex("ITS")) { // ITS "extra" clusters
              track->GetClusters(iDet,idx);
              for (Int_t i=6; i<12; i++) if(idx[i] >= 0) nsp++;
           }  
@@ -2968,9 +3051,9 @@ void AliReconstruction::WriteAlignmentData(AliESDEvent* esd)
        for (Int_t iDet = 5; iDet >= 0; iDet--) {
          AliTracker *tracker = fTracker[iDet];
          if (!tracker) continue;
-         Int_t nspdet = track->GetClusters(iDet,idx);
+         Int_t nspdet = (iDet==GetDetIndex("TRD")) ? track->GetTRDtracklets(idx):track->GetClusters(iDet,idx);
 
-         if (iDet==0) // ITS "extra" clusters             
+         if (iDet==GetDetIndex("ITS")) // ITS "extra" clusters             
              for (Int_t i=6; i<12; i++) if(idx[i] >= 0) nspdet++;
 
          if (nspdet <= 0) continue;
@@ -2994,7 +3077,7 @@ void AliReconstruction::WriteAlignmentData(AliESDEvent* esd)
            } 
            isp2++;
            if (!isvalid) continue;
-           if (iDet==0 && (isp-1)>=6) p.SetExtra();
+           if (iDet==GetDetIndex("ITS") && (isp-1)>=6) p.SetExtra();
            sp->AddPoint(isptrack,&p); isptrack++;
          }
        }       
@@ -3088,9 +3171,10 @@ Bool_t AliReconstruction::FinishPlaneEff() {
  //  Return: kTRUE if all operations have been done properly, kFALSE otherwise
  //
  Bool_t ret=kFALSE;
+ TString detStr = fLoadCDB;
  //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 (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
    if(fTracker[iDet] && fTracker[iDet]->GetPlaneEff()) {
       AliPlaneEff *planeeff=fTracker[iDet]->GetPlaneEff();
       TString name=planeeff->GetName();
@@ -3133,14 +3217,16 @@ Bool_t AliReconstruction::InitPlaneEff() {
  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");
+  TString detStr = fLoadCDB;
+  if (IsSelected(fgkDetectorName[0], detStr)) {
+    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;
 }
 
@@ -3194,9 +3280,7 @@ Bool_t AliReconstruction::SetRunQA(TString detAndAction)
        }
        Int_t colon = detAndAction.Index(":") ; 
        fQADetectors = detAndAction(0, colon) ; 
-       if (fQADetectors.Contains("ALL") )
-               fQADetectors = fFillESD ; 
-               fQATasks   = detAndAction(colon+1, detAndAction.Sizeof() ) ; 
+       fQATasks   = detAndAction(colon+1, detAndAction.Sizeof() ) ; 
        if (fQATasks.Contains("ALL") ) {
                fQATasks = Form("%d %d %d %d", AliQAv1::kRAWS, AliQAv1::kDIGITSR, AliQAv1::kRECPOINTS, AliQAv1::kESDS) ; 
        } else {
@@ -3324,7 +3408,7 @@ Bool_t AliReconstruction::GetEventInfo()
 {
   // Fill the event info object
   // ...
-  AliCodeTimerAuto("")
+  AliCodeTimerAuto("",0)
 
   AliCentralTrigger *aCTP = NULL;
   if (fRawReader) {
@@ -3511,3 +3595,67 @@ Bool_t AliReconstruction::ProcessEvent(void* event)
 
   return fStatus;
 }
+
+//______________________________________________________________________________
+Bool_t AliReconstruction::ParseOutput()
+{
+  // The method parses the output file
+  // location string in order to steer
+  // properly the selector
+
+  TPMERegexp re1("(\\w+\\.zip#\\w+\\.root):([,*\\w+\\.root,*]+)@dataset://(\\w++)");
+  TPMERegexp re2("(\\w+\\.root)?@?dataset://(\\w++)");
+
+  if (re1.Match(fESDOutput) == 4) {
+    // root archive with output files stored and regustered
+    // in proof dataset
+    gProof->AddInput(new TNamed("PROOF_OUTPUTFILE",re1[1].Data()));
+    gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",re1[3].Data()));
+    gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_DATASET",""));
+    gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_ARCHIVE",re1[2].Data()));
+    AliInfo(Form("%s files will be stored within %s in dataset %s",
+                re1[2].Data(),
+                re1[1].Data(),
+                re1[3].Data()));
+  }
+  else if (re2.Match(fESDOutput) == 3) {
+    // output file stored and registered
+    // in proof dataset
+    gProof->AddInput(new TNamed("PROOF_OUTPUTFILE",(re2[1].IsNull()) ? "AliESDs.root" : re2[1].Data()));
+    gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",re2[2].Data()));
+    gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_DATASET",""));
+    AliInfo(Form("%s will be stored in dataset %s",
+                (re2[1].IsNull()) ? "AliESDs.root" : re2[1].Data(),
+                re2[2].Data()));
+  }
+  else {
+    if (fESDOutput.IsNull()) {
+      // Output location not given.
+      // Assuming xrootd has been already started and
+      // the output file has to be sent back
+      // to the client machine
+      TString esdUrl(Form("root://%s/%s/",
+                         TUrl(gSystem->HostName()).GetHostFQDN(),
+                         gSystem->pwd()));
+      gProof->AddInput(new TNamed("PROOF_OUTPUTFILE","AliESDs.root"));
+      gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",esdUrl.Data()));
+      AliInfo(Form("AliESDs.root will be stored in %s",
+                  esdUrl.Data()));
+    }
+    else {
+      // User specified an output location.
+      // Ones has just to parse it here
+      TUrl outputUrl(fESDOutput.Data());
+      TString outputFile(gSystem->BaseName(outputUrl.GetFile()));
+      gProof->AddInput(new TNamed("PROOF_OUTPUTFILE",outputFile.IsNull() ? "AliESDs.root" : outputFile.Data()));
+      TString outputLocation(outputUrl.GetUrl());
+      outputLocation.ReplaceAll(outputFile.Data(),"");
+      gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",outputLocation.Data()));
+      AliInfo(Form("%s will be stored in %s",
+                  outputFile.IsNull() ? "AliESDs.root" : outputFile.Data(),
+                  outputLocation.Data()));
+    }
+  }
+
+  return kTRUE;
+}