| 1 |
|
| 2 |
#if !defined(__CINT__) || defined(__MAKECINT__) |
| 3 |
|
| 4 |
|
| 5 |
// ROOT includes // |
| 6 |
#include <TString.h> |
| 7 |
#include <TH1F.h> |
| 8 |
#include <TH2F.h> |
| 9 |
|
| 10 |
// standard libraries includes // |
| 11 |
#include <stdlib.h> |
| 12 |
#include <iostream> |
| 13 |
//#include <fstream> |
| 14 |
#include <iomanip> |
| 15 |
using namespace std; |
| 16 |
|
| 17 |
// PAMELA includes // |
| 18 |
#include <PamLevel2.h> |
| 19 |
|
| 20 |
#endif |
| 21 |
|
| 22 |
//====================== |
| 23 |
// global variables |
| 24 |
//====================== |
| 25 |
Int_t tot=0; |
| 26 |
Int_t sel[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; |
| 27 |
|
| 28 |
TrkLevel2 *trkl2 = 0; |
| 29 |
CaloLevel2 *calol2 = 0; |
| 30 |
ToFLevel2 *tofl2 = 0; |
| 31 |
TrigLevel2 *trigl2 = 0; |
| 32 |
AcLevel2 *acl2 = 0; |
| 33 |
|
| 34 |
//====================== |
| 35 |
// HISTOGRAMS declaration |
| 36 |
//====================== |
| 37 |
|
| 38 |
TH2F* hxytof[6]; |
| 39 |
|
| 40 |
void Dump(ToFTrkVar* tof){ |
| 41 |
|
| 42 |
cout << endl<< "n. tdc hits :"<<tof->npmttdc; |
| 43 |
cout << endl<< "PMTs :"; |
| 44 |
for(Int_t ip=0; ip< tof->npmttdc; ip++)cout << " "<< tof->pmttdc[ip]; |
| 45 |
cout << endl<< "n. adc hits :"<<tof->npmtadc; |
| 46 |
cout << endl<< "PMTs :"; |
| 47 |
for(Int_t ip=0; ip< tof->npmtadc; ip++)cout << " "<< tof->pmtadc[ip]; |
| 48 |
cout << endl<< "dedx :"; |
| 49 |
for(Int_t ib=0; ib< tof->npmtadc; ib++)cout << " "<< tof->dedx[ib]; |
| 50 |
cout << endl<< "beta :"; |
| 51 |
for(Int_t ib=0; ib<13 ; ib++)cout << " "<< tof->beta[ib]; |
| 52 |
cout << endl<< "xtofpos :"; |
| 53 |
for(Int_t ib=0; ib<3 ; ib++)cout << " "<< tof->xtofpos[ib]; |
| 54 |
cout << endl<< "ytofpos :"; |
| 55 |
for(Int_t ib=0; ib<3 ; ib++)cout << " "<<tof->ytofpos[ib]; |
| 56 |
cout <<endl<<"============================================="<<endl; |
| 57 |
|
| 58 |
} |
| 59 |
|
| 60 |
|
| 61 |
void Dump(ToFLevel2* l2){ |
| 62 |
cout<<"ToF event: "<<l2->npmt()<<" hit PMTs"<<endl; |
| 63 |
cout<<" id name plane paddle pmt adc tdc"<<endl; |
| 64 |
for(int ip=0; ip<l2->npmt(); ip++){ |
| 65 |
Int_t iplane = -1; |
| 66 |
Int_t ipaddle = -1; |
| 67 |
Int_t ipmt = -1; |
| 68 |
// cout << l2->GetToFPMT(ip) << endl; |
| 69 |
Int_t id = l2->GetToFPMT(ip)->pmt_id; |
| 70 |
float adc = l2->GetToFPMT(ip)->adc; |
| 71 |
float tdc = l2->GetToFPMT(ip)->tdc_tw; // temporaneo |
| 72 |
cout <<setw(3)<<id<< setw(10) << l2->GetPMTName(id,iplane,ipaddle,ipmt) << setw(7) << iplane << setw(7)<< ipaddle << setw(7) << ipmt << setw(7) << adc << setw(7) << tdc <<endl; |
| 73 |
} |
| 74 |
cout <<"============================================="<<endl; |
| 75 |
|
| 76 |
} |
| 77 |
|
| 78 |
void Dump(TrigLevel2* l2){ |
| 79 |
cout << "Trigger Configuration (hex): " << hex; |
| 80 |
cout << l2->trigconf << endl; |
| 81 |
cout <<"============================================="<<endl; |
| 82 |
cout << "Trigger Pattern (hex): " << hex; |
| 83 |
for(int i=0; i<6; i++)cout << setw(5) << l2->patterntrig[i]; |
| 84 |
cout << dec << endl; |
| 85 |
cout <<"============================================="<<endl; |
| 86 |
} |
| 87 |
|
| 88 |
void EvaluatePatternTrig(UInt_t *patterntrig, ToFLevel2* l2){ |
| 89 |
|
| 90 |
// TString photoS[48] = { |
| 91 |
// "S11_1A", "S11_1B", "S11_2A", "S11_2B", "S11_3A", "S11_3B", "S11_4A", |
| 92 |
// "S11_4B", |
| 93 |
// "S11_5A", "S11_5B", "S11_6A", "S11_6B", "S11_7A", "S11_7B", "S11_8A", |
| 94 |
// "S11_8B", |
| 95 |
// "S12_1A", "S12_1B", "S12_2A", "S12_2B", "S12_3A", "S12_3B", "S12_4A", |
| 96 |
// "S12_4B", "S12_5A", "S12_5B", "S12_6A", "S12_6B", |
| 97 |
// "S21_1A", "S21_1B", "S21_2A", "S21_2B", |
| 98 |
// "S22_1A", "S22_1B", "S22_2A", "S22_2B", |
| 99 |
// "S31_1A", "S31_1B", "S31_2A", "S31_2B", "S31_3A", "S31_3B", |
| 100 |
// "S32_1A", "S32_1B", "S32_2A", "S32_2B", "S32_3A", "S32_3B" |
| 101 |
// }; |
| 102 |
// patterntrig(3) --> S3 [49 to 38] 12 bits: (S32b,S32a,S31b,S31a) |
| 103 |
// patterntrig(4) --> S2 [37 to 30] 8 bits: (S22b,S22a,S21b,S21a) |
| 104 |
// patterntrig(5) --> S12 [29 to 18] 12 bits: (S12b,S12a) |
| 105 |
// patterntrig(6) --> S11 [17 to 2] 16 bits: (S11b,S11a) |
| 106 |
|
| 107 |
// UInt_t patterntrig[6]; |
| 108 |
for(int i=0; i<6; i++)*(patterntrig+i)=0; |
| 109 |
|
| 110 |
UInt_t word[]={ |
| 111 |
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, //S11 |
| 112 |
4,4,4,4,4,4,4,4,4,4,4,4, //S12 |
| 113 |
3,3,3,3,3,3,3,3, //S2 |
| 114 |
2,2,2,2,2,2,2,2,2,2,2,2 //S3 |
| 115 |
}; |
| 116 |
UInt_t bit[] ={ |
| 117 |
0,8,1,9,2,10,3,11,4,12,5,13,6,14,7,15, //S11 |
| 118 |
0,6,1,7,2,8,3,9,4,10,5,11, //S12 |
| 119 |
0,2,1,3,4,6,5,7, //S2 |
| 120 |
0,3,1,4,2,5,6,9,7,10,8,11 //S3 |
| 121 |
}; |
| 122 |
|
| 123 |
for(int ip=0; ip<l2->npmt(); ip++){ |
| 124 |
Int_t iplane = -1; |
| 125 |
Int_t ipaddle = -1; |
| 126 |
Int_t ipmt = -1; |
| 127 |
// cout << l2->GetToFPMT(ip) << endl; |
| 128 |
Int_t id = l2->GetToFPMT(ip)->pmt_id; |
| 129 |
float tdc = l2->GetToFPMT(ip)->tdc_tw; // temporaneo |
| 130 |
|
| 131 |
if(tdc<4095) *(patterntrig+word[id]) = *(patterntrig+word[id]) | (UInt_t)(pow(2.,(float)bit[id])); |
| 132 |
|
| 133 |
} |
| 134 |
|
| 135 |
|
| 136 |
|
| 137 |
|
| 138 |
} |
| 139 |
|
| 140 |
//=============================================================================== |
| 141 |
// |
| 142 |
// |
| 143 |
// |
| 144 |
// |
| 145 |
//=============================================================================== |
| 146 |
bool Select( PamLevel2* event ){ |
| 147 |
// return false; |
| 148 |
TrkParams::SetVerboseMode(); |
| 149 |
|
| 150 |
//------------------------------------------- |
| 151 |
// check if the event contains selection info |
| 152 |
//------------------------------------------- |
| 153 |
if( event->GetTrkLevel2()==0 ){ |
| 154 |
cout << "Missing TrkLevel2 object "<<endl; |
| 155 |
return false; |
| 156 |
} |
| 157 |
if( event->GetToFLevel2()==0 ){ |
| 158 |
cout << "Missing ToFLevel2 object "<<endl; |
| 159 |
return false; |
| 160 |
} |
| 161 |
if( event->GetCaloLevel2()==0 ){ |
| 162 |
cout << "Missing CaloLevel2 object "<<endl; |
| 163 |
return false; |
| 164 |
} |
| 165 |
if( event->GetTrigLevel2()==0 ){ |
| 166 |
cout << "Missing TrigLevel2 object "<<endl; |
| 167 |
return false; |
| 168 |
} |
| 169 |
if( event->GetAcLevel2()==0 ){ |
| 170 |
cout << "Missing AcLevel2 object "<<endl; |
| 171 |
return false; |
| 172 |
} |
| 173 |
if( event->GetRunInfo()==0 ){ |
| 174 |
cout << "Missing RunInfo object "<<endl; |
| 175 |
return false; |
| 176 |
} |
| 177 |
|
| 178 |
trkl2 = event->GetTrkLevel2(); |
| 179 |
calol2 = event->GetCaloLevel2(); |
| 180 |
tofl2 = event->GetToFLevel2(); |
| 181 |
trigl2 = event->GetTrigLevel2(); |
| 182 |
acl2 = event->GetAcLevel2(); |
| 183 |
|
| 184 |
tot++; |
| 185 |
|
| 186 |
|
| 187 |
//------------------------------------------------------------------ |
| 188 |
// Orbital selection |
| 189 |
//------------------------------------------------------------------ |
| 190 |
bool ORB__OK = false; |
| 191 |
if( |
| 192 |
event->GetOrbitalInfo()->Babs>0.22 && //outside SSA |
| 193 |
true ) ORB__OK = true; |
| 194 |
if( !ORB__OK )return false; |
| 195 |
sel[0]++; |
| 196 |
|
| 197 |
//--------------------------------------------------------- |
| 198 |
// trigger configuration: TOF 1 (standard) |
| 199 |
//--------------------------------------------------------- |
| 200 |
bool trigg_patt_ok = false; |
| 201 |
if ( trigl2->trigconf & (1<<0) ) trigg_patt_ok = true; |
| 202 |
if(!trigg_patt_ok)return false; |
| 203 |
sel[1]++; |
| 204 |
|
| 205 |
//--------------------------------------------------------- |
| 206 |
// single track |
| 207 |
//--------------------------------------------------------- |
| 208 |
if( trkl2->GetNTracks()!=1 ) return false; // singola traccia (fisica) |
| 209 |
event->SetSortingMethod("+CAL"); // usa solo l'info del calorimetro per scegliere l'immagine |
| 210 |
PamTrack *track = event->GetTrack(0);// qui viene scelta l'"immagine" fisica |
| 211 |
// if( track->GetScore() <=0 )cout << " >>> Strange track <<< P-score "<< track->GetPScore() << " I-score "<<track->GetIScore()<<endl; |
| 212 |
|
| 213 |
if(!track)return false; |
| 214 |
|
| 215 |
//---------------------------------------------------------- |
| 216 |
// (CHI**2 standard) |
| 217 |
//---------------------------------------------------------- |
| 218 |
float p0 = 1.111588e+00; |
| 219 |
float p1 = 1.707656e+00; |
| 220 |
float p2 = 1.489693e-01; |
| 221 |
float def_0 = 0.07; |
| 222 |
float chi2m025_0 = p0 + fabs(def_0)*p1 + def_0*def_0*p2; |
| 223 |
|
| 224 |
//------------------------------------------------------------------ |
| 225 |
// tracker pre-selection |
| 226 |
//------------------------------------------------------------------ |
| 227 |
TrkTrack *trk = track->GetTrkTrack(); |
| 228 |
|
| 229 |
float chi2m025 = p0 + fabs(trk->GetDeflection())*p1 + trk->GetDeflection()*trk->GetDeflection()*p2; |
| 230 |
float chi2m = pow( chi2m025-chi2m025_0+pow(6.4,0.25), 4.); |
| 231 |
|
| 232 |
bool TRACK__OK = false; |
| 233 |
if( |
| 234 |
// trk->chi2 >0 && |
| 235 |
trk->GetNX()>=4 && |
| 236 |
trk->GetNY()>=3 && |
| 237 |
trk->GetLeverArmX()>=5 && |
| 238 |
trk->GetRigidity()> 4. && // unit: GV |
| 239 |
trk->GetDEDX()<3. && // unit: dE/dX for Z=1 MIP |
| 240 |
trk->IsInsideCavity() && |
| 241 |
trk->chi2 < chi2m && |
| 242 |
true ) TRACK__OK = true; |
| 243 |
|
| 244 |
if( !TRACK__OK )return false; |
| 245 |
|
| 246 |
sel[2]++; |
| 247 |
|
| 248 |
|
| 249 |
//------------------------------------------------------------------ |
| 250 |
// AC |
| 251 |
//------------------------------------------------------------------ |
| 252 |
if( acl2->IsHit("CARD1-M") || acl2->IsHit("CARD1-E") )return false; |
| 253 |
if( acl2->IsHit("CARD2-M") || acl2->IsHit("CARD2-E") )return false; |
| 254 |
if( acl2->IsHit("CARD3-M") || acl2->IsHit("CARD3-E") )return false; |
| 255 |
if( acl2->IsHit("CARD4-M") || acl2->IsHit("CARD4-E") )return false; |
| 256 |
|
| 257 |
if( acl2->IsHit("CAT1-M") || acl2->IsHit("CAT1-E") )return false; |
| 258 |
if( acl2->IsHit("CAT2-M") || acl2->IsHit("CAT2-E") )return false; |
| 259 |
if( acl2->IsHit("CAT3-M") || acl2->IsHit("CAT3-E") )return false; |
| 260 |
if( acl2->IsHit("CAT4-M") || acl2->IsHit("CAT4-E") )return false; |
| 261 |
|
| 262 |
// if( acl2->IsHit("CAS1-M") || acl2->IsHit("CAS1-E") )return false; |
| 263 |
// if( acl2->IsHit("CAS2-M") || acl2->IsHit("CAS2-E") )return false; |
| 264 |
// if( acl2->IsHit("CAS3-M") || acl2->IsHit("CAS3-E") )return false; |
| 265 |
// if( acl2->IsHit("CAS4-M") || acl2->IsHit("CAS4-E") )return false; |
| 266 |
sel[3]++; |
| 267 |
|
| 268 |
|
| 269 |
|
| 270 |
//------------------------------------------------------------------ |
| 271 |
// CALORIMETER |
| 272 |
//------------------------------------------------------------------ |
| 273 |
bool NONINT=false; |
| 274 |
if( |
| 275 |
track->GetCaloTrack()->qtrack / event->GetCaloLevel2()->qtot > 0.85 && |
| 276 |
true)NONINT=true; |
| 277 |
|
| 278 |
if(!NONINT)return false; |
| 279 |
sel[4]++; |
| 280 |
|
| 281 |
|
| 282 |
return true; |
| 283 |
|
| 284 |
|
| 285 |
} |
| 286 |
//=============================================================== |
| 287 |
// Create histograms |
| 288 |
// |
| 289 |
// |
| 290 |
// |
| 291 |
// |
| 292 |
// |
| 293 |
//=============================================================== |
| 294 |
void CreateHistos( PamLevel2* event , TFile* outf ){ |
| 295 |
cout << "Creating histos..."<<endl; |
| 296 |
gROOT->cd();//create histos in memory |
| 297 |
TString hid; |
| 298 |
TString title; |
| 299 |
|
| 300 |
//-------------------------------- |
| 301 |
// histos |
| 302 |
//-------------------------------- |
| 303 |
for(Int_t i=0; i<6; i++){ |
| 304 |
hid.Form("hxytof%i",i); |
| 305 |
title.Form("Track coordinates on ToF plane %i",i); |
| 306 |
hxytof[i] = new TH2F(hid.Data(),title.Data(),6000,-30.,30.,6000,-30.,30.); |
| 307 |
} |
| 308 |
|
| 309 |
//-------------------------------- |
| 310 |
// initialization |
| 311 |
//-------------------------------- |
| 312 |
cout << "Opening DB connection..."<<endl; |
| 313 |
event->SetDBConnection(); |
| 314 |
|
| 315 |
} |
| 316 |
//=============================================================== |
| 317 |
// Retrieve histograms |
| 318 |
// |
| 319 |
// |
| 320 |
// |
| 321 |
// |
| 322 |
// |
| 323 |
//=============================================================== |
| 324 |
void RetrieveHistos(){ |
| 325 |
|
| 326 |
gROOT->cd(); |
| 327 |
TString hid; |
| 328 |
|
| 329 |
for(Int_t i=0; i<6; i++){ |
| 330 |
hid.Form("hxytof%i",i); |
| 331 |
hxytof[i] = dynamic_cast<TH2F*>(gDirectory->FindObject(hid.Data())); |
| 332 |
} |
| 333 |
|
| 334 |
} |
| 335 |
//=============================================================== |
| 336 |
// Get histograms (... non ho capito la differenza con retrieve) |
| 337 |
// |
| 338 |
// |
| 339 |
// |
| 340 |
// |
| 341 |
// |
| 342 |
//=============================================================== |
| 343 |
void GetHistos(){ |
| 344 |
|
| 345 |
TString hid; |
| 346 |
} |
| 347 |
//=============================================================== |
| 348 |
// Fill histograms (called event-by-event) |
| 349 |
// |
| 350 |
// |
| 351 |
// |
| 352 |
// |
| 353 |
// |
| 354 |
// |
| 355 |
//=============================================================== |
| 356 |
void FillHistos( PamLevel2* event ){ |
| 357 |
// ---------------------------------- |
| 358 |
// retrieve histos |
| 359 |
// ---------------------------------- |
| 360 |
RetrieveHistos(); |
| 361 |
|
| 362 |
|
| 363 |
// --------------------------------- |
| 364 |
// Retrieve the track |
| 365 |
// --------------------------------- |
| 366 |
PamTrack *track = event->GetTrack(0); |
| 367 |
TrkTrack *trk = track->GetTrkTrack(); |
| 368 |
ToFTrkVar *tof = track->GetToFTrack(); |
| 369 |
|
| 370 |
// cout << track->GetTrkTrack()->GetRigidity() << endl; |
| 371 |
// cout << track->GetToFTrack()->beta[12] << endl; |
| 372 |
// cout << track->GetCaloTrack()->qcyl << endl; |
| 373 |
|
| 374 |
// --------------------------------------------- |
| 375 |
// track coordinates esxtrapolated on tof planes |
| 376 |
// --------------------------------------------- |
| 377 |
float ytof[6],xtof[6]; |
| 378 |
for( int i=0; i<6; i++) ytof[i] = tof->ytr_tof[i]; |
| 379 |
for( int i=0; i<6; i++) xtof[i] = tof->xtr_tof[i]; |
| 380 |
|
| 381 |
for( int i=0; i<6; i++) hxytof[i]->Fill(xtof[i],ytof[i]); |
| 382 |
|
| 383 |
Dump(event->GetToFLevel2()); |
| 384 |
Dump(event->GetTrigLevel2()); |
| 385 |
UInt_t patterntrig[6]; |
| 386 |
EvaluatePatternTrig(patterntrig, event->GetToFLevel2()); |
| 387 |
cout << "TDC-Pattern: "<<hex; |
| 388 |
for(int i=0; i<6; i++)cout << setw(5) << patterntrig[i]; |
| 389 |
cout << dec << endl; |
| 390 |
cout <<"============================================="<<endl; |
| 391 |
Dump(tof); |
| 392 |
|
| 393 |
|
| 394 |
} |
| 395 |
//=============================================================== |
| 396 |
// Save histograms |
| 397 |
// |
| 398 |
// |
| 399 |
// |
| 400 |
// |
| 401 |
// |
| 402 |
//=============================================================== |
| 403 |
void SaveHistos( TFile * outf ){ |
| 404 |
|
| 405 |
TString hid; |
| 406 |
|
| 407 |
gROOT->cd(); |
| 408 |
// ---------------------------------- |
| 409 |
// retrieve histos |
| 410 |
// ---------------------------------- |
| 411 |
RetrieveHistos(); |
| 412 |
|
| 413 |
// ---------------------------------- |
| 414 |
// save on file |
| 415 |
// ---------------------------------- |
| 416 |
outf->cd(); |
| 417 |
|
| 418 |
for(Int_t i=0; i<6; i++)hxytof[i]->Write(); |
| 419 |
|
| 420 |
cout << "####------------------------------------------------------------------" <<endl; |
| 421 |
cout << "#### pre-selected :"<<tot<<endl; |
| 422 |
if(!tot)return; |
| 423 |
cout << "#### orbital :"<<sel[0]<< " (" << ((float)sel[0]/(float)tot) <<")"<<endl; |
| 424 |
cout << "#### trigger configuration :"<<sel[1]<< " (" << ((float)sel[1]/(float)tot) <<")"<<endl; |
| 425 |
cout << "#### tracker :"<<sel[2]<< " (" << ((float)sel[2]/(float)tot) <<")"<<endl; |
| 426 |
cout << "#### AC :"<<sel[3]<< " (" << ((float)sel[3]/(float)tot) <<")"<<endl; |
| 427 |
cout << "#### calo (non-int) :"<<sel[4]<< " (" << ((float)sel[4]/(float)tot) <<")"<<endl; |
| 428 |
cout << "####------------------------------------------------------------------" <<endl; |
| 429 |
|
| 430 |
} |