]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliReconstruction.cxx
remove obsolete histos and add detailed comments about more obscure aspects of digits...
[u/mrichter/AliRoot.git] / STEER / AliReconstruction.cxx
index 72f35db12f00cb5ff6dfd35442a505deab2bac3e..ba57d7debcd5cf1d4d4e1b3ee544b5461ad6c425 100644 (file)
@@ -202,6 +202,7 @@ AliReconstruction::AliReconstruction(const char* gAliceFilename,
   TNamed(name, title),
 
   fUniformField(kFALSE),
+  fForcedFieldMap(0x0),
   fRunVertexFinder(kTRUE),
   fRunVertexFinderTracks(kTRUE),
   fRunHLTTracking(kFALSE),
@@ -253,6 +254,8 @@ AliReconstruction::AliReconstruction(const char* gAliceFilename,
   fSpecCDBUri(), 
   fInitCDBCalled(kFALSE),
   fSetRunNumberFromDataCalled(kFALSE),
+  fQADetectors("ALL"), 
+  fQATasks("ALL"), 
   fRunQA(kTRUE),  
   fRunGlobalQA(kTRUE),
   fInLoopQA(kFALSE),
@@ -291,6 +294,7 @@ AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
   TNamed(rec),
 
   fUniformField(rec.fUniformField),
+  fForcedFieldMap(0x0),
   fRunVertexFinder(rec.fRunVertexFinder),
   fRunVertexFinderTracks(rec.fRunVertexFinderTracks),
   fRunHLTTracking(rec.fRunHLTTracking),
@@ -342,6 +346,8 @@ AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
   fSpecCDBUri(), 
   fInitCDBCalled(rec.fInitCDBCalled),
   fSetRunNumberFromDataCalled(rec.fSetRunNumberFromDataCalled),
+  fQADetectors(rec.fQADetectors), 
+  fQATasks(rec.fQATasks), 
   fRunQA(rec.fRunQA),  
   fRunGlobalQA(rec.fRunGlobalQA),
   fInLoopQA(rec.fInLoopQA),
@@ -377,6 +383,8 @@ AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
   for (Int_t i = 0; i < rec.fSpecCDBUri.GetEntriesFast(); i++) {
     if (rec.fSpecCDBUri[i]) fSpecCDBUri.Add(rec.fSpecCDBUri[i]->Clone());
   }
+
+  fForcedFieldMap=new AliMagWrapCheb(*((AliMagWrapCheb*)rec.fForcedFieldMap));
 }
 
 //_____________________________________________________________________________
@@ -397,6 +405,7 @@ AliReconstruction::~AliReconstruction()
   CleanUp();
   fOptions.Delete();
   fSpecCDBUri.Delete();
+  delete fForcedFieldMap;
 
   AliCodeTimer::Instance()->Print();
 }
@@ -639,6 +648,158 @@ void AliReconstruction::SetOption(const char* detector, const char* option)
   fOptions.Add(new TNamed(detector, option));
 }
 
