#include "CbmL1MuchFinder.h" #include "TProfile2D.h" #include "TCanvas.h" #include "TLegend.h" #include "TEllipse.h" #include "TText.h" #include "TMarker.h" #include "TStyle.h" #include "TTree.h" #include "TFile.h" #include "TLorentzVector.h" #include "TVector3.h" #include "CbmMuchHit.h" #include "CbmKF.h" #include "CbmKFMath.h" #include "CbmRootManager.h" #include "CbmKFHit.h" #include "CbmKFPixelMeasurement.h" #include "CbmKFMaterial.h" #include "CbmKFTrackInterface.h" #include "CbmMuchHit.h" #include "CbmMuchPoint.h" #include "CbmStsTrack.h" #include "CbmStsKFTrackFitter.h" ClassImp(CbmL1MuchFinder); CbmL1MuchFinder::CbmL1MuchFinder(const char *name, Int_t iVerbose ):CbmTask(name, iVerbose){ } CbmL1MuchFinder::~CbmL1MuchFinder(){ } InitStatus CbmL1MuchFinder::Init(){ return ReInit(); } InitStatus CbmL1MuchFinder::ReInit(){ fMuchPoints=(TClonesArray *) CbmRootManager::Instance()->GetObject("MuchPoint"); fMuchHits =(TClonesArray *) CbmRootManager::Instance()->GetObject("MuchHit"); fStsTracks =(TClonesArray *) CbmRootManager::Instance()->GetObject("STSTrack"); fStsFitter.Init(); return kSUCCESS; } void CbmL1MuchFinder::SetParContainers(){ } void CbmL1MuchFinder::Finish(){ } class CbmL1MuchHit : public CbmKFHit { public: CbmL1MuchHit(){} ~CbmL1MuchHit(){} CbmKFPixelMeasurement FitPoint; void Create( CbmMuchHit *h ); void Filter( CbmKFTrackInterface &track, Bool_t downstream, Double_t &QP0 ); int index; int iStation; bool busy; CbmMuchPoint *MC_Point; //ClassDef(CbmL1MuchHit, 1); }; void CbmL1MuchHit::Create( CbmMuchHit *h ) { FitPoint.x = h->GetX(); FitPoint.y = h->GetY(); FitPoint.z = h->GetZ(); FitPoint.V[0] = h->GetDx()*h->GetDx(); FitPoint.V[1] = 0; FitPoint.V[2] = h->GetDy()*h->GetDy(); CbmKF *KF = CbmKF::Instance(); MaterialIndex = KF->GetMaterialIndex( h->GetDetectorID() ); iStation = KF->MuchStationIDMap[ h->GetDetectorID() ]; busy = 0; } void CbmL1MuchHit::Filter( CbmKFTrackInterface &track, Bool_t downstream, Double_t &QP0 ){ track.Extrapolate( FitPoint.z, &QP0 ); FitPoint.Filter( track ); } struct CbmL1MuchTrack : public CbmKFTrackInterface{ public: double *GetTrack(){ return T; } double *GetCovMatrix(){ return C; } double &GetRefChi2(){ return chi2; } int &GetRefNDF(){ return NDF; } double GetMass(){ return 0.1057; } bool IsElectron(){ return 0; } int GetNOfHits(){ return vHits.size(); } CbmKFHit *GetHit( int i ){ return vHits[i]; } double T[6], C[15], chi2 ; int NDF ; vector vHits; int NHits; bool ok; void SetStsTrack( CbmStsTrack* track){ CbmKFMath::CopyTrackParam2TC( track->GetParamLast(), T, C ); chi2 = track->GetChi2(); NDF = track->GetNDF(); } }; bool ComparePMuchTracks( CbmL1MuchTrack *p1, CbmL1MuchTrack *p2 ){ return (p1->NHits>p2->NHits) || (p1->NHits==p2->NHits)&&(p1->chi2/p1->NDF chi2/p2->NDF) ; } void CbmL1MuchFinder::Exec(Option_t * option){ //const double muMass = 0.1057; const char fileName[] = "L1MuchFinder.root"; static TFile *HistoFile=0; static TTree *HistoTreePull[5]; static TH1F *histP[20], *histRes[20][2], *histResMu[20][2], *histChi2[20]; static TH1F *histPDG[20]; static TH1F *histPull[20][5], *histPullMu[20][5]; static TProfile *histNTr, *histNHits, *histNMu; static bool first_call_murec = 1; int MuNStations = CbmKF::Instance()->MuchStationIDMap.size(); if ( first_call_murec ) { first_call_murec = 0; HistoTreePull[0] = new TTree("MuRecPullX", "MuRecPullX"); HistoTreePull[1] = new TTree("MuRecPullY", "MuRecPullY"); HistoTreePull[2] = new TTree("MuRecPullTx", "MuRecPullTx"); HistoTreePull[3] = new TTree("MuRecPullTy", "MuRecPullTy"); HistoTreePull[4] = new TTree("MuRecPullP", "MuRecPullP"); for( int ist=0; istGetEntriesFast(); vector vMuchHits; for( int ih = 0; ih < NHits; ih++ ) { CbmMuchHit *h = (CbmMuchHit*) fMuchHits->At(ih); CbmL1MuchHit m; m.Create(h); m.index = ih; m.MC_Point = (CbmMuchPoint*) fMuchPoints->At(h->GetRefIndex()); histnhits[m.iStation]++; vMuchHits.push_back(m); } { cout <<"Hits per muon station:"; for( int ist=0; ist vTracks; int NStsTracks = fStsTracks->GetEntriesFast(); for( int itr=0; itrAt(itr); if ( tr->GetNHits()<4 ) continue; fStsFitter.DoFit( tr, 13 ); // refit with muon mass CbmL1MuchTrack tmp; tmp.SetStsTrack(tr); tmp.NHits = 0; tmp.ok = 1; vTracks.push_back(tmp); } int NTracks = vTracks.size(); for( int itr=0; itrvMuchDetectors[ist].ZReference; tr.Extrapolate(Zdet); if( fabs(tr.T[4])>100.) { cout << "+++++++++ " << ", stoped track with momentum " << 1./tr.T[4]<<"/"<<1.0/tr.T[4] << " at station "<Fill(ist+1,histntr[ist]); histNHits->Fill(ist+1,histnhits[ist]); if( histntr[ist]>0 ) histNMu->Fill(ist+1,histnmu[ist]*1./histntr[ist]); } //sort tracks and check for common muon hits vector vpTracks; for( int i=0; ibusy ) nbusy++; } if( nbusy>2 ){ t.ok = 0; continue; } for( int ih=0; ihbusy=1; } HistoTreePull[0]->Fill(); HistoTreePull[1]->Fill(); HistoTreePull[2]->Fill(); HistoTreePull[3]->Fill(); HistoTreePull[4]->Fill(); static int EventCounter = 0; bool write = false; EventCounter++; if ( EventCounter < 100 ) {//write at every 10th event if ( EventCounter % 10 == 0) write = true; } if ( EventCounter >= 100 ) {//write at every 100th event if ( EventCounter % 100 == 0) write = true; } if (write) { HistoFile = new TFile(fileName,"RECREATE"); //hPs->Write(); HistoFile->Write(); HistoTreePull[0]->Write(); //RecoData->Print(); for( int ist=0; istWrite(); histRes[ist][0]->Write(); histRes[ist][1]->Write(); histChi2[ist]->Write(); histPDG[ist]->Write(); histPull[ist][0]->Write(); histPull[ist][1]->Write(); histPull[ist][2]->Write(); histPull[ist][3]->Write(); histPull[ist][4]->Write(); histPullMu[ist][0]->Write(); histPullMu[ist][1]->Write(); histPullMu[ist][2]->Write(); histPullMu[ist][3]->Write(); histPullMu[ist][4]->Write(); } histNTr->Write(); histNMu->Write(); histNHits->Write(); HistoFile->Close(); } }