#include "AliITSUTrackCond.h" #include "AliITSUAux.h" #include "AliLog.h" #include using namespace AliITSUAux; using namespace TMath; Char_t AliITSUTrackCond::fgkClSharing = 0; Int_t AliITSUTrackCond::fgkMaxBranches = 50; Int_t AliITSUTrackCond::fgkMaxCandidates = 500; Float_t AliITSUTrackCond::fgkMaxTr2ClChi2 = 50.; Float_t AliITSUTrackCond::fgkMaxChi2GloNrm = 50.; Float_t AliITSUTrackCond::fgkMissPenalty = 2.; Float_t AliITSUTrackCond::fgkMaxMatchChi2 = 15.; Float_t AliITSUTrackCond::fgkMaxITSSAChi2 = 15; //______________________________________________________________ AliITSUTrackCond::AliITSUTrackCond(int nLayers) :fInitDone(kFALSE) ,fActiveLrInner(0) ,fActiveLrOuter(0) ,fExlLayers(0) ,fNLayers(0) ,fMaxITSTPCMatchChi2(fgkMaxMatchChi2) ,fMaxITSSAChi2(fgkMaxITSSAChi2) ,fClSharing(0) ,fMaxBranches(0) ,fMaxCandidates(0) ,fMaxTr2ClChi2(0) ,fMaxChi2GloNrm(0) ,fMissPenalty(0) ,fNSigmaRoadY(0) ,fNSigmaRoadZ(0) ,fNConditions(0) ,fConditions(0) ,fAuxData(0) { // def c-tor if (nLayers) SetNLayers(nLayers); } //______________________________________________________________ AliITSUTrackCond::AliITSUTrackCond(const AliITSUTrackCond& src) :TObject(src) ,fInitDone(src.fInitDone) ,fActiveLrInner(src.fActiveLrInner) ,fActiveLrOuter(src.fActiveLrOuter) ,fExlLayers(src.fExlLayers) ,fNLayers(0) ,fMaxITSTPCMatchChi2(src.fMaxITSTPCMatchChi2) ,fMaxITSSAChi2(src.fMaxITSSAChi2) ,fClSharing(0) ,fMaxBranches(0) ,fMaxCandidates(0) ,fMaxTr2ClChi2(0) ,fMaxChi2GloNrm(0) ,fMissPenalty(0) ,fNSigmaRoadY(0) ,fNSigmaRoadZ(0) ,fNConditions(src.fNConditions) ,fConditions(src.fConditions) ,fAuxData(src.fAuxData) { // copy c-tor SetNLayers(src.fNLayers); for (int i=fNLayers;i--;) { SetMaxBranches(i,src.GetMaxBranches(i)); SetMaxCandidates(i,src.GetMaxCandidates(i)); SetMaxTr2ClChi2(i,src.GetMaxTr2ClChi2(i)); SetMaxChi2GloNrm(i,src.GetMaxChi2GloNrm(i)); SetMissPenalty(i,src.GetMissPenalty(i)); SetNSigmaRoadY(i,src.GetNSigmaRoadY(i)); SetNSigmaRoadZ(i,src.GetNSigmaRoadZ(i)); SetClSharing(i,src.GetClSharing(i)); } } //______________________________________________________________ AliITSUTrackCond& AliITSUTrackCond::operator=(const AliITSUTrackCond& src) { // copy op. if (this!=&src) { fInitDone = src.fInitDone; fActiveLrInner = src.fActiveLrInner; fActiveLrOuter = src.fActiveLrOuter; // fExlLayers = src.fExlLayers; fNConditions = src.fNConditions; fConditions = src.fConditions; fMaxITSTPCMatchChi2 = src.fMaxITSTPCMatchChi2; fMaxITSSAChi2 = src.fMaxITSSAChi2; // SetNLayers(src.fNLayers); // for (int i=fNLayers;i--;) { SetMaxBranches(i,src.GetMaxBranches(i)); SetMaxCandidates(i,src.GetMaxCandidates(i)); SetMaxTr2ClChi2(i,src.GetMaxTr2ClChi2(i)); SetMaxChi2GloNrm(i,src.GetMaxChi2GloNrm(i)); SetMissPenalty(i,src.GetMissPenalty(i)); SetNSigmaRoadY(i,src.GetNSigmaRoadY(i)); SetNSigmaRoadZ(i,src.GetNSigmaRoadZ(i)); SetClSharing(i,src.GetClSharing(i)); } fAuxData = src.fAuxData; } return *this; } //______________________________________________________________ void AliITSUTrackCond::SetNLayers(int nLayers) { // set number of layers fInitDone = kFALSE; if (fNLayers) { delete[] fClSharing; delete[] fMaxBranches; delete[] fMaxCandidates; delete[] fMaxTr2ClChi2; delete[] fMaxChi2GloNrm; delete[] fMissPenalty; delete[] fNSigmaRoadY; delete[] fNSigmaRoadZ; } fNLayers = nLayers; // if (fNLayers>0) { fActiveLrInner = 0; fActiveLrOuter = fNLayers-1; fClSharing = new Char_t[fNLayers]; fMaxBranches = new Short_t[fNLayers]; fMaxCandidates = new Short_t[fNLayers]; fMaxTr2ClChi2 = new Float_t[fNLayers]; fMaxChi2GloNrm = new Float_t[fNLayers]; fMissPenalty = new Float_t[fNLayers]; fNSigmaRoadY = new Float_t[fNLayers]; fNSigmaRoadZ = new Float_t[fNLayers]; for (int i=fNLayers;i--;) { SetClSharing(i,fgkClSharing); SetMaxBranches(i,fgkMaxBranches); SetMaxCandidates(i,fgkMaxCandidates); SetMaxTr2ClChi2(i,fgkMaxTr2ClChi2); SetMaxChi2GloNrm(i,fgkMaxChi2GloNrm); SetMissPenalty(i,fgkMissPenalty); SetNSigmaRoadY(i,-1); // force recalculation SetNSigmaRoadZ(i,-1); // force recalculation } } else { fClSharing = 0; fMaxBranches = 0; fMaxCandidates = 0; fMaxTr2ClChi2 = 0; fMaxChi2GloNrm = 0; fMissPenalty = 0; fNSigmaRoadY = 0; fNSigmaRoadZ = 0; } // } //______________________________________________________________ void AliITSUTrackCond::AddGroupPattern(UShort_t patt,Int_t minCl) { // add new group pattern to last condition: the track should have at least minCl clusters at layers given by patt if (fNConditions<1) AliFatal("Can be called only after AddCondition"); if (minCl>int(AliITSUAux::kMaxLayers)) AliFatal(Form("Requested Nlayers=%d exceeds max alowed %d",minCl,AliITSUAux::kMaxLayers)); if (minCl<1) AliFatal(Form("Requested Nlayers=%d for pattern %x",minCl,patt)); int ind = fConditions.GetSize(); fConditions.Set(ind+1); fConditions[ind] = (patt&AliITSUAux::kMaxLrMask) | (minCl<ncl) {cntCond+=kNAuxSz; continue;} // check number of clusters int grAddr = arrAux[cntCond+kCondStart]; // 1st group pattern address in the condition Bool_t ok = kTRUE; // if every group of the condition does not match, check next contition for (int ig=arrAux[cntCond+kNGroups];ig--;) { UInt_t pattReq = arrGrp[grAddr++]; UShort_t actLr = (pattReq&AliITSUAux::kMaxLrMask)&patt; // patter of active layers satisfying to mask if (!actLr || NumberOfBitsSet(actLr)>kShiftNcl)) {ok = kFALSE; break;} } if (ok) return kTRUE; cntCond += kNAuxSz; } return kFALSE; } //______________________________________________________________ void AliITSUTrackCond::Print(Option_t*) const { // print conditions int nc = GetNConditions(); Short_t *arrAux = (Short_t*)fAuxData.GetArray(); UInt_t *arrGrp = (UInt_t*)fConditions.GetArray(); int cntCond = 0; printf("Conditions set ID=%d : %d entries\n",GetID(),nc); for (int i=0;i>kShiftNcl); grAddr++; } printf("\n"); cntCond += kNAuxSz; } if (fExlLayers) { printf("Exluded Layers: "); for (int i=0;i