+//_____________________________________________________________________________
+Bool_t AliReconstruction::SetFieldMap(Float_t l3Current, Float_t diCurrent, Float_t factor, const char *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 be the same
+  //------------------------------------------------
+  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)
+
+  Int_t map=0;
+  Bool_t dipoleON=kFALSE;
+
+  TString s=(factor < 0) ? "L3: -" : "L3: +";
+
+  if (TMath::Abs(l3Current-l3NominalCurrent1)/l3NominalCurrent1 < tolerance) {
+    map=AliMagWrapCheb::k5kG;
+    s+="0.5 T;  ";
+  } else
+  if (TMath::Abs(l3Current-l3NominalCurrent2)/l3NominalCurrent2 < tolerance) {
+    map=AliMagWrapCheb::k2kG;
+    s+="0.2 T;  ";
+  } else
+  if (TMath::Abs(l3Current) < zero) {
+    map=AliMagWrapCheb::k2kG;
+    s+="0.0 T;  ";
+    factor=0.;                  // in fact, this is a global factor...
+    fUniformField=kTRUE;        // track with the uniform (zero) B field
+  } else {
+    AliError("Wrong L3 current !");
+    return kFALSE;
+  }
+
+  if (TMath::Abs(diCurrent-diNominalCurrent)/diNominalCurrent < tolerance) {
+    // 3% current tolerance...
+    dipoleON=kTRUE;
+    s+="Dipole ON";
+  } else
+  if (TMath::Abs(diCurrent) < zero) { // some small current..
+    dipoleON=kFALSE;
+    s+="Dipole OFF";
+  } else {
+    AliError("Wrong dipole current !");
+    return kFALSE;
+  }
+
+  delete fForcedFieldMap;
+  fForcedFieldMap=
+    new AliMagWrapCheb("B field map  ",s,2,factor,10.,map,dipoleON,path);
+
+  fForcedFieldMap->Print();
+
+  AliTracker::SetFieldMap(fForcedFieldMap,fUniformField);    
+
+  return kTRUE;
+}
+
+
+Bool_t AliReconstruction::InitGRP() {
+  //------------------------------------
+  // Initialization of the GRP entry 
+  //------------------------------------
+  AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/GRP/Data");
+
+  if (entry) fGRPData = dynamic_cast<TMap*>(entry->GetObject());  
+
+  if (!fGRPData) {
+     AliError("No GRP entry found in OCDB!");
+     return kFALSE;
+  }
+
+
+  //*** Dealing with the magnetic field map
+  if (AliTracker::GetFieldMap()) {
+    AliInfo("Running with the externally set B field !");
+  } else {
+    // Construct the field map out of the information retrieved from GRP.
+
+    Bool_t ok = kTRUE;
+
+    // L3
+    TObjString *l3Current=
+       dynamic_cast<TObjString*>(fGRPData->GetValue("fL3Current"));
+    if (!l3Current) {
+      AliError("GRP/GRP/Data entry:  missing value for the L3 current !");
+      ok = kFALSE;
+    }
+    TObjString *l3Polarity=
+       dynamic_cast<TObjString*>(fGRPData->GetValue("fL3Polarity"));
+    if (!l3Polarity) {
+      AliError("GRP/GRP/Data entry:  missing value for the L3 polarity !");
+      ok = kFALSE;
+    }
+
+    // Dipole
+    TObjString *diCurrent=
+       dynamic_cast<TObjString*>(fGRPData->GetValue("fDipoleCurrent"));
+    if (!diCurrent) {
+      AliError("GRP/GRP/Data entry:  missing value for the dipole current !");
+      ok = kFALSE;
+    }
+    TObjString *diPolarity=
+       dynamic_cast<TObjString*>(fGRPData->GetValue("fDipolePolarity"));
+    if (!diPolarity) {
+      AliError("GRP/GRP/Data entry:  missing value for the dipole polarity !");
+      ok = kFALSE;
+    }
+
+    if (ok) { 
+       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...");
+      }
+      AliInfo("Running with the B field constructed out of GRP !");
+    }
+    else {
+      AliFatal("B field is neither set nor constructed from GRP ! Exitig...");
+    }
+
+  }
+
+
+  //*** Get the diamond profile from OCDB
+  entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertex");
+  if (entry) {
+     fDiamondProfile = dynamic_cast<AliESDVertex*> (entry->GetObject());  
+  } else {
+     AliError("No diamond profile found in OCDB!");
+  }
+
+  entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexTPC");
+  if (entry) {
+     fDiamondProfileTPC = dynamic_cast<AliESDVertex*> (entry->GetObject());  
+  } else {
+     AliError("No diamond profile found in OCDB!");
+  }
+
+  return kTRUE;
+} 
+
 //_____________________________________________________________________________
 Bool_t AliReconstruction::Run(const char* input)
 {
@@ -646,7 +807,6 @@ Bool_t AliReconstruction::Run(const char* input)
   AliCodeTimerAuto("");
 
   if (!InitRun(input)) return kFALSE;
-
   //******* The loop over events
   Int_t iEvent = 0;
   while ((iEvent < fRunLoader->GetNumberOfEvents()) ||
@@ -725,88 +885,8 @@ Bool_t AliReconstruction::InitRun(const char* input)
    AliSysInfo::AddStamp("LoadGeom");
 
 
-  // Get the GRP CDB entry
-  AliCDBEntry* entryGRP = AliCDBManager::Instance()->Get("GRP/GRP/Data");
-
-  if (entryGRP) 
-       fGRPData = dynamic_cast<TMap*>(entryGRP->GetObject());  
-
-  if (!fGRPData) {
-       AliError("No GRP entry found in OCDB!");
-       return kFALSE;
-  }
-
-
-  // Magnetic field map
-  if (!AliTracker::GetFieldMap()) {
-    // Construct the field map out of the information retrieved from GRP.
-    //
-    // For the moment, this is a dummy piece of code.
-    // The actual map is expected to be already created in rec.C ! 
-    //
-
-    Float_t factor=1.;
-    Int_t map=AliMagWrapCheb::k5kG;
-    Bool_t dipoleON=kTRUE;
-
-    // L3
-    TObjString *l3Current=
-       dynamic_cast<TObjString*>(fGRPData->GetValue("fL3Current"));
-    if (!l3Current) {
-      AliError("GRP/GRP/Data entry:  missing value for the L3 current !");
-      return kFALSE;
-    }
-    TObjString *l3Polarity=
-       dynamic_cast<TObjString*>(fGRPData->GetValue("fL3Polarity"));
-    if (!l3Polarity) {
-      AliError("GRP/GRP/Data entry:  missing value for the L3 polarity !");
-      return kFALSE;
-    }
-
-    // Dipole
-    TObjString *diCurrent=
-       dynamic_cast<TObjString*>(fGRPData->GetValue("fDipoleCurrent"));
-    if (!diCurrent) {
-      AliError("GRP/GRP/Data entry:  missing value for the dipole current !");
-      return kFALSE;
-    }
-    TObjString *diPolarity=
-       dynamic_cast<TObjString*>(fGRPData->GetValue("fDipolePolarity"));
-    if (!diPolarity) {
-      AliError("GRP/GRP/Data entry:  missing value for the dipole polarity !");
-      return kFALSE;
-    }
-
-
-    AliMagF *field=
-      new AliMagWrapCheb("Maps","Maps",2,factor,10.,map,dipoleON);
-    AliTracker::SetFieldMap(field,fUniformField);    
-
-    //Temporary measure
-    AliFatal("Please, provide the field map !  Crashing deliberately...");
-
-  }
-
-
-  // Get the diamond profile from OCDB
-  AliCDBEntry* entry = AliCDBManager::Instance()
-       ->Get("GRP/Calib/MeanVertex");
-       
-  if(entry) {
-       fDiamondProfile = dynamic_cast<AliESDVertex*> (entry->GetObject());  
-  } else {
-       AliError("No diamond profile found in OCDB!");
-  }
+  if (!InitGRP()) return kFALSE;
 
-  entry = 0;
-  entry = AliCDBManager::Instance()
-       ->Get("GRP/Calib/MeanVertexTPC");
-       
-  if(entry) {
-       fDiamondProfileTPC = dynamic_cast<AliESDVertex*> (entry->GetObject());  
-  } else {
-       AliError("No diamond profile found in OCDB!");
-  }
 
   ftVertexer = new AliVertexerTracks(AliTracker::GetBz());
   if(fDiamondProfile && fMeanVertexConstraint) ftVertexer->SetVtxStart(fDiamondProfile);
@@ -876,43 +956,61 @@ Bool_t AliReconstruction::InitRun(const char* input)
   gSystem->GetProcInfo(&ProcInfo);
   AliInfo(Form("Current memory usage %d %d", ProcInfo.fMemResident, ProcInfo.fMemVirtual));
   
-
   //QA
-  AliQADataMakerSteer qas ; 
-  if (fRunQA && fRawReader) { 
-    qas.Run(fRunLocalReconstruction, fRawReader) ; 
-       fSameQACycle = kTRUE ; 
+  if (fRunQA && fRawReader && fQATasks.Contains(Form("%d", AliQA::kRAWS))) { 
+               AliQADataMakerSteer qas ; 
+               qas.Run(fRunLocalReconstruction, fRawReader) ; 
+               fSameQACycle = kTRUE ; 
   }
   //Initialize the QA and start of cycle for out-of-cycle QA
   if (fRunQA) {
-//      TString detStr(fFillESD); 
-//      for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
-//         if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
-//         AliQADataMakerRec *qadm = GetQADataMaker(iDet);  
-//         if (!qadm) continue;
-//         AliInfo(Form("Initializing the QA data maker for %s", 
-//                fgkDetectorName[iDet]));
-//         qadm->Init(AliQA::kRECPOINTS, AliCDBManager::Instance()->GetRun());
-//         qadm->Init(AliQA::kESDS, AliCDBManager::Instance()->GetRun());
-//         if (!fInLoopQA) {
-//                     qadm->StartOfCycle(AliQA::kRECPOINTS, fSameQACycle);
-//                     qadm->StartOfCycle(AliQA::kESDS,"same");
-//         }
-//      }
+         TString detStr(fQADetectors) ; 
+      for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
+         if (!IsSelected(fgkDetectorName[iDet], detStr)) 
+                        continue;
+         AliQADataMakerRec *qadm = GetQADataMaker(iDet);  
+         if (!qadm) 
+                        continue;
+         AliInfo(Form("Initializing the QA data maker for %s", 
+                fgkDetectorName[iDet]));
+                if (fQATasks.Contains(Form("%d", AliQA::kRECPOINTS))) 
+                        qadm->Init(AliQA::kRECPOINTS, AliCDBManager::Instance()->GetRun());
+                if (fQATasks.Contains(Form("%d", AliQA::kESDS)))  
+                        qadm->Init(AliQA::kESDS, AliCDBManager::Instance()->GetRun());
+         if (!fInLoopQA) {
+                        if (fQATasks.Contains(Form("%d", AliQA::kRECPOINTS))) {
+                                qadm->StartOfCycle(AliQA::kRECPOINTS, fSameQACycle);
+                                fSameQACycle = kTRUE;
+                        }
+                        if (fQATasks.Contains(Form("%d", AliQA::kESDS))) {  
+                                qadm->StartOfCycle(AliQA::kESDS, fSameQACycle);
+                                fSameQACycle = kTRUE;
+                        }
+                }
+      }
          if (fRunGlobalQA) {
                  AliQADataMakerRec *qadm = GetQADataMaker(AliQA::kGLOBAL);
                  AliInfo(Form("Initializing the global QA data maker"));
-                 TObjArray *arr=
-                       qadm->Init(AliQA::kRECPOINTS, AliCDBManager::Instance()->GetRun());
-                 AliTracker::SetResidualsArray(arr);
-                 qadm->Init(AliQA::kESDS, AliCDBManager::Instance()->GetRun());
+                 if (fQATasks.Contains(Form("%d", AliQA::kRECPOINTS))) {
+                         TObjArray *arr=
+                               qadm->Init(AliQA::kRECPOINTS, AliCDBManager::Instance()->GetRun());
+                         AliTracker::SetResidualsArray(arr);
+                 }
+                 if (fQATasks.Contains(Form("%d", AliQA::kESDS))) {
+                         qadm->Init(AliQA::kESDS, AliCDBManager::Instance()->GetRun());
+                 }
                  if (!fInLoopQA) {
-                         qadm->StartOfCycle(AliQA::kRECPOINTS, fSameQACycle);
-                         qadm->StartOfCycle(AliQA::kESDS, "same");
+                         fSameQACycle = kFALSE;
+                         if (fQATasks.Contains(Form("%d", AliQA::kRECPOINTS))) {                                 
+                                 qadm->StartOfCycle(AliQA::kRECPOINTS, fSameQACycle);
+                                 fSameQACycle = kTRUE;
+                         }
+                         if (fQATasks.Contains(Form("%d", AliQA::kESDS))) { 
+                                 qadm->StartOfCycle(AliQA::kESDS, fSameQACycle);
+                                 fSameQACycle = kTRUE; 
+                         }
                  }
          }
-         if (!fInLoopQA) 
-                 fSameQACycle = kTRUE; 
   }
 
   //Initialize the Plane Efficiency framework
@@ -962,20 +1060,34 @@ Bool_t AliReconstruction::RunEvent(Int_t iEvent)
     //Start of cycle for the in-loop QA
     if (fInLoopQA) {
        if (fRunQA) {
-          TString detStr(fFillESD); 
+                 fSameQACycle = kFALSE ;
+          TString detStr(fQADetectors); 
           for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
              if (!IsSelected(fgkDetectorName[iDet], detStr)) 
                                 continue;
              AliQADataMakerRec *qadm = GetQADataMaker(iDet);  
              if (!qadm) 
                                 continue;
-             qadm->StartOfCycle(AliQA::kRECPOINTS, fSameQACycle);
-             qadm->StartOfCycle(AliQA::kESDS, "same") ;        
+                         if (fQATasks.Contains(Form("%d", AliQA::kRECPOINTS))) {
+                                 qadm->StartOfCycle(AliQA::kRECPOINTS, fSameQACycle);
+                                 fSameQACycle = kTRUE;
+                         }
+                         if (fQATasks.Contains(Form("%d", AliQA::kESDS))) {
+                                 qadm->StartOfCycle(AliQA::kESDS, fSameQACycle) ;
+                                 fSameQACycle = kTRUE;
+                         }
           }
                   if (fRunGlobalQA) {
+                          fSameQACycle = kFALSE;
                           AliQADataMakerRec *qadm = GetQADataMaker(AliQA::kGLOBAL);
-                          qadm->StartOfCycle(AliQA::kRECPOINTS, fSameQACycle);
-                          qadm->StartOfCycle(AliQA::kESDS, "same");
+                          if (fQATasks.Contains(Form("%d", AliQA::kRECPOINTS))) {
+                                  qadm->StartOfCycle(AliQA::kRECPOINTS, fSameQACycle);
+                                  fSameQACycle = kTRUE;
+                          }
+                          if (fQATasks.Contains(Form("%d", AliQA::kESDS))) {
+                                  qadm->StartOfCycle(AliQA::kESDS, fSameQACycle);
+                                  fSameQACycle = kTRUE;
+                          }
                   }               
           }
     }
@@ -1113,21 +1225,19 @@ Bool_t AliReconstruction::RunEvent(Int_t iEvent)
        ok = AliTracker::
          PropagateTrackTo(tpcTrack,kRadius,track->GetMass(),kMaxStep,kTRUE);
 
-
-
       if (ok) {
        Int_t n=trkArray.GetEntriesFast();
         selectedIdx[n]=track->GetID();
         trkArray.AddLast(tpcTrack);
       }
 
-      if (track->GetX() < kRadius) continue;
+      //Tracks refitted by ITS should already be at the SPD vertex
+      if (track->IsOn(AliESDtrack::kITSrefit)) continue;
+
+      AliTracker::
+         PropagateTrackTo(track,kRadius,track->GetMass(),kMaxStep,kTRUE);
+      track->RelateToVertex(fesd->GetPrimaryVertexSPD(), kBz, kVeryBig);
 
-      ok = AliTracker::
-           PropagateTrackTo(track,kRadius,track->GetMass(),kMaxStep,kTRUE);
-      if (ok) {
-         track->RelateToVertex(fesd->GetPrimaryVertexSPD(), kBz, kRadius);
-      }
     }
 
     //
