diff --git a/analysis/PWGHAD/hadron/CbmHadronAnalysis.cxx b/analysis/PWGHAD/hadron/CbmHadronAnalysis.cxx index 420d21f4d755f3be42b1f56b07c8a197bd8640db..b83a210425b65873022631c3b5f4cffe81be97eb 100644 --- a/analysis/PWGHAD/hadron/CbmHadronAnalysis.cxx +++ b/analysis/PWGHAD/hadron/CbmHadronAnalysis.cxx @@ -40,12 +40,19 @@ using namespace std; #include "CbmHadron.h" #include "CbmHadronAnalysis.h" #include "CbmMatch.h" +#include "CbmEvent.h" #include "CbmVertex.h" #include "CbmKFVertex.h" #include "CbmStsKFTrackFitter.h" +#include "CbmDigiManager.h" -TClonesArray* fTofTracks; // CbmTofTrack array +CbmDigiManager* fDigiMan; // TOF Input Digis +TClonesArray* fEventsColl; // CBMEvents (time based) +TClonesArray* fTofTracks; // CbmTofTrack array +TClonesArray* fTofHitsColl; +TClonesArray* fStsHitsColl; +static Int_t iNbTs=0; #define M2PI 0.019479835 #define M2KA 0.24371698 @@ -55,6 +62,7 @@ TClonesArray* fTofTracks; // CbmTofTrack array Int_t nMCTracks=0, nTofPoints=0, nTofHits=0; Int_t nTofTracks=0; + Int_t nStsHits=0; Int_t nGlobTracks=0; Int_t NMASS=3; Float_t refMass[3]={0.139, 0.494, 0.938}; @@ -1256,22 +1264,38 @@ InitStatus CbmHadronAnalysis::Init() // Task initialisation FairRootManager* rootMgr = FairRootManager::Instance(); if(NULL == rootMgr) { - cout << "-E- CbmHadronAnalysis::Init : " - << "ROOT manager is not instantiated." << endl; - return kFATAL; + cout << "-E- CbmHadronAnalysis::Init : ROOT manager is not instantiated." << endl; + return kFATAL; } + + fEventsColl = dynamic_cast<TClonesArray*>(rootMgr->GetObject("Event")); + if(NULL == fEventsColl) + fEventsColl = dynamic_cast<TClonesArray*>(rootMgr->GetObject("CbmEvent")); + + if(NULL == fEventsColl) + LOG(info) << "CbmEvent not found in input file, assume eventwise input" ; + else + LOG(info) << "CbmEvent found in input file, timebased analysis" ; + fMCEventHeader = (FairMCEventHeader*) rootMgr->GetObject("MCEventHeader."); if(NULL == fMCEventHeader) { - cout << "-W- CbmHadronAnalysis::Init : " - << "no MC Header Info" << endl; + cout << "-W- CbmHadronAnalysis::Init : no MC Header Info" << endl; } fTofPoints = (TClonesArray*) rootMgr->GetObject("TofPoint"); if(NULL == fTofPoints) { - cout << "-W- CbmHadronAnalysis::Init : " - << "no TOF point array!" << endl; + cout << "-W- CbmHadronAnalysis::Init : no TOF point array!" << endl; } - + + fDigiMan = CbmDigiManager::Instance(); + fDigiMan->Init(); + if ( ! fDigiMan->IsPresent(ECbmModuleId::kTof) ) { + LOG(error) << GetName() << ": No input digis!"; + return kFATAL; + }else + LOG(info) << "DigiManager has Tof Digis"; + + /* fTofDigis = (TClonesArray *) rootMgr->GetObject("TofDigi"); if( NULL == fTofDigis) @@ -1279,30 +1303,29 @@ InitStatus CbmHadronAnalysis::Init() if( NULL == fTofDigis) fTofDigis = (TClonesArray *) rootMgr->GetObject("CbmTofDigi"); - if( NULL == fTofDigis) { LOG(error)<<"CbmHadronAnalysis::RegisterInputs => Could not get the TofDigi TClonesArray!!!"; } // if( NULL == fTofDigis) - else { - fTofDigiMatchColl = (TClonesArray*) rootMgr->GetObject("TofDigiMatch"); - if(NULL == fTofDigiMatchColl) { - cout << "-I- CbmHadronAnalysis::Init : " - << "no TOF digiMatch array!" << endl; - } - - fTofDigiMatchPointsColl = (TClonesArray*) rootMgr->GetObject("TofDigiMatchPoints"); - if(NULL == fTofDigiMatchPointsColl) { - cout << "-I- CbmHadronAnalysis::Init : " - << "no TOF digiMatchPoints array!" << endl; +*/ + + fTofDigiMatchColl = (TClonesArray*) rootMgr->GetObject("TofCalDigiMatch"); + if(NULL == fTofDigiMatchColl) { + cout << "-I- CbmHadronAnalysis::Init : no TOF CalDigiMatch array!" << endl; + fTofDigiMatchColl = (TClonesArray*) rootMgr->GetObject("TofDigiMatch"); + if(NULL == fTofDigiMatchColl) { + cout << "-I- CbmHadronAnalysis::Init : no TOF digiMatch array!" << endl; + } + } - } + fTofDigiMatchPointsColl = (TClonesArray*) rootMgr->GetObject("TofDigiMatchPoints"); + if(NULL == fTofDigiMatchPointsColl) { + cout << "-I- CbmHadronAnalysis::Init : no TOF digiMatchPoints array!" << endl; } - fTofHits = (TClonesArray*) rootMgr->GetObject("TofHit"); - if(NULL == fTofHits) { - cout << "-W- CbmHadronAnalysis::Init : " - << "no TOF Hit array!" << endl; + fTofHitsColl = (TClonesArray*) rootMgr->GetObject("TofHit"); + if(NULL == fTofHitsColl) { + cout << "-W- CbmHadronAnalysis::Init : no TOF Hit array!" << endl; } fTofTracks = (TClonesArray*) rootMgr->GetObject("TofTrack"); @@ -1313,47 +1336,39 @@ InitStatus CbmHadronAnalysis::Init() fTrdPoints = (TClonesArray*) rootMgr->GetObject("TrdPoint"); if(NULL == fTofPoints) { - cout << "-W- CbmHadronAnalysis::Init : " - << "no TRD point array!" << endl; + cout << "-W- CbmHadronAnalysis::Init : no TRD point array!" << endl; } fTrdHits = (TClonesArray*) rootMgr->GetObject("TrdHit"); - if(NULL == fTofHits) { - cout << "-W- CbmHadronAnalysis::Init : " - << "no TRD Hit array!" << endl; + if(NULL == fTrdHits) { + cout << "-W- CbmHadronAnalysis::Init : no TRD Hit array!" << endl; } fGlobalTracks = (TClonesArray*) rootMgr->GetObject("GlobalTrack"); if(NULL == fGlobalTracks) { - cout << "-W- CbmHadronAnalysis::Init : " - << "no Global Track array!" << endl; + cout << "-W- CbmHadronAnalysis::Init : no Global Track array!" << endl; } fHadrons = (TClonesArray*) rootMgr->GetObject("Hadron"); if(NULL == fHadrons) { - cout << "-W- CbmHadronAnalysis::Init : " - << "no Hadron array!" << endl; + cout << "-W- CbmHadronAnalysis::Init : no Hadron array!" << endl; } fStsTracks = (TClonesArray*) rootMgr->GetObject("StsTrack"); if(NULL == fStsTracks) { - cout << "-W- CbmHadronAnalysis::Init : " - << "no STS Track array!" << endl; + cout << "-W- CbmHadronAnalysis::Init : no STS Track array!" << endl; } - fStsHits = (TClonesArray*) rootMgr->GetObject("StsHit"); - if(NULL == fStsHits) { - cout << "-W- CbmHadronAnalysis::Init : " - << "no STS Hit array!" << endl; + fStsHitsColl = (TClonesArray*) rootMgr->GetObject("StsHit"); + if(NULL == fStsHitsColl) { + cout << "-W- CbmHadronAnalysis::Init : no STS Hit array!" << endl; } fStsClusters = (TClonesArray*) rootMgr->GetObject("StsCluster"); if(NULL == fStsClusters) { - cout << "-W- CbmHadronAnalysis::Init : " - << "no STS Cluster array!" << endl; + cout << "-W- CbmHadronAnalysis::Init : no STS Cluster array!" << endl; } fStsDigis = (TClonesArray*) rootMgr->GetObject("StsDigi"); if(NULL == fStsDigis) { - cout << "-W- CbmHadronAnalysis::Init : " - << "no STS Digi array!" << endl; + cout << "-W- CbmHadronAnalysis::Init : no STS Digi array!" << endl; } fStsDigiMatchColl = (TClonesArray*) rootMgr->GetObject("StsDigiMatch"); if(NULL == fStsDigiMatchColl) { @@ -1372,7 +1387,14 @@ InitStatus CbmHadronAnalysis::Init() LOG(warn) << "No primary vertex"; } - + if(NULL == fEventsColl) { + fTofHits=fTofHitsColl; + fStsHits=fStsHitsColl; + } else { // for time based analysis generate temporary Event TClonesArrays + fTofHits = new TClonesArray("CbmTofHit",100); + fStsHits = new TClonesArray("CbmStsHit",100); + } + // --- MC data manager CbmMCDataManager* mcManager = (CbmMCDataManager*)rootMgr->GetObject("MCDataManager"); @@ -1384,15 +1406,13 @@ InitStatus CbmHadronAnalysis::Init() } fMCTracksColl = (TClonesArray*) rootMgr->GetObject("MCTrack"); - if(NULL == fMCTracks) { - cout << "-W- CbmHadronAnalysis::Init : " - << "no MC track array!" << endl; + if(NULL == fMCTracksColl) { + cout << "-W- CbmHadronAnalysis::Init : " << "no MC track array!" << endl; } fStsPointsColl = (TClonesArray*) rootMgr->GetObject("StsPoint"); if(NULL == fStsPointsColl) { - cout << "-W- CbmHadronAnalysis::Init : " - << "no STS Point array!" << endl; + cout << "-W- CbmHadronAnalysis::Init : " << "no STS Point array!" << endl; } fTrackFitter.Init(); @@ -1401,6 +1421,7 @@ InitStatus CbmHadronAnalysis::Init() if(kSUCCESS != status) { return status; } + InitStatus statf = ReadFlowFile(); if(kSUCCESS != statf) { return statf; @@ -1422,11 +1443,57 @@ InitStatus CbmHadronAnalysis::Init() return kSUCCESS; } // ------------------------------------------------------------------ - - +// ------------------------------------------------------------------ +void CbmHadronAnalysis::Exec(Option_t* option) +{ + // Task execution on TS or Events + if(NULL != fEventsColl) { // working for STS and TOF only + iNbTs++; + LOG(debug) << "process TS "<<iNbTs<<" with " << fEventsColl->GetEntriesFast() << " events"; + if( NULL == fTofHits || NULL == fTofHitsColl ) { + assert("Invalid pointer to Tof TClonesArray"); + } + if( NULL == fStsHits || NULL == fStsHitsColl ) { + assert("Invalid pointer to Sts TClonesArray"); + } + LOG(debug) << "TS contains " << fTofHitsColl->GetEntriesFast() << "TOF and " + << fStsHitsColl->GetEntriesFast() << " Sts hits"; + + for(Int_t iEvent = 0; iEvent < fEventsColl->GetEntriesFast(); iEvent++) + { + CbmEvent* tEvent = dynamic_cast<CbmEvent*>(fEventsColl->At(iEvent)); + // copy TOF hits + fTofHits->Clear(); + Int_t iNbHits=0; + LOG(debug) << "Fill Tof array with mul " << tEvent->GetNofData(ECbmDataType::kTofHit); + for (Int_t iHit = 0; iHit < tEvent->GetNofData(ECbmDataType::kTofHit); iHit++) { + Int_t iHitIndex = static_cast<Int_t>(tEvent->GetIndex(ECbmDataType::kTofHit, iHit)); + CbmTofHit* pHit = (CbmTofHit *)fTofHitsColl->At(iHitIndex); + new((*fTofHits)[iNbHits]) CbmTofHit(*pHit); // fill temporary working TClonesArray + iNbHits++; + } + // copy STS hits + iNbHits=0; + fStsHits->Clear(); + LOG(debug) << "Fill Sts array with mul " << tEvent->GetNofData(ECbmDataType::kStsHit); + for (Int_t iHit = 0; iHit < tEvent->GetNofData(ECbmDataType::kStsHit); iHit++) { + Int_t iHitIndex = static_cast<Int_t>(tEvent->GetIndex(ECbmDataType::kStsHit, iHit)); + const CbmStsHit* pHit = (CbmStsHit *)fStsHitsColl->At(iHitIndex); + new((*fStsHits)[iNbHits]) CbmStsHit(*pHit); // fill temporary working TClonesArray + iNbHits++; + } + LOG(debug) << Form("analyze TS %d, Ev %d with %d STS, %d TOF hits",iNbTs, iEvent, + fStsHits->GetEntriesFast(), fTofHits->GetEntriesFast()); + ExecEvent(option); + } + } + else { // event based analysis + ExecEvent(option); + } +} // ------------------------------------------------------------------ -void CbmHadronAnalysis::Exec(Option_t*) +void CbmHadronAnalysis::ExecEvent(Option_t*) { // Task execution @@ -1464,12 +1531,12 @@ void CbmHadronAnalysis::Exec(Option_t*) } Float_t yrp_mid=GetMidY(); // midrapidity -> update from simulation! - - nMCTracks = fMCTracksColl->GetEntriesFast(); - nTofPoints = fTofPoints->GetEntriesFast(); - nTofHits = fTofHits->GetEntriesFast(); + if(fMCTracksColl != NULL) nMCTracks = fMCTracksColl->GetEntriesFast(); + if(fTofPoints != NULL) nTofPoints = fTofPoints->GetEntriesFast(); + if(fTofHits != NULL) nTofHits = fTofHits->GetEntriesFast(); if(fTofTracks != NULL) nTofTracks = fTofTracks->GetEntriesFast(); if(fGlobalTracks != NULL) nGlobTracks = fGlobalTracks->GetEntriesFast(); + if(fStsHits != NULL) nStsHits = fStsHits->GetEntriesFast(); if(verbose>0){ //nh-debug @@ -1478,28 +1545,42 @@ void CbmHadronAnalysis::Exec(Option_t*) << ", TofHit " << nTofHits << ", TofTrk " << nTofTracks << ", GlbTrk " << nGlobTracks - << ", StsHit " << fStsHits->GetEntriesFast(); - LOG(debug) << "-D- b = "<<fMCEventHeader->GetB()<< ", phi = " << fMCEventHeader->GetRotZ(); + << ", StsHit " << nStsHits; + if(fMCEventHeader != NULL) + LOG(debug) << "-D- b = "<<fMCEventHeader->GetB()<< ", phi = " << fMCEventHeader->GetRotZ(); } if(FairLogger::GetLogger()->IsLogNeeded(fair::Severity::debug)) { for (Int_t j =0; j<nTofHits; j++) { - TofHit = (CbmTofHit*) fTofHits->At(j); - if(NULL == TofHit) continue; - LOG(DEBUG)<<Form("TofHit %d, addr 0x%08x, x %6.1f, y %6.1f, z %6.1f, t %6.1f ", - j, TofHit->GetAddress(),TofHit->GetX(),TofHit->GetY(),TofHit->GetZ(),TofHit->GetTime()); - + TofHit = (CbmTofHit*) fTofHits->At(j); + if(NULL == TofHit) continue; + LOG(DEBUG)<<Form("TofHit %d, addr 0x%08x, x %6.1f, y %6.1f, z %6.1f, t %6.1f ", + j, TofHit->GetAddress(),TofHit->GetX(),TofHit->GetY(),TofHit->GetZ(),TofHit->GetTime()); } } - if(FairLogger::GetLogger()->IsLogNeeded(fair::Severity::debug)) { + + Double_t dT0=0.; + for (Int_t j =0; j<nTofHits; j++) { + TofHit = (CbmTofHit*) fTofHits->At(j); + if(NULL == TofHit) continue; + if(TofHit->GetZ()==0.) dT0=TofHit->GetTime(); + } + if( dT0 != 0.) { + for (Int_t j =0; j<nTofHits; j++) { + TofHit = (CbmTofHit*) fTofHits->At(j); + if(NULL == TofHit) continue; + TofHit->SetTime( TofHit->GetTime() - dT0); + } + } + + if (FairLogger::GetLogger()->IsLogNeeded(fair::Severity::debug)) { for (Int_t j =0; j<nTofHits; j++) { - TofHit = (CbmTofHit*) fTofHits->At(j); - if(NULL == TofHit) continue; - LOG(DEBUG)<<Form("TofHit %d, addr 0x%08x, x %6.1f, y %6.1f, z %6.1f, t %6.1f ", - j, TofHit->GetAddress(),TofHit->GetX(),TofHit->GetY(),TofHit->GetZ(),TofHit->GetTime()); - + TofHit = (CbmTofHit*) fTofHits->At(j); + if(NULL == TofHit) continue; + LOG(DEBUG)<<Form("TofHit %d, addr 0x%08x, x %6.1f, y %6.1f, z %6.1f, t %6.1f ", + j, TofHit->GetAddress(),TofHit->GetX(),TofHit->GetY(),TofHit->GetZ(),TofHit->GetTime()); } } - + if (bRecSec && nTofHits > 1) ReconstructSecondaries(); // independent method // some local arrays @@ -1512,7 +1593,7 @@ void CbmHadronAnalysis::Exec(Option_t*) Int_t IndTofTrack_TofHit[nTofHits][MAXNHT]; // index of TofTracks assigned to specific TofHit // generator level - fa_mul_b_gen->Fill(fMCEventHeader->GetB(),nMCTracks); + if( NULL != fMCEventHeader ) fa_mul_b_gen->Fill(fMCEventHeader->GetB(),nMCTracks); Qx1=0.; Qy1=0.; Np1=0; Qx2=0.; Qy2=0.; Np2=0; for (Int_t k=0; k< nMCTracks; k++) { // inspect MCTracks @@ -1782,7 +1863,7 @@ void CbmHadronAnalysis::Exec(Option_t*) for (Int_t k=0; k< nMCTracks; k++) TrackP[k]=0; // reset track detected flag Qx1=0.; Qy1=0.; Np1=0; Qx2=0.; Qy2=0.; Np2=0; - fa_mul_b_poi->Fill(fMCEventHeader->GetB(),nTofPoints); + if(NULL != fMCEventHeader) fa_mul_b_poi->Fill(fMCEventHeader->GetB(),nTofPoints); for (Int_t l =0; l<nTofPoints; l++) { TofPoint = (CbmTofPoint*) fTofPoints->At(l); @@ -2030,13 +2111,14 @@ void CbmHadronAnalysis::Exec(Option_t*) while(phirp<-180.) {phirp+=360.;} while(phirp>180.) {phirp-=360.;} } // RP flattening end - delrp=phirp - RADDEG*fMCEventHeader->GetRotZ(); - while(delrp<-180.) {delrp+=360.;} - while(delrp> 180.) {delrp-=360.;} - fa_phirp_poi->Fill(phirp); // 1D histo - fa_delrp_b_poi->Fill(fMCEventHeader->GetB(),delrp); - fa_cdelrp_b_poi->Fill(fMCEventHeader->GetB(),TMath::Cos(delrp/RADDEG)); - + if (NULL != fMCEventHeader) { + delrp=phirp - RADDEG*fMCEventHeader->GetRotZ(); + while(delrp<-180.) {delrp+=360.;} + while(delrp> 180.) {delrp-=360.;} + fa_phirp_poi->Fill(phirp); // 1D histo + fa_delrp_b_poi->Fill(fMCEventHeader->GetB(),delrp); + fa_cdelrp_b_poi->Fill(fMCEventHeader->GetB(),TMath::Cos(delrp/RADDEG)); + } // TofHit level for (Int_t k=0; k< nMCTracks; k++) TrackP[k]=0; // reset track detected flag @@ -2044,7 +2126,7 @@ void CbmHadronAnalysis::Exec(Option_t*) Int_t NT0=0; Float_t t0m_hit=0.; Int_t NT0F=0; Float_t t0mf_hit=0.; Int_t NT0NF=0; Float_t t0mnf_hit=0.; - fa_mul_b_hit->Fill(fMCEventHeader->GetB(),nTofHits); + if (NULL != fMCEventHeader) fa_mul_b_hit->Fill(fMCEventHeader->GetB(),nTofHits); Float_t T0MIN=0.; Int_t NFHITS=10; @@ -2139,7 +2221,7 @@ void CbmHadronAnalysis::Exec(Option_t*) if(NULL == TofHit) continue; // Int_t l = TofHit->GetRefId(); // pointer to Digi Int_t l = j; // One CbmMatch per hit and in same order!!!! - if(fTofDigiMatchColl != NULL) { + if(fTofDigiMatchColl != NULL && fTofDigiMatchPointsColl != NULL ) { CbmMatch* digiMatch=(CbmMatch *)fTofDigiMatchColl->At(l); // take first digi's point link CbmLink L0 = digiMatch->GetLink(0); @@ -2165,9 +2247,9 @@ void CbmHadronAnalysis::Exec(Option_t*) } */ }else{ - lp=-1; - LOG(WARNING)<<"No Link to MCTofPoint found for hit "<<j; - continue; + lp=-1; + LOG(WARNING)<<"No Link to MCTofPoint found for hit "<<j; + continue; } TofPoint = (CbmTofPoint*) fTofPoints->At(lp); Int_t k = TofPoint->GetTrackID(); @@ -2455,14 +2537,16 @@ void CbmHadronAnalysis::Exec(Option_t*) fa_phirps_hit->Fill(phirp1*RADDEG); // 1D histo fa_phirps_hit->Fill(phirp2*RADDEG); // 1D histo delrp=(phirp1-phirp2); - if(0){ //nh-debug - cout << "<D-hit> Impact parameter "<<fMCEventHeader->GetB()<< ", delrp = "<< delrp << endl; + if (NULL != fMCEventHeader) { + if(0){ //nh-debug + cout << "<D-hit> Impact parameter "<<fMCEventHeader->GetB()<< ", delrp = "<< delrp << endl; + } + fa_cdrp_b_hit->Fill(fMCEventHeader->GetB(),TMath::Cos(delrp)); + delrp=delrp*RADDEG; + if(delrp<-180.) delrp+=360.; + if(delrp>180.) delrp-=360.; + fa_drp_b_hit->Fill(fMCEventHeader->GetB(),delrp); } - fa_cdrp_b_hit->Fill(fMCEventHeader->GetB(),TMath::Cos(delrp)); - delrp=delrp*RADDEG; - if(delrp<-180.) delrp+=360.; - if(delrp>180.) delrp-=360.; - fa_drp_b_hit->Fill(fMCEventHeader->GetB(),delrp); } phirp=RADDEG*atan2(Qy1+Qy2,Qx1+Qx2); // full reaction plane while(phirp<-180.) {phirp+=360.;} @@ -2483,32 +2567,34 @@ void CbmHadronAnalysis::Exec(Option_t*) while(phirp<-180.) {phirp+=360.;} while(phirp>180.) {phirp-=360.;} } // RP flattening end - delrp=phirp - RADDEG*fMCEventHeader->GetRotZ(); - while(delrp<-180.) {delrp+=360.;} - while(delrp> 180.) {delrp-=360.;} - fa_phirp_hit->Fill(phirp); // 1D histo - fa_delrp_b_hit->Fill(fMCEventHeader->GetB(),delrp); - fa_cdelrp_b_hit->Fill(fMCEventHeader->GetB(),TMath::Cos(delrp/RADDEG)); - - fa_tn_hit->Fill(T0MIN); - fa_t0mn_hit->Fill((Float_t)NT0); - fa_t0mn_b_hit->Fill(fMCEventHeader->GetB(),(Float_t)NT0); - if (NT0 > 0) { - fa_t0m_hit->Fill(t0m_hit); - fa_t0m_b_hit->Fill(fMCEventHeader->GetB(),t0m_hit); - } + if (NULL != fMCEventHeader) { + delrp=phirp - RADDEG*fMCEventHeader->GetRotZ(); + while(delrp<-180.) {delrp+=360.;} + while(delrp> 180.) {delrp-=360.;} + fa_phirp_hit->Fill(phirp); // 1D histo + fa_delrp_b_hit->Fill(fMCEventHeader->GetB(),delrp); + fa_cdelrp_b_hit->Fill(fMCEventHeader->GetB(),TMath::Cos(delrp/RADDEG)); + + fa_tn_hit->Fill(T0MIN); + fa_t0mn_hit->Fill((Float_t)NT0); + fa_t0mn_b_hit->Fill(fMCEventHeader->GetB(),(Float_t)NT0); + if (NT0 > 0) { + fa_t0m_hit->Fill(t0m_hit); + fa_t0m_b_hit->Fill(fMCEventHeader->GetB(),t0m_hit); + } - fa_t0mn_f_hit->Fill((Float_t)NT0F); - fa_t0mn_f_b_hit->Fill(fMCEventHeader->GetB(),(Float_t)NT0F); - if (NT0F > 0) { - fa_t0m_f_hit->Fill(t0mf_hit); - fa_t0m_f_b_hit->Fill(fMCEventHeader->GetB(),t0mf_hit); - } - fa_t0mn_nf_hit->Fill((Float_t)NT0NF); - fa_t0mn_nf_b_hit->Fill(fMCEventHeader->GetB(),(Float_t)NT0NF); - if (NT0NF > 0) { - fa_t0m_nf_hit->Fill(t0mnf_hit); - fa_t0m_nf_b_hit->Fill(fMCEventHeader->GetB(),t0mnf_hit); + fa_t0mn_f_hit->Fill((Float_t)NT0F); + fa_t0mn_f_b_hit->Fill(fMCEventHeader->GetB(),(Float_t)NT0F); + if (NT0F > 0) { + fa_t0m_f_hit->Fill(t0mf_hit); + fa_t0m_f_b_hit->Fill(fMCEventHeader->GetB(),t0mf_hit); + } + fa_t0mn_nf_hit->Fill((Float_t)NT0NF); + fa_t0mn_nf_b_hit->Fill(fMCEventHeader->GetB(),(Float_t)NT0NF); + if (NT0NF > 0) { + fa_t0m_nf_hit->Fill(t0mnf_hit); + fa_t0m_nf_b_hit->Fill(fMCEventHeader->GetB(),t0mnf_hit); + } } // cout << "<I> CbmHadronAnalysis: Number of T0 particles: NTO = " << NT0 << endl; //////////////////////////////////////////////////////////////////////////////////////////// @@ -2520,7 +2606,7 @@ void CbmHadronAnalysis::Exec(Option_t*) Int_t NGTofTrack=0; Qx1=0.; Qy1=0.; Np1=0; Qx2=0.; Qy2=0.; Np2=0; - fa_mul_b_glo->Fill(fMCEventHeader->GetB(),nGlobTracks); + if (NULL != fMCEventHeader) fa_mul_b_glo->Fill(fMCEventHeader->GetB(),nGlobTracks); Int_t NReas=0; //100; // activate reassignment of hits to global tracks Int_t NRIt=0; @@ -3485,13 +3571,14 @@ void CbmHadronAnalysis::Exec(Option_t*) delrp=(phirp1-phirp2); fa_phirps_glo->Fill(phirp1*RADDEG); // 1D histo fa_phirps_glo->Fill(phirp2*RADDEG); // 1D histo + if (NULL != fMCEventHeader) { // cout << " Impact parameter "<<fMCEventHeader->GetB()<< ", delrp = "<< delrp << endl; - fa_cdrp_b_glo->Fill(fMCEventHeader->GetB(),TMath::Cos(delrp)); - delrp=delrp*RADDEG; - if(delrp<-180.) delrp+=360.; - if(delrp>180.) delrp-=360.; - fa_drp_b_glo->Fill(fMCEventHeader->GetB(),delrp); - + fa_cdrp_b_glo->Fill(fMCEventHeader->GetB(),TMath::Cos(delrp)); + delrp=delrp*RADDEG; + if(delrp<-180.) delrp+=360.; + if(delrp>180.) delrp-=360.; + fa_drp_b_glo->Fill(fMCEventHeader->GetB(),delrp); + } phirp=RADDEG*atan2(Qy1+Qy2,Qx1+Qx2); // full reaction plane while(phirp<-180.) {phirp+=360.;} while(phirp>180.) {phirp-=360.;} @@ -3510,15 +3597,17 @@ void CbmHadronAnalysis::Exec(Option_t*) phirp+=dphir*RADDEG; while(phirp<-180.) {phirp+=360.;} while(phirp>180.) {phirp-=360.;} - } // RP flattening end - delrp=phirp - RADDEG*fMCEventHeader->GetRotZ(); - while(delrp<-180.) {delrp+=360.;} - while(delrp> 180.) {delrp-=360.;} - fa_phirp_glo->Fill(phirp); // 1D histo - fa_delrp_b_glo->Fill(fMCEventHeader->GetB(),delrp); - fa_cdelrp_b_glo->Fill(fMCEventHeader->GetB(),TMath::Cos(delrp/RADDEG)); - - fa_mul_b_had->Fill(fMCEventHeader->GetB(),NGTofTrack); + } // RP flattening end + if (NULL != fMCEventHeader) { + delrp=phirp - RADDEG*fMCEventHeader->GetRotZ(); + while(delrp<-180.) {delrp+=360.;} + while(delrp> 180.) {delrp-=360.;} + fa_phirp_glo->Fill(phirp); // 1D histo + fa_delrp_b_glo->Fill(fMCEventHeader->GetB(),delrp); + fa_cdelrp_b_glo->Fill(fMCEventHeader->GetB(),TMath::Cos(delrp/RADDEG)); + + fa_mul_b_had->Fill(fMCEventHeader->GetB(),NGTofTrack); + } } // Hadron level @@ -3652,8 +3741,10 @@ void CbmHadronAnalysis::ReconstructSecondaries() const Double_t dTofSigT=0.08; const Double_t dChiTofLim=3.; - Int_t nStsHits=fStsHits->GetEntriesFast(); - Int_t nTrdHits=fTrdHits->GetEntriesFast(); + nStsHits=0; + if (NULL != fStsHits ) nStsHits=fStsHits->GetEntriesFast(); + Int_t nTrdHits=0; + if (NULL != fTrdHits ) nTrdHits=fTrdHits->GetEntriesFast(); LOG(DEBUG)<<"Secondaries from "<<nTofHits<<" TofHits, "<<nStsHits <<" StsHits and "<<nTrdHits<<" TrdHits in event "<<iCandEv; @@ -3764,31 +3855,33 @@ void CbmHadronAnalysis::ReconstructSecondaries() for (Int_t i=0; i<nTofHits; i++) { CbmTofHit* pTofHit = (CbmTofHit*) fTofHits->At(i); if(NULL == pTofHit) continue; + if(pTofHit->GetZ() == 0) continue; // don't merge with fake beam counter for (Int_t i2=0; i2<nTofHits; i2++){ if(i2 != i){ - CbmTofHit* pTofHit2 = (CbmTofHit*) fTofHits->At(i2); - if(NULL == pTofHit2) continue; - // Project to plane with smallest z coordinate - if( pTofHit2->GetZ()<pTofHit->GetZ() ){ //invert order - CbmTofHit* pTofHittmp= pTofHit; - pTofHit = pTofHit2; - pTofHit2 = pTofHittmp; - } - Double_t dPosZExp = pTofHit->GetZ() / pTofHit2->GetZ(); - Double_t dPosXExp = pTofHit2->GetX() * dPosZExp; - Double_t dPosYExp = pTofHit2->GetY() * dPosZExp; + CbmTofHit* pTofHit2 = (CbmTofHit*) fTofHits->At(i2); + if(NULL == pTofHit2) continue; + // Project to plane with smallest z coordinate + if( pTofHit2->GetZ()<pTofHit->GetZ() ){ //invert order + CbmTofHit* pTofHittmp= pTofHit; + pTofHit = pTofHit2; + pTofHit2 = pTofHittmp; + } + Double_t dPosZExp = pTofHit->GetZ() / pTofHit2->GetZ(); + Double_t dPosXExp = pTofHit2->GetX() * dPosZExp; + Double_t dPosYExp = pTofHit2->GetY() * dPosZExp; Double_t dTimeExp = pTofHit2->GetTime() * dPosZExp; - Double_t dChi2 = TMath::Power((dPosXExp- pTofHit->GetX())/dTofSigX,2) - + TMath::Power((dPosYExp- pTofHit->GetY())/dTofSigY,2) - + TMath::Power((dTimeExp- pTofHit->GetTime())/dTofSigT,2); - Double_t dChi = TMath::Sqrt(dChi2)/3.; - fhTofChi->Fill(dChi); - if (dChi < dChiTofLim) { // merge info + Double_t dChi2 = TMath::Power((dPosXExp- pTofHit->GetX())/dTofSigX,2) + + TMath::Power((dPosYExp- pTofHit->GetY())/dTofSigY,2) + + TMath::Power((dTimeExp- pTofHit->GetTime())/dTofSigT,2); + Double_t dChi = TMath::Sqrt(dChi2)/3.; + fhTofChi->Fill(dChi); + if (dChi < dChiTofLim) { // merge info pTofHit->SetTime((pTofHit->GetTime()+dTimeExp)*0.5); // update time - fTofHits->Remove(pTofHit2); - //pTofHit2->Delete(); // remove from TClonesArray - LOG(DEBUG) << "Tof Hits "<<i<<" and "<<i2<<" merged " ; - } + fTofHits->Remove(pTofHit2); + //pTofHit2->Delete(); // remove from TClonesArray + LOG(DEBUG) << "Tof Hits "<<i<<" and "<<i2<<" merged " ; + LOG(debug) << "Tof " << i << ", xyz " << pTofHit->GetX() << ", " << pTofHit->GetY() << ", " << pTofHit->GetZ(); + } } } } @@ -3797,6 +3890,7 @@ void CbmHadronAnalysis::ReconstructSecondaries() for (Int_t i=0; i<nTofHits; i++) { CbmTofHit* pTofHit = (CbmTofHit*) fTofHits->At(i); if(NULL == pTofHit) continue; + if(pTofHit->GetZ() == 0) continue; // skip fake beam counter dStsDistMin[i] =1.E3; dSts2DistMin[i]=1.E3; for (Int_t l=0; l<NTrdStations; l++) dTrdDistMin[i][l]=1.E3; @@ -3811,6 +3905,8 @@ void CbmHadronAnalysis::ReconstructSecondaries() Double_t dDist2 = TMath::Power(pStsHit->GetX()-sPosXext,2) + TMath::Power(pStsHit->GetY()-sPosYext,2); Double_t dDist = TMath::Sqrt(dDist2); fhDperp->Fill(dDist); + LOG(debug) << "Sts " << j << ", xyz " << pStsHit->GetX() << ", " << pStsHit->GetY() << ", " << sPosZ; + LOG(debug) << "Tof " << i << ", xyz " << pTofHit->GetX() << ", " << pTofHit->GetY() << ", " << pTofHit->GetZ(); LOG(debug) << "Tof "<<i<<", Sts "<<j<<Form(" -> dist %6.3f, Min %6.3f ",dDist, dStsDistMin[i]); if(dDist<fdDistPrimLim && dDist<dStsDistMin[i]) { // primary or proton candidate @@ -3875,6 +3971,7 @@ void CbmHadronAnalysis::ReconstructSecondaries() if(j<0) continue; // no STS assigned CbmTofHit* pTofHit = (CbmTofHit*) fTofHits->At(i); if(NULL == pTofHit) continue; + if(pTofHit->GetZ() == 0) continue; // skip fake beam counter CbmStsHit* pStsHit = (CbmStsHit*) fStsHits->At(j); Double_t dDx = pTofHit->GetX() - pStsHit->GetX(); Double_t dDy = pTofHit->GetY() - pStsHit->GetY(); @@ -3892,22 +3989,22 @@ void CbmHadronAnalysis::ReconstructSecondaries() << Form("Module 0x%08x, layer %d",pTrdHit->GetAddress(),CbmTrdAddress::GetLayerId(pTrdHit->GetAddress())) <<" at z= "<< pTrdHit->GetZ()<<" dD = "<<dDtrans<<" < " << fdDistTRD; fhDTRDprim->Fill(dDtrans); - if(dDtrans<fdDistTRD && dDtrans<dTrdDistMin[i][iTrdLayer]) { // check if acceptable and take best match - Int_t iMul=iTRD[i].size(); - if(dTrdDistMin[i][iTrdLayer]<1.E3){ // modify previous entry - //find old entry in vector - Int_t ll=0; - for( ; ll<iMul; ll++) - if( CbmTrdAddress::GetLayerId(((CbmTrdHit*)fTrdHits->At(iTRD[i][ll]))->GetAddress()) == iTrdLayer ) break; - iTRD[i][ll]=l; - }else { //add hit - dTrdDistMin[i][iTrdLayer]=dDtrans; - iTRD[i].resize( iMul + 1); - iTRD[i][iMul]=l; - } - LOG(DEBUG)<<"assign TrdHit "<<l<<" to TofHit "<<i<<" in layer "<<iTrdLayer<<" with d = "<<dDtrans - <<", TrdMul"<<iMul<<", dEdx = "<<pTrdHit->GetELoss(); - } + if(dDtrans<fdDistTRD && dDtrans<dTrdDistMin[i][iTrdLayer]) { // check if acceptable and take best match + Int_t iMul=iTRD[i].size(); + if(dTrdDistMin[i][iTrdLayer]<1.E3){ // modify previous entry + //find old entry in vector + Int_t ll=0; + for( ; ll<iMul; ll++) + if( (Int_t)CbmTrdAddress::GetLayerId(((CbmTrdHit*)fTrdHits->At(iTRD[i][ll]))->GetAddress()) == iTrdLayer ) break; + iTRD[i][ll]=l; + }else { //add hit + dTrdDistMin[i][iTrdLayer]=dDtrans; + iTRD[i].resize( iMul + 1); + iTRD[i][iMul]=l; + } + LOG(DEBUG)<<"assign TrdHit "<<l<<" to TofHit "<<i<<" in layer "<<iTrdLayer<<" with d = "<<dDtrans + <<", TrdMul"<<iMul<<", dEdx = "<<pTrdHit->GetELoss(); + } } } //2.b - monitor TRD dEdx @@ -3932,6 +4029,7 @@ void CbmHadronAnalysis::ReconstructSecondaries() if(j<0) continue; // no STS assigned CbmTofHit* pTofHit = (CbmTofHit*) fTofHits->At(i); if(NULL == pTofHit) continue; + if(pTofHit->GetZ() == 0) continue; // skip fake beam counter CbmStsHit* pStsHit = (CbmStsHit*) fStsHits->At(j); Double_t dDx = pTofHit->GetX() - pStsHit->GetX(); Double_t dDy = pTofHit->GetY() - pStsHit->GetY(); @@ -3955,8 +4053,8 @@ void CbmHadronAnalysis::ReconstructSecondaries() //find old entry in vector Int_t ll=0; for( ; ll<iMul; ll++) - if( CbmTrdAddress::GetLayerId(((CbmTrdHit*)fTrdHits->At(iTRD[i][ll]))->GetAddress()) == iTrdLayer ) break; - iTRD[i][ll]=l; + if( CbmTrdAddress::GetLayerId(((CbmTrdHit*)fTrdHits->At(iTRD[i][ll]))->GetAddress()) == iTrdLayer ) break; + iTRD[i][ll]=l; }else { //add hit dTrdDistMin[i][iTrdLayer]=dDtrans; iTRD[i].resize( iMul + 1); @@ -3986,6 +4084,7 @@ void CbmHadronAnalysis::ReconstructSecondaries() for (Int_t i=0; i<nTofHits; i++) { CbmTofHit* pTofHit = (CbmTofHit*) fTofHits->At(i); if(NULL == pTofHit) continue; + if(pTofHit->GetZ() == 0) continue; // skip fake beam counter if( iStsMin[i][0]>-1 && iStsMin[i][1]>-1 ) { CbmStsHit* pStsHit = (CbmStsHit*) fStsHits->At( iStsMin[i][0] ); CbmStsHit* pSts2Hit = (CbmStsHit*)fStsHits->At( iStsMin[i][1] ); @@ -4032,6 +4131,7 @@ void CbmHadronAnalysis::ReconstructSecondaries() Int_t kbest=-1; CbmTofHit* pTofHit = (CbmTofHit*) fTofHits->At(i); if(NULL == pTofHit) continue; + if(pTofHit->GetZ() == 0) continue; // skip fake beam counter for (Int_t j=0; j<nStsHits; j++) { LOG(debug) << "Tof "<<i<<", Sts "<<j<<Form(" ? sec cand %6.3f Min %6.3f ", dTofDistMin[j], fdDistPrimLim); if( dTofDistMin[j] > fdDistPrimLim) { // Sts hit not in the primary class @@ -4093,7 +4193,7 @@ void CbmHadronAnalysis::ReconstructSecondaries() //find old entry in vector Int_t ll=0; for( ; ll<iMul; ll++) - if( CbmTrdAddress::GetLayerId(((CbmTrdHit*)fTrdHits->At(iTRD[i][ll]))->GetAddress()) == iTrdLayer ) break; + if( (Int_t) CbmTrdAddress::GetLayerId(((CbmTrdHit*)fTrdHits->At(iTRD[i][ll]))->GetAddress()) == iTrdLayer ) break; iTRD[i][ll]=l; }else { //add hit dTrdDistMin[i][iTrdLayer]=dDtrans; diff --git a/analysis/PWGHAD/hadron/CbmHadronAnalysis.h b/analysis/PWGHAD/hadron/CbmHadronAnalysis.h index ada9f66f2d2256fe0249a62ac4676a296e031291..b31740eb7a42a8e41450ae2d28f5ee1b037979a3 100644 --- a/analysis/PWGHAD/hadron/CbmHadronAnalysis.h +++ b/analysis/PWGHAD/hadron/CbmHadronAnalysis.h @@ -451,6 +451,7 @@ public: virtual InitStatus Init(); virtual void Exec(Option_t* option); + virtual void ExecEvent(Option_t* option); virtual void Finish(); void WriteHistogramms(); diff --git a/analysis/detectors/tof/CbmTofAnaTestbeam.cxx b/analysis/detectors/tof/CbmTofAnaTestbeam.cxx index 915190de2851c4cddd2380854d939631860c6765..990df8c9671287b4528ea3118ba30b115e6957b9 100644 --- a/analysis/detectors/tof/CbmTofAnaTestbeam.cxx +++ b/analysis/detectors/tof/CbmTofAnaTestbeam.cxx @@ -18,6 +18,7 @@ #include "CbmMatch.h" #include "CbmTrackMatchNew.h" #include "CbmTofTracklet.h" +#include "CbmTofTrackletTools.h" #include "CbmEvent.h" #include "CbmVertex.h" #include "CbmTofPoint.h" @@ -79,8 +80,7 @@ Double_t dDTD4Min=1.E8; static Double_t StartAnalysisTime = 0.; static Double_t dTLEvt=0.; static Double_t StartSpillTime = -100.; -//const Double_t SpillDuration = 20.; // in seconds -const Double_t fdSpillBreak = 0.9; + Int_t iNspills=0; static Double_t fdMemoryTime = 1.E12; // memory time in ns @@ -405,6 +405,10 @@ CbmTofAnaTestbeam::CbmTofAnaTestbeam(const char* name, Int_t verbose) fhDutMul_Missed(NULL), fhDutTIS_Found(NULL), fhDutTIS_Missed(NULL), + fhDutTIR_Found(NULL), + fhDutTIR_Missed(NULL), + fhDutVel_Found(NULL), + fhDutVel_Missed(NULL), fhDutDTLH_CluSize(NULL), fhDutDTLH_Tot(NULL), fhDutDTLH_Mul(NULL), @@ -554,6 +558,7 @@ CbmTofAnaTestbeam::CbmTofAnaTestbeam(const char* name, Int_t verbose) fhSelHitTupleResidualXYT_Width(NULL), fdMulDMax(0.), fdSpillDuration(20.), + fdSpillBreak(0.9), fdDTDia(0.), fdDTD4MAX(0.), fdMul0Max(0.), @@ -610,6 +615,7 @@ CbmTofAnaTestbeam::CbmTofAnaTestbeam(const char* name, Int_t verbose) fEnableMatchPosScaling(kTRUE), fFindTracks(NULL), fClusterizer(NULL), + fTrackletTools(NULL), fbMonteCarloComparison(kFALSE), fbPointsInInputFile(kFALSE), fbTracksInInputFile(kFALSE), @@ -636,6 +642,7 @@ CbmTofAnaTestbeam::CbmTofAnaTestbeam(const char* name, Int_t verbose) fbAttachDutHitToTracklet(kFALSE), fbBestSelTrackletOnly(kFALSE), fbUseSigCalib(kFALSE), + fiAnaMode(0), fdMCSIGLIM(3.), fdMCSIGT(100.), fdMCSIGX(1.), @@ -682,6 +689,7 @@ InitStatus CbmTofAnaTestbeam::Init() fFindTracks = CbmTofFindTracks::Instance(); fClusterizer= CbmTofTestBeamClusterizer::Instance(); + fTrackletTools = new CbmTofTrackletTools(); // initialize tools if (NULL == fFindTracks) { //fdTShift += fChannelInfoDut->GetZ()/30.; // in ns @@ -786,8 +794,7 @@ void CbmTofAnaTestbeam::Exec(Option_t* opt) { CbmEvent* tEvent = dynamic_cast<CbmEvent*>(fEventsColl->At(iEvent)); LOG(debug) << "Process event "<<iEvent<<" with "<< tEvent->GetNofData(ECbmDataType::kTofHit)<<" hits from " - << tEvent->GetNofData(ECbmDataType::kTofDigi) << ", "<<tEvent->GetNofData(ECbmDataType::kTofCalDigi)<< " digis " - ; + << tEvent->GetNofData(ECbmDataType::kTofDigi) << ", "<<tEvent->GetNofData(ECbmDataType::kTofCalDigi)<< " digis "; if(fTofDigisColl) fTofDigisColl->Clear("C"); //if(fTofDigisColl) fTofDigisColl->Delete(); @@ -795,42 +802,46 @@ void CbmTofAnaTestbeam::Exec(Option_t* opt) if(fTofDigiMatchColl) fTofDigiMatchColl->Clear("C"); if(fTofTrackColl) fTofTrackColl->Clear("C"); - Int_t iNbDigi=0; + /* + assert ( fTofDigisColl ); for (Int_t iDigi = 0; iDigi < tEvent->GetNofData(ECbmDataType::kTofCalDigi); iDigi++) { Int_t iDigiIndex = static_cast<Int_t>(tEvent->GetIndex(ECbmDataType::kTofCalDigi, iDigi)); - CbmTofDigi* tDigi = dynamic_cast<CbmTofDigi*>(fTofDigisCollIn->At(iDigiIndex)); - new((*fTofDigisColl)[iNbDigi++]) CbmTofDigi(*tDigi); + const CbmTofDigi* tDigi = fDigiMan->Get<CbmTofDigi>(iDigiIndex); +// CbmTofDigi* tDigi = dynamic_cast<CbmTofDigi*>(fTofDigisCollIn->At(iDigiIndex)); + assert (tDigi); + //LOG(INFO) << "Copy TofDigi " << iDigi << " from " << iDigiIndex << " to " << iNbDigi; + //new((*fTofDigisColl)[iNbDigi++]) CbmTofDigi(*tDigi); // does not work for tDigi, since no TObject } - + */ Int_t iNbHits=0; for (Int_t iHit = 0; iHit < tEvent->GetNofData(ECbmDataType::kTofHit); iHit++) { Int_t iHitIndex = static_cast<Int_t>(tEvent->GetIndex(ECbmDataType::kTofHit, iHit)); CbmTofHit* tHit = dynamic_cast<CbmTofHit*>(fTofHitsCollIn->At(iHitIndex)); - new((*fTofHitsColl)[iNbHits]) CbmTofHit(*tHit); + new((*fTofHitsColl)[iNbHits]) CbmTofHit(*tHit); - CbmMatch* tMatch = dynamic_cast<CbmMatch*>(fTofDigiMatchCollIn->At(iHitIndex)); - new((*fTofDigiMatchColl)[iNbHits]) CbmMatch(*tMatch); + CbmMatch* tMatch = dynamic_cast<CbmMatch*>(fTofDigiMatchCollIn->At(iHitIndex)); + new((*fTofDigiMatchColl)[iNbHits]) CbmMatch(*tMatch); - iNbHits++; + iNbHits++; } Int_t iNbTrks=0; for (Int_t iTrk = 0; iTrk < tEvent->GetNofData(ECbmDataType::kTofTrack); iTrk++) { Int_t iTrkIndex = static_cast<Int_t>(tEvent->GetIndex(ECbmDataType::kTofTrack, iTrk)); - CbmTofTracklet* tTrk = dynamic_cast<CbmTofTracklet*>(fTofTrackCollIn->At(iTrkIndex)); - new((*fTofTrackColl)[iNbTrks++]) CbmTofTracklet(*tTrk); + CbmTofTracklet* tTrk = dynamic_cast<CbmTofTracklet*>(fTofTrackCollIn->At(iTrkIndex)); + new((*fTofTrackColl)[iNbTrks++]) CbmTofTracklet(*tTrk); } ExecEvent(opt); - if(iNbDigi) fTofDigisColl->Delete(); //Clear("C"); // Clear causes memory leak, FIXME - if(iNbHits) fTofHitsColl->Clear("C"); + if(iNbDigi) fTofDigisColl->Delete(); //Clear("C"); // Clear causes memory leak, FIXME + if(iNbHits) fTofHitsColl->Clear("C"); if(iNbHits) fTofDigiMatchColl->Delete(); //Clear("C"); - if(iNbTrks) fTofTrackColl->Delete(); //Clear("C"); + if(iNbTrks) fTofTrackColl->Delete(); //Clear("C"); } } @@ -857,9 +868,9 @@ void CbmTofAnaTestbeam::ExecEvent(Option_t* /*option*/) // if( 0 < fEvents ) if( 0 == ( fEvents%100000 ) && 0 < fEvents ) { - cout << "-I- CbmTofAnaTestbeam::Exec : " - << "event " << fEvents - << " in "<<iNspills<< " spills processed." << endl; + LOG(info) << "CbmTofAnaTestbeam::Exec : " + << "event " << fEvents + << " in "<<iNspills<< " spills processed."; } fEvents += 1; } @@ -963,6 +974,19 @@ Bool_t CbmTofAnaTestbeam::RegisterInputs() FairRootManager *fManager = FairRootManager::Instance(); fEventsColl = dynamic_cast<TClonesArray*>(fManager->GetObject("Event")); + if(NULL == fEventsColl) + fEventsColl = dynamic_cast<TClonesArray*>(fManager->GetObject("CbmEvent")); + + if(NULL == fEventsColl) + LOG(info) << "CbmEvent not found in input file, assume eventwise input" ; + + fDigiMan = CbmDigiManager::Instance(); + fDigiMan->Init(); + if ( ! fDigiMan->IsPresent(ECbmModuleId::kTof) ) { + LOG(error) << GetName() << ": No digi input!"; + return kFALSE; + } + if (!fEventsColl) { @@ -973,8 +997,7 @@ Bool_t CbmTofAnaTestbeam::RegisterInputs() fTofDigisColl = (TClonesArray *) fManager->GetObject("TofCalDigi"); if( NULL == fTofDigisColl){ - LOG(WARNING)<<"CbmTofAnaTestbeam::RegisterInputs => Could not get the TofDigi TClonesArray!!! ... continuing with incomplete input " - ; + LOG(WARNING)<<"CbmTofAnaTestbeam::RegisterInputs => Could not get the TofDigi TClonesArray!!! ... continuing with incomplete input "; // return kFALSE; }// if( NULL == fTofDigisColl) @@ -990,6 +1013,7 @@ Bool_t CbmTofAnaTestbeam::RegisterInputs() return kFALSE; } // if( NULL == fTofDigiMatchColl) + fTofTrackColl = (TClonesArray *) fManager->GetObject("TofTracks"); if( NULL == fTofTrackColl) { LOG(info)<<"CbmTofAnaTestbeam::RegisterInputs => Could not get the TofTracklet TClonesArray!!!"; @@ -1000,6 +1024,14 @@ Bool_t CbmTofAnaTestbeam::RegisterInputs() if( NULL == fTrbHeader) { LOG(info)<<"CbmTofAnaTestbeam::RegisterInputs => Could not get the TofTrbHeader Object"; } + + fDigiMan = CbmDigiManager::Instance(); + fDigiMan->Init(); + if ( ! fDigiMan->IsPresent(ECbmModuleId::kTof) ) { + LOG(error) << GetName() << ": No input digis!"; + //return kFALSE; + }else + LOG(info) << "DigiManager has Tof Digis"; if(fbMonteCarloComparison) { @@ -1123,9 +1155,8 @@ Bool_t CbmTofAnaTestbeam::RegisterInputs() fTofDigisCollIn = (TClonesArray *) fManager->GetObject("TofDigi"); */ if( NULL == fTofDigisCollIn){ - LOG(WARNING)<<"CbmTofAnaTestbeam::RegisterInputs => Could not get the TofDigi TClonesArray!!! ... continuing with incomplete input " - ; - return kFALSE; + LOG(WARNING)<<"CbmTofAnaTestbeam::RegisterInputs => Could not get the TofDigi TClonesArray!!! ... continuing with incomplete input "; + //return kFALSE; }// if( NULL == fTofDigisColl) fTofHitsCollIn = (TClonesArray *) fManager->GetObject("TofHit"); @@ -1136,8 +1167,10 @@ Bool_t CbmTofAnaTestbeam::RegisterInputs() fTofDigiMatchCollIn= (TClonesArray *) fManager->GetObject("TofDigiMatch"); if( NULL == fTofDigiMatchCollIn) { - LOG(error)<<"CbmTofAnaTestbeam::RegisterInputs => Could not get the Match TClonesArray!!!"; - //return kFALSE; + fTofDigiMatchCollIn= (TClonesArray *) fManager->GetObject("TofCalDigiMatch"); + if( NULL == fTofDigiMatchCollIn) { + LOG(error)<<"CbmTofAnaTestbeam::RegisterInputs => Could not get the Match TClonesArray!!!"; + } } // if( NULL == fTofDigiMatchColl) fTofTrackCollIn = (TClonesArray *) fManager->GetObject("TofTracks"); @@ -1151,7 +1184,8 @@ Bool_t CbmTofAnaTestbeam::RegisterInputs() if ( ! fDigiMan->IsPresent(ECbmModuleId::kTof) ) { LOG(error) << GetName() << ": No input digis!"; return kFALSE; - } + }else + LOG(info) << "DigiManager has Tof Digis"; // Create work Arrays fTofDigisColl = new TClonesArray("CbmTofDigi",100); @@ -1449,8 +1483,8 @@ Bool_t CbmTofAnaTestbeam::CreateHistos() gROOT->cd(); // <= To prevent histos from being sucked in by the param file of the TRootManager ! // define histos here - Double_t TISmax = 10.; //fdSpillDuration; - Double_t TISnbins = 100.; //50.; + Double_t TISmax = 11.; //fdSpillDuration; + Double_t TISnbins = 110.; //50.; fhRate_all = new TH1F("hRate_all", "Event Rate; Rate (Hz); t (sec)", 1000, 0, 100); fhTriggerPattern = new TH1I("tof_trb_trigger_pattern", "CTS trigger pattern", 16, 0, 16); fhTriggerType = new TH1I("tof_trb_trigger_types", "CTS trigger types", 16, 0, 16); @@ -1461,15 +1495,15 @@ Bool_t CbmTofAnaTestbeam::CreateHistos() fhTIS_sel2 = new TH1F("TIS_sel2", "Time in Spill (sel2); t (sec)", TISnbins, 0, TISmax); - Double_t TIRmax = 2000.; // Run duration - Double_t TIRnbins = 200.; + Double_t TIRmax = 1800.; // Run duration + Double_t TIRnbins = 18000.; fhTIR_all = new TH1F("TIR_all", "Time in Run (all); t (sec)", TIRnbins, 0, TIRmax); fhTIR_sel = new TH1F("TIR_sel", "Time in Run (sel); t (sec)", TIRnbins, 0, TIRmax); fhTIR_sel1 = new TH1F("TIR_sel1", "Time in Run (sel1); t (sec)", TIRnbins, 0, TIRmax); fhTIR_sel2 = new TH1F("TIR_sel2", "Time in Run (sel2); t (sec)", TIRnbins, 0, TIRmax); - Double_t TISmax2 = 10.; - Double_t TISnbins2 = 1.E2; + Double_t TISmax2 = 11.; + Double_t TISnbins2 = 110.; fhTIS_Nhit = new TH2F("TIS_Nhit", "Time in Spill (Nhit); t (sec); N_{hit}", TISnbins2, 0, TISmax2,25,0,50); fhTIS_Ntrk = new TH2F("TIS_Ntrk", "Time in Spill (Ntrk); t (sec); N_{trk}", TISnbins2, 0, TISmax2,10,0,10); @@ -1912,12 +1946,24 @@ Bool_t CbmTofAnaTestbeam::CreateHistos() fhDutMul_Missed=new TH1F( Form("hDutMul_Missed_%03d",iDutId), Form("hDutMul_Missed_%03d; Hit Multiplicity",iDutId), 32, 0., 32.); - fhDutTIS_Found=new TH1F( Form("hDutTIS_Found_%03d",iDutId), + fhDutTIS_Found=new TH2F( Form("hDutTIS_Found_%03d",iDutId), Form("hDutTIS_Found_%03d; Time in spill (s)",iDutId), - TISnbins, 0, TISmax); - fhDutTIS_Missed=new TH1F( Form("hDutTIS_Missed_%03d",iDutId), + TISnbins, 0, TISmax,9,0,9); + fhDutTIS_Missed=new TH2F( Form("hDutTIS_Missed_%03d",iDutId), Form("hDutTIS_Missed_%03d; Time in spill (s)",iDutId), - TISnbins, 0, TISmax); + TISnbins, 0, TISmax,9,0,9); + fhDutTIR_Found=new TH2F( Form("hDutTIR_Found_%03d",iDutId), + Form("hDutTIR_Found_%03d; Time in spill (s)",iDutId), + TIRnbins, 0, TIRmax,9,0,9); + fhDutTIR_Missed=new TH2F( Form("hDutTIR_Missed_%03d",iDutId), + Form("hDutTIR_Missed_%03d; Time in spill (s)",iDutId), + TIRnbins, 0, TIRmax,9,0,9); + fhDutVel_Found=new TH1F( Form("hDutVel_Found_%03d",iDutId), + Form("hDutVel_Found_%03d; velocity (cm/ns)",iDutId), + 50, 0., 50.); + fhDutVel_Missed=new TH1F( Form("hDutVel_Missed_%03d",iDutId), + Form("hDutVel_Missed_%03d; velocity (cm/ns)",iDutId), + 50, 0., 50.); fhDutDTLH_CluSize=new TH2F( Form("hDutDTLH_CluSize_%03d",iDutId), Form("hDutDTLH_CluSize_%03d; log(#DeltaT); CluSize",iDutId), 50, 0., 12., 10, 1., 11.); @@ -3215,6 +3261,8 @@ Bool_t CbmTofAnaTestbeam::FillHistos() Double_t dDTSpill=dTDia-StartSpillTime; StartSpillTime=dTDia; */ + if(fdSpillBreak == 0.) StartSpillTime=dTAv; + Double_t dDTSpill=dTAv-StartSpillTime; if( fDetIdMap.size() > 3 && dMulD>0 ){ // FIXME - hardwired constants Double_t dDTLEvt=dTAv-dTLEvt; @@ -3228,7 +3276,8 @@ Bool_t CbmTofAnaTestbeam::FillHistos() dDTSpill/1.E9,fEvents,dMulD,(Int_t)fDetIdMap.size(),dDTLEvt/1.E9); } } - fhRate_all->Fill((dTAv-StartAnalysisTime)/1.E9,1./ fhRate_all->GetBinWidth(1)); + Double_t dTIR=(dTAv-StartAnalysisTime)/1.E9; + fhRate_all->Fill(dTIR,1./ fhRate_all->GetBinWidth(1)); if (StartSpillTime<0) { LOG(debug) << "SpillStartTime not available, abort Anatestbeam " ; return kFALSE; @@ -3286,7 +3335,7 @@ Bool_t CbmTofAnaTestbeam::FillHistos() if(fTrbHeader != NULL) fhTIS_all->Fill(fTrbHeader->GetTimeInSpill()); else fhTIS_all->Fill((dTAv-StartSpillTime)/1.E9); - fhTIR_all->Fill((dTAv-StartAnalysisTime)/1.E9); + fhTIR_all->Fill(dTIR); LOG(debug)<<Form(" FoundMatches: %d with first chi2s = %12.1f, %12.1f, %12.1f, %12.1f",iNbMatchedHits, Chi2List[0],Chi2List[1],Chi2List[2],Chi2List[3]) @@ -3313,7 +3362,7 @@ Bool_t CbmTofAnaTestbeam::FillHistos() if(fTrbHeader != NULL) fhTIS_sel->Fill(fTrbHeader->GetTimeInSpill()); else fhTIS_sel->Fill((dTAv-StartSpillTime)/1.E9); - fhTIR_sel->Fill((dTAv-StartAnalysisTime)/1.E9); + fhTIR_sel->Fill(dTIR); fhTofD4sel->Fill(pHitRef->GetTime()-dTDia); // general normalisation fhDTD4sel->Fill(dDTD4Min); // general normalisation @@ -3410,7 +3459,7 @@ Bool_t CbmTofAnaTestbeam::FillHistos() if(fTrbHeader != NULL) fhTIS_sel2->Fill(fTrbHeader->GetTimeInSpill()); else fhTIS_sel2->Fill((dTAv-StartSpillTime)/1.E9); - fhTIR_sel2->Fill((dTAv-StartAnalysisTime)/1.E9); + fhTIR_sel2->Fill(dTIR); if(NULL != fClusterizer) if(fClusterizer->fdMemoryTime>0) { @@ -3736,10 +3785,9 @@ Bool_t CbmTofAnaTestbeam::FillHistos() fhSelMatchEfficiency->Fill(kTRUE, fiNAccRefTracks); fhSelHitTupleMatchEfficiencyTIS->Fill(kTRUE, (dTAv - StartSpillTime)/1.E9); - if(fTrbHeader != NULL) fhTIS_sel1->Fill(fTrbHeader->GetTimeInSpill()); else fhTIS_sel1->Fill((dTAv-StartSpillTime)/1.E9); - fhTIR_sel1->Fill((dTAv-StartAnalysisTime)/1.E9); + fhTIR_sel1->Fill(dTIR); if(NULL != fClusterizer) if(fClusterizer->fdMemoryTime>0) { @@ -4639,7 +4687,11 @@ Bool_t CbmTofAnaTestbeam::FillHistos() Bool_t bGoodSelTrackletDutMatch(kFALSE); auto itDutHitMatch = TrackletMatchedDutHitRedChiSq.find(iTrk); - + + Double_t dVel= 0.; + Double_t dTt=fTrackletTools->FitTt(pTrk,fiDutAddr); + if(dTt > 0.) dVel=1./dTt; + if(NStations == pTrk->GetNofHits()) { if(fbAttachDutHitToTracklet) @@ -4825,6 +4877,7 @@ Bool_t CbmTofAnaTestbeam::FillHistos() Double_t dDYB= pTrk->GetYdif(fiDutAddr, pHit); // ignore pHit in calc of reference Double_t dDT = pHit->GetTime() - pTrk->GetFitT(pHit->GetZ()); // pTrk->GetTdif(fStationType[iSt]); Double_t dDTB= pTrk->GetTdif(fiDutAddr, pHit); // ignore pHit in calc of reference + fhDutPullX->Fill(dDX); fhDutPullXB->Fill(dDXB); fhDutPullY->Fill(dDY); @@ -4832,6 +4885,33 @@ Bool_t CbmTofAnaTestbeam::FillHistos() fhDutPullT->Fill(dDT); fhDutPullTB->Fill(dDTB); fhDutChi_Found->Fill(pTrk->GetChiSq()); + + Int_t iGet4=-1; + Double_t dTot=0.; + CbmMatch* digiMatch=(CbmMatch *)fTofDigiMatchColl->At(iDutHitIndex); + if( NULL != digiMatch ) + if ( fDigiMan->IsPresent(ECbmModuleId::kTof) ) + for (Int_t iLink=0; iLink<digiMatch->GetNofLinks(); iLink++){ // loop over digis + CbmLink L0 = digiMatch->GetLink(iLink); + Int_t iDigInd0=L0.GetIndex(); + const CbmTofDigi* pDig0 = fDigiMan->Get<CbmTofDigi>(iDigInd0); + if(iGet4==-1) { + iGet4 = Int_t(pDig0->GetChannel())%8 + 1; + dTot=pDig0->GetTot(); + } + else { + if(iGet4>0) { + if(pDig0->GetTot() > dTot) { + iGet4 = Int_t(pDig0->GetChannel())%8 + 1; + dTot=pDig0->GetTot(); + } + //if ( Int_t(pDig0->GetChannel())%8 + 1 != iGet4 ) iGet4=0; + } + } + } + else LOG(error) << "no Tof Digis"; + else LOG(error) << "no Tof Digi Match"; + if(fbAttachDutHitToTracklet) { // fhDutChi_Match->Fill(vHitMap[iTrk].begin()->first); @@ -4840,7 +4920,10 @@ Bool_t CbmTofAnaTestbeam::FillHistos() fhDutXY_Found->Fill(hitpos_local[0],hitpos_local[1]); fhDutDTLH_Found->Fill(dDelTLH); fhDutMul_Found->Fill( dMul4 ); - fhDutTIS_Found->Fill( dTiS ); + fhDutTIS_Found->Fill( dTiS , iGet4); + fhDutTIR_Found->Fill( dTIR , iGet4); + fhDutVel_Found->Fill( dVel ); + fhDutXYDX->Fill(hitpos_local[0],hitpos_local[1],dDX); fhDutXYDY->Fill(hitpos_local[0],hitpos_local[1],dDY); fhDutXYDT->Fill(hitpos_local[0],hitpos_local[1],dDTB); @@ -5021,7 +5104,10 @@ Bool_t CbmTofAnaTestbeam::FillHistos() fhDutChi_Missed->Fill(pTrk->GetChiSq()); fhDutXY_Missed->Fill(hitpos_local[0],hitpos_local[1]); fhDutMul_Missed->Fill( dMul4 ); - fhDutTIS_Missed->Fill( dTiS ); + Int_t iGet4=((Int_t)hitpos_local[0]+16)%8 +1; + fhDutTIS_Missed->Fill( dTiS, iGet4); + fhDutTIR_Missed->Fill( dTIR, iGet4); + fhDutVel_Missed->Fill( dVel ); fhDutDTLH_Missed->Fill( dDelTLH ); fhDutDTLH_Missed_TIS->Fill( dDelTLH, dTiS ); if(NULL != pLHit){ diff --git a/analysis/detectors/tof/CbmTofAnaTestbeam.h b/analysis/detectors/tof/CbmTofAnaTestbeam.h index 435704c4f3f090ba66c3e5e1bbfe42a85e7a84dc..26ad67fc25cb019bacb1443637855cee9c089370 100644 --- a/analysis/detectors/tof/CbmTofAnaTestbeam.h +++ b/analysis/detectors/tof/CbmTofAnaTestbeam.h @@ -113,7 +113,8 @@ class CbmTofAnaTestbeam : public FairTask { inline void SetPosYS2Sel (Double_t val) { fdPosYS2Sel = val;} inline void SetPosYS2SelOff (Double_t val) { fdPosYS2SelOff = val;} inline void SetSel2TOff (Double_t val) { fdSel2TOff = val;} - inline void SetSpillDuration (Double_t val) { fdSpillDuration = val;} + inline void SetSpillDuration (Double_t val) { fdSpillDuration = val;} + inline void SetSpillBreak (Double_t val) { fdSpillBreak = val;} inline void SetMulDMax (Double_t val) { fdMulDMax = val;} inline void SetDTDia (Double_t val) { fdDTDia = val;} inline void SetDTD4MAX (Double_t val) { fdDTD4MAX = val;} @@ -199,6 +200,7 @@ class CbmTofAnaTestbeam : public FairTask { inline void SetAttachDutHitToTracklet(Bool_t bval) { fbAttachDutHitToTracklet = bval; } inline void SetBestSelTrackletOnly(Bool_t bval) { fbBestSelTrackletOnly = bval; } inline void SetUseSigCalib(Bool_t bval) { fbUseSigCalib = bval; } + inline void SetAnaMode(Int_t ival) { fiAnaMode = ival; } inline void SetMCSIGLIM ( Double_t val ) { fdMCSIGLIM = val; } inline void SetMCSIGT ( Double_t val ) { fdMCSIGT = val; } @@ -475,8 +477,12 @@ class CbmTofAnaTestbeam : public FairTask { TH1 * fhDutDTLH_Missed; TH1 * fhDutMul_Found; TH1 * fhDutMul_Missed; - TH1 * fhDutTIS_Found; - TH1 * fhDutTIS_Missed; + TH2 * fhDutTIS_Found; + TH2 * fhDutTIS_Missed; + TH2 * fhDutTIR_Found; + TH2 * fhDutTIR_Missed; + TH1 * fhDutVel_Found; + TH1 * fhDutVel_Missed; TH2 * fhDutDTLH_CluSize; TH2 * fhDutDTLH_Tot; TH2 * fhDutDTLH_Mul; @@ -657,7 +663,8 @@ class CbmTofAnaTestbeam : public FairTask { TH1 *fhSelTypeNNResidualY_Width; // 'calibration' histo TH1 *fhSelHitTupleResidualXYT_Width;// 'calibration' histo Double_t fdMulDMax; // max multiplicity in Diamond counter - Double_t fdSpillDuration; // spill length in sec + Double_t fdSpillDuration; // min. spill length in sec + Double_t fdSpillBreak; // min. spill break in sec Double_t fdDTDia; // max time difference between diamonds Double_t fdDTD4MAX; // max time difference between reference & diamond Double_t fdMul0Max; // max multiplicity in Dut @@ -720,6 +727,7 @@ class CbmTofAnaTestbeam : public FairTask { CbmTofFindTracks* fFindTracks; // Pointer to Task CbmTofTestBeamClusterizer* fClusterizer; // Pointer to Task + CbmTofTrackletTools* fTrackletTools;// Pointer to Class Bool_t fbMonteCarloComparison; Bool_t fbPointsInInputFile; @@ -749,6 +757,7 @@ class CbmTofAnaTestbeam : public FairTask { Bool_t fbAttachDutHitToTracklet; Bool_t fbBestSelTrackletOnly; Bool_t fbUseSigCalib; + Int_t fiAnaMode; Double_t fdMCSIGLIM; Double_t fdMCSIGT;