]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HLT/trigger/AliHLTTriggerBarrelMultiplicity.cxx
implementing possibility of multiple BarrelMultiplicityTrigger instances with differe...
[u/mrichter/AliRoot.git] / HLT / trigger / AliHLTTriggerBarrelMultiplicity.cxx
index fe356f4c4e90fa829bbe4bf7bdbcb60e9db4ca93..b5e13ef546cfa5717cb59c6fa9ccc6bd2d278dbe 100644 (file)
@@ -32,6 +32,8 @@
 #include "AliHLTTriggerDecision.h"
 #include "AliHLTDomainEntry.h"
 #include "AliHLTGlobalBarrelTrack.h"
+#include "TObjArray.h"
+#include "TObjString.h"
 
 /** ROOT macro for the implementation of ROOT specific class methods */
 ClassImp(AliHLTTriggerBarrelMultiplicity)
@@ -41,15 +43,24 @@ AliHLTTriggerBarrelMultiplicity::AliHLTTriggerBarrelMultiplicity()
   , fPtMin(0.0)
   , fPtMax(0.0)
   , fMinTracks(1)
+  , fDCAReference()
+  , fMinLDca(-1.)
+  , fMaxLDca(-1.)
+  , fMinTDca(-1.)
+  , fMaxTDca(-1.)
+  , fSolenoidBz(0.0)
+  , fName()
 {
   // see header file for class documentation
   // or
   // refer to README to build package
   // or
   // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
+
+  for (int i=0; i<fgkDCAReferenceSize; i++) fDCAReference[i]=0.0;
 }
 
-const char* AliHLTTriggerBarrelMultiplicity::fgkOCDBEntry="HLT/ConfigHLT/BarrelMultiplicityTrigger";
+const char* AliHLTTriggerBarrelMultiplicity::fgkDefaultOCDBEntry="HLT/ConfigHLT/BarrelMultiplicityTrigger";
 
 AliHLTTriggerBarrelMultiplicity::~AliHLTTriggerBarrelMultiplicity()
 {
@@ -78,13 +89,13 @@ int AliHLTTriggerBarrelMultiplicity::DoTrigger()
   const TObject* obj = GetFirstInputObject(kAliHLTAllDataTypes, "AliESDEvent");
   AliESDEvent* esd = dynamic_cast<AliESDEvent*>(const_cast<TObject*>(obj));
   TString description;
-  TString ptcut;
+  TString ptcut,tdca,ldca,dcaref,op1st,op2nd;
   if (esd != NULL) {
     numberOfTracks=0;
     esd->GetStdContent();
     
     for (Int_t i = 0; i < esd->GetNumberOfTracks(); i++) {
-      if (CheckCondition(esd->GetTrack(i))) numberOfTracks++;
+      if (CheckCondition(esd->GetTrack(i), esd->GetMagneticField())) numberOfTracks++;
     }
   }
 
@@ -97,7 +108,7 @@ int AliHLTTriggerBarrelMultiplicity::DoTrigger()
       if ((iResult=AliHLTGlobalBarrelTrack::ConvertTrackDataArray(reinterpret_cast<const AliHLTTracksData*>(pBlock->fPtr), pBlock->fSize, tracks))>0) {
        for (vector<AliHLTGlobalBarrelTrack>::iterator element=tracks.begin();
             element!=tracks.end(); element++) {
-         if (CheckCondition(&(*element))) numberOfTracks++;
+         if (CheckCondition(&(*element), fSolenoidBz)) numberOfTracks++;
        }
       } else if (iResult<0) {
        HLTError("can not extract tracks from data block of type %s (specification %08x) of size %d: error %d", 
@@ -106,15 +117,54 @@ int AliHLTTriggerBarrelMultiplicity::DoTrigger()
     }
   }
 
+  bool condition=false;
   if (iResult>=0 && numberOfTracks>=0) {
     if (fPtMax>fPtMin) {
       ptcut.Form(" %.02f GeV/c <= pt < %.02f GeV/c", fPtMin, fPtMax);
     } else {
       ptcut.Form(" pt >= %.02f GeV/c", fPtMin);
     }
+
+    if (fMinTDca>=0.0) {
+      if (fMaxTDca>=0.0) {
+       tdca.Form(", %.02f<=transverse_dca<=%.02f", fMinTDca, fMaxTDca);
+      } else {
+       tdca.Form(" transverse_dca >= %.02f", fMinTDca);
+      }
+    } else if (fMaxTDca>=0.0) {
+       tdca.Form(" transverse_dca<=%.02f", fMaxTDca);
+    }
+    if (!tdca.IsNull()) {
+      if (op1st.IsNull()) op1st=" && ";
+      else op2nd=" && ";
+    }
+
+    if (fMinLDca>=0.0) {
+      if (fMaxLDca>=0.0) {
+       ldca.Form(" %.02f<=longitudinal_dca<=%.02f", fMinLDca, fMaxLDca);
+      } else {
+       ldca.Form(" longitudinal_dca >= %.02f", fMinLDca);
+      }
+    } else if (fMaxLDca>=0.0) {
+       ldca.Form(" longitudinal_dca<=%.02f", fMaxLDca);
+    }
+    if (!ldca.IsNull()) {
+      if (op1st.IsNull()) op1st=" && ";
+      else op2nd=" && ";
+    }
+
+    if (fMinTDca>=0.0 || fMaxTDca>=0 || fMinLDca>=0.0 || fMaxLDca>=0) {
+      dcaref.Form(" (%.01f,%.01f,%.01f)", fDCAReference[0], fDCAReference[1], fDCAReference[2]);
+    }
+
     if (numberOfTracks>=fMinTracks) {
       description.Form("Event contains %d track(s) with ", numberOfTracks);
       description+=ptcut;
+      description+=op1st;
+      description+=ldca;
+      description+=op2nd;
+      description+=tdca;
+      description+=dcaref;
       SetDescription(description.Data());
       // Enable the central detectors for readout.
       GetReadoutList().Enable(
@@ -125,44 +175,97 @@ int AliHLTTriggerBarrelMultiplicity::DoTrigger()
                              AliHLTReadoutList::kTRD |
                              AliHLTReadoutList::kTOF |
                              AliHLTReadoutList::kHMPID |
-                             AliHLTReadoutList::kPHOS
+                             AliHLTReadoutList::kPHOS |
+                             AliHLTReadoutList::kEMCAL
                              );
-      // Add the available HLT information for readout too.
-      GetTriggerDomain().Add("CLUSTERS", "TPC ");
-      TriggerEvent(true);
-      return 0;
+      condition=true;
+    } else {
+    description.Form("No tracks matching the tresholds found in the central barrel (min tracks %d, ", fMinTracks);
+    description+=ptcut;
+    description+=op1st;
+    description+=ldca;
+    description+=op2nd;
+    description+=tdca;
+    description+=dcaref;
+    description+=")";
     }
-    description.Form("No tracks matching the tresholds found in the central barrel (min tracks %d, %s)",
-                    fMinTracks, ptcut.Data());
   } else {
     description.Form("No input blocks found");
   }
-  SetDescription(description.Data());
-  TriggerEvent(false);
+
+  // add a specific trigger decision object with initialized name
+  // the readout list however is fixed 
+  AliHLTTriggerDecision decision(
+                                condition,
+                                fName.IsNull()?GetTriggerName():fName.Data(),
+                                GetReadoutList(),
+                                description.Data()
+                                );
+  TriggerEvent(&decision, kAliHLTDataTypeTObject|kAliHLTDataOriginOut);
+
   return iResult;
 }
 
 template<class T>