@@ -1153,7 +1263,7 @@ Bool_t AliReconstruction::RunEvent(Int_t iEvent)
              fesd->SetPrimaryVertex(pvtx);
              for (Int_t i=0; i<ntracks; i++) {
                 AliESDtrack *t = fesd->GetTrack(i);
-                 t->RelateToVertex(pvtx, kBz, kRadius);
+                 t->RelateToVertex(pvtx, kBz, kVeryBig);
              } 
           }
        }
@@ -1169,11 +1279,9 @@ Bool_t AliReconstruction::RunEvent(Int_t iEvent)
        if (pvtx) {
           if (pvtx->GetStatus()) {
              fesd->SetPrimaryVertexTPC(pvtx);
-             Int_t nsel=trkArray.GetEntriesFast();
-             for (Int_t i=0; i<nsel; i++) {
-                AliExternalTrackParam *t = 
-                   (AliExternalTrackParam *)trkArray.UncheckedAt(i);
-                 t->PropagateToDCA(pvtx, kBz, kRadius);
+             for (Int_t i=0; i<ntracks; i++) {
+                AliESDtrack *t = fesd->GetTrack(i);
+                 t->RelateToVertexTPC(pvtx, kBz, kVeryBig);
              } 
           }
        }
@@ -1202,7 +1310,8 @@ Bool_t AliReconstruction::RunEvent(Int_t iEvent)
        if (fRunQA) {
                if (fRunGlobalQA) {
                        AliQADataMakerRec *qadm = GetQADataMaker(AliQA::kGLOBAL);
-                       if (qadm) qadm->Exec(AliQA::kESDS, fesd);
+                       if (qadm && fQATasks.Contains(Form("%d", AliQA::kESDS)))
+                               qadm->Exec(AliQA::kESDS, fesd);
                }
        }
 
@@ -1232,29 +1341,32 @@ Bool_t AliReconstruction::RunEvent(Int_t iEvent)
     AliInfo(Form("Event %d -> Current memory usage %d %d",iEvent, ProcInfo.fMemResident, ProcInfo.fMemVirtual));
   
 
-  // End of cycle for the in-loop QA
+  // End of cycle for the in-loop  
      if (fInLoopQA) {
         if (fRunQA) {
-           RunQA(fFillESD.Data(), fesd);
-           TString detStr(fFillESD); 
+           RunQA(fesd);
            for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
-                          if (!IsSelected(fgkDetectorName[iDet], detStr)) 
+                          if (!IsSelected(fgkDetectorName[iDet], fQADetectors)) 
                                   continue;
                           AliQADataMakerRec * qadm = GetQADataMaker(iDet);
-                          if (!qadm) 
+                          if (!qadm)
                                   continue;
-                          qadm->EndOfCycle(AliQA::kRECPOINTS);
-                          qadm->EndOfCycle(AliQA::kESDS);
+                          if (fQATasks.Contains(Form("%d", AliQA::kRECPOINTS))) 
+                                  qadm->EndOfCycle(AliQA::kRECPOINTS);
+                          if (fQATasks.Contains(Form("%d", AliQA::kESDS))) 
+                                  qadm->EndOfCycle(AliQA::kESDS);
                           qadm->Finish();
                   }
         }
         if (fRunGlobalQA) {
            AliQADataMakerRec *qadm = GetQADataMaker(AliQA::kGLOBAL);
            if (qadm) {
-             qadm->EndOfCycle(AliQA::kRECPOINTS);
-             qadm->EndOfCycle(AliQA::kESDS);
-             qadm->Finish();
-          }
+                          if (fQATasks.Contains(Form("%d", AliQA::kRECPOINTS))) 
+                                  qadm->EndOfCycle(AliQA::kRECPOINTS);
+                          if (fQATasks.Contains(Form("%d", AliQA::kESDS))) 
+                                  qadm->EndOfCycle(AliQA::kESDS);
+                          qadm->Finish();
+                  }
         }
      }
 
