#include "AliAODVertex.h"
#include "AliESDVertex.h"
#include "AliAODRecoDecay.h"
-#include "AliHLTMCEvent.h"
-#include "AliStack.h"
-#include "TParticle.h"
+#include "TMap.h"
+#include "AliHLTD0Candidate.h"
+#include "TFile.h"
+#include "TClonesArray.h"
/** ROOT macro for the implementation of ROOT specific class methods */
ClassImp(AliHLTD0Trigger)
, fcosPoint(0.0)
, fplothisto(false)
, fUseV0(false)
- , mD0PDG(TDatabasePDG::Instance()->GetParticle(421)->Mass())
+ , fD0PDG(TDatabasePDG::Instance()->GetParticle(421)->Mass())
, fD0mass(NULL)
, fD0pt(NULL)
, fPos()
, fd0calc(NULL)
, ftwoTrackArray(NULL)
, fTotalD0(0)
- , fTotalD0true(0)
- , fVertex(NULL)
- , fField(0)
- , fEvent(NULL)
+ , fuseKF(false)
+ , fSendCandidate(false)
+ , fCandidateTree(NULL)
+ , fCandidateArray(NULL)
+ , fWriteFile(false)
{
// see header file for class documentation
AliHLTD0Trigger::~AliHLTD0Trigger()
{
- //if(fd0calc){delete fd0calc;}
- //if(fD0mass){delete fD0mass;}
- //if(ftwoTrackArray){delete ftwoTrackArray;}
- // see header file for class documentation
+ // destructor
}
const char* AliHLTD0Trigger::GetTriggerName() const
if (!IsDataEvent()) return 0;
+ HLTDebug("Used Cuts: pT: %f , DCA: %f , InvMass: %f , CosThetaStar: %f , d0: %f , d0xd0: %f , CosPointingAngle: %f",fPtMin,fdca,finvMass,fcosThetaStar,fd0,fd0d0,fcosPoint);
+
Int_t nD0=0;
- Int_t nD0true=0;
TString description;
- for ( const TObject *iter = GetFirstInputObject(kAliHLTDataTypeMCObject|kAliHLTDataOriginHLT); iter != NULL; iter = GetNextInputObject() ) {
- fEvent = dynamic_cast<AliHLTMCEvent*>(const_cast<TObject*>( iter ) );
- if ( ! fEvent ) {
- HLTError( "No MC Event present!" );
- break;
- }
- }
-
+ const AliESDVertex *Vertex=NULL;
+ if(fCandidateArray){fCandidateArray->Clear();}
+
for ( const TObject *iter = GetFirstInputObject(kAliHLTDataTypeESDObject); iter != NULL; iter = GetNextInputObject() ) {
if(fUseV0){
nD0=RecV0(iter);
else{
AliESDEvent *event = dynamic_cast<AliESDEvent*>(const_cast<TObject*>( iter ) );
event->GetStdContent();
- fField = event->GetMagneticField();
- const AliESDVertex* pv = event->GetPrimaryVertexTracks();
- fVertex = new AliESDVertex(*pv);
- if(fVertex->GetNContributors()<2){
- HLTWarning("Contributors in ESD vertex to low or not been set");
+ Double_t field = event->GetMagneticField();
+ Vertex = event->GetPrimaryVertexTracks();
+ if(!Vertex || Vertex->GetNContributors()<2){
+ HLTDebug("Contributors in ESD vertex to low or not been set");
continue;
}
for(Int_t it=0;it<event->GetNumberOfTracks();it++){
- SingleTrackSelect(event->GetTrack(it));
+ SingleTrackSelect(event->GetTrack(it),Vertex,field);
}
-
- RecD0(nD0,nD0true);
+ RecD0(nD0,Vertex,field);
}
}
for ( const TObject *iter = GetFirstInputObject(kAliHLTDataTypeESDVertex|kAliHLTDataOriginOut);
iter != NULL; iter = GetNextInputObject() ) {
- fVertex = dynamic_cast<AliESDVertex*>(const_cast<TObject*>( iter ));
- if(!fVertex){
+ Vertex = dynamic_cast<const AliESDVertex*>(iter);
+ if(!Vertex){
HLTError("Vertex object is corrupted");
//iResult = -EINVAL;
}
vector<AliHLTGlobalBarrelTrack> tracksVector;
AliHLTGlobalBarrelTrack::ConvertTrackDataArray(reinterpret_cast<const AliHLTTracksData*>(iter->fPtr), iter->fSize, tracksVector);
- fField = GetBz();
- for(UInt_t i=0;i<tracksVector.size();i++){
- SingleTrackSelect(&tracksVector[i]);
- }
- RecD0(nD0,nD0true);
- }
-
+ Double_t field = GetBz();
+ if (Vertex){
+ for(UInt_t i=0;i<tracksVector.size();i++){
+ SingleTrackSelect(&tracksVector[i],Vertex,field);
+ }
+ RecD0(nD0,Vertex,field);
+ }
+ }
+
fTotalD0+=nD0;
- fTotalD0true += nD0true;
ftwoTrackArray->Clear();
fPos.clear();
fNeg.clear();
HLTDebug("Number of D0 found: %d",nD0);
- HLTDebug("Number of True D0 found: %d",nD0true);
HLTDebug("Total Number of D0 found: %d",fTotalD0);
- HLTDebug("Total Number of True D0 found: %d",fTotalD0true);
-
+
if(fplothisto){
PushBack( (TObject*) fD0mass, kAliHLTDataTypeHistogram,0);
PushBack( (TObject*) fD0pt, kAliHLTDataTypeHistogram,0);
}
-
+ if(fSendCandidate){
+ PushBack( (TObject*) fCandidateArray, kAliHLTDataTypeTObjArray,0);
+ }
+ if(fWriteFile && fCandidateTree!=NULL){
+ fCandidateTree->Fill();
+ }
+ if(fCandidateArray){
+ fCandidateArray->Clear();
+ }
+
//if (iResult>=0) {
if (1) {
int AliHLTD0Trigger::DoInit(int argc, const char** argv)
{
-
+ // component initialization
+
fd0calc = new AliHLTD0toKpi();
ftwoTrackArray = new TObjArray(2);
-
- fplothisto=false;
// see header file for class documentation
fD0mass = new TH1F("hMass","D^{0} mass plot",100,1.7,2);
fD0pt = new TH1F("hPt","D^{0} Pt plot",20,0,20);
// configure from the command line parameters if specified
if (iResult>=0 && argc>0)
iResult=ConfigureFromArgumentString(argc, argv);
+
+ if (iResult<0) return iResult;
+
+ if(fSendCandidate || fWriteFile){
+ fCandidateArray = new TClonesArray("AliHLTD0Candidate",1000);
+ }
+ if(fWriteFile){
+ fCandidateTree = new TTree("D0Candidates","Tree with D0 Candidates");
+ fCandidateTree->Branch("Candidates","TClonesArray",&fCandidateArray,32000,99);
+ }
+
return iResult;
}
int AliHLTD0Trigger::DoDeinit()
{
// see header file for class documentation
- if(fd0calc){delete fd0calc;}
- if(fD0mass){delete fD0mass;}
- if(ftwoTrackArray){delete ftwoTrackArray;}
- if(fVertex){delete fVertex;}
+ if(fd0calc){delete fd0calc; fd0calc = NULL;}
+ if(fD0mass){delete fD0mass; fD0mass = NULL;}
+ if(fD0pt){delete fD0pt; fD0pt=NULL;}
+ if(ftwoTrackArray){delete ftwoTrackArray; ftwoTrackArray=NULL;}
+ if(fWriteFile){
+ TFile *mcFile = new TFile("D0_Candidates.root","RECREATE");
+ fCandidateTree->Write();
+ mcFile->Close();
+ }
+ if(fCandidateTree){delete fCandidateTree; fCandidateTree=NULL;}
+ if(fCandidateArray){delete fCandidateArray; fCandidateArray=NULL;}
return 0;
}
fUseV0=true;
return 1;
}
-
+ if (argument.CompareTo("-useKF")==0) {
+ fuseKF=true;
+ return 1;
+ }
+ if (argument.CompareTo("-send-candidates")==0) {
+ fSendCandidate=true;
+ return 1;
+ }
+ if (argument.CompareTo("-write-file")==0) {
+ fWriteFile=true;
+ return 1;
+ }
+
// unknown argument
return -EINVAL;
}
-void AliHLTD0Trigger::SingleTrackSelect(AliExternalTrackParam* t){
- // Offline har || på disse kuttene på de to henfallsproduktene
- Double_t pv[3];
- fVertex->GetXYZ(pv);
+void AliHLTD0Trigger::SingleTrackSelect(AliExternalTrackParam* t, const AliESDVertex* pv, Double_t field){
+ // Offline uses || on the cuts of decay products
+ if (!pv) return;
+
+ Double_t pvpos[3];
+ pv->GetXYZ(pvpos);
if(t->Pt()<fPtMin){return;}
- if(TMath::Abs(t->GetD(pv[0],pv[1],fField)) > fd0){return;}
+ if(TMath::Abs(t->GetD(pvpos[0],pvpos[1],field)) > fd0){return;}
if(t->Charge()>0){
fPos.push_back(t);
}
}
-void AliHLTD0Trigger::RecD0(Int_t& nD0, Int_t& nD0true){
-
+void AliHLTD0Trigger::RecD0(Int_t& nD0,const AliESDVertex* pv, Double_t field){
+ // Default way of reconstructing D0's. Both from ESD and Barreltracks
Double_t D0,D0bar,xdummy,ydummy;
Double_t d0[2];
Double_t svpos[3];
Double_t pvpos[3];
- if(!fVertex){
+ if(!pv){
HLTError("No Vertex is set");
return;
}
- fVertex->GetXYZ(pvpos);
+ pv->GetXYZ(pvpos);
for(UInt_t ip=0;ip<fPos.size();ip++){
AliExternalTrackParam *tP=fPos[ip];
for(UInt_t in=0;in<fNeg.size();in++){
AliExternalTrackParam *tN=fNeg[in];
- tP->PropagateToDCA(fVertex,fField,kVeryBig); //do I need this??????
- tN->PropagateToDCA(fVertex,fField,kVeryBig);
+ tP->PropagateToDCA(pv,field,kVeryBig); //do I need this??????
+ tN->PropagateToDCA(pv,field,kVeryBig);
- Double_t dcatPtN = tP->GetDCA(tN,fField,xdummy,ydummy);
+ Double_t dcatPtN = tP->GetDCA(tN,field,xdummy,ydummy);
if(dcatPtN>fdca) { continue; }
ftwoTrackArray->AddAt(tP,0);
ftwoTrackArray->AddAt(tN,1);
- AliAODVertex *vertexp1n1 = fd0calc->ReconstructSecondaryVertex(ftwoTrackArray,fField,fVertex);
+ AliAODVertex *vertexp1n1 = fd0calc->ReconstructSecondaryVertex(ftwoTrackArray,field,pv,fuseKF);
if(!vertexp1n1) {
ftwoTrackArray->Clear();
continue;
vertexp1n1->GetXYZ(svpos);
- tP->PropagateToDCA(vertexp1n1,fField,kVeryBig);
- tN->PropagateToDCA(vertexp1n1,fField,kVeryBig);
+ tP->PropagateToDCA(vertexp1n1,field,kVeryBig);
+ tN->PropagateToDCA(vertexp1n1,field,kVeryBig);
/*
Double_t px[2],py[2],pz[2];
pdg2[0]=211; pdg2[1]=321; pdg2bar[0]=321; pdg2bar[1]=211;
minv = rd->InvMass(nprongs,pdg2);
minvbar = rd->InvMass(nprongs,pdg2bar);
- if(TMath::Abs(minv-mD0PDG)>finvMass && TMath::Abs(minv-mD0PDG)>finvMass) {continue; delete vertexp1n1; delete rd;}
+ if(TMath::Abs(minv-fD0PDG)>finvMass && TMath::Abs(minv-fD0PDG)>finvMass) {continue; delete vertexp1n1; delete rd;}
*/
- if((TMath::Abs(fd0calc->InvMass(tN,tP)-mD0PDG)) > finvMass && TMath::Abs((fd0calc->InvMass(tP,tN))-mD0PDG) > finvMass){continue;}
- fd0calc->cosThetaStar(tN,tP,D0,D0bar);
- if(TMath::Abs(D0) > fcosThetaStar && TMath::Abs(D0bar) > fcosThetaStar){continue;}
- d0[0] = tP->GetD(pvpos[0],pvpos[1],fField);
- d0[1] = tN->GetD(pvpos[0],pvpos[1],fField);
- if((d0[0]*d0[1]) > fd0d0){continue;}
- if(fd0calc->pointingAngle(tN,tP,pvpos,svpos) < fcosPoint){continue;}
+ if((TMath::Abs(fd0calc->InvMass(tN,tP)-fD0PDG)) > finvMass && TMath::Abs((fd0calc->InvMass(tP,tN))-fD0PDG) > finvMass){
+ vertexp1n1->RemoveCovMatrix();
+ delete vertexp1n1;
+ ftwoTrackArray->Clear();
+ continue;
+ }
+
+ fd0calc->CosThetaStar(tN,tP,D0,D0bar);
+ if(TMath::Abs(D0) > fcosThetaStar && TMath::Abs(D0bar) > fcosThetaStar){
+ vertexp1n1->RemoveCovMatrix();
+ delete vertexp1n1;
+ ftwoTrackArray->Clear();
+ continue;
+ }
+
+ d0[0] = tP->GetD(pvpos[0],pvpos[1],field);
+ d0[1] = tN->GetD(pvpos[0],pvpos[1],field);
+ if((d0[0]*d0[1]) > fd0d0){
+ vertexp1n1->RemoveCovMatrix();
+ delete vertexp1n1;
+ ftwoTrackArray->Clear();
+ continue;
+ }
+
+ if(fd0calc->PointingAngle(tN,tP,pvpos,svpos) < fcosPoint){
+ vertexp1n1->RemoveCovMatrix();
+ delete vertexp1n1;
+ ftwoTrackArray->Clear();
+ continue;
+ }
if(fplothisto){
//fD0mass->Fill(minv);
fD0mass->Fill(fd0calc->InvMass(tP,tN));
fD0pt->Fill(fd0calc->Pt(tP,tN));
/*
- if((fd0calc->InvMass(tN,tP) - mD0PDG) > finvMass){
+ if((fd0calc->InvMass(tN,tP) - fD0PDG) > finvMass){
fD0mass->Fill(fd0calc->InvMass(tN,tP));
}
else{
}
*/
}
-
- if(CheckTrackMC(tP,tN)){
- nD0true++;
+
+ if(fSendCandidate && fCandidateArray){
+ new(fCandidateArray->AddrAt(nD0)) AliHLTD0Candidate(fd0calc->InvMass(tN,tP),fd0calc->InvMass(tP,tN),fd0calc->Pt(tP,tN),tP->GetLabel(),tN->GetLabel(),tP->Pt(),tN->Pt());
}
nD0++;
+ vertexp1n1->RemoveCovMatrix();
delete vertexp1n1;
+ ftwoTrackArray->Clear();
}
}
+ ftwoTrackArray->Clear();
}
Int_t AliHLTD0Trigger::RecV0(const TObject* iter){
+ // Reconstruction D0's from the V0 found by the V0 finder
int nD0=0;
Double_t d0[2];
Double_t D0,D0bar;
Double_t pvpos[3];
AliESDEvent *event = dynamic_cast<AliESDEvent*>(const_cast<TObject*>( iter ) );
+ if (!event) {
+ HLTError("input object is not of type AliESDEvent");
+ return 0;
+ }
+
event->GetStdContent();
Int_t nV0 = event->GetNumberOfV0s();
Double_t field = event->GetMagneticField();
Double_t tmp1, tmp2;
if(tN->GetDCA(tP,field,tmp1,tmp2) > fdca){continue;}
- if((fd0calc->InvMass(tN,tP) - mD0PDG) > finvMass && (fd0calc->InvMass(tP,tN) - mD0PDG) > finvMass){continue;}
- fd0calc->cosThetaStar(tN,tP,D0,D0bar);
+ if((fd0calc->InvMass(tN,tP) - fD0PDG) > finvMass && (fd0calc->InvMass(tP,tN) - fD0PDG) > finvMass){continue;}
+ fd0calc->CosThetaStar(tN,tP,D0,D0bar);
if(D0 > fcosThetaStar && D0bar > fcosThetaStar){continue;}
if((d0[0]*d0[1]) > fd0d0){continue;}
- if(fd0calc->pointingAngle(tN,tP,pvpos,svpos) < fcosPoint){continue;}
+ if(fd0calc->PointingAngle(tN,tP,pvpos,svpos) < fcosPoint){continue;}
nD0++;
- if((fd0calc->InvMass(tN,tP) - mD0PDG) > finvMass){
+ if((fd0calc->InvMass(tN,tP) - fD0PDG) > finvMass){
fD0mass->Fill(fd0calc->InvMass(tN,tP));
}
else{
return nD0;
}
-bool AliHLTD0Trigger::CheckTrackMC(AliExternalTrackParam* pt, AliExternalTrackParam* pn){
-
- if(!fEvent){return false;}
-
- int lP = pt->GetLabel();
- int lN = pn->GetLabel();
-
- if(lN>=0 && lP>=0){
-
- int imP = (fEvent->Particle(lP))->GetFirstMother();
- int imN = (fEvent->Particle(lN))->GetFirstMother();
-
- if(imP>=0 && imN>=0){
- TParticle * mP = fEvent->Particle(imP);
- TParticle * mN = fEvent->Particle(imN);
- if(fabs(mP->GetPdgCode())==421 && fabs(mN->GetPdgCode())==421 && imP == imN){
- return true;
- }
- }
- }
- return false;
+void AliHLTD0Trigger::GetOCDBObjectDescription( TMap* const targetMap)
+{
+ // Get a list of OCDB object description.
+ if (!targetMap) return;
+ targetMap->Add(new TObjString("HLT/ConfigHLT/D0Trigger"),new TObjString("Object with default cuts for D0 reconstruction" ));
}