19 #include <TClonesArray.h> 21 #include "AliAODEvent.h" 22 #include "AliESDEvent.h" 23 #include "AliVEvent.h" 35 {
"kNonLinCorr", AliVCluster::kNonLinCorr },
36 {
"kHadCorr", AliVCluster::kHadCorr },
37 {
"kUserDefEnergy1", AliVCluster::kUserDefEnergy1 },
38 {
"kUserDefEnergy2", AliVCluster::kUserDefEnergy2 }
52 fDefaultClusterEnergy(-1),
54 fIncludePHOSonly(kFALSE),
58 fEmcalMaxM02(DBL_MAX),
59 fEmcalMaxM02CutEnergy(DBL_MAX)
61 fBaseClassName =
"AliVCluster";
62 SetClassName(
"AliVCluster");
64 for (
Int_t i = 0; i <= AliVCluster::kLastUserDefEnergy; i++) {
74 AliEmcalContainer(name),
87 fBaseClassName =
"AliVCluster";
88 SetClassName(
"AliVCluster");
90 for (
Int_t i = 0; i <= AliVCluster::kLastUserDefEnergy; i++) {
107 if (option.Contains(
"e")) {
108 momentum = &AliTLorentzVector::E;
111 momentum = &AliTLorentzVector::Et;
117 if ((clusterMax.first.*momentum)() < (cluster.first.*momentum)()) {
118 clusterMax = cluster;
122 return clusterMax.second;
132 if(i<0 || i>fClArray->GetEntriesFast())
return 0;
133 AliVCluster *vp =
static_cast<AliVCluster*
>(fClArray->At(i));
148 UInt_t rejectionReason = 0;
152 AliDebug(2,
"Cluster not accepted.");
164 Int_t i = GetIndexFromLabel(lab);
175 Int_t i = GetIndexFromLabel(lab);
185 const Int_t n = GetNEntries();
189 if (fCurrentID >= n)
break;
202 const Int_t n = GetNEntries();
206 if (fCurrentID >= n)
break;
215 if (mass < 0) mass = 0;
226 Double_t p = TMath::Sqrt(energy*energy - mass*mass);
229 vc->GetPosition(pos);
235 Double_t r = TMath::Sqrt(pos[0]*pos[0]+pos[1]*pos[1]+pos[2]*pos[2]) ;
238 mom.SetPxPyPzE( p*pos[0]/r, p*pos[1]/r, p*pos[2]/r, energy) ;
241 AliInfo(
"Null cluster radius, momentum calculation not possible");
250 if (fMassHypothesis > 0)
return GetMomentum(mom, vc, fMassHypothesis);
257 vc->GetMomentum(mom, fVertex);
261 mom.SetPtEtaPhiM(0, 0, 0, 0.139);
316 if (!r)
return kFALSE;
321 return ApplyKinematicCuts(mom, rejectionReason);
327 if (!r)
return kFALSE;
332 return ApplyKinematicCuts(mom, rejectionReason);
344 rejectionReason |= kNullObject;
348 Bool_t bInAcceptance = clus->IsEMCAL();
350 bInAcceptance = clus->IsEMCAL() || (clus->GetType() == AliVCluster::kPHOSNeutral);
353 bInAcceptance = (clus->GetType() == AliVCluster::kPHOSNeutral);
355 if (!bInAcceptance) {
356 rejectionReason |= kIsEMCalCut;
360 if (clus->TestBits(fBitMap) != (
Int_t)fBitMap) {
361 rejectionReason |= kBitMapCut;
365 if (fMinMCLabel >= 0 && TMath::Abs(clus->GetLabel()) < fMinMCLabel) {
366 rejectionReason |= kMCLabelCut;
370 if (fMaxMCLabel >= 0 && TMath::Abs(clus->GetLabel()) > fMaxMCLabel) {
371 rejectionReason |= kMCLabelCut;
376 rejectionReason |= kTimeCut;
381 rejectionReason |= kExoticCut;
385 if (clus->IsEMCAL()) {
388 rejectionReason |= kExoticCut;
394 for (
Int_t i = 0; i <= AliVCluster::kLastUserDefEnergy; i++) {
396 rejectionReason |= kEnergyCut;
402 if (clus->GetType() == AliVCluster::kPHOSNeutral) {
404 rejectionReason |= kExoticCut;
409 rejectionReason |= kExoticCut;
424 UInt_t rejectionReason = 0;
426 for(
int iclust = 0; iclust < this->fClArray->GetEntries(); ++iclust){
427 AliVCluster *clust = this->
GetCluster(iclust);
440 if (t >= 0 && t <= AliVCluster::kLastUserDefEnergy){
455 if (t >= 0 && t <= AliVCluster::kLastUserDefEnergy){
473 AliEmcalContainer::SetArray(event);
522 clusterString = TString::Format(
"%s_E0000", GetArrayName().
Data());
524 else if (Ecut < 1.0) {
525 clusterString = TString::Format(
"%s_E0%3.0f", GetArrayName().
Data(), Ecut*1000.0);
528 clusterString = TString::Format(
"%s_E%4.0f", GetArrayName().
Data(), Ecut*1000.0);
531 return clusterString.Data();
535 if(ev->IsA() == AliAODEvent::Class())
return "caloClusters";
536 else if(ev->IsA() == AliESDEvent::Class())
return "CaloClusters";
546 std::vector<AliVCluster *> reference, variation;
547 AliVCluster *
test = NULL;
548 for(
int iclust = 0; iclust < cont->
GetNClusters(); iclust++){
551 UInt_t rejectionReason = 0;
554 reference.push_back(test);
559 for(
auto cluster : cont->
accepted()){
560 variation.push_back(cluster);
564 for(
auto cluster : cont->
all()){
565 variation.push_back(cluster);
571 if(reference.size() < 30){
572 std::cout <<
"Clusters in reference container: " << std::endl;
573 std::cout <<
"===========================================" << std::endl;
574 for(std::vector<AliVCluster *>::iterator refit = reference.begin(); refit != reference.end(); ++refit){
575 std::cout <<
"Address: " << *refit << std::endl;
578 if(variation.size() < 30){
579 std::cout <<
"Clusters in test container: " << std::endl;
580 std::cout <<
"===========================================" << std::endl;
581 for(std::vector<AliVCluster *>::iterator varit = variation.begin(); varit != variation.end(); ++varit){
582 std::cout <<
"Address: " << *varit << std::endl;
589 bool failure =
false;
591 for(std::vector<AliVCluster *>::iterator clit = reference.begin(); clit != reference.end(); ++clit){
592 if(std::find(variation.begin(), variation.end(), *clit) == variation.end()) {
594 std::cout <<
"Could not find cluster with address " << *clit <<
" in test container" << std::endl;
601 for(std::vector<AliVCluster *>::iterator clit = variation.begin(); clit != variation.end(); ++clit){
602 if(std::find(reference.begin(), reference.end(), *clit) == reference.end()) {
604 std::cout <<
"Could not find cluster with address " << *clit <<
" in reference container" << std::endl;
609 if(failure) testresult = 2;
615 std::cout <<
"Unit test cluster container, iterator type " << iteratorType << std::endl;
616 std::cout <<
"Number of expected clusters: " << reference.size() <<
", number of found clusters: " << variation.size() << std::endl;
617 std::cout <<
"Test result: " << testresult << std::endl;
618 std::cout <<
"-----------------------------------------------------------------------" << std::endl;
AliVCluster * GetAcceptClusterWithLabel(Int_t lab) const
virtual TString GetDefaultArrayName(const AliVEvent *const ev) const
virtual Bool_t ApplyClusterCuts(const AliVCluster *clus, UInt_t &rejectionReason) const
Bool_t GetNextAcceptMomentum(TLorentzVector &mom)
const char * GetTitle() const
EMCALIterableContainer::AliEmcalIterableContainerT< AliVCluster, EMCALIterableContainer::operator_star_object< AliVCluster > > AliClusterIterableContainer
Bool_t GetNextMomentum(TLorentzVector &mom)
const AliClusterIterableMomentumContainer accepted_momentum() const
Bool_t fIncludePHOS
flag to accept PHOS clusters in addition to EMCal clusters
Declaration of class AliTLorentzVector.
Double_t fClusTimeCutLow
low time cut for clusters
Double_t fUserDefEnergyCut[AliVCluster::kLastUserDefEnergy+1]
cut on the energy of the cluster after higher level corrections (see AliVCluster.h) ...
void SetClusUserDefEnergyCut(Int_t t, Double_t cut)
AliVCluster * GetLeadingCluster(const char *opt="")
Double_t GetClusUserDefEnergyCut(Int_t t) const
Int_t GetDefaultClusterEnergy() const
const AliClusterIterableContainer all() const
enum AliVCluster::VCluUserDefEnergy_t VCluUserDefEnergy_t
Double_t fEmcalMaxM02CutEnergy
max EMCal cluster energy for which to apply M02 cut
std::pair< AliTLorentzVector, T * > momentum_object_pair
Double_t fEmcalMaxM02
max value of M02 for EMCAL clusters
Double_t fEmcalMinM02
min value of M02 for EMCAL clusters
virtual Bool_t AcceptCluster(Int_t i, UInt_t &rejectionReason) const
AliVCluster * GetAcceptCluster(Int_t i) const
Int_t GetNClusters() const
Int_t GetNAcceptedClusters() const
const AliClusterIterableContainer accepted() const
Double_t fClusTimeCutUp
up time cut for clusters
AliVCluster * GetCluster(Int_t i) const
Bool_t fExoticCut
reject clusters marked as "exotic"
AliVCluster * GetNextCluster()
Bool_t Data(TH1F *h, Double_t *rangefit, Bool_t writefit, Double_t &sgn, Double_t &errsgn, Double_t &bkg, Double_t &errbkg, Double_t &sgnf, Double_t &errsgnf, Double_t &sigmafit, Int_t &status)
int RegisterArray(U *inputObject)
EMCALIterableContainer::AliEmcalIterableContainerT< AliVCluster, EMCALIterableContainer::operator_star_pair< AliVCluster > > AliClusterIterableMomentumContainer
const AliClusterIterableMomentumContainer all_momentum() const
Bool_t GetAcceptMomentum(TLorentzVector &mom, Int_t i) const
AliVCluster * GetClusterWithLabel(Int_t lab) const
Double_t fPhosMinM02
min value of M02 for phos clusters
int TestClusterContainerIterator(const AliClusterContainer *const cont, int iteratorType, bool verbose)
Bool_t GetMomentum(TLorentzVector &mom, const AliVCluster *vc, Double_t mass) const
void SetArray(const AliVEvent *event)
void test(int runnumber=195345)
Bool_t fIncludePHOSonly
flag to accept only PHOS clusters (and reject EMCal clusters)
Int_t fDefaultClusterEnergy
default cluster energy: -1 for clus->E(); otherwise clus->GetUserDefEnergy(fDefaultClusterEnergy) ...
static AliEmcalContainerIndexMap< TClonesArray, AliVCluster > fgEmcalContainerIndexMap
! Mapping from containers to indices
Container structure for EMCAL clusters.
static const std::map< std::string, VCluUserDefEnergy_t > fgkClusterEnergyTypeMap
Relates string to the cluster energy enumeration for YAML configuration.
AliVCluster * GetNextAcceptCluster()
Int_t fPhosMinNcells
min number of phos cells per cluster