@@ -1347,14 +1459,18 @@ Bool_t AliReconstruction::FinishRun()
   if (!fInLoopQA) {
          if (fRunQA) {
                  AliQADataMakerSteer qas;
-                 qas.Run(fRunLocalReconstruction.Data(), AliQA::kRECPOINTS, fSameQACycle);
+                 if (fQATasks.Contains(Form("%d", AliQA::kRECPOINTS))) 
+                         qas.Run(fRunLocalReconstruction.Data(), AliQA::kRECPOINTS, fSameQACycle);
                  //qas.Reset() ;
-                 qas.Run(fRunLocalReconstruction.Data(), AliQA::kESDS, fSameQACycle);
+                 if (fQATasks.Contains(Form("%d", AliQA::kESDS))) 
+                         qas.Run(fRunLocalReconstruction.Data(), AliQA::kESDS, fSameQACycle);
                  if (fRunGlobalQA) {
                         AliQADataMakerRec *qadm = GetQADataMaker(AliQA::kGLOBAL);
                          if (qadm) {
-                                 qadm->EndOfCycle(AliQA::kRECPOINTS);
-                                 qadm->EndOfCycle(AliQA::kESDS);
+                                 if (fQATasks.Contains(Form("%d", AliQA::kRECPOINTS))) 
+                                         qadm->EndOfCycle(AliQA::kRECPOINTS);
+                                 if (fQATasks.Contains(Form("%d", AliQA::kESDS))) 
+                                         qadm->EndOfCycle(AliQA::kESDS);
                                  qadm->Finish();
                          }
                  }
@@ -1497,8 +1613,8 @@ Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
          //AliInfo
           //(Form("Running QA data maker for %s", fgkDetectorName[iDet]));
 
-         qadm->Exec(AliQA::kRECPOINTS, clustersTree) ;
+                  if (fQATasks.Contains(Form("%d", AliQA::kRECPOINTS))) 
+                          qadm->Exec(AliQA::kRECPOINTS, clustersTree) ;
          //AliCodeTimerStop
           //(Form("Running QA data maker for %s", fgkDetectorName[iDet]));
        }
@@ -1924,11 +2040,16 @@ Bool_t AliReconstruction::FillTriggerESD(AliESDEvent*& esd)
   if (fRawReader) {
     AliCTPRawStream input(fRawReader);
     if (!input.Next()) {
-      AliError("No valid CTP (trigger) DDL raw data is found ! The trigger information is not stored in the ESD !");
-      return kFALSE;
+      AliWarning("No valid CTP (trigger) DDL raw data is found ! The trigger mask will be taken from the event header, trigger cluster mask will be empty !");
+      ULong64_t mask = (((ULong64_t)fRawReader->GetTriggerPattern()[1]) << 32) +
+       fRawReader->GetTriggerPattern()[0];
+      esd->SetTriggerMask(mask);
+      esd->SetTriggerCluster(0);
+    }
+    else {
+      esd->SetTriggerMask(input.GetClassMask());
+      esd->SetTriggerCluster(input.GetClusterMask());
     }
-    esd->SetTriggerMask(input.GetClassMask());
-    esd->SetTriggerCluster(input.GetClusterMask());
 
     aCTP = new AliCentralTrigger();
     TString configstr("");
@@ -1960,7 +2081,7 @@ Bool_t AliReconstruction::FillTriggerESD(AliESDEvent*& esd)
   // Now fill the trigger class names into AliESDRun object
   AliTriggerConfiguration *config = aCTP->GetConfiguration();
   if (!config) {
-    AliError("No trigger configuration has been found! The trigger classes information will no be stored in ESD!");
+    AliError("No trigger configuration has been found! The trigger classes information will not be stored in ESD!");
     if (fRawReader) delete aCTP;
     return kFALSE;
   }
@@ -2518,12 +2639,12 @@ AliQADataMakerRec * AliReconstruction::GetQADataMaker(Int_t iDet)
 }
 
 //_____________________________________________________________________________
-Bool_t AliReconstruction::RunQA(const char* detectors, AliESDEvent *& esd)
+Bool_t AliReconstruction::RunQA(AliESDEvent *& esd)
 {
   // run the Quality Assurance data producer
 
   AliCodeTimerAuto("")
-  TString detStr = detectors;
+  TString detStr = fQADetectors ;
   for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
    if (!IsSelected(fgkDetectorName[iDet], detStr)) 
      continue;
@@ -2533,9 +2654,10 @@ Bool_t AliReconstruction::RunQA(const char* detectors, AliESDEvent *& esd)
    AliCodeTimerStart(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
    AliInfo(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
     
-   qadm->Exec(AliQA::kESDS, esd) ; 
-   qadm->Increment() ; 
-
+   if (fQATasks.Contains(Form("%d", AliQA::kESDS))) {
+          qadm->Exec(AliQA::kESDS, esd) ; 
+          qadm->Increment() ; 
+   }
    AliCodeTimerStop(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
  }
  if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
@@ -2682,3 +2804,49 @@ void AliReconstruction::RunAliEVE()
   gROOT->ProcessLine("gAliEveEvent->StartStopAutoLoadTimer();");
   gSystem->Run();
 }
+
+//_____________________________________________________________________________
+Bool_t AliReconstruction::SetRunQA(TString detAndAction) 
+{
+       // Allows to run QA for a selected set of detectors
+       // and a selected set of tasks among RAWS, RECPOINTS and ESDS
+       // all selected detectors run the same selected tasks
+       
+       if (!detAndAction.Contains(":")) {
+               AliError( Form("%s is a wrong syntax, use \"DetectorList:ActionList\" \n", detAndAction.Data()) ) ;
+               fRunQA = kFALSE ;
+               return kFALSE ;                 
+       }
+       Int_t colon = detAndAction.Index(":") ; 
+       fQADetectors = detAndAction(0, colon) ; 
+       if (fQADetectors.Contains("ALL") )
+               fQADetectors = fFillESD ; 
+       fQATasks   = detAndAction(colon+1, detAndAction.Sizeof() ) ; 
+       if (fQATasks.Contains("ALL") ) {
+               fQATasks = Form("%d %d %d", AliQA::kRAWS, AliQA::kRECPOINTS, AliQA::kESDS) ; 
+       } else {
+               fQATasks.ToUpper() ; 
+               TString tempo("") ; 
+               if ( fQATasks.Contains("RAW") ) 
+                       tempo = Form("%d ", AliQA::kRAWS) ; 
+               if ( fQATasks.Contains("RECPOINT") ) 
+                       tempo += Form("%d ", AliQA::kRECPOINTS) ; 
+               if ( fQATasks.Contains("ESD") ) 
+                       tempo += Form("%d ", AliQA::kESDS) ; 
+               fQATasks = tempo ; 
+               if (fQATasks.IsNull()) {
+                       AliInfo("No QA requested\n")  ;
+                       fRunQA = kFALSE ;
+                       return kTRUE ; 
+               }
+       }       
+       TString tempo(fQATasks) ; 
+    tempo.ReplaceAll(Form("%d", AliQA::kRAWS), AliQA::GetTaskName(AliQA::kRAWS))       ;
+    tempo.ReplaceAll(Form("%d", AliQA::kRECPOINTS), AliQA::GetTaskName(AliQA::kRECPOINTS)) ;   
+    tempo.ReplaceAll(Form("%d", AliQA::kESDS), AliQA::GetTaskName(AliQA::kESDS)) ;     
+       AliInfo( Form("QA will be done on \"%s\" for \"%s\"\n", fQADetectors.Data(), tempo.Data()) ) ;  
+       fRunQA = kTRUE ;
+       return kTRUE; 
+} 
+
+