static int dma_r_ioctl(struct inode * inode, struct file * file, unsigned int cmd, unsigned long value) { char * tmp; unsigned long w4,adr,tmpval; char val; switch(cmd) { case NUDAQ_2_START_DMA: if (!dma_main_pointer){ nu2err=E_NU2_nopointer; return -EINVAL; } if (dma_should_run) { nu2err=E_NU2_already_running; return -EINVAL;} start_dma_engine(); break; case NUDAQ_2_STOP_DMA: if (!dma_main_pointer){ nu2err=E_NU2_nopointer; return -EINVAL; } if (!dma_should_run) { nu2err=E_NU2_not_running; return -EINVAL;} shutoff_dma_engine(); break; case NUDAQ_2_READ_ERR: return nu2err; break; case NUDAQ_2_BYTES_READ: return get_bytes_transfered();break; case NUDAQ_2_OUTWORD: outl(value,iocard_base+0x14);break; case NUDAQ_2_READBACK: return inl(iocard_base+0x14);break; case NUDAQ_2_DITIMERS: /* set internal timers and corresp. cascade mode */ set_counter(0, value & 0x0ffff); tmpval=inl(iocard_base+0x1c) & ~0x0400; /* T0_T2 bit isolation */ if (value & 0xffff0000) { set_counter(2,(value>>16)); tmpval |= 0x0400; /* set T0_T2 cascade enable bit */ }; outl(tmpval,iocard_base+0x1c); break; case NUDAQ_2_INMODE: return setinmode(value); break; /* for debugging: */ case 0x2001: /* write to buffer adr mit offset, return kernel adr */ tmp=dma_main_pointer->buffer; tmp[(value>>8)&0xff]=(value & 0xff); return (unsigned int)tmp[(value>>8)&0xff]; break; case 0x2002: /* read buffer mot offset */ tmp=dma_main_pointer->buffer; val=tmp[(value>>8)&0xff]; return (unsigned int)val; break; case 0x2003: return (int)value; break; case 0x2004: /* set adr register */ adr2 = value; return 0; break; case 0x2005: /* re-read adr register */ return (int) adr2; break; case 0x2006:case 0x2008: /* set register in adr space 1 directly */ w4=value;adr=(adr2 & 0x3c)+(cmd==0x2006?iocard_base:dma_engine_base); outl(w4,adr); break; case 0x2007:case 0x2009: /* read register in adr space 1 directly */ adr=(adr2 & 0x3c)+(cmd==0x2007?iocard_base:dma_engine_base); return (int)inl(adr); break; case 0x200a: /* read bus master control status reg */ return (int) inl(dma_engine_base+0x3c); break; case 0x200b: /* read interrupt control register */ return (int) inl(dma_engine_base+0x38); break; case 0x200c: /* read saved value diovalsave */ return (int)diovalsave; break; case 0x200d: /* read MWTC register */ return (int)inl(dma_engine_base+0x28); break; default: return -EINVAL; };
int main(int argc, char **argv) { double *V; double *xx; double *iscase; double *iscasecorr; int K; int k,m,n; int nignore; double rowsum, rowsum1; double chisq, Echisq, gamma, denom; readcommands(argc, argv) ; if (outputname != NULL) openit(outputname, &fpout, "w") ; else fpout = stdout; fprintf(fpout, "Chisq EIGENSTRAT\n"); setinmode(&inmode, imode); packmode = YES; numsnps = getsnps(snpname, &snpmarkers, 0.0, NULL, &nignore, 1) ; NSAMPLES = getindivs(indivname, &indivmarkers) ; setstatus(indivmarkers, NSAMPLES, "Case") ; setgenotypename(&genotypename, indivname) ; if (genotypename != NULL) { getgenos(genotypename, snpmarkers, indivmarkers, numsnps, NSAMPLES, nignore) ; } /*******************************************************************/ /* Free memory: Usually this is done in outfiles: */ /* */ /* nind = rmindivs(&snpmarkers, numsnps, &indmarkers, NSAMPLES); */ /* */ /* But where is the snpmarkers array released? */ /*******************************************************************/ L = numpc; readpcafile(&V, &outlier, &K, L, NSAMPLES); getphenos(NSAMPLES, &iscase, outlier, &iscasecorr, L, V); /* main eigenstrat loop here */ if ((xx = (double *)malloc(NSAMPLES*sizeof(*xx))) == NULL) { fprintf(stderr,"CM\n"); exit(1); } for(m=0;m<numsnps;m++) { SNP *cupt = snpmarkers[m]; for(n=0; n<NSAMPLES; n++) { int j = getgtypes(cupt,n); if(j == 0) { xx[n] = 0.0; } else if(j == 1) { xx[n] = 0.5; } else if(j == 2 ) { xx[n] = 1.0; } else if(j == -1) { xx[n] = -100.0; } if(outlier[n] == 1) xx[n] = -100.0; } /* mean-adjust xx */ rowsum = 0.0; rowsum1 = 0.0; for(n=0; n<NSAMPLES; n++) { if(qtmode == NO && ((outlier[n]) || (xx[n] < -99.0))) continue; if(qtmode == YES && ((outlier[n]) || (xx[n] == -100.0))) continue; rowsum += xx[n]; rowsum1 += 1.0; } for(n=0; n<NSAMPLES; n++) { if(outlier[n]) continue; if(qtmode == NO) { if (xx[n] < -99.0) xx[n] = -100.0; /* still keep track */ else xx[n] -= rowsum/rowsum1; } else { if (xx[n] == -100.0) xx[n] = -100.0; /* still keep track */ else xx[n] -= rowsum/rowsum1; } } /* Chisq */ chisq = compute_chisq(xx,iscase); /* EIGENSTRAT */ for(k=0; k<L; k++) { gamma = 0.0; denom = 0.0; for(n=0; n<NSAMPLES; n++) { if(qtmode == NO && (outlier[n] || xx[n] < -99.0)) continue; if(qtmode == YES && (outlier[n] || xx[n] == -100.0)) continue; gamma += xx[n]*V[NSAMPLES*n+k]; denom += V[NSAMPLES*n+k]*V[NSAMPLES*n+k]; } gamma /= denom; for(n=0; n<NSAMPLES; n++) { if(qtmode == NO && (outlier[n] || xx[n] < -99.0)) continue; if(qtmode == YES && (outlier[n] || xx[n] == -100.0)) continue; xx[n] -= gamma*V[NSAMPLES*n+k]; } } Echisq = compute_chisqE(xx,iscasecorr); if(rowsum1 == 0.0) { chisq = -1.0; Echisq = -1.0; } if(chisq >= 0.0) fprintf(fpout,"%.04f",chisq); else fprintf(fpout,"NA"); if(Echisq >= 0.0) fprintf(fpout," %.04f\n",Echisq); else fprintf(fpout," NA\n"); if(NSAMPLES*m > MAXSIZE) { fprintf(stderr,"OOPS genotype file has > %d genotypes\n",MAXSIZE); fprintf(fpout,"OOPS genotype file has > %d genotypes\n",MAXSIZE); exit(1); } } }