32 #include "FairRootManager.h" 
   33 #include "FairRunAna.h" 
   34 #include "FairRuntimeDb.h" 
   36 #include "FairRuntimeDb.h" 
   39 #include "TClonesArray.h" 
   43 #include "TDatabasePDG.h" 
   72   FairTask(
"PndSimpleCombinerTask"), 
fVerbose(0), fEvtCount(0), 
fRun(run), fMode(mode), fRunMult(10000),
 
   73   fAnaDecay(anadecay), fAnaParms(anaparms), fNntp(0), 
 
   74   fPidAlgo(
"PidAlgoEmcBayes;PidAlgoDrc;PidAlgoDisc;PidAlgoStt;PidAlgoMdtHardCuts;PidAlgoSciT;PidAlgoRich;PidAlgoFtof"),
 
   75   fQaMC(false), fQaEventShape(false),  fQaRecoInfo(0), fQaEvShapeNtp(false), fFit4C(false), 
 
   76   fBest4C(false), fFitVtx(false), fFit4CChiCut(1e15), fFitVtxChiCut(1e8), 
 
   77   fAnalysis(0), fSimpleCombiner(0), fNodump(0), nmc(0), nevt(0)
 
   79         fIni.SetXYZT(0,0,0,0);
 
   81         if (p>0.0001) 
fIni.SetXYZT(0,0,p, 
sqrt(p*p+mp*mp)+mp);
 
  101         for (
unsigned int i=0;
i<pars.size();++
i)
 
  104                 bool taskparm = 
false;
 
  107                 if (pars[
i]==
"qamc")                { 
fQaMC             = 
true; taskparm = 
true; } 
 
  108                 if (pars[
i]==
"qaevtshape")          { 
fQaEventShape = 
true; taskparm = 
true; } 
 
  110                 if (pars[
i]==
"qarec")               { 
fQaRecoInfo   = 1   ; taskparm = 
true; } 
 
  111                 if (pars[
i]==
"qarecfull")           { 
fQaRecoInfo   = 2   ; taskparm = 
true; } 
 
  114                 if (pars[
i].Contains(
"fit4c"))      { 
fFit4C            = 
true; taskparm = 
true; } 
 
  115                 if (pars[
i].Contains(
"fit4cbest"))  { 
fBest4C           = 
true; taskparm = 
true; } 
 
  116                 if (pars[
i].Contains(
"fitvtx"))     { 
fFitVtx           = 
true; taskparm = 
true; } 
 
  118                 if (pars[
i].BeginsWith(
"!ntp"))                                                
 
  120                         int ntpnum = ((
TString)(pars[
i](4,100))).Atoi();
 
  121                         if (ntpnum>=0 && ntpnum<32) 
fNodump |= (1<<ntpnum);                        
 
  126                 if (pars[
i].Contains(
"<"))
 
  129                         double cut = 
TString((pars[
i])(pars[i].Index(
"<")+1,1000)).Atof();
 
  130                         if (cut<=0) { cout <<
"[PndSimpleCombinerTask] **** ERROR : Invalid parameter setting '"<<pars[
i]<<
"'"<<endl;
continue; }
 
  138                 if (taskparm) 
fAnaParms.ReplaceAll(pars[
i],
"");
 
  170         TDirectory *dir = gDirectory;
 
  171         FairRootManager::Instance()->GetOutFile()->cd();
 
  173         std::vector<TString> toks;
 
  182                         n = 
new RhoTuple(TString::Format(
"ntp%d",
i), toks[
i]);
 
  187                 TString pname = toks[
i](0,toks[
i].Index(
"->"));
 
  188                 pname.ReplaceAll(
" ",
"");
 
  189                 if (TDatabasePDG::Instance()->GetParticle(pname)) {
vmpdg.push_back(TDatabasePDG::Instance()->GetParticle(pname)->PdgCode());}
 
  204         fOnlineFilterInfo = ( TClonesArray* ) FairRootManager::Instance()->GetObject ( 
"OnlineFilterInfo" );    
 
  208         cout <<
"\n------------------------------------------"<<endl<<
"[PndSimpleCombinerTask] **** Configuration"<<endl<<
"------------------------------------------"<<endl;
 
  214         cout <<
"Ntuple output : ";
 
  215         if (
fQaMC)         cout <<
"nmc  ";
 
  217         for (
int i=0;
i<
fNntp;++
i) 
if (!(
fNodump & (1<<
i))) cout <<
"ntp"<<
i<<
"("<<TDatabasePDG::Instance()->GetParticle(
vmpdg[
i])->GetName()<<
")  ";
 
  218         cout <<
