00001 #include "TTrackingProc.h"
00002 #include "TGo4Version.h"
00003 #if __GO4BUILDVERSION__ > 40502
00004 #include "go4iostream.h"
00005 #else
00006 #include "Riostream.h"
00007 #endif
00008 #include "TTimeStamp.h"
00009 #include "TSystem.h"
00010 #include "TROOT.h"
00011 #include "TGo4Log.h"
00012
00013 #include "TGo4UserException.h"
00014
00015 #include "STS/TSTSGeometry.h"
00016 #include "TSpacepoint.h"
00017 #include "STS/TSTSParam.h"
00018
00019
00020 TTrackingProc::TTrackingProc(const char* name) :
00021 TCBMBeamtimeProc(name),
00022 fBeamMonitorEvent(0),
00023 fFirstHodoEvent(0),
00024 fSecondHodoEvent(0),
00025 fGEMEvent(0),
00026 fSTSEvent(0),
00027 fOutputEvent(0)
00028 {
00029 cout << "**** TTrackingProc: Create instance ****" << name << endl;
00030 TString obname, obtitle;
00031
00032 fPar = (TTrackingParam*) MakeParameter("TrackingPar", "TTrackingParam");
00033
00034
00035
00036 fPosXHod1 = MakeTH1('I', "Tracking/XPosHod1","XPosHod1_title", 1000,-50.,50.);
00037 fPosYHod1 = MakeTH1('I', "Tracking/YPosHod1","YPosHod1_title", 1000,-50.,50.);
00038 fPosXYHod1 = MakeTH2('I', "Tracking/XYPosHod1","XYPosHod1_title", 100,-50.,50., 100,-50.,50.);
00039 fPosXYHod1Sts = MakeTH2('I', "Tracking/XYPosHod1Sts","XYPosHod1Sts_title", 100,-50.,50., 100,-50.,50.);
00040 fPosXHod2 = MakeTH1('I', "Tracking/XPosHod2","XPosHod2_title", 1000,-50.,50.);
00041 fPosYHod2 = MakeTH1('I', "Tracking/YPosHod2","YPosHod2_title", 1000,-50.,50.);
00042 fPosXYHod2 = MakeTH2('I', "Tracking/XYPosHod2","XYPosHod2_title", 100,-50.,50., 100,-50.,50.);
00043 fPosXYHod2Sts = MakeTH2('I', "Tracking/XYPosHod2Sts","XYPosHod2Sts_title", 100,-50.,50., 100,-50.,50.);
00044
00045 fResXHod1 = MakeTH1('I', "Tracking/XResHod1","XResHod1_title", 400,-20.,20.);
00046 fResYHod1 = MakeTH1('I', "Tracking/YResHod1","YResHod1_title", 400,-20.,20.);
00047 fResXHod2 = MakeTH1('I', "Tracking/XResHod2","XResHod2_title", 400,-20.,20.);
00048 fResYHod2 = MakeTH1('I', "Tracking/YResHod2","YResHod2_title", 400,-20.,20.);
00049
00050 fCorrYHod = MakeTH2('I', "Tracking/CorrYHod","CorrYHod_title", 100,-50.,50., 100,-50.,50.);
00051 fCorrXHod = MakeTH2('I', "Tracking/CorrXHod","CorrXHod_title", 100,-50.,50., 100,-50.,50.);
00052 fCorrYHod1Gem1 = MakeTH2('I', "Tracking/CorrYHod1Gem1","CorrYHod1Gem1_title", 100,-50.,50., 100,-50.,50.);
00053 fCorrXHod1Gem1 = MakeTH2('I', "Tracking/CorrXHod1Gem1","CorrXHod1Gem1_title", 100,-50.,50., 100,-50.,50.);
00054 fCorrYHod2Gem1 = MakeTH2('I', "Tracking/CorrYHod2Gem1","CorrYHod2Gem1_title", 100,-50.,50., 100,-50.,50.);
00055 fCorrXHod2Gem1 = MakeTH2('I', "Tracking/CorrXHod2Gem1","CorrXHod2Gem1_title", 100,-50.,50., 100,-50.,50.);
00056
00057 TSTSParam * stsParam = dynamic_cast< TSTSParam * >( GetParameter( "STSPar" ) );
00058 if( ! stsParam ) {
00059 printf("Error in TTrackingProc::TTrackingProc: StsPar parameter not found\n");
00060 return;
00061 }
00062 UInt_t detArrSize = stsParam->fSTSTopology->GetDetArrSize();
00063
00064 fPosXSts.resize( detArrSize );
00065 fPosYSts.resize( detArrSize );
00066 fPosXYSts.resize( detArrSize );
00067 fCorrXXSts.resize( detArrSize );
00068 fCorrYYSts.resize( detArrSize );
00069 fCorrXXH1Sts.resize( detArrSize );
00070 fCorrYYH1Sts.resize( detArrSize );
00071 fCorrXXGem1Sts.resize( detArrSize );
00072 fCorrYYGem1Sts.resize( detArrSize );
00073 fNHitsSts.resize( detArrSize );
00074 fPosXSts_vs_time.resize( detArrSize );
00075 fPosYSts_vs_time.resize( detArrSize );
00076
00077 for( UInt_t iDet = 0; iDet < detArrSize; iDet++ ) {
00078
00079
00080
00081 fPosXSts.at( iDet ) = MakeTH1('I', Form( "Tracking/XPosSts%d", iDet), Form("XPosSts%d_title", iDet), 10000,-10.,10.);
00082 fPosYSts.at( iDet ) = MakeTH1('I', Form( "Tracking/YPosSts%d", iDet), Form("XPosSts%d_title", iDet), 10000,-10.,10.);
00083 fPosXYSts.at( iDet ) = MakeTH2('I', Form( "Tracking/XYPosSts%d", iDet), Form("XPosSts%d_title", iDet), 100,-10.,10., 100,-10.,10. );
00084 fCorrXXSts.at( iDet ) = MakeTH2('I', Form( "Tracking/XXCorrSts%d", iDet), Form("XXCorrSts%d_title", iDet), 100,-10.,10., 100,-10.,10. );
00085 fCorrYYSts.at( iDet ) = MakeTH2('I', Form( "Tracking/YYCorrSts%d", iDet), Form("YYCorrSts%d_title", iDet), 100,-10.,10., 100,-10.,10. );
00086 fCorrXXH1Sts.at( iDet ) = MakeTH2('I', Form( "Tracking/XXCorrH1Sts%d", iDet), Form("XXCorrH1Sts%d_title", iDet), 250,-20.,30., 100,-10.,10. );
00087 fCorrYYH1Sts.at( iDet ) = MakeTH2('I', Form( "Tracking/YYCorrH1Sts%d", iDet), Form("YYCorrH1Sts%d_title", iDet), 100,-10.,10., 100,-10.,10. );
00088 fCorrXXGem1Sts.at( iDet ) = MakeTH2('I', Form( "Tracking/XXCorrGem1Sts%d", iDet), Form("XXCorrGem1Sts%d_title", iDet), 100,-50.,50., 100,-50.,50. );
00089 fCorrYYGem1Sts.at( iDet ) = MakeTH2('I', Form( "Tracking/YYCorrGem1Sts%d", iDet), Form("YYCorrGem1Sts%d_title", iDet), 100,-50.,50., 100,-50.,50. );
00090 fNHitsSts.at( iDet ) = MakeTH1('I', Form( "Tracking/NHitsSts%d", iDet), Form("NHitsSts%d_title", iDet), 100,0.,100.);
00091 fPosXSts_vs_time.at( iDet ) = MakeTH2('I', Form( "Tracking/XPosSts_vs_time%d", iDet), Form("XPosSts_vs_time%d_title", iDet), 3600,0,3600, 100,-50.,50.);
00092 fPosYSts_vs_time.at( iDet ) = MakeTH2('I', Form( "Tracking/YPosSts_vs_time%d", iDet), Form("YPosSts_vs_time%d_title", iDet), 3600,0,3600, 100,-50.,50.);
00093 }
00094
00095
00096
00097 fPosXGem1 = MakeTH1('I', "Tracking/XPosGem1","XPosGem1_title", 100,-50.,50.);
00098 fPosYGem1 = MakeTH1('I', "Tracking/YPosGem1","YPosGem1_title", 100,-50.,50.);
00099 fPosXYGem1 = MakeTH2('I', "Tracking/XYPosGem1","XYPosGem1_title", 100,-50.,50., 100,-50.,50.);
00100 fPosXGem2 = MakeTH1('I', "Tracking/XPosGem2","XPosGem2_title", 100,-50.,50.);
00101 fPosYGem2 = MakeTH1('I', "Tracking/YPosGem2","YPosGem2_title", 100,-50.,50.);
00102 fPosXYGem2 = MakeTH2('I', "Tracking/XYPosGem2","XYPosGem2_title", 100,-50.,50., 100,-50.,50.);
00103
00104 fResXSts1 = MakeTH1('I', "Tracking/XResSts1","XResSts1_title", 1000,-5.,5.);
00105 fResYSts1 = MakeTH1('I', "Tracking/YResSts1","YResSts1_title", 1000,-5.,5.);
00106 fResXSts2 = MakeTH1('I', "Tracking/XResSts2","XResSts2_title", 1000,-5.,5.);
00107 fResYSts2 = MakeTH1('I', "Tracking/YResSts2","YResSts2_title", 1000,-5.,5.);
00108 fResXSts3 = MakeTH1('I', "Tracking/XResSts3","XResSts3_title", 1000,-5.,5.);
00109 fResYSts3 = MakeTH1('I', "Tracking/YResSts3","YResSts3_title", 1000,-5.,5.);
00110
00111 fResXGem1 = MakeTH1('I', "Tracking/XResGem1","XResGem1_title", 100,-5.,5.);
00112 fResYGem1 = MakeTH1('I', "Tracking/YResGem1","YResGem1_title", 100,-5.,5.);
00113 fResXGem2 = MakeTH1('I', "Tracking/XResGem2","XResGem2_title", 100,-5.,5.);
00114 fResYGem2 = MakeTH1('I', "Tracking/YResGem2","YResGem2_title", 100,-5.,5.);
00115
00116 fPosXHod1_vs_time = MakeTH2('I', "Tracking/XPosHod1_vs_time","XPosHod1_vs_time_title", 3600,0,3600,100,-50.,50.);
00117 fPosYHod1_vs_time = MakeTH2('I', "Tracking/YPosHod1_vs_time","YPosHod1_vs_time_title", 3600,0,3600,100,-50.,50.);
00118 fPosXHod1_vs_time->GetXaxis()->SetTitle("time (sec) ");
00119 fPosXHod1_vs_time->GetYaxis()->SetTitle("H1_{hit} X (mm)");
00120 fPosYHod1_vs_time->GetXaxis()->SetTitle("time (sec) ");
00121 fPosYHod1_vs_time->GetYaxis()->SetTitle("H1_{hit} Y (mm)");
00122 fPosXHod2_vs_time = MakeTH2('I', "Tracking/XPosHod2_vs_time","XPosHod2_vs_time_title", 3600,0,3600,100,-50.,50.);
00123 fPosYHod2_vs_time = MakeTH2('I', "Tracking/YPosHod2_vs_time","YPosHod2_vs_time_title", 3600,0,3600,100,-50.,50.);
00124 fPosXHod2_vs_time->GetXaxis()->SetTitle("time (sec) ");
00125 fPosXHod2_vs_time->GetYaxis()->SetTitle("H2_{hit} X (mm)");
00126 fPosYHod2_vs_time->GetXaxis()->SetTitle("time (sec) ");
00127 fPosYHod2_vs_time->GetYaxis()->SetTitle("H2_{hit} Y (mm)");
00128
00129
00130
00131
00132 #ifdef HODOSCOPE_FULLTIMESTAMP
00133 fDeltaT_STS= MakeTH1('I', Form( "Tracking/Times/DeltaT_Sts"), Form("Hit time difference within event for all sts"), 500000, -5000000., 20000., "#Delta t");
00134 fDeltaT_Hod= MakeTH1('I', Form( "Tracking/Times/DeltaT_Hod"), Form("Hit time difference within event for all hodos"), 40000, -20000., 20000., "#Delta t");
00135 fDeltaT_GEM= MakeTH1('I', Form( "Tracking/Times/DeltaT_GEM"), Form("Hit time difference within event for all gems"), 40000, -20000., 20000., "#Delta t");
00136
00137 fDeltaT_all= MakeTH1('I', Form( "Tracking/Times/DeltaT_AllvsHod"), Form("Hit time difference within event of all components vs hod reference"), 40000, -20000., 20000., "#Delta t");
00138 #endif
00139
00140
00141
00142
00143 TString setupmacro = "set_TrackingPar.C";
00144 if (!gSystem->AccessPathName(setupmacro.Data())) {
00145 TGo4Log::Info("Executing tracking parameter setup script %s", setupmacro.Data());
00146 gROOT->ProcessLine(Form(".x %s", setupmacro.Data()));
00147
00148 } else {
00149 TGo4Log::Info("NO tracking setup script %s. Use previous values!", setupmacro.Data());
00150 }
00151
00152 TString dir="Tracking";
00153 TString gname="HYGraph";
00154 TString fullname= dir+"/"+gname;
00155 cout <<"graph name is "<<fullname.Data() << endl;
00156 grHY=dynamic_cast<TGraphErrors*>(GetObject(fullname));
00157
00158 if(grHY==0) {
00159 grHY=new TGraphErrors(2, ZHf, YHf, EZHf, EYHf);
00160 grHY->SetName(gname);
00161 AddObject(grHY, dir.Data());
00162
00163 }
00164 cout <<"assigned object"<< grHY->GetName()<< endl;
00165 gname="HXGraph";
00166 fullname= dir+"/"+gname;
00167 grHX=dynamic_cast<TGraphErrors*>(GetObject(fullname));
00168 if(grHX==0) {
00169 grHX=new TGraphErrors(2, ZHf, XHf, EZHf, EXHf);
00170 grHX->SetName(gname);
00171 AddObject(grHX, dir.Data());
00172
00173 }
00174 gname="YGraph";
00175 fullname= dir+"/"+gname;
00176 grY=dynamic_cast<TGraphErrors*>(GetObject(fullname));
00177 if(grY==0) {
00178 grY = new TGraphErrors(5, Zf, Yf, EZf, EYf);
00179 grY->SetName(gname);
00180 grY->SetTitle("YZ projection");
00181 grY->GetXaxis()->SetTitle("Z (mm) ");
00182 grY->GetYaxis()->SetTitle("Y (mm) ");
00183 grY->SetMarkerStyle(21);
00184 grY->SetMarkerColor(4);
00185 grY->SetMarkerSize(0.8);
00186 grY->SetLineColor(4);
00187 grY->GetXaxis()->SetRangeUser(-10, 3100);
00188 AddObject(grY, dir.Data());
00189 }
00190 gname="XGraph";
00191 fullname= dir+"/"+gname;
00192 grX=dynamic_cast<TGraphErrors*>(GetObject(fullname));
00193 if(grX==0) {
00194 grX = new TGraphErrors(5, Zf, Xf, EZf, EXf);
00195 grX->SetName(gname);
00196 grX->SetTitle("XZ projection");
00197 grX->GetXaxis()->SetTitle("Z (mm) ");
00198 grX->GetYaxis()->SetTitle("X (mm) ");
00199 grX->SetMarkerStyle(20);
00200 grX->SetMarkerColor(4);
00201 grX->SetMarkerSize(0.8);
00202 grX->SetLineColor(4);
00203 grX->GetXaxis()->SetRangeUser(-10, 3100);
00204 AddObject(grX, dir.Data());
00205 }
00206 gname="YaGraph";
00207 fullname= dir+"/"+gname;
00208 graY=dynamic_cast<TGraphErrors*>(GetObject(fullname));
00209 if(graY==0) {
00210 graY = new TGraphErrors(7, Za, Ya, EZa, EYa);
00211 graY->SetName(gname);
00212 graY->SetTitle("YZ projection");
00213 grY->GetXaxis()->SetTitle("Z (mm) ");
00214 graY->GetYaxis()->SetTitle("Y (mm) ");
00215 graY->SetMarkerStyle(21);
00216 graY->SetMarkerColor(4);
00217 graY->SetMarkerSize(0.8);
00218 graY->SetLineColor(4);
00219 graY->GetXaxis()->SetRangeUser(-10, 3100);
00220 AddObject(graY, dir.Data());
00221 }
00222 gname="XaGraph";
00223 fullname= dir+"/"+gname;
00224 graX=dynamic_cast<TGraphErrors*>(GetObject(fullname));
00225 if(graX==0) {
00226 graX = new TGraphErrors(7, Za, Xa, EZa, EXa);
00227 graX->SetName(gname);
00228 graX->SetTitle("XZ projection");
00229 graX->GetXaxis()->SetTitle("Z (mm) ");
00230 graX->GetYaxis()->SetTitle("X (mm) ");
00231 graX->SetMarkerStyle(20);
00232 graX->SetMarkerColor(4);
00233 graX->SetMarkerSize(0.8);
00234 graX->SetLineColor(4);
00235 graX->GetXaxis()->SetRangeUser(-10, 3100);
00236 AddObject(graX, dir.Data());
00237 }
00238
00239 printf("TTrackingProc Histograms created \n");
00240 fflush ( stdout);
00241
00242 }
00243
00244
00245
00246 TTrackingProc::~TTrackingProc()
00247 {
00248 }
00249
00250
00251
00252 void TTrackingProc::InitEvent(TGo4EventElement* outevnt)
00253 {
00254
00255
00256
00257 TCBMBeamtimeEvent* btevent=dynamic_cast<TCBMBeamtimeEvent*>(GetInputEvent());
00258 if(btevent)
00259 {
00260
00261 fFirstHodoEvent=dynamic_cast<TFiberHodEvent*>(btevent->GetSubEvent("Hodo1"));
00262 fSecondHodoEvent=dynamic_cast<TFiberHodEvent*>(btevent->GetSubEvent("Hodo2"));
00263 fSTSEvent=dynamic_cast<TSTSEvent*>(btevent->GetSubEvent("STS"));
00264 fGEMEvent=dynamic_cast<TGEMEvent*>(btevent->GetSubEvent("GEM"));
00265 }
00266 else {
00267 cout << "btevent == 0\n";
00268 }
00269
00270
00271 btevent=dynamic_cast<TCBMBeamtimeEvent*>(GetInputEvent("Detector"));
00272 if(btevent)
00273 {
00274 fRocInputEvent = dynamic_cast<TRocEvent*>(btevent->GetSubEvent("ROC"));
00275 fRocInputEvent->GetEventTime();
00276 }
00277 else {
00278 cout << "detector event == 0\n";
00279 }
00280
00281
00282
00283
00284
00285
00286 if(fOutputEvent==0)
00287 {
00288 TCBMBeamtimeEvent* btevent=dynamic_cast<TCBMBeamtimeEvent*>(outevnt);
00289
00290 if(btevent)
00291 {
00292 fOutputEvent=dynamic_cast<TTrackingEvent*>(btevent->GetSubEvent("TRACKING"));
00293 }
00294 else
00295 {
00296 fOutputEvent= dynamic_cast<TTrackingEvent*>(outevnt);
00297 }
00298 if(fOutputEvent==0) {
00299 GO4_STOP_ANALYSIS_MESSAGE("**** TTrackingProc: Fatal error: output event is not a TTrackingEvent!!! STOP GO4");
00300 }
00301 }
00302 }
00303
00304
00305
00306 void TTrackingProc::FinalizeEvent()
00307 {
00308 if(fBeamMonitorEvent && fBeamMonitorEvent->IsValid())
00309 {
00310
00311 }
00312 static int eventNum = 0;
00313 if( fFirstHodoEvent->NumHits() == 1 && fSecondHodoEvent->NumHits() == 1) {
00314
00315 eventNum++;
00316 for (int i2=0;i2<2;i2++)
00317 {
00318 XHf[i2] = 0.0;
00319 YHf[i2] = 0.0;
00320 }
00321 for (int i5=0;i5<5;i5++)
00322 {
00323 Xf[i5] = 0.0;
00324 Yf[i5] = 0.0;
00325 }
00326 for (int i7=0;i7<7;i7++)
00327 {
00328 Xa[i7] = 0.0;
00329 Ya[i7] = 0.0;
00330 }
00331
00332 #ifdef HODOSCOPE_FULLTIMESTAMP
00333
00334 uint64_t HodoTime=0;
00335
00336
00337 #endif
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348 static double first_time_stamp = 0;
00349 if( eventNum == 1 )first_time_stamp = fRocInputEvent->GetEventTime();
00350 for( UInt_t iHit1 = 0; iHit1 < fFirstHodoEvent->NumHits(); iHit1++ ) {
00351 fPosXHod1->Fill( fFirstHodoEvent->Hit(iHit1).X );
00352 fPosYHod1->Fill( fFirstHodoEvent->Hit(iHit1).Y );
00353 fPosXYHod1->Fill( fFirstHodoEvent->Hit(iHit1).X , fFirstHodoEvent->Hit(iHit1).Y );
00354
00355
00356 fPosXHod1_vs_time->Fill( fRocInputEvent->GetEventTime()-first_time_stamp,fFirstHodoEvent->Hit(iHit1).X );
00357 fPosYHod1_vs_time->Fill( fRocInputEvent->GetEventTime()-first_time_stamp,fFirstHodoEvent->Hit(iHit1).Y );
00358 Xf[0] = fFirstHodoEvent->Hit(iHit1).X;
00359 Yf[0] = fFirstHodoEvent->Hit(iHit1).Y;
00360 Xa[0] = fFirstHodoEvent->Hit(iHit1).X;
00361 Ya[0] = fFirstHodoEvent->Hit(iHit1).Y;
00362
00363
00364 #ifdef HODOSCOPE_FULLTIMESTAMP
00365 uint64_t htime=fFirstHodoEvent->Hit(iHit1).fulltime;
00366 if(HodoTime==0)
00367 {
00368 HodoTime=htime;
00369 }
00370 if(HodoTime)
00371 {
00372 int64_t delta=htime-HodoTime;
00373 fDeltaT_Hod->Fill(delta);
00374 fDeltaT_all->Fill(delta);
00375 }
00376 #endif
00377
00378 }
00379 for(UInt_t iHit5 = 0; iHit5 < fSecondHodoEvent->NumHits(); iHit5++ ) {
00380 fPosXHod2->Fill( fSecondHodoEvent->Hit(iHit5).X );
00381 fPosYHod2->Fill( fSecondHodoEvent->Hit(iHit5).Y );
00382 fPosXYHod2->Fill( fSecondHodoEvent->Hit(iHit5).X , fSecondHodoEvent->Hit(iHit5).Y );
00383 fPosXHod2_vs_time->Fill( fRocInputEvent->GetEventTime()-first_time_stamp,fSecondHodoEvent->Hit(iHit5).X );
00384 fPosYHod2_vs_time->Fill( fRocInputEvent->GetEventTime()-first_time_stamp,fSecondHodoEvent->Hit(iHit5).Y );
00385 Xf[4] = fSecondHodoEvent->Hit(iHit5).X;
00386 Yf[4] = fSecondHodoEvent->Hit(iHit5).Y;
00387 Xa[6] = fSecondHodoEvent->Hit(iHit5).X;
00388 Ya[6] = fSecondHodoEvent->Hit(iHit5).Y;
00389
00390 #ifdef HODOSCOPE_FULLTIMESTAMP
00391 uint64_t htime=fSecondHodoEvent->Hit(iHit5).fulltime;
00392 if(HodoTime)
00393 {
00394 int64_t delta=htime-HodoTime;
00395 fDeltaT_Hod->Fill(delta);
00396 fDeltaT_all->Fill(delta);
00397 }
00398 #endif
00399
00400 }
00401
00402
00403 fCorrXHod->Fill( Xa[0] , Xa[6]);
00404 fCorrYHod->Fill( Ya[0] , Ya[6]);
00405
00406
00407
00408
00409
00410
00411 for( Int_t iDet = 0; iDet < fSTSEvent->GetNPlanes(); iDet++ ) {
00412
00413 for( Int_t iHit = 0; iHit < fSTSEvent->GetNPoints( iDet ); iHit++ ) {
00414 fPosXSts.at( iDet )->Fill( -fSTSEvent->GetPoint( iDet, iHit ).GetX() );
00415 if(iDet == 0) Xf[1] = fSTSEvent->GetPoint( iDet, iHit ).GetX();
00416 if(iDet == 1) Xf[3] = fSTSEvent->GetPoint( iDet, iHit ).GetX();
00417 if(iDet == 2) Xf[2] = fSTSEvent->GetPoint( iDet, iHit ).GetX();
00418 fPosYSts.at( iDet )->Fill( fSTSEvent->GetPoint( iDet, iHit ).GetY() );
00419 if(iDet == 0)Yf[1] = fSTSEvent->GetPoint( iDet, iHit ).GetY();
00420 if(iDet == 1)Yf[3] = fSTSEvent->GetPoint( iDet, iHit ).GetY();
00421 if(iDet == 2)Yf[2] = fSTSEvent->GetPoint( iDet, iHit ).GetY();
00422 fPosXYSts.at( iDet )->Fill( fSTSEvent->GetPoint( iDet, iHit ).GetX(), fSTSEvent->GetPoint( iDet, iHit ).GetY() );
00423 fPosXSts_vs_time.at( iDet )->Fill( fRocInputEvent->GetEventTime()-first_time_stamp, fSTSEvent->GetPoint( iDet, iHit ).GetX());
00424 fPosYSts_vs_time.at( iDet )->Fill( fRocInputEvent->GetEventTime()-first_time_stamp, fSTSEvent->GetPoint( iDet, iHit ).GetY());
00425
00426 #ifdef HODOSCOPE_FULLTIMESTAMP
00427 uint64_t stime=fSTSEvent->GetPoint( iDet, iHit ).GetTS();
00428 if(HodoTime && stime)
00429 {
00430 static unsigned cnt=0;
00431 int64_t delta=stime-HodoTime;
00432 fDeltaT_STS->Fill(delta);
00433 fDeltaT_all->Fill(delta);
00434
00435
00436
00437
00438
00439
00440
00441
00442 }
00443 #endif
00444
00445 }
00446 }
00447
00448
00449
00450 int NumGem1Hits =0;
00451 int NumGem2Hits =0;
00452 for(UInt_t iHit6 = 0; iHit6 < fGEMEvent->NumHits(); iHit6++ ) {
00453 if(fGEMEvent->Hit(iHit6).StationIndex==0){
00454 fPosXGem1->Fill( -fGEMEvent->Hit(iHit6).X );
00455 fPosYGem1->Fill( -fGEMEvent->Hit(iHit6).Y );
00456 fPosXYGem1->Fill( -fGEMEvent->Hit(iHit6).X , -fGEMEvent->Hit(iHit6).Y );
00457 Xa[4] = -fGEMEvent->Hit(iHit6).X;
00458 Ya[4] = -fGEMEvent->Hit(iHit6).Y;
00459
00460 #ifdef HODOSCOPE_FULLTIMESTAMP
00461 uint64_t gtime=fGEMEvent->Hit(iHit6).Fulltime;
00462 if(HodoTime)
00463 {
00464 int64_t delta=gtime-HodoTime;
00465 fDeltaT_GEM->Fill(delta);
00466 fDeltaT_all->Fill(delta);
00467 }
00468 #endif
00469
00470 NumGem1Hits++;
00471 }
00472 if(fGEMEvent->Hit(iHit6).StationIndex==1){
00473 fPosXGem2->Fill( -fGEMEvent->Hit(iHit6).X );
00474 fPosYGem2->Fill( -fGEMEvent->Hit(iHit6).Y );
00475 fPosXYGem2->Fill( -fGEMEvent->Hit(iHit6).X , -fGEMEvent->Hit(iHit6).Y );
00476 Xa[5] = -fGEMEvent->Hit(iHit6).X;
00477 Ya[5] = -fGEMEvent->Hit(iHit6).Y;
00478
00479 #ifdef HODOSCOPE_FULLTIMESTAMP
00480 uint64_t gtime=fGEMEvent->Hit(iHit6).Fulltime;
00481 if(HodoTime)
00482 {
00483 fDeltaT_GEM->Fill(gtime-HodoTime);
00484 fDeltaT_all->Fill(gtime-HodoTime);
00485 }
00486 #endif
00487 NumGem2Hits++;
00488 }
00489 }
00490
00491
00492 int NumSts1Hits = fSTSEvent->GetNPoints( 0);
00493 int NumSts2Hits = fSTSEvent->GetNPoints( 2);
00494 int NumSts3Hits = fSTSEvent->GetNPoints( 1);
00495
00496
00497
00498 if(NumSts1Hits==1 && NumSts3Hits==1) fCorrXXSts.at(0)->Fill(Xf[1],Xf[3]);
00499 if(NumSts1Hits==1 && NumSts2Hits==1) fCorrXXSts.at(1)->Fill(Xf[1],Xf[2]);
00500 if(NumSts2Hits==1 && NumSts3Hits==1) fCorrXXSts.at(2)->Fill(Xf[2],Xf[3]);
00501 if(NumSts1Hits==1 && NumSts3Hits==1) fCorrYYSts.at(0)->Fill(Yf[1],Yf[3]);
00502 if(NumSts1Hits==1 && NumSts2Hits==1) fCorrYYSts.at(1)->Fill(Yf[1],Yf[2]);
00503 if(NumSts2Hits==1 && NumSts3Hits==1) fCorrYYSts.at(2)->Fill(Yf[2],Yf[3]);
00504
00505
00506 if(NumSts1Hits==1) fCorrXXH1Sts.at(0)->Fill(Xf[0],Xf[1]);
00507 if(NumSts2Hits==1) fCorrXXH1Sts.at(1)->Fill(Xf[0],Xf[2]);
00508 if(NumSts3Hits==1) fCorrXXH1Sts.at(2)->Fill(Xf[0],Xf[3]);
00509 if(NumSts1Hits==1) fCorrYYH1Sts.at(0)->Fill(Yf[0],Yf[1]);
00510 if(NumSts2Hits==1) fCorrYYH1Sts.at(1)->Fill(Yf[0],Yf[2]);
00511 if(NumSts3Hits==1) fCorrYYH1Sts.at(2)->Fill(Yf[0],Yf[3]);
00512
00513 if(Xf[0]>5. && Xf[0]<20. && Yf[0]>-2. && Yf[0]<5. &&Xf[4]>-2. && Xf[4]<17. && Yf[4]>7. && Yf[4]<22.){
00514 fNHitsSts.at(0)->Fill( NumSts1Hits);
00515 fNHitsSts.at(1)->Fill( NumSts2Hits);
00516 fNHitsSts.at(2)->Fill( NumSts3Hits);
00517 }
00518
00519
00520 if(NumGem1Hits == 1) {
00521 fCorrXHod1Gem1->Fill( Xa[0] , Xa[4]);
00522 fCorrYHod1Gem1->Fill( Ya[0] , Ya[4]);
00523 fCorrXHod2Gem1->Fill( Xa[6] , Xa[4]);
00524 fCorrYHod2Gem1->Fill( Ya[6] , Ya[4]);
00525 }
00526
00527
00528 if(NumGem1Hits == 1&&NumSts1Hits==1) {
00529 fCorrXXGem1Sts.at(0)->Fill( Xf[1] , Xa[4]);
00530 fCorrYYGem1Sts.at(0)->Fill( Yf[1] , Ya[4]);
00531 }
00532 if(NumGem1Hits == 1&&NumSts2Hits==1) {
00533 fCorrXXGem1Sts.at(1)->Fill( Xf[2] , Xa[4]);
00534 fCorrYYGem1Sts.at(1)->Fill( Yf[2] , Ya[4]);
00535 }
00536 if(NumGem1Hits == 1&&NumSts3Hits==1) {
00537 fCorrXXGem1Sts.at(2)->Fill( Xf[3] , Xa[4]);
00538 fCorrYYGem1Sts.at(2)->Fill( Yf[3] , Ya[4]);
00539 }
00540
00541
00542
00543
00544
00545 if(NumSts1Hits ==1&& NumSts2Hits ==1 && NumSts3Hits ==1) {
00546
00547
00548
00549
00550 if(Xf[1]<0.5&&Xf[1]>-0.5&&Yf[1]<0.5&&Yf[1]>-0.5){
00551
00552
00553 fPosXYHod1Sts->Fill(Xf[2],Yf[2]);
00554 fPosXYHod2Sts->Fill(Xf[3],Yf[3]);
00555 }
00556
00557
00558
00559 NPoint = 5; NHPoint = 2;
00560
00561 double ShiftX_Hod1 = 0.0;
00562 double ShiftY_Hod1 = 0.0;
00563 double ShiftX_Hod2 = 0.0;
00564 double ShiftY_Hod2 = 0.0;
00565
00566 double ShiftX_Sts1 = 11.564;
00567 double ShiftY_Sts1 = 3.410;
00568 double ShiftX_Sts2 =10.752;
00569 double ShiftY_Sts2 = 5.270;
00570 double ShiftX_Sts3 = 9.827;
00571 double ShiftY_Sts3 = 8.633;
00572
00573 double ShiftX_Gem1 = -10.4;
00574 double ShiftY_Gem1 = -11.5;
00575 double ShiftX_Gem2 = 0.0;
00576 double ShiftY_Gem2 = 0.0;
00577
00578 Zf[0] = 0.; Zf[1] = 270.; Zf[2] = 740.; Zf[3] = 1260.; Zf[4] = 2770.;
00579 Za[0] = 0.; Za[1] = 270.; Za[2] = 740.; Za[3] = 1260.; Za[4] = 1630.; Za[5] = 1770.; Za[6] = 2770.;
00580
00581 Xf[0] = Xf[0] + ShiftX_Hod1;
00582 Xf[1] = Xf[1] + ShiftX_Sts1;
00583 Xf[2] = Xf[2] + ShiftX_Sts2;
00584 Xf[3] = Xf[3] + ShiftX_Sts3;
00585 Xf[4] = Xf[4] + ShiftX_Hod2;
00586 Yf[0] = Yf[0] + ShiftY_Hod1;
00587 Yf[1] = Yf[1] + ShiftY_Sts1;
00588 Yf[2] = Yf[2] + ShiftY_Sts2;
00589 Yf[3] = Yf[3] + ShiftY_Sts3;
00590 Yf[4] = Yf[4] + ShiftY_Hod2;
00591
00592 Xa[0] = Xa[0] + ShiftX_Hod1;
00593 Xa[1] = Xf[1];
00594 Xa[2] = Xf[2];
00595 Xa[3] =Xf[3];
00596 Xa[4] = Xa[4] + ShiftX_Gem1;
00597 Xa[5] = Xa[5] + ShiftX_Gem2;
00598 Xa[6] = Xa[6] + ShiftX_Hod2;
00599
00600 Ya[0] = Ya[0] + ShiftY_Hod1;
00601 Ya[1] = Yf[1];
00602 Ya[2] = Yf[2];
00603 Ya[3] = Yf[3];
00604 Ya[4] = Ya[4] + ShiftY_Gem1;
00605 Ya[5] = Ya[5] + ShiftY_Gem2;
00606 Ya[6] = Ya[6] + ShiftY_Hod2;
00607
00608
00609
00610
00611
00612
00613
00614
00615
00616
00617
00618
00619
00620
00621
00622
00623
00624
00625
00626
00627
00628
00629
00630
00631
00632
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644
00645
00646
00647
00648
00649
00650
00651 EZf[0] = 2.0; EZf[1] = 2.0; EZf[2] = 2.0; EZf[3] = 2.0; EZf[4] = 2.0;
00652 EXf[0] = 2.5; EXf[1] =0.014; EXf[2] = 0.014; EXf[3] = 0.014; EXf[4] = 3.5;
00653 EYf[0] = 2.0; EYf[1] =0.014; EYf[2] = 0.014; EYf[3] = 0.014; EYf[4] = 2.8;
00654
00655 ZHf[0] = Zf[0]; ZHf[1] = Zf[4];
00656 XHf[0] = Xf[0]; XHf[1] = Xf[4];
00657 YHf[0] = Yf[0]; YHf[1] = Yf[4];
00658 EZHf[0] = 2.0; EZHf[1] = 2.0;
00659 EXHf[0] = 1.0; EXHf[1] = 1.0;
00660 EYHf[0] = 1.0; EYHf[1] = 1.0;
00661
00662 EZa[0] = 2.0; EZa[1] = 2.0; EZa[2] = 2.0; EZa[3] = 2.0; EZa[4] = 2.0; EZa[5] = 2.0; EZa[6] = 2.0;
00663 EXa[0] = 2.0; EXa[1] = 0.014; EXa[2] = 0.014; EXa[3] = 0.014; EXa[4] = 1.5; EXa[5] = 1.5; EXa[6] = 2.0;
00664 EYa[0] = 1.0; EYa[1] = 0.014; EYa[2] = 0.014; EYa[3] = 0.014; EYa[4] = 0.5; EYa[5] = 0.5; EYa[6] = 1.0;
00665
00666 if(fFirstHodoEvent->NumHits()>0){
00667
00668 for (int p=0;p<2;p++)
00669 {
00670
00671 grHY->SetPoint(p,ZHf[p], YHf[p]);
00672 grHY->SetPointError(p, EZHf[p], EYHf[p]);
00673 grHX->SetPoint(p,ZHf[p], XHf[p]);
00674 grHX->SetPointError(p, EZHf[p], EXHf[p]);
00675 }
00676
00677
00678 for (int pp=0;pp<5;pp++)
00679 {
00680 grY->SetPoint(pp,Zf[pp], Yf[pp]);
00681 grY->SetPointError(pp, EZf[pp], EYf[pp]);
00682 grX->SetPoint(pp,Zf[pp], Xf[pp]);
00683 grX->SetPointError(pp, EZf[pp], EXf[pp]);
00684 }
00685
00686
00687 for (int pp1=0;pp1<7;pp1++)
00688 {
00689
00690 graY->SetPoint(pp1,Za[pp1], Ya[pp1]);
00691 graY->SetPointError(pp1, EZa[pp1], EYa[pp1]);
00692 graX->SetPoint(pp1,Za[pp1], Xa[pp1]);
00693 graX->SetPointError(pp1, EZa[pp1], EXa[pp1]);
00694 }
00695
00696
00697 if(NumGem2Hits <= 0) {
00698 graY->RemovePoint(5);
00699 graX->RemovePoint(5);
00700 }
00701 if(NumGem1Hits <= 0) {
00702 graY->RemovePoint(4);
00703 graX->RemovePoint(4);
00704 }
00705
00706 if(NumSts3Hits <= 0) {
00707 grY->RemovePoint(3);
00708 grX->RemovePoint(3);
00709 graY->RemovePoint(3);
00710 graX->RemovePoint(3);
00711 }
00712 if(NumSts2Hits <= 0) {
00713 grY->RemovePoint(2);
00714 grX->RemovePoint(2);
00715 graY->RemovePoint(2);
00716 graX->RemovePoint(2);
00717 }
00718 if(NumSts1Hits <= 0) {
00719 grY->RemovePoint(1);
00720 grX->RemovePoint(1);
00721 graY->RemovePoint(1);
00722 graX->RemovePoint(1);
00723 }
00724
00725
00726
00727
00728
00729
00730
00731
00732
00733
00734
00735
00736
00737 fun3 = new TF1("fun3", "[0]+[1]*x");
00738
00739 grY->Fit(fun3,"Q");
00740
00741
00742
00743 fun4 = new TF1("fun4", "[0]+[1]*x");
00744
00745 grX->Fit(fun4,"Q");
00746
00747
00748
00749
00750
00751
00752
00753
00754
00755
00756
00757
00758
00759
00760
00761
00762
00763
00764
00765 fResXHod1->Fill( Xf[0] - fun4->GetParameter(0) - fun4->GetParameter(1)*Zf[0]);
00766 fResYHod1->Fill( Yf[0] - fun3->GetParameter(0) - fun3->GetParameter(1)*Zf[0]);
00767 fResXHod2->Fill( Xf[4] - fun4->GetParameter(0) - fun4->GetParameter(1)*Zf[4]);
00768 fResYHod2->Fill( Yf[4] - fun3->GetParameter(0) - fun3->GetParameter(1)*Zf[4]);
00769
00770
00771
00772 if(NumSts1Hits > 0) {
00773 fResXSts1->Fill( Xf[1] - fun4->GetParameter(0) - fun4->GetParameter(1)*Zf[1]);
00774 fResYSts1->Fill( Yf[1] - fun3->GetParameter(0) - fun3->GetParameter(1)*Zf[1]);
00775 }
00776 if(NumSts2Hits > 0) {
00777 fResXSts2->Fill( Xf[2] - fun4->GetParameter(0) - fun4->GetParameter(1)*Zf[2]);
00778 fResYSts2->Fill( Yf[2] - fun3->GetParameter(0) - fun3->GetParameter(1)*Zf[2]);
00779 }
00780 if(NumSts3Hits > 0) {
00781 fResXSts3->Fill( Xf[3] - fun4->GetParameter(0) - fun4->GetParameter(1)*Zf[3]);
00782 fResYSts3->Fill( Yf[3] - fun3->GetParameter(0) - fun3->GetParameter(1)*Zf[3]);
00783 }
00784 fun5 = new TF1("fun5", "[0]+[1]*x");
00785
00786 graY->Fit(fun5,"Q");
00787
00788
00789
00790 fun6 = new TF1("fun6", "[0]+[1]*x");
00791 graX->Fit(fun6,"Q");
00792
00793
00794
00795 if(NumGem1Hits > 0) {
00796 fResXGem1->Fill( Xa[4] - fun6->GetParameter(0) - fun6->GetParameter(1)*Za[4]);
00797 fResYGem1->Fill( Ya[4] - fun5->GetParameter(0) - fun5->GetParameter(1)*Za[4]);
00798 }
00799 if(NumGem2Hits > 0) {
00800 fResXGem2->Fill( Xa[5] - fun6->GetParameter(0) - fun6->GetParameter(1)*Za[5]);
00801 fResYGem2->Fill( Ya[5] - fun5->GetParameter(0) - fun5->GetParameter(1)*Za[5]);
00802 }
00803
00804
00805
00806
00807 delete fun3;
00808 delete fun4;
00809 delete fun5;
00810 delete fun6;
00811 }
00812 }
00813 }
00814 else {
00815
00816 }
00817
00818 }