AliRun *a; AliRunLoader *al; TGeoManager *g; //globals for easy manual manipulations
AliHMPID *h; AliLoader *hl; AliHMPIDParam *hp;
-Bool_t isGeomType=kFALSE;
Int_t nCurEvt=0;
Int_t nMaxEvt=0;
TControlBar *pMenu=0;
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-void GetParam()
-{
- isGeomType=!isGeomType;
- if(g) delete g; if(hp) delete hp; //delete current TGeoManager and AliHMPIDParam
- if(isGeomType) g=TGeoManager::Import("geometry.root");
- else g=TGeoManager::Import("misaligned_geometry.root");
- hp=AliHMPIDParam::Instance();
-}//GetParam()
-//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void Hmenu()
{
TString status="Status: ";
status+="PROBLEM PROBLEM PROBLEM no galice.root";
status+=Form(" curent event %i",nCurEvt);
- GetParam();
+
+ AliHMPIDParam::Instance(); // geometry loaded
+
pMenu = new TControlBar("horizontal",status.Data(),0,0);
pMenu->AddButton(" ","","");
pMenu->AddButton(" General ","General()" ,"general items which do not depend on any files");
Double_t r2d=TMath::RadToDeg();
- Double_t x=AliHMPIDDigit::SizeAllX(),y=AliHMPIDDigit::SizeAllY();
+ Double_t x=AliHMPIDParam::SizeAllX(),y=AliHMPIDParam::SizeAllY();
Printf("\n\n\n");
ch, pc, px, py, ddl, raw, r, d, a); dd.Print();
ddl=7;raw=0x592e000;r=22;d=4;a=46;ch=3;pc=1;
}//PrintMap()
-//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-void DrawSeg()
-{
- TCanvas *pC=new TCanvas("seg","Segmentation as seen from electronics side");
- DrawPc(1);
- new TGedEditor(pC);
- pC->ToggleEventStatus();
- pC->SetEditable(0);
- pC->AddExec("status","DrawStatus()");
-}
-//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-void DrawStatus()
-{// Show info about current cursur position in status bar of the canvas
-// Printf("event %i",gPad->GetEvent()); return;
- TPad *pad=gPad;
- TCanvas *pC=(TCanvas*)pad;
- TRootCanvas *pRC= (TRootCanvas*)pC->GetCanvasImp();
- TGStatusBar *pBar=pRC->GetStatusBar();
- pBar->SetParts(5);
- Float_t x=pad->AbsPixeltoX(pad->GetEventX()); Float_t y=pad->AbsPixeltoY(pad->GetEventY());
- if(AliHMPIDDigit::IsInDead(x,y))
- pBar->SetText("Out of sensitive area",4);
- else{
- Int_t pc,px,py,w32,ddl,r,d,a; AliHMPIDDigit::Lors2Pad(x,y,pc,px,py); AliHMPIDDigit dig; dig.Set(1,pc,px,py); dig.Raw(w32,ddl,r,d,a);
- pBar->SetText(Form("(pc%i,px%i,py%i) (r%i,d%i,a%i) (%.2f,%.2f)",
- pc ,px ,py, r ,d ,a ,dig.LorsX(),dig.LorsY()),4);
- }
-// if(pad->GetEvent()==1){
-// new TCanvas("zoom",Form("Row %i DILOGIC %i",dig.Row(),dig.Dilogic()));
-// }
-}//DrawStatus()
-//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-void DrawPc(Bool_t isFill)
-{
- gPad->Range(-10,-10,AliHMPIDDigit::SizeAllX()+5,AliHMPIDDigit::SizeAllY()+5);
-
-
- Float_t dX2=0.5*AliHMPIDDigit::SizePadX(),
- dY2=0.5*AliHMPIDDigit::SizePadY() ;
-
- TLatex txt; txt.SetTextSize(0.01);
- TLine *pL;
-
- AliHMPIDDigit dig; UInt_t w32; Int_t ddl,r,d,a;
-
- for(Int_t iPc=AliHMPIDDigit::kMinPc;iPc<=AliHMPIDDigit::kMaxPc;iPc++){
- TBox *pBox=new TBox(AliHMPIDDigit::fMinPcX[iPc],AliHMPIDDigit::fMinPcY[iPc],
- AliHMPIDDigit::fMaxPcX[iPc],AliHMPIDDigit::fMaxPcY[iPc]);
-
- if(iPc==0||iPc==2||iPc==4) pBox->SetFillColor(29);
- else pBox->SetFillColor(41);
- pBox->Draw();
-
- if(!isFill) continue;
-
-// if(iPc%2) {dig.Set(0,iPc,79,25); txt.DrawText(dig.LorsX()+2,dig.LorsY(),Form("PC%i",dig.Pc()));}//print PC#
-
- txt.SetTextAlign(32);
- for(Int_t iRow=0;iRow<8 ;iRow++){//draw row lines (horizontal)
- dig.Set(0,iPc,0,iRow*6); dig.Raw(w32,ddl,r,d,a); //set digit to the left-down pad of this row
-
- if(iPc%2) txt.DrawText(dig.LorsX()-1 ,dig.LorsY(),Form("%i",dig.PadPcY())); //print PadY#
- txt.DrawText(dig.LorsX()-1+(iPc%2)*67,dig.LorsY()+2,Form("r%i",r)); //print Row#
- pL=new TLine(dig.LorsX()-dX2,dig.LorsY()-dY2,dig.LorsX()+AliHMPIDDigit::SizePcX()-dX2,dig.LorsY()-dY2);//draw horizontal line
- if(iRow!=0) pL->Draw();
- }//row loop
-
- txt.SetTextAlign(13);
- for(Int_t iDil=0;iDil<10;iDil++){//draw dilogic lines (vertical)
- dig.Set(0,iPc,iDil*8,0); dig.Raw(w32,ddl,r,d,a); //set this digit to the left-down pad of this dilogic
-
- txt.DrawText(dig.LorsX() ,dig.LorsY()-1,Form("%i",dig.PadPcX())); //print PadX#
- if(iPc==4 || iPc==5) txt.DrawText(dig.LorsX()+2,dig.LorsY()+42,Form("d%i",d)); //print Dilogic#
- pL=new TLine(dig.LorsX()-dX2,dig.LorsY()-dY2,dig.LorsX()-dX2,dig.LorsY()+AliHMPIDDigit::SizePcY()-dY2); //draw vertical line
- if(iDil!=0)pL->Draw();
- }//dilogic loop
- }//PC loop
-}//DrawPc()
-//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-void hed()
-{//event display from files
- static TCanvas *pC=0;
- static Int_t iEvt=0;
- static Int_t iEvtTot=999;
- static TFile *pEsdFl=0;
- static TTree *pEsdTr=0;
- static AliESD *pEsd=0;
-
-
-
-
- if(!pC&&iEvt<iEvtTot){
- iEvt=0;
- iEvtTot=999;
- if(hl==0) {Printf("hed: no HMPID loader");return;}
- Printf("Opening session");
- pEsdFl=TFile::Open("AliESDs.root"); if(!pEsdFl || !pEsdFl->IsOpen()) return;//open AliESDs.root
- pEsdTr=(TTree*) pEsdFl->Get("esdTree"); if(!pEsdTr) return;//get ESD tree
- pEsdTr->SetBranchAddress("ESD", &pEsd);
- hl->LoadHits(); hl->LoadDigits(); hl->LoadRecPoints();
- iEvtTot=pEsdTr->GetEntries();
- pC=new TCanvas("hed","View from electronics side, IP is behind the picture.",1000,900); pC->ToggleEventStatus(); pC->Divide(3,3);
- pC->cd(7); TButton *pBtn=new TButton("Next","hed()",0,0,0.2,0.1); pBtn->Draw();
- pC->cd(7); TButton *pBtn=new TButton("Quit","Close_hed()",0.2,0,0.4,0.1); pBtn->Draw();
- new TGedEditor(pC);
- }
-
- TLatex txt; txt.SetTextSize(0.1);
- TClonesArray hits("AliHMPIDHit");
-
- if(iEvt<iEvtTot){
- pEsdTr->GetEntry(iEvt); al->GetEvent(iEvt);
- hl->TreeD()->GetEntry(0); hl->TreeR()->GetEntry(0);
- ReadHits(&hits);
-
- pC->cd(3); gPad->Clear(); txt.DrawLatex(0.2,0.2,Form("Event %i (total %i)",iEvt,iEvtTot));
- DrawEvt(pC,&hits,h->DigLst(),h->CluLst(),pEsd);
-
- iEvt++;
- }else{
- Printf("--- No more events available...Bye.");
- pC->Close();
- pC=0x0;
- iEvt=0;
- iEvtTot=999;
- }
-}//hed()
-//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-void Close_hed()
-{
- TCanvas *pC = ((TCanvas*)gROOT->FindObject("hed"));if(!pC) return;
- pC->Close();
- pC=0x0;
-}
-//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-void ReadHits(TClonesArray *pHitLst)
-{
- pHitLst->Delete(); Int_t cnt=0;
- for(Int_t iEnt=0;iEnt<hl->TreeH()->GetEntries();iEnt++){ //TreeH loop
- hl->TreeH()->GetEntry(iEnt); //get current entry (prim)
- for(Int_t iHit=0;iHit<h->Hits()->GetEntries();iHit++){ //hits loop
- AliHMPIDHit *pHit = (AliHMPIDHit*)h->Hits()->At(iHit); //get current hit
- new((*pHitLst)[cnt++]) AliHMPIDHit(*pHit);
- }//hits loop for this entry
- }//tree entries loop
-
-}//ReadHits()
-//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-void sed()
-{
-
- static TCanvas *pC1=0;
-
- if(!pC1){
- pC1=new TCanvas("hed","Simulated evets-View from electronics side, IP is behind the picture.",1000,900); pC1->Divide(3,3);
- pC1->cd(7); TButton *pBtn=new TButton("Next","sed()",0,0,0.2,0.1); pBtn->Draw();
- }
-
-
-
- AliHMPIDRecon rec;
-
- TClonesArray lh("AliHMPIDHit");
- TClonesArray ls("AliHMPIDDigit");
- TObjArray ld(7); for(Int_t i=0;i<7;i++) ld.AddAt(new TClonesArray("AliHMPIDDigit"),i);
- TObjArray lc(7); for(Int_t i=0;i<7;i++) lc.AddAt(new TClonesArray("AliHMPIDCluster"),i);
- AliESD esd;
-
-
- SimEsd(&esd);
- HitsFromEsd(&esd,&lh);
-
-
-
- AliHMPIDv1::Hit2Sdi(&lh,&ls);
- AliHMPIDDigitizer::Sdi2Dig(&ls,&ld);
- AliHMPIDReconstructor::Dig2Clu(&ld,&lc);
-// AliHMPIDTracker::Recon(&esd,&cl);
-
- DrawEvt(pC1,&lh,&ld,&lc,&esd);
-}//SimEvt()
-//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-void DrawEvt(TCanvas *pC,TClonesArray *pHitLst,TObjArray *pDigLst,TObjArray *pCluLst,AliESD *pEsd)
-{//draws all the objects of current event
-
- AliHMPIDRecon rec;
- TPolyMarker *pTxC[7]; TPolyMarker *pRin[7]; //intesections and rings
- for(Int_t ch=0;ch<7;ch++){
- pTxC[ch]=new TPolyMarker; pTxC[ch]->SetMarkerStyle(2); pTxC[ch]->SetMarkerColor(kRed); pTxC[ch]->SetMarkerSize(3);
- pRin[ch]=new TPolyMarker; pRin[ch]->SetMarkerStyle(6); pRin[ch]->SetMarkerColor(kMagenta);
- }
-
-
- for(Int_t iTrk=0;iTrk<pEsd->GetNumberOfTracks();iTrk++){//tracks loop to collect cerenkov rings and intersection points
- AliESDtrack *pTrk=pEsd->GetTrack(iTrk);
- Int_t ch=pTrk->GetHMPIDcluIdx();
- if(ch<0) continue; //this track does not hit HMPID
- ch/=1000000;
- Float_t th,ph,xPc,yPc; pTrk->GetHMPIDtrk(xPc,yPc,th,ph); //get info on current track
- pTxC[ch]->SetNextPoint(xPc,yPc); //add new intersection point
-
- Float_t ckov=pTrk->GetHMPIDsignal(); Float_t err=TMath::Sqrt(pTrk->GetHMPIDchi2());
-
- if(ckov>0){
- rec.SetTrack(xPc,yPc,th,ph);
- TVector2 pos; for(int j=0;j<100;j++){rec.TracePhot(ckov,j*0.0628,pos); pRin[ch]->SetNextPoint(pos.X(),pos.Y());}
- }
- }//tracks loop
-
- for(Int_t iCh=0;iCh<7;iCh++){//chambers loop
- switch(iCh){
- case 6: pC->cd(1); break; case 5: pC->cd(2); break;
- case 4: pC->cd(4); break; case 3: pC->cd(5); break; case 2: pC->cd(6); break;
- case 1: pC->cd(8); break; case 0: pC->cd(9); break;
- }
- gPad->SetEditable(kTRUE); gPad->Clear();
- DrawPc(0);
- for(Int_t iHit=0;iHit<pHitLst->GetEntries();iHit++){
- AliHMPIDHit *pHit=(AliHMPIDHit*)pHitLst->At(iHit);
- if(pHit->Ch()==iCh) pHit->Draw(); //draw hits
- }
- ((TClonesArray*)pDigLst->At(iCh))->Draw(); //draw digits
- ((TClonesArray*)pCluLst->At(iCh))->Draw(); //draw clusters
- pTxC[iCh]->Draw(); //draw intersections
- pRin[iCh]->Draw(); //draw rings
- gPad->SetEditable(kFALSE);
-// gPad->AddExec("zoom","DrawZoom()");
- }//chambers loop
-
-
-// TLatex txt; txt.SetTextSize(0.02);
-// txt.DrawLatex(20,-5,Form("#theta=%.4f#pm%.5f with %2i #check{C}" ,simCkov,simErr,simN));
-// txt.DrawLatex(25,-5,Form("#theta=%.4f#pm%.5f with %2i #check{C}" ,recCkov,recErr,recN));
-// txt.DrawLatex(0 ,127,Form("#theta=%.2f#circ #phi=%.2f#circ @(%.2f,%.2f) ",th*TMath::RadToDeg(),ph*TMath::RadToDeg(),radx,rady));
-// Printf("DIG------DIG---------DIG--------DIG------DIG------DIG");pDigLst->Print();Printf("");
-}//DrawEvt()
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-void DrawZoom()
-{
- TPad *pad=gPad; Float_t x=gPad->AbsPixeltoX(pad->GetEventX()); Float_t y=gPad->AbsPixeltoY(pad->GetEventY());
- TCanvas *zoom = (TCanvas*)gROOT->GetListOfCanvases()->FindObject("zoom");
- if(!zoom) zoom=new TCanvas("zoom","");
- zoom->SetTitle(Form("Zoom view around %.2f %.2f",x,y));
- gPad->Range(x-20,y-20,x+20,y+20);
- zoom->Update();
-}
void t1(Int_t case=1)
{
AliHMPIDDigit *d[10]; for(Int_t i=0;i<10;i++) d[i]=new AliHMPIDDigit;
cl->Print();
}//t1()
-//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-void SimEsd(AliESD *pEsd)
-{
- TParticle part; TLorentzVector mom;
- for(Int_t iTrk=0;iTrk<25;iTrk++){//stack loop
- part.SetPdgCode(kProton);
- part.SetProductionVertex(0,0,0,0);
- Double_t eta= -0.4+gRandom->Rndm()*0.8; //rapidity is random [-0.4,+0.4]
- Double_t phi= gRandom->Rndm()*1.4; //phi is random [ 0 , 80 ] degrees
- mom.SetPtEtaPhiM(2,eta,phi,part.GetMass());
- part.SetMomentum(mom);
- AliESDtrack trk(&part);
- pEsd->AddTrack(&trk);
- }//stack loop
-}//EsdFromStack()
-//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-void EsdFromStack(AliESD *pEsd)
-{
- al->LoadHeader();al->LoadKinematics();
- AliStack *pStk=al->Stack();
-
- for(Int_t iTrk=0;iTrk<pStk->GetNtrack();iTrk++){//stack loop
- TParticle *pPart=pStk->Particle(iTrk);
- if(pPart->GetPDG()->Charge()==0) continue; //neutral particles are not reconstructed
- if(pPart->GetFirstMother()>0) continue; //do not consider secondaries
- AliESDtrack trk(pPart);
- pEsd->AddTrack(&trk);
- }//stack loop
-}//EsdFromStack()
-//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-void HitsFromEsd(AliESD *pEsd, TClonesArray *pHitLst)
-{
- AliHMPIDRecon rec;
- const Int_t kCerenkov=50000050,kFeedback=50000051;
- Int_t hc=0; TVector2 pos;
- for(Int_t iTrk=0;iTrk<pEsd->GetNumberOfTracks();iTrk++){//tracks loop
- AliESDtrack *pTrk=pEsd->GetTrack(iTrk);
- Float_t xRa,yRa;
- Int_t ch=AliHMPIDTracker::IntTrkCha(pTrk,xRa,yRa);
- if(ch<0) continue; //this track does not hit HMPID
- Float_t ckov=0.63;
-
- Float_t th,ph,xPc,yPc,; pTrk->GetHMPIDtrk(xPc,yPc,th,ph); rec.SetTrack(xRa,yRa,th,ph);
-
- if(!AliHMPIDDigit::IsInDead(xPc,yPc)) new((*pHitLst)[hc++]) AliHMPIDHit(ch,200e-9,kProton ,iTrk,xPc,yPc); //mip hit
-// for(int i=0;i<4;i++) new((*pHitLst)[hc++]) AliHMPIDHit(ch,7.5e-9,kFeedback,iTrk,gRandom->Rndm()*130,gRandom->Rndm()*126); //bkg hits 4 per track
-// for(int i=0;i<16;i++){
-// rec.TracePhot(ckov,gRandom->Rndm()*TMath::TwoPi(),pos);
-// new((*pHitLst)[hc++]) AliHMPIDHit(ch,7.5e-9,kCerenkov,iTrk,pos.X(),pos.Y());} //photon hits
- }//tracks loop
-}//HitsFromEsd()
-//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-void tst(Int_t nEvts=10000,Int_t type=999)
-{
-
- TLegend *lQ=new TLegend(0.5,0.5,0.9,0.9);
-
- TH1F *hQ7 =new TH1F("hQ7" ,"" ,300,-50,2000); hQ7 ->SetLineColor(kRed); lQ->AddEntry(hQ7 ,"Ckov 7 eV"); hQ7->SetStats(0);
- TH1F *hQ200=new TH1F("hQ200","" ,300,-50,2000); hQ200->SetLineColor(kBlack); lQ->AddEntry(hQ200,"mip 200 eV");
- TH1F *hQ500=new TH1F("hQ500","" ,300,-50,2000); hQ500->SetLineColor(kCyan); lQ->AddEntry(hQ500,"mip 500 eV");
- TH1F *hQ900=new TH1F("hQ900","" ,300,-50,2000); hQ900->SetLineColor(kGreen); lQ->AddEntry(hQ900,"mip 900 eV");
-
- TH1F *hCluPerEvt=new TH1F("hCluPerEvt","# clusters per event",11,-0.5,10.5);
- TH1F *hCluChi2 =new TH1F("hChi2","Chi2 ",1000,0,100);
- TH1F *hCluFlg =new TH1F("hCluFlg","Cluster flag",14,-1.5,12.5); hCluFlg->SetFillColor(5);
- TH1F *hCluRawSize= new TH1F("hCluRawSize","Raw cluster size ",100,0,100);
-
- TH2F *pCluMapSi1=new TH2F("cluMSi1","Size 1 map",1700,-10,160,1700,-10,160);
- TH2F *pCluMapLo1=new TH2F("cluMLo1","Loc Max 1 map",1700,-10,160,1700,-10,160);
- TH2F *pCluMapEmp=new TH2F("cluMEmp","Should be empty",1700,-10,160,1700,-10,160);
- TH2F *pCluMapUnf=new TH2F("cluMUnf","Unfolded map",1700,-10,160,1700,-10,160);
- TH2F *pCluMapMax=new TH2F("cluMMax","Max Loc Max map",1700,-10,160,1700,-10,160);
- TH2F *pCluMapAbn=new TH2F("cluMAbn","Fit failed map",1700,-10,160,1700,-10,160);
- TH2F *pCluMapEdg=new TH2F("cluMEdg","On edge map",1700,-10,160,1700,-10,160);
- TH2F *pCluMapNoLoc=new TH2F("cluMNoLoc","No Loc map",1700,-10,160,1700,-10,160);
- TH2F *pCluMapCoG=new TH2F("cluMCoG","CoG map",1700,-10,160,1700,-10,160);
-
- TH1F *hHitCluDifX = new TH1F("hHitCluDifX" ,";entries;x_{Hit}-x_{Clu} [cm]" ,2000,-2,2); hHitCluDifX->Sumw2(); hHitCluDifX->SetFillColor(kYellow);
- TH1F *hHitCluDifY = new TH1F("hHitCluDifY" ,";entries;y_{Hit}-y_{Clu} [cm]" ,2000,-2,2); hHitCluDifY->Sumw2(); hHitCluDifY->SetFillColor(kYellow);
- TH2F *hHitCluDifXY= new TH2F("hHitCluDifXY",";x_{Hit}-x_{Clu};y_{Hit}-y_{Clu}",2000,-2,2,2000,-2,2);hHitCluDifXY->Sumw2();
- TH1F *hHitCluDifQ = new TH1F("hHitCluDifQ" ,";entries;Q_{Hit}-Q_{Clu}" ,200 ,-100,100); hHitCluDifQ->Sumw2(); hHitCluDifQ->SetFillColor(kYellow);
-
- Float_t e200=200e-9,e500=500e-9,e900=900e-9,e7=7e-9;//predefined Eloss
-
- AliHMPIDHit hit(0,0,kProton,0,0,0);
- TClonesArray hits("AliHMPIDHit"); TClonesArray sdigs("AliHMPIDDigit");
- TObjArray digs(7); for(Int_t i=0;i<7;i++) digs.AddAt(new TClonesArray("AliHMPIDDigit"),i);
- TObjArray clus(7); for(Int_t i=0;i<7;i++) clus.AddAt(new TClonesArray("AliHMPIDCluster"),i);
-
-
- for(Int_t iEvt=0;iEvt<nEvts;iEvt++){//events loop
- Printf("============> iEvt = %d ",iEvt);
- Int_t nHits=(type==999)?1:40;
- Int_t ch,pid; Float_t e,hitx,hity,hitq;
- for(Int_t iHit=0;iHit<nHits;iHit++){//hits loop for the current event
- Printf("In loop");
- switch(iHit){
- case 0: ch=0;pid=kProton;e=e200;hitx=16.0+gRandom->Rndm()*0.8;hity= 16.8+gRandom->Rndm()*0.84;break; //mip ramdomly distributed in one pad in the middle
- case 1: ch=0;pid=kProton;e=e200;hitx=0.4;hity=0.42;break; //mip in left-hand bottom coner of chamber 0
- case 2: ch=0;pid=kProton;e=e200;hitx=0.4;hity=30 ;break; //mip on left edge of chamber 0
- case 3: ch=0;pid=kProton;e=e200;hitx=40; hity=0.42;break; //mip on bottom edge of chamber 0
- default: ch=gRandom->Rndm()*6; pid=(gRandom->Rndm()>0.9)? kProton:kCerenkov;
- if(pid==kProton)
- e=gRandom->Rndm()*900e-9;
- else
- e=5.5e-9+3e-9*gRandom->Rndm();
- x=gRandom->Rndm()*AliHMPIDDigit::SizeAllX(); y=gRandom->Rndm()*AliHMPIDDigit::SizeAllY();break; //random hit
- }
- new(hits[iHit]) AliHMPIDHit(ch,e,pid,iHit,hitx,hity);
- hitq=e;
- hQ200->Fill(hit.QdcTot(e200));
- hQ500->Fill(hit.QdcTot(e500));
- hQ900->Fill(hit.QdcTot(e900));
- hQ7 ->Fill(hit.QdcTot(e7));
- }//hits loop
-
- hits.Print();
-
- AliHMPIDv1::Hit2Sdi(&hits,&sdigs);
- AliHMPIDDigitizer::Sdi2Dig(&sdigs,&digs);
- AliHMPIDReconstructor::Dig2Clu(&digs,&clus);
-
- for(Int_t iCh=AliHMPIDDigit::kMinCh;iCh<=AliHMPIDDigit::kMaxCh;iCh++){//chambers loop
- TClonesArray *pDigs=(TClonesArray *)digs.UncheckedAt(iCh);
- TClonesArray *pClus=(TClonesArray *)clus.UncheckedAt(iCh);
-
- hCluPerEvt->Fill(pClus->GetEntriesFast());
- for(Int_t iClu=0;iClu<pClus->GetEntriesFast();iClu++){//clusters loop
- AliHMPIDCluster *pClu=(AliHMPIDCluster*)pClus->UncheckedAt(iClu);
- Float_t clux=pClu->X(); Float_t cluy=pClu->Y(); Float_t cluq=pClu->Q();
- hCluFlg->Fill(pClu->Status());
- hCluChi2->Fill(pClu->Chi2());
- hCluRawSize->Fill(pClu->Size());
-
- switch(pClu->Status()){
- case AliHMPIDCluster::kSi1: pCluMapSi1->Fill(clux,cluy); break;
- case AliHMPIDCluster::kLo1: pCluMapLo1->Fill(clux,cluy); break;
- case AliHMPIDCluster::kUnf: pCluMapUnf->Fill(clux,cluy); break;
- case AliHMPIDCluster::kAbn: pCluMapAbn->Fill(clux,cluy); break;
- case AliHMPIDCluster::kMax: pCluMapMax->Fill(clux,cluy); break;
- case AliHMPIDCluster::kEdg: pCluMapEdg->Fill(clux,cluy); break;
- case AliHMPIDCluster::kCoG: pCluMapCoG->Fill(clux,cluy); break;
- case AliHMPIDCluster::kNoLoc: pCluMapNoLoc->Fill(clux,cluy); break;
- default: pCluMapEmp->Fill(clux,cluy); break;
- }
-
- hHitCluDifX->Fill(hitx-clux); hHitCluDifY->Fill(hity-cluy); hHitCluDifXY->Fill(hitx-clux,hity-cluy); hHitCluDifQ->Fill(hitq-cluq);
-
- }//clusters loop
-
- }//chambers loop
-
- hits.Delete(); sdigs.Delete(); for(int i = 0;i<7;i++){((TClonesArray*)digs.At(i))->Delete();((TClonesArray*)clus.At(i))->Delete();}
- }//events loop
-
- gStyle->SetPalette(1);
- TCanvas *pC2=new TCanvas("Digit canvas","Digit canvas",1280,800); pC2->Divide(3,3);
- pC2->cd(1);gPad->SetLogy(1);hHitCluDifX->Draw("hist");
- pC2->cd(2);gPad->SetLogy(1);hHitCluDifY->Draw("hist");
- pC2->cd(3);gPad->SetLogz(1);hHitCluDifXY->Draw("colz");
- pC2->cd(4);gPad->SetLogy(1);hHitCluDifQ->Draw("hist");
- pC2->cd(5);gPad->SetLogy(1);hCluFlg->Draw();
- pC2->cd(6);gPad->SetLogy(1);hCluChi2->Draw();
- pC2->cd(7); hCluRawSize->Draw();
- pC2->cd(8); hCluPerEvt->Draw("colz");
- pC2->cd(9); hQckov->Draw(); hQm200->Draw("same"); hQm500->Draw("same"); hQm900->Draw("same"); lQ->Draw();
- TCanvas *pC1=new TCanvas("ClusterMaps","Cluster maps",1280,800); pC1->Divide(3,3);
- pC1->cd(1); pCluMapSi1->Draw(); DrawPc(kFALSE);
- pC1->cd(2); pCluMapLo1->Draw(); DrawPc(kFALSE);
- pC1->cd(3); pCluMapUnf->Draw(); DrawPc(kFALSE);
- pC1->cd(4); pCluMapAbn->Draw(); DrawPc(kFALSE);
- pC1->cd(5); pCluMapMax->Draw(); DrawPc(kFALSE);
- pC1->cd(6); pCluMapEdg->Draw(); DrawPc(kFALSE);
- pC1->cd(7); pCluMapCoG->Draw(); DrawPc(kFALSE);
- pC1->cd(8); pCluMapNoLoc->Draw();DrawPc(kFALSE);
- pC1->cd(9); pCluMapEmp->Draw(); DrawPc(kFALSE);
-
- pC1->SaveAs("$HOME/HitMaps.png"); //?????
- pC2->SaveAs("$HOME/HitCluDif.gif");
-
- Printf("Digits - raw -digits conversion...");
-
- AliHMPIDDigit d1,d2; Int_t ddl,r,d,a;UInt_t w32;
- for(Int_t iCh=AliHMPIDDigit::kMinCh;iCh<=AliHMPIDDigit::kMaxCh;iCh++)
- for(Int_t iPc=AliHMPIDDigit::kMinPc;iPc<=AliHMPIDDigit::kMaxPc;iPc++)
- for(Int_t iPx=AliHMPIDDigit::kMinPx;iPx<=AliHMPIDDigit::kMaxPx;iPx++)
- for(Int_t iPy=AliHMPIDDigit::kMinPy;iPy<=AliHMPIDDigit::kMaxPy;iPy++){
- d1.Set(iCh,iPc,iPx,iPy,3040); //set digit
- d1.Raw(w32,ddl,r,d,a); //get raw word for this digit
- d2.Raw(w32,ddl); //set another digit from that raw word
- if(d1.Compare(&d2)) {d1.Print(); d2.Print(); Printf("");}//compare them
- }
- Printf("OK");
-}//tst()
-
-
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void hp(Int_t iEvt=0)
{
Printf("totally %i clusters for event %i",iCluCnt,iEvt);
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-void Gui()
-{
- TGMainFrame *pMF =new TGMainFrame(gClient->GetRoot(),300,400);//main frame
-//1 level widgets: button and 2 horizontal frames
- TGedFrame *pGedF;
- pMF->AddFrame(pGedF=new TGedFrame(pMF),new TGLayoutHints(kLHintsExpandY));
- pMF->AddFrame(pDis1=new TGEmbeddedCanvas(pMF,kSunkenFrame));
-
- pMF->Layout();
- pMF->MapSubwindows();
- pMF->Resize(pMF->GetDefaultSize());
- pMF->MapWindow();
-}