12 #include "FairRootManager.h"
13 #include "FairRunAna.h"
14 #include "FairRuntimeDb.h"
17 #include "TClonesArray.h"
18 #include "TObjArray.h"
20 #include "TGeoManager.h"
39 using std::setprecision;
57 : FairTask(
"GEM MagneticFieldVsTrackParametersr", iVerbose) {
69 : FairTask(name, iVerbose) {
108 FairRunAna*
run = FairRunAna::Instance();
109 if ( ! run ) Fatal(
"SetParContainers",
"No analysis run");
111 FairRuntimeDb* db = run->GetRuntimeDb();
112 if ( ! db ) Fatal(
"SetParContainers",
"No runtime database");
126 FairRootManager* ioman = FairRootManager::Instance();
127 if ( ! ioman ) Fatal(
"Init",
"No FairRootManager");
130 fMCPointArray = (TClonesArray*) ioman->GetObject(
"GEMPoint");
132 cout <<
"-E- "<< GetName() <<
"::Init: No MCPoint array!"
140 cout <<
"-E- "<< GetName() <<
"::Init: No MCTrack array!"
155 for ( Int_t in = 0 ; in < 3 ; in++ ) {
162 cout <<
"-I- " << fName.Data() <<
"::Init(). There are " <<
fDigiPar->
GetNStations() <<
" GEM stations." << endl;
163 cout <<
"-I- " << fName.Data() <<
"::Init(). Initialization succesfull." << endl;
193 for ( Int_t imcp = 0 ; imcp < nofGemPoints ; imcp++ ) {
201 Double_t pRadius =
TMath::Sqrt(mcPoint->GetX()*mcPoint->GetX()+mcPoint->GetY()*mcPoint->GetY());
204 Double_t tTheta = mcMomVec.Theta()*TMath::RadToDeg();
221 for ( Int_t imcp1 = 0 ; imcp1 < nofGemPoints ; imcp1++ ) {
224 Double_t p1Radius =
TMath::Sqrt(mcPoint1->GetX()*mcPoint1->GetX()+mcPoint1->GetY()*mcPoint1->GetY());
226 Double_t p1PhiAng = TMath::ACos(mcPoint1->GetX()/p1Radius);
227 if ( mcPoint1->GetY() < 0 )
229 p1PhiAng *= TMath::RadToDeg();
231 Int_t mcTrackId = mcPoint1->GetTrackID();
240 Double_t pMom = TMath::RadToDeg()*mcMomVec.Phi() + (mcMomVec.Phi()>=0?0.:360.);
242 for ( Int_t imcp2 = imcp1+1 ; imcp2 < nofGemPoints ; imcp2++ ) {
247 Double_t p2Radius =
TMath::Sqrt(mcPoint2->GetX()*mcPoint2->GetX()+mcPoint2->GetY()*mcPoint2->GetY());
249 Double_t p2PhiAng = TMath::ACos(mcPoint2->GetX()/p2Radius);
250 if ( mcPoint2->GetY() < 0 )
252 p2PhiAng *= TMath::RadToDeg();
254 if ( p1PhiAng < 90. && p2PhiAng > 270. ) p2PhiAng -= 360.;
255 if ( p1PhiAng > 270. && p2PhiAng < 90. ) p2PhiAng += 360.;
257 fhRadiusVsAngle->Fill((p2PhiAng-p1PhiAng)*p1Z/p2Z,p2Radius*p1Z/(p1Radius*p2Z));
271 if ( histNo == -1 )
continue;
272 fhRadiusVsAnglePair[histNo]->Fill((p2PhiAng-p1PhiAng)*p1Z/p2Z,p2Radius*p1Z/(p1Radius*p2Z));
276 (mcPoint2->GetY()-mcPoint1->GetY())*(mcPoint2->GetY()-mcPoint1->GetY())) /
277 TMath::Sin(TMath::DegToRad()*(p2PhiAng-p1PhiAng)) / 2.),
280 if ( mcTrackId != mcPoint2->GetTrackID() )
302 const Int_t nofMomBins = 19;
303 Double_t momBins[nofMomBins+1] = {0.05,0.15,0.25,0.35,0.45,
304 0.55,0.65,0.75,0.85,0.95,
305 1.05,1.15,1.25,1.75,2.25,
306 2.75,3.25,4.75,7.25,10.75};
307 const Int_t nofRadiusBins = 60;
313 for ( Int_t itemp = 0 ; itemp < nofRadiusBins+1 ; itemp++ ) radBins[itemp] = minRadius + (
Double_t)itemp*(maxRadius-minRadius)/(
Double_t(nofRadiusBins));
315 for ( Int_t itemp = 0 ; itemp < nofRadiusBins+1 ; itemp++ ) rRadBins[itemp] = minRRadius + (
Double_t)itemp*(maxRRadius-minRRadius)/(
Double_t(nofRadiusBins));
316 const Int_t nofThetaBins = 60;
320 for ( Int_t itemp = 0 ; itemp < nofThetaBins+1 ; itemp++ ) theBins[itemp] = minTheta + (
Double_t)itemp*(maxTheta-minTheta)/(
Double_t(nofThetaBins));
321 const Int_t nofPhiBins = 160;
325 for ( Int_t itemp = 0 ; itemp < nofPhiBins+1 ; itemp++ ) phiBins[itemp] = minPhi + (
Double_t)itemp*(maxPhi-minPhi)/(
Double_t(nofPhiBins));
326 const Int_t nofDetPhiBins = 400;
327 const Int_t nofDetMomBins = 100;
330 const Int_t nofPhi1Bins = 360;
332 for ( Int_t itemp = 0 ; itemp < nofPhi1Bins+1 ; itemp++ ) phi1Bins[itemp] = itemp;
333 const Int_t nofPhi2Bins = 120;
337 for ( Int_t itemp = 0 ; itemp < nofPhi2Bins+1 ; itemp++ ) phi2Bins[itemp] = minPhi2 + (
Double_t)itemp*(maxPhi2-minPhi2)/(
Double_t(nofPhi2Bins));
340 "Track Theta vs Point Radius/Z vs Track Momentum, all;p [GeV/c];r [cm];#theta [#circ]",
342 nofRadiusBins,rRadBins,
343 nofThetaBins,theBins);
346 Form(
"Track Theta vs Point Radius vs Track Momentum on station %d;p [GeV/c];r [cm];#theta [#circ]",istat+1),
348 nofRadiusBins,radBins,
349 nofThetaBins,theBins);
351 "([0]+1/(x+[1]*[4]+[2]))*y/[4]+[3]",0.,20.,minRRadius,maxRRadius);
355 fHistoList->Add(fhThetaVsRadiusVsMomentumAll);
359 fhRadiusVsAngle =
new TH2F(
"fhRadiusVsAngle",
"Radius ratio/z ratio vs phi angle difference;#phi_{2}-#phi_{1} [#circ];#frac{r_{2}}{r_{1}}#frac{z_{1}}{z_{2}}",800,-40.,40.,200,0.,2.);
364 fhRadiusVsAnglePair[crHist] =
new TH2F(Form(
"fhRadiusVsAnglePair_s%d_s%d",istat1+1,istat2+1),
365 Form(
"Radius ratio/z ratio vs phi angle difference, stat%d vs stat%d;#phi_{2} - #phi_{1} [#circ];#frac{r_{2}}{r_{1}}#frac{z_{1}}{z_{2}}",istat1+1,istat2+1),
366 800,-40.,40.,200,0.,2.);
370 Form(
"Momentum vs phi angle difference vs radius, stat%d vs stat%d;r [cm];#phi_{2} - #phi_{1} [#circ];p [GeV/c]",istat1+1,istat2+1),
371 nofRadiusBins,radBins,
378 "([0]+[1]/x)/y",0.,100.,0.,40.);
382 Form(
"Momentum vs phi angle difference, stat%d vs stat%d;#phi_{2} - #phi_{1} [#circ];p [GeV/c]",istat1+1,istat2+1),
383 nofDetPhiBins,minPhi,maxPhi,
384 nofDetMomBins,minMom,maxMom);
391 for ( Int_t irad = 0 ; irad < 20 ; irad++ ) {
392 fhMomentumVsPhiDiff[crHist][irad] =
new TH2F(Form(
"fhMomentumVsPhiDiff_s%d_s%d_r%d",istat1+1,istat2+1,irad),
393 Form(
"Momentum vs phi angle difference, stat%d vs stat%d, rad %d to %d;#phi_{2} - #phi_{1} [#circ];p [GeV/c]",istat1+1,istat2+1,irad*5,(irad+1)*5),
394 nofDetPhiBins,minPhi,maxPhi,
395 nofDetMomBins,minMom,maxMom);
398 ffMomentumVsPhiDiff[crHist][irad] =
new TF1(Form(
"ffMomentumVsPhiDiff_s%d_s%d_r%d",istat1+1,istat2+1,irad),
403 fhTrackPhiVsHitPhis [crHist] =
new TH3F(Form(
"fhTrackPhiVsHitPhis_s%d_s%d",istat1+1,istat2+1),
404 Form(
"Track phi vs hit1 phi vs phi difference/z ratio, stat%d vs stat%d;#phi_{1} [#circ];(#phi_{2} - #phi_{1})*z__{2}/z_{1} [#circ];#phi_{T} [#circ]",istat1+1,istat2+1),
405 nofPhi1Bins,phi1Bins,
406 nofPhi2Bins,phi2Bins,
407 nofPhi1Bins,phi1Bins);
408 fhTrackPhiVsCalcPhi [crHist] =
new TH2F(Form(
"fhTrackPhiVsCalcPhi_s%d_s%d",istat1+1,istat2+1),
409 Form(
"Track MC phi vs track calculated phi, stat%d vs stat%d;#phi_{calc} [#circ];#phi_{MC} [#circ]",istat1+1,istat2+1),
410 nofPhi1Bins,phi1Bins,
411 nofPhi1Bins,phi1Bins);
416 fhMomTransVsHRadius[crHist] =
new TH2F(Form(
"fhMomTransVsHRadius_s%d_s%d",istat1+1,istat2+1),
417 Form(
"Track MC momentum trans vs track calculated helix radius;radius_{radius} [cm];pt_{MC} [GeV/c]"),
418 nofDetMomBins,0.,800.,
419 nofDetMomBins,0.,maxMom/3.);
425 for ( Int_t itemp = 0 ; itemp < 3 ; itemp++ ) {
426 ffRadiusVsAngle[itemp] =
new TF1(Form(
"ffRadiusVsAngle%d",itemp),
"pol2",-40.,40.);
447 for ( Int_t itemp = 0 ; itemp < 3 ; itemp++ ) {
458 Double_t zCuDiff = zStation2*zStation2*zStation2-zStation1*zStation1*zStation1;
459 Double_t zSqDiff = zStation2*zStation2-zStation1*zStation1;
460 Double_t zDiff = zStation2-zStation1;
467 for ( Int_t irad = 0 ; irad < 20 ; irad++ ) {
476 gDirectory->mkdir(
"GemMFVTP");
477 gDirectory->cd(
"GemMFVTP");
479 while ( TH1* histo = ((TH1*)
next()) ) histo->Write();
480 gDirectory->cd(
"..");
Double_t fTrackFinderOnHits_ParTheta2
Double_t GetTrackFinderOnHits_ParTheta1()
Int_t Fill1StationHistograms()
virtual void Exec(Option_t *opt)
Int_t Fill2StationsHistograms()
TF1 * ffMomentumVsPhiDiff[10][20]
TH3F * fhThetaVsRadiusVsMomentumAll
TF2 * ffThetaVsRadiusVsMomentum[10]
virtual void SetParContainers()
Double_t GetTrackFinderOnHits_ParThetaB()
Double_t GetTrackFinderOnHits_ParTheta3()
virtual ~PndGemMagneticFieldVsTrackParameters()
TClonesArray * fMCPointArray
static T Sqrt(const T &x)
Double_t fTrackFinderOnHits_ParTheta0
Double_t fTrackFinderOnHits_ParRadPhi0
Double_t GetZ(Int_t it=0)
TVector3 GetMomentum() const
Double_t GetTrackFinderOnHits_ParMat1(Int_t in)
Digitization Parameter Class for GEM part.
Double_t fTrackFinderOnHits_ParThetaA
Double_t fTrackFinderOnHits_ParTheta3
Double_t GetTrackFinderOnHits_ParTheta0()
Double_t GetTrackFinderOnHits_ParMat0(Int_t in)
virtual InitStatus Init()
TH2F * fhMomTransVsHRadius[10]
TF1 * ffMomentumVsPhiDiffAll[10]
Int_t GetSensorId() const
TF2 * ffMomentumVsPhiDiffVsRadius[10]
TH2F * fhRadiusVsAnglePair[20]
TH3F * fhMomentumVsPhiDiffVsRadius[10]
virtual InitStatus ReInit()
PndGemMagneticFieldVsTrackParameters()
Double_t fTrackFinderOnHits_ParRadPhi2
TClonesArray * fMCTrackArray
Double_t fTrackFinderOnHits_ParThetaB
Double_t fTrackFinderOnHits_ParMat0[3]
Int_t GetStationNr(Int_t sensorId)
TH3F * fhTrackPhiVsHitPhis[10]
Double_t GetTrackFinderOnHits_ParRadPhi2()
TH2F * fhMomentumVsPhiDiff[10][20]
Double_t fTrackFinderOnHits_ParMat1[3]
TH3F * fhThetaVsRadiusVsMomentum[10]
Double_t fTrackFinderOnHits_ParTheta1
Int_t GetMotherID() const
TH2F * fhMomentumVsPhiDiffAll[10]
TH2F * fhTrackPhiVsCalcPhi[10]
Double_t GetTrackFinderOnHits_ParThetaA()
Double_t GetTrackFinderOnHits_ParTheta2()
Double_t GetTrackFinderOnHits_ParRadPhi0()
PndGemStation * GetStation(Int_t iStation)