"\n------------------------------------------\n\n"<<endl;
 
  244         TObjArray *tok = s.Tokenize(delim);
 
  245         int N = tok->GetEntries();      
 
  247         for (
int i=0;
i<N;++
i) 
 
  249                 TString st = ((TObjString*)tok->At(
i))->String();
 
  250                 st.ReplaceAll(
"\t",
"");
 
  251                 st = st.Strip(TString::kBoth);
 
  252                 if (st != 
"") toks.push_back(st);
 
  286                         double p  = mclist[0]->P3().Pz();
 
  287                         double mp = 0.938272;
 
  288                         fIni.SetXYZT(0,0,p, 
sqrt(p*p+mp*mp)+mp);
 
  325                 qa.qaEventShape(
"es", evsh, 
nevt);
 
  341                   if (
fNodump & (1<<i)) 
continue; 
 
  345                   if (TDatabasePDG::Instance()->GetParticle(pdg)->AntiParticle()) apdg = TDatabasePDG::Instance()->GetParticle(pdg)->AntiParticle()->PdgCode();
 
  348                   for (j=0; j<
fNntp; ++j) 
if (
vmpdg[j]==apdg) {apdg=0; j=fNntp+1;}
 
  361                   double best4cChi2 = 1e10;
 
  363                   for (j=0;j<l1.GetLength();++j) 
 
  367                           Float_t mmiss = (
fIni-(l1[j]->P4())).M();
 
  368                           Float_t msum  = l1[j]->M() + mmiss;
 
  372                           bool fitaccept = 
true;
 
  381                                   double chi2_4c = fit4c.
GetChi2();   
 
  384                                   if (chi2_4c>best4cChi2 || !fitaccept) 
continue;
 
  386                                   best4cChi2 = chi2_4c;
 
  390                                   vntp[
i]->Column(
"chi24c", (Float_t) chi2_4c);
 
  391                                   qa.qaP4(
"f4cx", cfit->
P4(), 
vntp[
i]);
 
  396                                           qa.qaP4(TString::Format(
"f4cxd%d",k),d0fit->
P4(),
vntp[
i]);
 
  401                                                   qa.qaP4(TString::Format(
"f4cxd%dd%d",k,k2),ddfit->
P4(),
vntp[
i]);
 
  407                           vntp[
i]->Column(
"cand",           (Int_t) j);
 
  408                           vntp[
i]->Column(
"ncand",    (Int_t) l1.GetLength());
 
  413                           vntp[
i]->Column(
"mmiss",      (Float_t) mmiss);
 
  414                           vntp[
i]->Column(
"msum",           (Float_t) msum);
 
  419                           qa.qaComp(
"x", l1[j], 
vntp[i]);
 
  430                                   vntp[
i]->Column(
"trig",    (Int_t) stInfo->
Tagged() );       
 
  437                           if (truth) lv = truth->
P4();
 
  438                           qa.qaP4(
"trx", lv, 
vntp[i]);
 
  449                                   qa.qaVtx(
"fvxx",cfit,
vntp[i]);
 
  450                                   qa.qaP4(
"fvxx", cfit->
P4(), 
vntp[
i]);
 
  451                                   double chi2_vtx = vtxfitter.
GetChi2();     
 
  452                                   vntp[
i]->Column(
"chi2vx", (Float_t) chi2_vtx);
 
  457                           if (fitaccept && ((i<fNntp-1) || !
fBest4C )) 
vntp[
i]->DumpData();
 
  460                   if (
fBest4C && i==fNntp-1 && best4cChi2<1e10) { 
vntp[
i]->DumpData();}
 
  464         if (evsh) 
delete evsh;
 
int SplitString(TString s, TString delim, std::vector< TString > &toks)
friend F32vec4 sqrt(const F32vec4 &a)
Bool_t FillList(RhoCandList &l, TString listkey="All", TString pidTcaNames="", int trackHypothesis=-1)
RhoCandidate * Daughter(Int_t n)
PndSimpleCombinerTask(TString anadecay, TString anaparms, double p=0, int run=0, int mode=0)
void Add4MomConstraint(TLorentzVector lv)
int CountChargedDaughters(RhoCandidate *c)
std::vector< TString > StringList
virtual InitStatus Init()
TLorentzVector P4() const 
void Column(const char *label, Bool_t value, Bool_t defval=0, const char *block=0)
friend F32vec4 fabs(const F32vec4 &a)
TClonesArray * fOnlineFilterInfo
RhoCandidate * GetMcTruth() const 
PndSimpleCombiner * fSimpleCombiner
RhoCandidate * GetFit() const 
virtual void Exec(Option_t *opt)
TTree * GetInternalTree()
void SetVerbose(int verb=1)
bool GetList(RhoCandList &l, TString comp)
std::vector< RhoTuple * > vntp