#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "PndLmdDim.h" //lmd track #include #include #include #include #include #include #include #include #include // needed for geane backtracking #include #include #include #include #include #include #include #include #include // void combitransFromLumiFrame(TVector3& hitPos, int senType=0){ // Double_t kTransZ, kRotUmZ, kRot, kTransX; // if(senType>0){ //Pixel sensors // //do the transformation from lab frame to LUMI frame (with z-axis perp. to lumi planes) // double end_seg_upstream = 360.1; // where bending starts with // double r_bend = 5750.; // the bending radius // double phi_bend = 40.068e-3; // and the angle of the circle path // // const Double_t kRot = phi_bend/3.141*180.;//=2.295727;//2.326; //(deg) //Rotate to dipol // kRot = phi_bend;//here we need abgle in rad! // // the point where both tangents of the straight beam pipe tubes meet is // kRotUmZ = end_seg_upstream + tan(phi_bend/2.)*r_bend;//476.03; //(cm) //z-point to rotate // kTransZ = 1130.; //(cm) //move at z-position // kTransX = (kTransZ - end_seg_upstream - tan(phi_bend/2.)*r_bend)*tan(phi_bend); // 25 (cm) //move at x-position // } // else{ // /// THIS WORKS ONLY FOR DESIGN WITH STRIP SENSORS! // //do the transformation from lab frame to LUMI frame (with z-axis perp. to lumi planes) // kTransZ = 1100.; //(cm) //move at z-position // kRotUmZ = 476.03; //(cm) //z-point to rotate // kTransX = 25; //(cm) //move at x-position // kRot = 0.040596358401388; // 2.326 degree = 4.05963584013881024e-02 rad // } // TVector3 LumiTrans(0,0,kTransZ-kRotUmZ); // hitPos +=LumiTrans; // hitPos.RotateY(kRot); // LumiTrans = TVector3(0,0,kRotUmZ); // hitPos +=LumiTrans; // } // TMatrixD rotateFromLumiFrame(TMatrixD& hitCov, int senType=0){ // Double_t sintheta, costheta; // if(senType>0){ //Pixel sensors // double phi_bend = 40.068e-3; // and the angle of the circle path // sintheta = TMath::Sin(phi_bend); // costheta = TMath::Cos(phi_bend); // } // else{ // /// THIS WORKS ONLY FOR DESIGN WITH STRIP SENSORS! // Double_t theta=-2.326; // Double_t degrad = TMath::Pi()/180.; // sintheta = TMath::Sin(degrad*theta); // costheta = TMath::Cos(degrad*theta); // } // TMatrixD rot(3,3);// Rotation around Y axis // rot[0][0]= costheta; // rot[0][1]= 0; // rot[0][2]= sintheta; // rot[1][0]= 0; // rot[1][1]= 1; // rot[1][2]= 0; // rot[2][0]= -sintheta; // rot[2][1]= 0; // rot[2][2]= costheta; // TMatrixD result = rot; // result.T(); // result*=hitCov; // hitCov = result; // result*=rot; // return result; // } // void rotateFromLumiFrame(TVector3& hitPos, bool err, int senType=0){ // TMatrixD hitMtx(3,3); // if(err){ // hitMtx[0][0] = hitPos[0]*hitPos[0]; // hitMtx[1][1] = hitPos[1]*hitPos[1]; // hitMtx[2][2] = hitPos[2]*hitPos[2]; // TMatrixD res = rotateFromLumiFrame(hitMtx,senType); // hitPos = TVector3(sqrt(res(0,0)),sqrt(res(1,1)),sqrt(res(2,2))); // } // else{ // hitMtx[0][0] = hitPos[0]; // hitMtx[1][0] = hitPos[1]; // hitMtx[2][0] = hitPos[2]; // TMatrixD res = rotateFromLumiFrame(hitMtx,senType); // hitPos = TVector3(hitMtx(0,0),hitMtx(1,0),hitMtx(2,0)); // } // } using namespace std; int main(int __argc,char *__argv[]) { //gROOT->Macro("/PANDA/pandaroot/macro/lmd/Style_Imported_Style.C"); // gROOT->SetStyle("Imported_Style"); //TODO: read this like params! // const int nEvents=500000; int nEvents=1000; int nMCtracks=1; int startEvent=0; TString storePath="/data/FAIRsorf/pandaroot/trunk/macro/lmd/tmpOutput"; double Plab=15.; int verboseLevel=5; int mh = 0;//if>0 : use merged hit collection int dnu=0;//if>0 : use namespace for pixel std::string startStr="", momStr="", nStr="", pathStr="", verbStr="" , mcTrkStr="", useNewDStr="",usedMHStr=""; // decode arguments if( __argc>1 && ( strcmp( __argv[1], "-help" ) == 0 || strcmp( __argv[1], "--help" ) == 0 ) ){ std::cout << "This is script for comparision reconstructed and simulated tracks with parameters\n" <<"-s start event \n" <<"-n Number of events \n" <<"-t Number of trks per event \n" <<"-mom Beam Momentum \n" <<"-path path to the file(s) \n" <<"-v verbose Level (if>0, print out some information) \n" <<"-npx if>0: use namespace for pixel \n" <<"-mh if>0: use merged hits\n" <<"Have fun! \n" << std::endl; return 0; } while ((optind < (__argc-1) ) && (__argv[optind][0]=='-')) { bool found=false; std::string sw = __argv[optind]; if (sw=="-s") { optind++; startStr = __argv[optind]; found=true; } if (sw=="-n"){ optind++; nStr = __argv[optind]; found=true; } if (sw=="-t"){ optind++; mcTrkStr = __argv[optind]; found=true; } if (sw=="-path"){ optind++; pathStr = __argv[optind]; found=true; } if (sw=="-mom"){ optind++; momStr = __argv[optind]; found=true; } if (sw=="-v"){ optind++; verbStr = __argv[optind]; found=true; } if (sw=="-npx"){ optind++; useNewDStr = __argv[optind]; found=true; } if (sw=="-mh"){ optind++; usedMHStr = __argv[optind]; found=true; } if (!found){ std::cout<< "Unknown switch: " << __argv[optind] <> startEvent; momSStr >> Plab; nSStr >> nEvents; pathSStr >> storePath; verbSStr >> verboseLevel; mcTrkSStr >> nMCtracks; useNewDSStr >> dnu; usedMHSStr >> mh; cout<<"====================================="<Macro("$VMCWORKDIR/gconfig/rootlogon.C"); gSystem->Load("libLmdTrk"); // gROOT->LoadMacro("line3Dfit.C"); // ------------------------------------------------------------------------ // ----- Timer -------------------------------------------------------- TStopwatch timer; timer.Start(); // ------------------------------------------------------------------------ // ---- Input files -------------------------------------------------------- TString simMC=storePath+"/Lumi_MC_"; simMC += startEvent; simMC += ".root"; TChain tMC("cbmsim"); tMC.Add(simMC); TString DigiFile = storePath+"/Lumi_digi_"; DigiFile += startEvent; DigiFile += ".root"; TChain tdigiHits("cbmsim"); tdigiHits.Add(DigiFile); TString recHit=storePath+"/Lumi_reco"; // if(dnu>0) recHit+="Merged"; recHit +="_"; recHit += startEvent; recHit += ".root"; TChain tHits("cbmsim"); tHits.Add(recHit); TString recHitmerged=storePath+"/Lumi_recoMerged_"; recHitmerged += startEvent; recHitmerged += ".root"; TChain tHitsMerged("cbmsim"); if(mh) tHitsMerged.Add(recHitmerged); TString trkCand = storePath+"/Lumi_TCand_"; trkCand += startEvent; trkCand += ".root"; TChain tTrkCand("cbmsim"); tTrkCand.Add(trkCand); TString recTrack; TChain tTrkRec("cbmsim"); recTrack = storePath+"/Lumi_Track_"; recTrack += startEvent; recTrack += ".root"; tTrkRec.Add(recTrack); // if(kf<1){ // recTrack = storePath+"/Lumi_Track_"; // recTrack += startEvent; // recTrack += ".root"; // tTrkRec.Add(recTrack); // } TString geaneFile = storePath+"/Lumi_Geane_"; geaneFile += startEvent; geaneFile += ".root"; TChain tgeane("cbmsim"); tgeane.Add(geaneFile); // --------------------------------------------------------------------------------- // ---- Output file ---------------------------------------------------------------- TString out=storePath+"/Lumi_out_MC_and_REC_trks_matches_with_IDs"; out += startEvent; out += ".root"; TFile *f = new TFile(out,"RECREATE"); // --------------------------------------------------------------------------------- //--- MC info ----------------------------------------------------------------- TClonesArray* true_tracks=new TClonesArray("PndMCTrack"); tMC.SetBranchAddress("MCTrack",&true_tracks); //True Track to compare TClonesArray* true_points=new TClonesArray("PndSdsMCPoint"); tMC.SetBranchAddress("LMDPoint",&true_points); //True Points to compare //---------------------------------------------------------------------------------- //--- Digitization info ------------------------------------------------------------ TClonesArray* fStripClusterArray; if(dnu>0){ fStripClusterArray = new TClonesArray("PndSdsClusterPixel"); tHits.SetBranchAddress("LMDPixelClusterCand",&fStripClusterArray); } else{ fStripClusterArray = new TClonesArray("PndSdsClusterStrip"); tHits.SetBranchAddress("LMDStripClusterCand",&fStripClusterArray); } TClonesArray* fStripDigiArray; if(dnu>0){ fStripDigiArray = new TClonesArray("PndSdsDigiPixel"); tdigiHits.SetBranchAddress("LMDPixelDigis",&fStripDigiArray); } else{ fStripDigiArray = new TClonesArray("PndSdsDigiStrip"); tdigiHits.SetBranchAddress("LMDStripDigis",&fStripDigiArray); } //---------------------------------------------------------------------------------- //--- Real Hits -------------------------------------------------------------------- TClonesArray* rechit_array; if(dnu>0){ if(mh>0){ rechit_array = new TClonesArray("PndSdsMergedHit"); tHitsMerged.SetBranchAddress("LMDHitsMerged",&rechit_array); //Points for Tracks } else{ rechit_array = new TClonesArray("PndSdsHit"); tHits.SetBranchAddress("LMDHitsPixel",&rechit_array); //Points for Tracks } } else{ rechit_array = new TClonesArray("PndSdsHit"); tHits.SetBranchAddress("LMDHitsStrip",&rechit_array); //Points for Tracks } //---------------------------------------------------------------------------------- //--- Track Candidate --------------------------------------------------------------- TClonesArray* trkcand_array=new TClonesArray("PndTrackCand"); tTrkCand.SetBranchAddress("LMDTrackCand",&trkcand_array); //Points for Track Canidates //----------------------------------------------------------------------------------- //--- Real tracks ------------------------------------------------------------------- TClonesArray* rec_trk=new TClonesArray("PndLinTrack"); tTrkRec.SetBranchAddress("LMDTrack",&rec_trk); //Tracks // tgeane.SetBranchAddress("PndTrackLmd",&rec_trk); //Tracks // if(kf>0){ // rec_trk = new TClonesArray("PndTrack"); // tgeane.SetBranchAddress("PndTrackLmd",&rec_trk); //Tracks // } // else{ // rec_trk = new TClonesArray("PndLinTrack"); // tTrkRec.SetBranchAddress("LMDTrack",&rec_trk); //Tracks // } cout<<"Here we go to GEANE file: "< Read_transformation_matrices("matrices.txt", true); lmddim -> Read_transformation_matrices("matrices_perfect.txt", false); int glBADGEANE=0; int glBadEv = 0; int glNoisehit = 0;// total number of noise hits for (Int_t j=0; j0) tHitsMerged.GetEntry(j); const int nGeaneTrks = geaneArray->GetEntriesFast(); const int nParticles = true_tracks->GetEntriesFast(); const int numTrk = nGeaneTrks; const int nRecHits = rechit_array->GetEntriesFast(); const int nMCHits = true_points->GetEntriesFast(); const int nTrkCandidates = trkcand_array->GetEntriesFast(); const int nRecTrks = rec_trk->GetEntriesFast(); if(verboseLevel>0) cout<<"Event #"<Fill(nParticles,nGeaneTrks); if(nParticles!=nMCtracks) continue; hnhits->Fill(nMCHits,nRecHits); if(nRecHits<3*nMCtracks) glBadEv++; // if(nRecHits<3*nMCtracks) cout<<"Event #"<Fill(nRecHits,nParticles); if(nTrkCandidates>numTrk) cout<<"Event #"<Fill(nTrkCandidates); hntrkcandvsMC->Fill(nParticles,nTrkCandidates); /// Set MC ID for each track ---------------------------------------------------- Int_t nRecGEANEtrk = 0; int MCtrk[nParticles]; //Number of participation this MCid in rec.tracks int RECtrkMCid[nGeaneTrks];//Assignment MC id to REC trk; for(int nk=0;nk MCtrkID; //arrray of hits MCid Int_t diffIDs=1; FairTrackParH *fRes = (FairTrackParH*)geaneArray->At(iN); ///get rid from most probably ghost track ------------ TVector3 PosRec = fRes->GetPosition(); double pca_lim = 1.;//=10*sigma_Xpca~10*{0.093,0.11,0.12,0.22,0.55}; if(Plab<5) pca_lim = 2.; if(Plab<2) pca_lim = 5.; // if(fabs(PosRec.X())>pca_lim && fabs(PosRec.Y())>pca_lim){ // cout<<"666 Event #"<pca_lim && fabs(PosRec.Y())>pca_lim) continue; // PCA_x and PCA_y should be < 10sigmaX ///get rid from most probably ghost track (END) --- Double_t lyambda = fRes->GetLambda(); if(lyambda==0){ cout<<"GEANE didn't propagate this trk!"<GetSortedHit(iHit)); Int_t hitID = candhit.GetHitId(); PndSdsHit* myHit = (PndSdsHit*)(rechit_array->At(hitID)); //for pixel design double MCpointMom; if(dnu>0){ // if(verboseLevel>1) cout<<"Rec hit("<GetClusterIndex()<<")"; PndSdsClusterPixel* myCluster = (PndSdsClusterPixel*)(fStripClusterArray->At(myHit->GetClusterIndex())); PndSdsDigiPixel* astripdigi = (PndSdsDigiPixel*)(fStripDigiArray->At(myCluster->GetDigiIndex(0))); if (astripdigi->GetIndex(0) == -1){ glNoisehit++; // MCtrkID.push_back(-111); continue; } int sensorID = myHit->GetSensorID(); int ihalf, iplane, imodule, iside, idie, isensor; // calculate the plane and sensor on this plane lmddim->Get_sensor_by_id(sensorID, ihalf, iplane, imodule, iside, idie, isensor); trkSensor = ihalf*5+imodule; // if (astripdigi->GetIndex(0) == -1) continue; // sort out noise PndSdsMCPoint* MCPoint = (PndSdsMCPoint*)(true_points->At(astripdigi->GetIndex(0))); MCpointMom = sqrt(MCPoint->GetPx()*MCPoint->GetPx()+MCPoint->GetPy()*MCPoint->GetPy()+MCPoint->GetPz()*MCPoint->GetPz()); int MCidTOP = MCPoint->GetTrackID(); if(iHit==0) MCPointHit = MCPoint; MCtrkID.push_back(MCidTOP); // if(verboseLevel>1) cout<<"MCid("<1) cout<At(myHit->GetClusterIndex())); PndSdsDigiStrip* astripdigi = (PndSdsDigiStrip*)(fStripDigiArray->At(myCluster->GetDigiIndex(0))); if (astripdigi->GetIndex(0) == -1) glNoisehit++; if (astripdigi->GetIndex(0) == -1) continue; // sort out noise PndSdsMCPoint* MCPoint = (PndSdsMCPoint*)(true_points->At(astripdigi->GetIndex(0))); MCpointMom = sqrt(MCPoint->GetPx()*MCPoint->GetPx()+MCPoint->GetPy()*MCPoint->GetPy()+MCPoint->GetPz()*MCPoint->GetPz()); int MCidTOP = MCPoint->GetTrackID(); if(verboseLevel>1) cout<GetZ(); // double xTop = MCPoint->GetX(); // double yTop = MCPoint->GetY(); ///Bottom cluster Int_t botIndex = myHit->GetBotIndex(); PndSdsClusterStrip* myClusterBot = (PndSdsClusterStrip*)(fStripClusterArray->At(botIndex)); PndSdsDigiStrip* astripdigiBot = (PndSdsDigiStrip*)(fStripDigiArray->At(myClusterBot->GetDigiIndex(0))); if (astripdigiBot->GetIndex(0) == -1) glNoisehit++; if (astripdigiBot->GetIndex(0) == -1) continue; // sort out noise PndSdsMCPoint* MCPointBot = (PndSdsMCPoint*)(true_points->At(astripdigiBot->GetIndex(0))); // double zBot = MCPointBot->GetZ(); // double xBot = MCPointBot->GetX(); // double yBot = MCPointBot->GetY(); // cout<<"zTop - zBot = "<Fill(momMC0,momMC1,momMC2); if(verboseLevel>1) cout<<""<Fill(diffIDs); hntrkcandvsIDs->Fill(diffIDs,nTrkCandidates); hnhitsvsIDs->Fill(diffIDs,Ntrkcandhits); ///------------------------------------------------------------------------ /// Set track quality: good or ghost? and assign MC id to rec trk --------- if(diffIDs<2){ RECtrkMCid[iN] = MCtrkID[0]; goodTrk[iN] = true; } else{ vector countMC_IDs(diffIDs); prevID = MCtrkID[0]; int diffCount=0; for(Int_t n=0; nGetStartVec(); TVector3 vtxLumiErr = trk->GetStartErrVec(); TVector3 dirLumi = trk->GetDirectionVec(); TVector3 dirLumiErr = trk->GetDirectionErrVec(); // // //do the transformation from LUMI frame (with z-axis perp. to lumi planes) to lab frame // if(dnu>0){ // vtxLumi = lmddim->Transform_lmd_local_to_global(vtxLumi, false, false); // dirLumi = lmddim->Transform_lmd_local_to_global(dirLumi, true, false); // vtxLumiErr = lmddim->Transform_lmd_local_to_global(vtxLumiErr, true, false); // dirLumiErr = lmddim->Transform_lmd_local_to_global(dirLumiErr, true, false); // } // else{ // combitransFromLumiFrame(vtxLumi,dnu); // rotateFromLumiFrame(dirLumi, false, dnu); // rotateFromLumiFrame(dirLumiErr, true, dnu); // rotateFromLumiFrame(vtxLumiErr, true, dnu); // } double xTrue = MCPointHit->GetX(); double yTrue = MCPointHit->GetY(); double zTrue = MCPointHit->GetZ(); TVector3 vtxLumiMC = TVector3(xTrue,yTrue,zTrue); double pxTrue = MCPointHit->GetPx(); double pyTrue = MCPointHit->GetPy(); double pzTrue = MCPointHit->GetPz(); TVector3 dirLumiMC = TVector3(pxTrue,pyTrue,pzTrue); // hMomMC->Fill(dirLumiMC.Mag()); dirLumiMC *=1./dirLumiMC.Mag(); double dz = -zTrue+vtxLumi.Z();//Correct definition Z coord for comparision // double dz = 0;//TEST double dx = dirLumiMC.X()*dz; double dy = dirLumiMC.Y()*dz; vtxLumiMC += TVector3(dx,dy,dz); hResLumiTrkMom->Fill(dirLumiMC.Mag()-dirLumi.Mag()); hResLumiTrkTheta->Fill(dirLumiMC.Theta()-dirLumi.Theta()); hResLumiTrkPhi->Fill(dirLumiMC.Phi()-dirLumi.Phi()); hResLumiTrkThetaPull->Fill((dirLumiMC.Theta()-dirLumi.Theta())/dirLumiErr.Theta()); // hResLumiTrkPhiPull->Fill(dirLumiMC.Phi()-dirLumi.Phi()); hResLumiTrkPhiPull->Fill((dirLumiMC.Phi()-dirLumi.Phi())/dirLumiErr.Phi()); hResLumiTrkPointX->Fill(vtxLumiMC.X()-vtxLumi.X()); hResLumiTrkPointY->Fill(vtxLumiMC.Y()-vtxLumi.Y()); hResLumiTrkPointZ->Fill(vtxLumiMC.Z()-vtxLumi.Z()); hResLumiTrkPointPx->Fill(dirLumiMC.X()-dirLumi.X()); hResLumiTrkPointPy->Fill(dirLumiMC.Y()-dirLumi.Y()); hResLumiTrkPointPz->Fill(dirLumiMC.Z()-dirLumi.Z()); hResLumiTrkPointXPull->Fill((vtxLumiMC.X()-vtxLumi.X())/vtxLumiErr.X()); hResLumiTrkPointYPull->Fill((vtxLumiMC.Y()-vtxLumi.Y())/vtxLumiErr.Y()); hResLumiTrkPointZPull->Fill((vtxLumiMC.Z()-vtxLumi.Z())/vtxLumiErr.Z()); hResLumiTrkPointPxPull->Fill((dirLumiMC.X()-dirLumi.X())/dirLumiErr.X()); hResLumiTrkPointPyPull->Fill((dirLumiMC.Y()-dirLumi.Y())/dirLumiErr.Y()); hResLumiTrkPointPzPull->Fill((dirLumiMC.Z()-dirLumi.Z())/dirLumiErr.Z()); hMCThetaResSeedTheta->Fill(dirLumiMC.Theta(),(dirLumiMC.Theta()-dirLumi.Theta())); hMCPhiResSeedPhi->Fill(dirLumiMC.Phi(),(dirLumiMC.Phi()-dirLumi.Phi())); ///================================================================ } ///------------------------------------------------------------------------------------- MCtrkID.clear(); } for(int nk=0;nkFill(nk,MCtrk[nk]); hchi2MCdiffID->Fill(chi2Cont[nk],ndiffIDCont[nk]); } /// (I) missed\ghost tracks are defined on Phi\Theta difference between MC&REC trks hntrkgood_I->Fill(goodRectrk); if((nMCtracks-goodRectrk)>0) hntrkmissed_I->Fill(nMCtracks-goodRectrk); if((nGeaneTrks-goodRectrk)>0) hntrkghost_I->Fill(nGeaneTrks-goodRectrk); if(verboseLevel>0){ cout<At(iN); Double_t lyambda = fRes->GetLambda(); Double_t thetaBP = TMath::Pi()/2. - lyambda; Double_t phiBP = fRes->GetPhi(); TVector3 MomRecBP = fRes->GetMomentum(); TVector3 PosBP = fRes->GetPosition(); ntuprecTrk->Fill(PosBP.X(),PosBP.Y(),PosBP.Z(),MomRecBP.Mag(),thetaBP,phiBP,trkType); } hntrkgood_II->Fill(goodRecII); if(ghostRecII>0) hntrkghost_II->Fill(ghostRecII); if((nMCtracks-goodRecII)>0){ hntrkmissed_II->Fill(nMCtracks-goodRecII); } for(int imc=0;imcAt(imc); TVector3 MomMC = mctrk->GetMomentum(); TVector3 PosMC = mctrk->GetStartVertex(); int trkQ; if(missTrk) trkQ=-1; else trkQ=0; ntupMCTrk->Fill(PosMC.X(),PosMC.Y(),PosMC.Z(),MomMC.Mag(),MomMC.Theta(),MomMC.Phi(),trkQ,nRecHits); } if(verboseLevel>0){ cout<<"-- (II) Hits matching -------------------------"<At(jk); Int_t mcID = mctrk->GetPdgCode(); if(mcID==-2212){ // if(nParticles!=4) cout<<"For event #"<Divide(2,2); // c1->cd(1); // hnRecnMC->Draw(); // c1->cd(2); // hntrkcand->Draw(); // hntrk->SetLineColor(2); // hntrk->Draw("same"); // c1->cd(3); // hDiffIDs->Draw(); // c1->cd(4); // // hntrkcandvsIDs->Draw(); // hchi2->Draw(); // c1->Write(); // c1->Close(); TCanvas *c1 = new TCanvas("IDsINFO"); c1->Divide(2,2); c1->cd(1); hnRecnMC->Draw("colz"); c1->cd(2); hntrkcand->Draw(); hntrk->SetLineColor(2); hntrk->Draw("same"); c1->cd(3); hDiffIDs->Draw(); c1->cd(4); // hntrkcandvsIDs->Draw("colz"); // hntrkcandvsMC->Draw("colz"); hnhitsvsIDs->Draw("colz"); //hchi2->Draw(); c1->Write(); c1->Close(); TH1F *heffTheta = (TH1F*)hgoodTheta->Clone("heffTheta"); heffTheta->SetTitle("Efficiency vs. #theta"); heffTheta->Divide(hallTheta); TH1F *heffPhi = (TH1F*)hgoodPhi->Clone("heffPhi"); heffPhi->SetTitle("Efficiency vs. #phi"); heffPhi->Divide(hallPhi); TH2F *heffPhiTheta = (TH2F*)hgoodPhiTheta->Clone("heffPhiTheta"); heffPhiTheta->SetTitle("Efficiency #phi & #theta"); heffPhiTheta->Divide(hallPhiTheta); TCanvas *c2 = new TCanvas("EffINFO"); c2->Divide(3,2); c2->cd(1); hallTheta->SetLineWidth(2); hallTheta->SetFillStyle(3354); hallTheta->SetFillColor(kBlack); hallTheta->Draw(); hgoodTheta->SetLineWidth(2); hgoodTheta->SetLineColor(2); hgoodTheta->SetFillStyle(3690); hgoodTheta->SetFillColor(kRed); hgoodTheta->Draw("same"); c2->cd(4); heffTheta->SetMinimum(0.9); heffTheta->Draw(); c2->cd(3); hallPhiTheta->Draw("colz"); c2->cd(2); hallPhi->SetLineWidth(2); hallPhi->SetFillStyle(3354); hallPhi->SetFillColor(kBlack); hallPhi->Draw(); hgoodPhi->SetLineWidth(2); hgoodPhi->SetLineColor(2); hgoodPhi->SetFillColor(kRed); hgoodPhi->SetFillStyle(3690); hgoodPhi->Draw("same"); c2->cd(5); heffPhi->SetMinimum(0.9); heffPhi->Draw(); c2->cd(6); heffPhiTheta->Draw("colz"); c2->Write(); c2->Close(); TF1 *funrp = new TF1("fitrp","gaus",-1e-5,1e-5); funrp->SetParameters(100,0,3e-3); funrp->SetParNames("Constant","Mean","Sigma"); TF1 *funrth = new TF1("fitrth","gaus",-0.01,0.01); funrth->SetParameters(100,0,3e-3); funrth->SetParNames("Constant","Mean","Sigma"); TF1 *funrphi = new TF1("fitrphi","gaus",-1,1); funrphi->SetParameters(100,0,3e-3); funrphi->SetParNames("Constant","Mean","Sigma"); TF1 *funp = new TF1("fitp","gaus",-20,20); funp->SetParameters(100,0,3e-3); funp->SetParNames("Constant","Mean","Sigma"); TCanvas *c3 = new TCanvas("ResMomINFO"); c3->Divide(3,3); c3->cd(1); hResMom->Fit(funrp,"r"); hResMom->Draw(); c3->cd(2); hResTheta->Fit(funrth,"r"); hResTheta->Draw(); c3->cd(3); hResPhi->Fit(funrphi,"r"); hResPhi->Draw(); c3->cd(4); // hPullMom->Fit(funp,"r"); hPullMom->Draw(); c3->cd(5); hPullTheta->Fit(funp,"r"); hPullTheta->Draw(); c3->cd(6); hPullPhi->Fit(funp,"r"); hPullPhi->Draw(); c3->cd(7); hErrMom->Draw(); c3->cd(8); hErrTheta->Draw(); c3->cd(9); hErrPhi->Draw(); c3->Write(); c3->Close(); TF1 *funcoord = new TF1("fitcoord","gaus",-1,1.); funcoord->SetParameters(1e4,0,1e-1); funcoord->SetParNames("Constant","Mean","Sigma"); // TF1 *funp = new TF1("fitp","gaus",-10,10); funp->SetParameters(100,0,1); funp->SetParNames("Constant","Mean","Sigma"); TCanvas *c4 = new TCanvas("ResPCAINFO"); c4->Divide(3,3); c4->cd(1); hResPointX->Fit(funcoord,"r"); hResPointX->Draw(); c4->cd(2); hResPointY->Fit(funcoord,"r"); hResPointY->Draw(); c4->cd(3); hResPointZ->Fit(funcoord,"r"); hResPointZ->Draw(); c4->cd(4); hErrPointX->Draw(); c4->cd(5); hErrPointY->Draw(); c4->cd(6); hErrPointZ->Draw(); c4->cd(7); hPullPointX->Fit(funp,"r"); hPullPointX->Draw(); c4->cd(8); hPullPointY->Fit(funp,"r"); hPullPointY->Draw(); c4->cd(9); hPullPointZ->Fit(funp,"r"); hPullPointZ->Draw(); c4->Write(); c4->Close(); TCanvas *c42 = new TCanvas("ResMomPointINFO"); c42->Divide(3,3); c42->cd(1); hResPointPx->Fit(funcoord,"r"); hResPointPx->Draw(); c42->cd(2); hResPointPy->Fit(funcoord,"r"); hResPointPy->Draw(); c42->cd(3); hResPointPz->Fit(funcoord,"r"); hResPointPz->Draw(); c42->cd(4); hErrPointPx->Draw(); c42->cd(5); hErrPointPy->Draw(); c42->cd(6); hErrPointPz->Draw(); c42->cd(7); hPullPointPx->Fit(funp,"r"); hPullPointPx->Draw(); c42->cd(8); hPullPointPy->Fit(funp,"r"); hPullPointPy->Draw(); c42->cd(9); hPullPointPz->Fit(funp,"r"); hPullPointPz->Draw(); c42->Write(); c42->Close(); TCanvas *c41 = new TCanvas("ResLinINFO"); c41->Divide(2,2); c41->cd(1); hErrLinPointX->Draw(); c41->cd(2); hErrLinPointY->Draw(); c41->Write(); c41->Close(); // TCanvas *c5 = new TCanvas("HitIdINFO"); // c5->Divide(1,2); // c5->cd(1); // hHitIDHitX->SetMarkerStyle(24); // hHitIDHitX->Draw(); // c5->cd(2); // hHitIDHitY->SetMarkerStyle(24); // hHitIDHitY->Draw(); // c5->Write(); // c5->Close(); TCanvas *c6 = new TCanvas("VertexINFO"); c6->Divide(2,2); c6->cd(1); hPointXY->Draw(); c6->cd(2); hPointXYcut->Draw(); c6->cd(3); hErrPointXY->Draw(); c6->Write(); c6->Close(); TCanvas *c7 = new TCanvas("GEANEvsRecINFO"); c7->Divide(3,2); c7->cd(1); hRecGEANEX->Draw(); c7->cd(2); hRecGEANEY->Draw(); c7->cd(3); hRecGEANEZ->Draw(); c7->cd(4); hRecGEANETheta->Draw(); c7->cd(5); hRecGEANEPhi->Draw(); c7->cd(6); hRecThetaPhi->Draw(); c7->Write(); c7->Close(); TCanvas *c8 = new TCanvas("GEANEvsCandINFO"); c8->Divide(3,2); c8->cd(1); hSeedGEANEX->Draw(); c8->cd(2); hSeedGEANEY->Draw(); c8->cd(3); hSeedGEANEZ->Draw(); c8->cd(4); hSeedGEANETheta->Draw(); TLine *uplim = new TLine(0.05, 0, 0.05, 0.1); TLine *downlim = new TLine(0.03, 0, 0.03, 0.1); uplim->SetLineColor(kRed); downlim->SetLineColor(kRed); uplim->SetLineWidth(2); downlim->SetLineWidth(2); uplim->Draw(); downlim->Draw(); // ---- Count number events in range [3-8] mrad ------------------------ Int_t binx1, binx2; Int_t binmax = hSeedGEANETheta->GetNbinsX(); for(int bin=0;binGetBinCenter(bin); if(binCenter>0.05){ // if(binCenter>5){ binx2 = bin; break; } } for(int bin=0;binGetBinCenter(bin); if(binCenter>0.03){ binx1 = bin; break; } } // cout<<"binmax = "<Divide(3,2); c9->cd(1); hResDCA->Draw(); c9->cd(2); hErrDCA->Draw(); c9->cd(3); hPullDCA->Draw(); c9->Write(); c9->Close(); hangMCRec->Write(); hchi2->Write(); heffTheta->Write(); heffPhi->Write(); hnRecnMC->Write(); hDiffIDs->Write(); hntrkcand->Write(); hntrk->Write(); hntrkcandvsIDs->Write(); hResMom->Write(); hErrMom->Write(); hPullMom->Write(); hResPhi->Write(); hErrPhi->Write(); hPullPhi->Write(); hResTheta->Write(); hErrTheta->Write(); hPullTheta->Write(); hangMCRec->Write(); hPointXY->Write(); hPointXYcut->Write(); hSeedGEANEX->Write(); hSeedGEANEY->Write(); hSeedGEANEZ->Write(); hSeedGEANER->Write(); hSeedGEANETheta->Write(); hSeedGEANEPhi->Write(); hSeedThetaPhi->Write(); hRecGEANEX->Write(); hRecGEANEY->Write(); hRecGEANEZ->Write(); hchi2Errx->Write(); hchi2Erry->Write(); TCanvas *c10 = new TCanvas("ThetaPhiDistr"); c10->Divide(4,2); // c10->cd(1); // hSeedThetaDiffIDs->Draw("colz"); // c10->cd(2); // hSeedPhiDiffIDs->Draw("colz"); // c10->cd(1); // hMCThetaGEANETheta->Draw("colz"); // c10->cd(2); // hMCPhiGEANEPhi->Draw("colz"); c10->cd(1); hMCThetaResTheta->Draw("colz"); c10->cd(5); hMCPhiResPhi->Draw("colz"); TH1F *fdiffThetaMean; TH1F *fdiffThetaSigma; TH1F *fdiffThetaChi2; hMCThetaResTheta->FitSlicesY(); fdiffThetaMean = (TH1F*)gDirectory->Get("hMCThetaResTheta_1"); fdiffThetaSigma = (TH1F*)gDirectory->Get("hMCThetaResTheta_2"); fdiffThetaChi2= (TH1F*)gDirectory->Get("hMCThetaResTheta_chi2"); TH1F *fdiffPhiMean; TH1F *fdiffPhiSigma; TH1F *fdiffPhiChi2; hMCPhiResPhi->FitSlicesY(); fdiffPhiMean = (TH1F*)gDirectory->Get("hMCPhiResPhi_1"); fdiffPhiSigma = (TH1F*)gDirectory->Get("hMCPhiResPhi_2"); fdiffPhiChi2 = (TH1F*)gDirectory->Get("hMCPhiResPhi_chi2"); c10->cd(2); fdiffThetaMean->Draw(); c10->cd(6); fdiffPhiMean->Draw(); c10->cd(3); fdiffThetaSigma->Draw(); c10->cd(7); fdiffPhiSigma->Draw(); c10->cd(4); fdiffThetaChi2->Draw(); c10->cd(8); fdiffPhiChi2->Draw(); c10->Write(); c10->Close(); TCanvas *c11 = new TCanvas("HitsUsing"); c11->Divide(2,2); c11->cd(1); hntrkMCtrkID->Draw("colz"); c11->cd(2); // hntrkMCtrkID->ProjectionY(); // hntrkMCtrkID_py->Draw(); c11->cd(3); // hntrkMCtrkID->ProjectionX(); // hntrkMCtrkID_px->Draw(); c11->Write(); c11->Close(); TCanvas *c12 = new TCanvas("TrkLin_and_MC"); c12->Divide(3,3); c12->cd(1); hResLumiTrkMom->Fit(funrp,"r"); hResLumiTrkMom->Draw(); c12->cd(2); hResLumiTrkTheta->Fit(funrth,"r"); hResLumiTrkTheta->Draw(); c12->cd(3); hResLumiTrkPhi->Fit(funrphi,"r"); hResLumiTrkPhi->Draw(); c12->cd(4); hResLumiTrkPointX->Fit(funcoord,"r"); hResLumiTrkPointX->Draw(); c12->cd(5); hResLumiTrkPointY->Fit(funcoord,"r"); hResLumiTrkPointY->Draw(); c12->cd(6); hResLumiTrkPointZ->Fit(funcoord,"r"); hResLumiTrkPointZ->Draw(); c12->cd(7); hResLumiTrkPointPx->Fit(funp,"r"); hResLumiTrkPointPx->Draw(); c12->cd(8); hResLumiTrkPointPy->Fit(funp,"r"); hResLumiTrkPointPy->Draw(); c12->cd(9); hResLumiTrkPointPz->Fit(funp,"r"); hResLumiTrkPointPz->Draw(); c12->Write(); c12->Close(); TCanvas *c13 = new TCanvas("TrkLin_and_MC_pulls"); c13->Divide(3,2); c13->cd(1); hResLumiTrkPointXPull->Fit(funp,"r"); hResLumiTrkPointXPull->Draw(); c13->cd(2); hResLumiTrkPointYPull->Fit(funp,"r"); hResLumiTrkPointYPull->Draw(); c13->cd(3); hResLumiTrkPointZPull->Fit(funp,"r"); hResLumiTrkPointZPull->Draw(); c13->cd(4); hResLumiTrkPointPxPull->Fit(funp,"r"); hResLumiTrkPointPxPull->Draw(); c13->cd(5); hResLumiTrkPointPyPull->Fit(funp,"r"); hResLumiTrkPointPyPull->Draw(); c13->cd(6); hResLumiTrkPointPzPull->Fit(funp,"r"); hResLumiTrkPointPzPull->Draw(); c13->Write(); c13->Close(); TCanvas *c14 = new TCanvas("TrkIP_andLin_and_MC_pulls"); c14->Divide(3,2); c14->cd(1); //Grey = Trk near IP //Blue = Trk near Lumi hPullPointX->SetLineWidth(2); hPullPointX->SetLineColor(12); hPullPointX->SetFillColor(12); hPullPointX->SetFillStyle(3003); hPullPointX->Draw(); hResLumiTrkPointXPull->SetLineColor(4); hResLumiTrkPointXPull->SetLineWidth(2); hResLumiTrkPointXPull->Draw("same"); c14->cd(2); hPullPointY->SetLineWidth(2); hPullPointY->SetLineColor(12); hPullPointY->SetFillColor(12); hPullPointY->SetFillStyle(3003); hPullPointY->Draw(); hResLumiTrkPointYPull->SetLineColor(4); hResLumiTrkPointYPull->SetLineWidth(2); hResLumiTrkPointYPull->Draw("same"); c14->cd(3); hPullPointZ->SetLineWidth(2); hPullPointZ->SetLineColor(12); hPullPointZ->SetFillColor(12); hPullPointZ->SetFillStyle(3003); hPullPointZ->Draw(); hResLumiTrkPointZPull->SetLineColor(4); hResLumiTrkPointZPull->SetLineWidth(2); hResLumiTrkPointZPull->Draw("same"); c14->cd(4); hPullPointPx->SetLineWidth(2); hPullPointPx->SetLineColor(12); hPullPointPx->SetFillColor(12); hPullPointPx->SetFillStyle(3003); hPullPointPx->Draw(); hResLumiTrkPointPxPull->SetLineColor(4); hResLumiTrkPointPxPull->SetLineWidth(2); hResLumiTrkPointPxPull->Draw("same"); c14->cd(5); hPullPointPy->SetLineWidth(2); hPullPointPy->SetLineColor(12); hPullPointPy->SetFillColor(12); hPullPointPy->SetFillStyle(3003); hPullPointPy->Draw(); hResLumiTrkPointPyPull->SetLineColor(4); hResLumiTrkPointPyPull->SetLineWidth(2); hResLumiTrkPointPyPull->Draw("same"); c14->cd(6); hPullPointPz->SetLineWidth(2); hPullPointPz->SetLineColor(12); hPullPointPz->SetFillColor(12); hPullPointPz->SetFillStyle(3003); hPullPointPz->Draw(); hResLumiTrkPointPzPull->SetLineColor(4); hResLumiTrkPointPzPull->SetLineWidth(2); hResLumiTrkPointPzPull->Draw("same"); c14->Write(); c14->Close(); hSeedThetaDiffIDs->Write(); hSeedPhiDiffIDs->Write(); hMCThetaGEANETheta->Write(); hMCPhiGEANEPhi->Write(); hMCThetaResTheta->Write(); hMCPhiResPhi->Write(); hDiffIDsPointX->Write(); hDiffIDsPointY->Write(); hDiffIDsPointZ->Write(); hResPointPx->Write(); hErrPointPx->Write(); hPullPointPx->Write(); hResPointPy->Write(); hErrPointPy->Write(); hPullPointPy->Write(); hResPointPz->Write(); hErrPointPz->Write(); hPullPointPz->Write(); hResPointX->Write(); hErrPointX->Write(); hPullPointX->Write(); hResPointY->Write(); hErrPointY->Write(); hPullPointY->Write(); hResPointZ->Write(); hErrPointZ->Write(); hPullPointZ->Write(); hMCtrkvshits->Write(); hntrkMCtrkID->Write(); hchi2nTrkCand->Write(); hgoodPhichi2->Write(); hgoodThetachi2->Write(); hchi2MCdiffID->Write(); hnhitsvsIDs->Write(); hResLumiTrkMom->Write(); hResLumiTrkTheta->Write(); hResLumiTrkPhi->Write(); hResLumiTrkThetaPull->Write(); hResLumiTrkPhiPull->Write(); hResLumiTrkPointX->Write(); hResLumiTrkPointY->Write(); hResLumiTrkPointZ->Write(); hResLumiTrkPointPx->Write(); hResLumiTrkPointPy->Write(); hResLumiTrkPointPz->Write(); hResLumiTrkPointXPull->Write(); hResLumiTrkPointYPull->Write(); hResLumiTrkPointZPull->Write(); hResLumiTrkPointPxPull->Write(); hResLumiTrkPointPyPull->Write(); hResLumiTrkPointPzPull->Write(); // hMomMC->Write(); hResZResPhi->Write(); nrecpointall->Write(); nrecdirall->Write(); TCanvas *c134 = new TCanvas("TrkLinparams"); c134->Divide(2,2); c134->cd(1); hLumiTrkA->Draw(); c134->cd(2); hLumiTrkB->Draw(); c134->cd(3); hLumiTrkC->Draw(); c134->cd(4); hLumiTrkD->Draw(); c134->Write(); c134->Close(); hLumiTrkA->Write(); hLumiTrkB->Write(); hLumiTrkC->Write(); hLumiTrkD->Write(); hMCThetaResSeedTheta->Write(); hMCPhiResSeedPhi->Write(); hntrkmissedPhiTheta->Write(); hntrkmissed_I->Write(); hntrkghost_I->Write(); hntrkmissed_II->Write(); hntrkghost_II->Write(); hntrkgood_I->Write(); hntrkgood_II->Write(); heffPhiTheta->Write(); nmomMC->Write(); ntuprecTrk->Write(); ntupMCTrk->Write(); hnhits->Write(); nsectors->Write(); hPullPointXphi->Write(); hPullPointYphi->Write(); hPullPointXtheta->Write(); hPullPointYtheta->Write(); f->Close(); cout<<"Number of events with low number of hits (less then 3 per trk): "<