fDescriptor(NULL),
fCluster(NULL),
fPFProtection(NULL),
- fMask(NULL),
fPrescaler(0),
fAllRare(kFALSE),
fStatus(kFALSE),
fTimeWindow(0)
{
// Default constructor
+ for(Int_t i = 0; i < kNMaxMasks; i++)fMask[i]=0;
}
//_____________________________________________________________________________
fDescriptor( desc ),
fCluster( clus ),
fPFProtection( pfp ),
- fMask( mask ),
fPrescaler( prescaler ),
fAllRare( allrare ),
fStatus(kFALSE),
fTimeWindow(0)
{
// Constructor
+ // This should be used with old version of config
+ for(Int_t i = 0; i < kNMaxMasks; i++)fMask[i]=0;
+ fMask[0]=mask;
}
//_____________________________________________________________________________
fDescriptor( NULL ),
fCluster( NULL ),
fPFProtection( NULL ),
- fMask( NULL ),
fPrescaler( prescaler ),
fAllRare( allrare ),
fStatus(kFALSE),
fTimeGroup(0),
fTimeWindow(0)
{
+ // This should be used with old version of config
fDescriptor = (AliTriggerDescriptor*)config->GetDescriptors().FindObject(desc);
fCluster = (AliTriggerCluster*)config->GetClusters().FindObject(clus);
pfp.ReplaceAll("{","");
pfp.ReplaceAll("}","");
fPFProtection = (AliTriggerPFProtection*)config->GetPFProtections().FindObject(pfp);
+ // BC masks
+ for(Int_t i = 0; i < kNMaxMasks; i++)fMask[i]=0;
mask.ReplaceAll("{","");
mask.ReplaceAll("}","");
- fMask = (AliTriggerBCMask*)config->GetMasks().FindObject(mask);
+ fMask[0] = (AliTriggerBCMask*)config->GetMasks().FindObject(mask);
}
//_____________________________________________________________________________
AliTriggerClass::AliTriggerClass( AliTriggerConfiguration *config,
TString & name, UChar_t index,
TString &desc, TString &clus,
- TString &pfp, TString &mask,
+ TString &pfp,
UInt_t prescaler, Bool_t allrare,
UInt_t timegroup,UInt_t timewindow) :
TNamed( name, name ),
fDescriptor( NULL ),
fCluster( NULL ),
fPFProtection( NULL ),
- fMask( NULL ),
fPrescaler( prescaler ),
fAllRare( allrare ),
fStatus(kFALSE),
pfp.ReplaceAll("{","");
pfp.ReplaceAll("}","");
fPFProtection = (AliTriggerPFProtection*)config->GetPFProtections().FindObject(pfp);
- mask.ReplaceAll("{","");
- mask.ReplaceAll("}","");
- fMask = (AliTriggerBCMask*)config->GetMasks().FindObject(mask);
+ // masks are added by seter
+ for(Int_t i = 0; i < kNMaxMasks; i++)fMask[i]=0;
}
-
//_____________________________________________________________________________
AliTriggerClass::~AliTriggerClass()
{
fDescriptor(trclass.fDescriptor),
fCluster(trclass.fCluster),
fPFProtection(trclass.fPFProtection),
- fMask(trclass.fMask),
fPrescaler(trclass.fPrescaler),
fAllRare(trclass.fAllRare),
fStatus(trclass.fStatus),
fTimeWindow(trclass.fTimeWindow)
{
// Copy constructor
+ for(Int_t i = 0; i < kNMaxMasks; i++)fMask[i]=trclass.fMask[i];
}
-
//______________________________________________________________________________
AliTriggerClass& AliTriggerClass::operator=(const AliTriggerClass& trclass)
{
fDescriptor = trclass.fDescriptor;
fCluster = trclass.fCluster;
fPFProtection = trclass.fPFProtection;
- fMask = trclass.fMask;
+ for(Int_t i=0; i< kNMaxMasks; i++)fMask[i]=trclass.fMask[i];
fPrescaler = trclass.fPrescaler;
fAllRare = trclass.fAllRare;
fStatus = trclass.fStatus;
}
return *this;
}
-
+//_____________________________________________________________________________
+Bool_t AliTriggerClass::SetMasks(AliTriggerConfiguration* config,TString& masks)
+{
+ masks.ReplaceAll("{","");
+ masks.ReplaceAll("}","");
+ masks.ReplaceAll(" ","");
+ masks.ReplaceAll("\t","");
+ TObjArray *tokens = masks.Tokenize(",");
+ Int_t ntokens = tokens->GetEntriesFast();
+ if(ntokens==0){
+ delete tokens;
+ AliError(Form("The class (%s) has invalid mask pattern: (%s)",GetName(),masks.Data()));
+ return kFALSE;
+ }
+ Int_t nmask=0;
+ while(fMask[nmask])nmask++;
+ if(nmask+ntokens>=kNMaxMasks){
+ delete tokens;
+ AliError(Form("The class (%s) exceeds %i masks",GetName(),kNMaxMasks));
+ return kFALSE;
+ }
+ for(Int_t i=nmask; i<nmask+ntokens; i++){
+ fMask[i] = (AliTriggerBCMask*)config->GetMasks().FindObject(((TObjString*)tokens->At(i-nmask))->String());
+ if(!fMask[i]){
+ AliError(Form("The class (%s) unknown mask %s",GetName(),(((TObjString*)tokens->At(i-nmask))->String().Data())));
+ return kFALSE;
+ }
+ }
+ delete tokens;
+ return kTRUE;
+}
//_____________________________________________________________________________
Bool_t AliTriggerClass::CheckClass(AliTriggerConfiguration* config) const
{
AliError(Form("The class (%s) contains invalid past-future protection !",GetName()));
return kFALSE;
}
-
- if (!config->GetMasks().FindObject(fMask)) {
- AliError(Form("The class (%s) contains invalid BC mask !",GetName()));
- return kFALSE;
+
+ for(Int_t i=0; i< kNMaxMasks; i++){
+ if(fMask[i]){
+ if (!config->GetMasks().FindObject(fMask[i])) {
+ AliError(Form("The class (%s) contains invalid BC mask !",GetName()));
+ return kFALSE;
+ }
+ }
}
-
return kTRUE;
}
cout << " Descriptor: " << fDescriptor->GetName() << endl;
cout << " Cluster: " << fCluster->GetName() << endl;
cout << " PF Protection:" << fPFProtection->GetName() << endl;
- cout << " BC Mask: " << fMask->GetName() << endl;
+ cout << " BC Mask: " ;
+ for(Int_t i=0; i< kNMaxMasks; i++)if(fMask[i])cout << fMask[i]->GetName() << " ";
+ cout << endl;
cout << " Prescaler: " << fPrescaler << endl;
cout << " AllRare: " << fAllRare << endl;
cout << " Time Group: " << fTimeGroup << endl;
AliTriggerClass( AliTriggerConfiguration *config,
TString & name, UChar_t index,
TString &desc, TString &clus,
- TString &pfp, TString &mask,
+ TString &pfp,
UInt_t prescaler, Bool_t allrare,
UInt_t timegroup, UInt_t timewindow);
ULong64_t GetMask() const { return fClassMask; }
AliTriggerDescriptor* GetDescriptor() const { return fDescriptor; }
AliTriggerCluster* GetCluster() const { return fCluster; }
- AliTriggerBCMask* GetBCMask() const { return fMask; }
+ AliTriggerBCMask* GetBCMask() const { return fMask[0]; }
UInt_t GetTimeGroup() const { return fTimeGroup; }
UInt_t GetTimeWindow() const { return fTimeGroup; }
+ Bool_t SetMasks(AliTriggerConfiguration *config,TString &mask);
void Trigger( const TObjArray& inputs , const TObjArray& functions);
void Print( const Option_t* ) const;
Bool_t CheckClass(AliTriggerConfiguration *config) const;
Bool_t IsActive( const TObjArray& inputs, const TObjArray& functions) const;
+ enum {kNMaxMasks = 13}; // CTP handles up to 12 different BC masks + NONE
+
private:
ULong64_t fClassMask; // trigger mask (1<< (index-1))
UChar_t fIndex; // position of class in mask
AliTriggerDescriptor* fDescriptor; // pointer to the descriptor
AliTriggerCluster* fCluster; // pointer to the cluster
AliTriggerPFProtection* fPFProtection; // pointer to the past-future protection
- AliTriggerBCMask* fMask; // pointer to bunch-crossing mask
+ AliTriggerBCMask* fMask[kNMaxMasks]; // array of pinters pointer to bunch-crossing mask
UInt_t fPrescaler; // Downscaling factor
Bool_t fAllRare; // All or Rare trigger
Bool_t fStatus; //! true = Condition has been satisfied after Trigger
UInt_t fTimeGroup; // time group
UInt_t fTimeWindow; // the size of time window for its group
- ClassDef( AliTriggerClass, 4 ) // Define a trigger class object
+ ClassDef( AliTriggerClass, 5 ) // Define a trigger class object
};
#endif
AliError("Invalid logical function ! Impossible to add it !");
}
else
- AliError("CTP can handle up to 2 logical functions ! Impossible to add the required interaction !");
+ AliError("CTP can handle up to 4 logical functions ! Impossible to add the required interaction !");
return kFALSE;
}
{
// Add a trigger bunch-crossing mask object to
// the list of the trigger bunch-crossing masks
- if (fMasks.GetEntries() < (kNMaxMasks+1)) { //+1 to account for NONE
+ if (fMasks.GetEntries() < (kNMaxMasks)) {
fMasks.AddLast( mask );
return kTRUE;
}
else
- AliError("CTP can handle up to 4 bunch-crossing masks ! Impossible to add the required mask !");
+ AliError("CTP can handle up to 12 bunch-crossing masks ! Impossible to add the required mask !");
return kFALSE;
}
}
if (((TObjString*)tokens->At(0))->String().BeginsWith("l0f")) {
// function
- AddFunction(((TObjString*)tokens->At(0))->String(),
- strLine.ReplaceAll(((TObjString*)tokens->At(0))->String(),""));
+ if(!AddFunction(((TObjString*)tokens->At(0))->String(),
+ strLine.ReplaceAll(((TObjString*)tokens->At(0))->String(),""))) return kFALSE;
}
else {
- AddDescriptor(((TObjString*)tokens->At(0))->String(),
- strLine.ReplaceAll(((TObjString*)tokens->At(0))->String(),""));
+ if(!AddDescriptor(((TObjString*)tokens->At(0))->String(),
+ strLine.ReplaceAll(((TObjString*)tokens->At(0))->String(),""))) return kFALSE;
}
break;
case 4:
}
if (((TObjString*)tokens->At(0))->String().CompareTo("NONE") == 0)
{
- AddMask(new AliTriggerBCMask(((TObjString*)tokens->At(0))->String()));
+ if(!AddMask(new AliTriggerBCMask(((TObjString*)tokens->At(0))->String()))) return kFALSE;
}
else {
- AddMask(((TObjString*)tokens->At(0))->String(),
- ((TObjString*)tokens->At(1))->String());
+ if(!AddMask(((TObjString*)tokens->At(0))->String(),((TObjString*)tokens->At(1))->String())) return kFALSE;
}
break;
case 7:
((TObjString*)tokens->At(2))->String(),((TObjString*)tokens->At(3))->String(),
((TObjString*)tokens->At(4))->String(),((TObjString*)tokens->At(5))->String(),
((TObjString*)tokens->At(6))->String().Atoi(),(Bool_t)(((TObjString*)tokens->At(7))->String().Atoi()));
- else trclass = new AliTriggerClass(this,
+ else{ trclass = new AliTriggerClass(this,
((TObjString*)tokens->At(0))->String(),((TObjString*)tokens->At(1))->String().Atoi(),
((TObjString*)tokens->At(2))->String(),((TObjString*)tokens->At(3))->String(),
- ((TObjString*)tokens->At(4))->String(),((TObjString*)tokens->At(5))->String(),
+ ((TObjString*)tokens->At(4))->String(),
((TObjString*)tokens->At(6))->String().Atoi(),(Bool_t)(((TObjString*)tokens->At(7))->String().Atoi()),
(((TObjString*)tokens->At(8))->String().Atoi()),(((TObjString*)tokens->At(9))->String().Atoi()));
- AddClass(trclass);
+ if(!trclass->SetMasks(this,((TObjString*)tokens->At(5))->String())) return kFALSE;
+ }
+ AddClass(trclass);
}
default:
break;
enum {kNMaxInputs = 60}; // CTP handles up to 60 trigger detector inputs
enum {kNMaxInteractions = 2}; // CTP handles up to two different interactions
- enum {kNMaxFunctions = 2}; // CTP handles up to two different logical functions
+ enum {kNMaxFunctions = 4}; // CTP handles up to 4 different logical functions
enum {kNMaxClasses = 50}; // Maximum number of trigger classes = 50
enum {kNMaxClusters = 6}; // Maximum number of different detector clusters that can be handled by CTP
enum {kNMaxPFProtections = 4}; // Maximum number of different past-future protections that can be handled by CTP
- enum {kNMaxMasks = 4}; // CTP handles up to 4 different BC masks
+ enum {kNMaxMasks = 13}; // CTP handles up to 12 different BC masks + NONE
private:
Bool_t ProcessConfigurationLine(const char* line, Int_t& level);
delete tokens;
return kFALSE;
}
- if (inp->GetMask() == 0 || inp->GetMask() > 16) {
+ if (inp->GetMask() == 0 || inp->GetMask() > (1<<24)) { // New l0f can use all inputs
AliError( Form( "The trigger input (%s) is not among the first 4 trigger inputs used to create interactions. Interaction (%s) is invalid",
iname->String().Data(), GetName() ) );
delete tokens;