-bool AliHLTTriggerBarrelMultiplicity::CheckCondition(T* track)
+bool AliHLTTriggerBarrelMultiplicity::CheckCondition(T* track, float b)
 {
   // see header file for class documentation
-  if (track && track->Pt() >= fPtMin &&
-      (fPtMax<=fPtMin || track->Pt() < fPtMax)) {
-    return true;
+  if (!track) return false;
+
+  // check on ptransverse momentum
+  if (TMath::Abs(track->Pt()) < fPtMin || (fPtMax>fPtMin && TMath::Abs(track->Pt()) > fPtMax)) {
+    return false;
+  }
+
+  // check on transverse and longitudinal DCA
+  if (fMinTDca>=0.0 || fMaxTDca>=0 || fMinLDca>=0.0 || fMaxLDca>=0) {
+    Float_t dz[2]={0.0,0.0};
+    track->GetDZ(fDCAReference[0], fDCAReference[1], fDCAReference[2], b, dz);
+    HLTDebug("checking dca condition: transversal %f logitudinal %f", dz[0], dz[1]);
+    if (fMinTDca>=0 && TMath::Abs(dz[0])<fMinTDca) return false;
+    if (fMaxTDca>=0 && TMath::Abs(dz[0])>fMaxTDca) return false;
+    if (fMinLDca>=0 && TMath::Abs(dz[1])<fMinLDca) return false;
+    if (fMaxLDca>=0 && TMath::Abs(dz[1])>fMaxLDca) return false;
   }
-  return false;
+
+  return true;
 }
 
 int AliHLTTriggerBarrelMultiplicity::DoInit(int argc, const char** argv)
 {
   // see header file for class documentation
+  int iResult=0;
+
+  // check if the -triggername argument is used
+  // the name of the trigger determines the following initialization
+  vector<const char*> remainingArgs;
+  for (int i=0; i<argc; i++) {
+    if (strcmp(argv[i], "-triggername")==0) {
+      if (++i<argc) fName=argv[i];
+      else {
+       HLTError("invalid parameter for argument '-triggername', string expected");
+       return -EINVAL;
+      }
+      continue;
+    }
+    remainingArgs.push_back(argv[i]);
+  }
 
   // first configure the default
-  int iResult=ConfigureFromCDBTObjString(fgkOCDBEntry);
+  TString cdbPath;
+  if (!fName.IsNull()) {
+    cdbPath="HLT/ConfigHLT/";
+    cdbPath+=fName;
+  } else {
+    cdbPath=fgkDefaultOCDBEntry;
+  }
+  iResult=ConfigureFromCDBTObjString(cdbPath);
 
   // configure from the command line parameters if specified
   if (iResult>=0 && argc>0)
-    iResult=ConfigureFromArgumentString(argc, argv);
+    iResult=ConfigureFromArgumentString(remainingArgs.size(), &(remainingArgs[0]));
+
+  fSolenoidBz=GetBz();
   return iResult;
 }
 
@@ -177,10 +280,27 @@ int AliHLTTriggerBarrelMultiplicity::Reconfigure(const char* cdbEntry, const cha
   // see header file for class documentation
 
   // configure from the specified antry or the default one
-  const char* entry=cdbEntry;
-  if (!entry || entry[0]==0) entry=fgkOCDBEntry;
+  TString cdbPath;
+  if (!cdbEntry || cdbEntry[0]==0) {
+    if (!fName.IsNull()) {
+      cdbPath="HLT/ConfigHLT/";
+      cdbPath+=fName;
+    } else {
+      cdbPath=fgkDefaultOCDBEntry;
+    }
+  } else {
+    cdbPath=cdbEntry;
+  }
+
+  return ConfigureFromCDBTObjString(cdbPath);
+}
+
+int AliHLTTriggerBarrelMultiplicity::ReadPreprocessorValues(const char* /*modules*/)
+{
+  // see header file for class documentation
 
-  return ConfigureFromCDBTObjString(entry);
+  // nothing to do for the moment
+  return 0;
 }
 
 int AliHLTTriggerBarrelMultiplicity::ScanConfigurationArgument(int argc, const char** argv)
@@ -213,7 +333,67 @@ int AliHLTTriggerBarrelMultiplicity::ScanConfigurationArgument(int argc, const c
     fMinTracks=argument.Atoi();
     return 2;
   }    
+
+  // -dca-reference
+  // reference point for the transverse and longitudinal dca cut
+  if (argument.CompareTo("-dca-reference")==0) {
+    if (++i>=argc) return -EPROTO;
+    argument=argv[i];
+    // scan x,y,z
+    TObjArray* pTokens=argument.Tokenize("'");
+    if (pTokens) {
+      for (int c=0; c<pTokens->GetEntriesFast() && c<fgkDCAReferenceSize; c++) {
+       argument=((TObjString*)pTokens->At(c))->GetString();
+       fDCAReference[i]=argument.Atof();
+      }
+      delete pTokens;
+    }
+    return 2;
+  }
+
+  // -min-ldca
+  // minimum longitudinal dca to reference point
+  if (argument.CompareTo("-min-ldca")==0) {
+    if (++i>=argc) return -EPROTO;
+    argument=argv[i];
+    fMinLDca=argument.Atof();
+    return 2;
+  }
+  
+  // -max-ldca
+  // maximum longitudinal dca to reference point
+  if (argument.CompareTo("-max-ldca")==0) {
+    if (++i>=argc) return -EPROTO;
+    argument=argv[i];
+    fMaxLDca=argument.Atof();
+    return 2;
+  }
+
+  // -min-tdca
+  // minimum transverse dca to reference point
+  if (argument.CompareTo("-min-tdca")==0) {
+    if (++i>=argc) return -EPROTO;
+    argument=argv[i];
+    fMinTDca=argument.Atof();
+    return 2;
+  }
   
+  // -max-tdca
+  // maximum transverse dca to reference point
+  if (argument.CompareTo("-max-tdca")==0) {
+    if (++i>=argc) return -EPROTO;
+    argument=argv[i];
+    fMaxTDca=argument.Atof();
+    return 2;
+  }
+
+  // -solenoidBz
+  if (argument.CompareTo("-solenoidBz")==0) {
+    if (++i>=argc) return -EPROTO;
+    HLTWarning("argument -solenoidBz is deprecated, magnetic field set up globally (%f)", GetBz());
+    return 2;
+  }
+
   // unknown argument
   return -EINVAL;
 }